diff --git a/README.md b/README.md index 7f7074e9..2d6fb255 100644 --- a/README.md +++ b/README.md @@ -1,666 +1,846 @@ -# SEDISH: The Haiti HIE -This README details the end-to-end deployment of a docker-swarm based HIE using instant OpenHIE. The deployment follows the Jembi platform pattern and includes instructions for setting up the Linux environment, installing and configuring Docker, initializing a Docker Swarm, configuring security best practices, and deploying the project packages. +# SEDISH: Haiti Health Information Exchange -[![CI](https://github.com/I-TECH-UW/sedish-haiti.org/actions/workflows/main.yml/badge.svg)](https://github.com/I-TECH-UW/sedish-haiti.org/actions/workflows/main.yml) -## Components +A Docker Swarm-based Health Information Exchange (HIE) for Haiti, built on [Instant OpenHIE v2](https://jembi.gitbook.io/instant-v2). SEDISH connects multiple iSantePlus (OpenMRS) clinic sites to a centralized data exchange layer for patient identity management, shared health records, and clinical data analytics. -### 1. iSantePlus EMR -### Links -https://github.com/IsantePlus/openmrs-distro-isanteplus -https://github.com/IsantePlus/docker-isanteplus-server +--- -### 2. OpenCR -https://github.com/intrahealth/client-registry +## Architecture -### 3. OpenHIM -http://openhim.org/docs/installation/docker +``` + ┌──────────────┐ + │ OpenCR │ + │ (Patient MPI)│ + └──────▲───────┘ + │ /CR/fhir +┌─────────────┐ ┌───────┴────────┐ ┌──────────────┐ +│ iSantePlus │──mpi-client───▶│ │ │ │ +│ (Site 1) │ │ OpenHIM │───/SHR/fhir──▶│ HAPI FHIR │ +│ iSantePlus │──mpi-client───▶│ (Mediator) │ │ (SHR) │ +│ (Site 2) │ │ │ │ │ +│ iSantePlus │──mpi-client───▶│ Port 5001 │ └──────────────┘ +│ (Site N) │ └─────────────────┘ +└─────────────┘ +``` -### 4. HAPI JPA Server -https://github.com/hapifhir/hapi-fhir-jpaserver-starter#deploy-with-docker-compose -https://hapifhir.io/hapi-fhir/docs/server_jpa/get_started.html +**Data flows:** +| Flow | Trigger | Path | Purpose | +|------|---------|------|---------| +| Patient identity | Patient create/update | iSantePlus → OpenHIM → OpenCR | Real-time MPI registration via `mpi-client` module | +| Clinical documents | Lab order (VL/EID) | iSantePlus → OpenHIM → SHR → HAPI FHIR | Real-time via `xds-sender` module | -## Deployment Guide +--- +## Components -> **Note:** This deployment uses instant OpenHIE v2. For more background, see the [Instant OpenHIE documentation](https://jembi.gitbook.io/instant-v2) and [Jembi Platform README](https://github.com/jembi/platform/blob/main/README.md). +| Component | Image | Purpose | +|-----------|-------|---------| +| [iSantePlus](https://github.com/IsantePlus/openmrs-distro-isanteplus) | `itechuw/docker-isanteplus-server:local-2` | OpenMRS-based EMR (multiple clinic instances) | +| [OpenHIM](http://openhim.org/) | `jembi/openhim-core:v8.5.0` | Interoperability layer — routes, logs, and secures all data exchange | +| [OpenCR](https://github.com/intrahealth/client-registry) | `itechuw/opencr` | Master Patient Index (MPI) — de-duplicates patient identities | +| [HAPI FHIR](https://hapifhir.io/) | `jembi/hapi:v7.0.3-wget` | FHIR R4 data store — Shared Health Record (SHR) | +| [SHR Mediator](https://github.com/DIGI-UW/shared-health-record) | `itechuw/shared-health-record:main` | Proxies FHIR requests to HAPI FHIR with validation | +| [Keycloak](https://www.keycloak.org/) | `keycloak/keycloak:20.0` | Identity and access management (SSO) | +| [Nginx](https://nginx.org/) | `nginx:stable` | Reverse proxy with Let's Encrypt SSL | +| Monitoring | Grafana + Prometheus + Loki | Dashboards, metrics, and log aggregation | --- -## Table of Contents - -- [SEDISH: The Haiti HIE](#sedish-the-haiti-hie) - - [Components](#components) - - [1. iSantePlus EMR](#1-isanteplus-emr) - - [Links](#links) - - [2. OpenCR](#2-opencr) - - [3. OpenHIM](#3-openhim) - - [4. HAPI JPA Server](#4-hapi-jpa-server) - - [Deployment Guide](#deployment-guide) - - [Table of Contents](#table-of-contents) - - [Overview](#overview) - - [System Requirements](#system-requirements) - - [Environment Setup](#environment-setup) - - [Linux VM Setup](#linux-vm-setup) - - [Installing Git and Docker](#installing-git-and-docker) - - [Initializing Docker Swarm](#initializing-docker-swarm) - - [Security Best Practices](#security-best-practices) - - [Docker and Swarm Security](#docker-and-swarm-security) - - [Host and OS Hardening](#host-and-os-hardening) - - [Cloud-Specific Controls (AWS)](#cloud-specific-controls-aws) - - [Project Configuration](#project-configuration) - - [Project Structure and .env File](#project-structure-and-env-file) - - [Docker Secrets and Swarm Locking](#docker-secrets-and-swarm-locking) - - [Component Modules](#component-modules) - - [Interoperability Layer – OpenHIM](#interoperability-layer--openhim) - - [Reverse Proxy – Nginx](#reverse-proxy--nginx) - - [FHIR Datastore – HAPI FHIR](#fhir-datastore--hapi-fhir) - - [Monitoring](#monitoring) - - [Database Modules – Postgres \& MySQL](#database-modules--postgres--mysql) - - [Analytics Datastore – ElasticSearch](#analytics-datastore--elasticsearch) - - [Message Bus – Kafka](#message-bus--kafka) - - [Shared Health Record – FHIR / OpenSHR](#shared-health-record--fhir--openshr) - - [Sedish Haiti Custom Packages](#sedish-haiti-custom-packages) - - [Deployment Steps](#deployment-steps) - - [Post-Deployment Configuration](#post-deployment-configuration) - - [Troubleshooting \& Logging](#troubleshooting--logging) - - [Additional Resources](#additional-resources) +## Prerequisites + +- **Server**: Ubuntu 20.04+ with at least 16 GB RAM (32 GB recommended) +- **Docker**: Docker CE with Swarm mode +- **Domain**: A domain with wildcard DNS (`*.yourdomain.com`) pointing to the server +- **Git LFS**: Required for `.omod` and `.sql` binary files --- -## Overview +## Quick Start + +```bash +# 1. Install dependencies +sudo apt-get update && sudo apt-get install -y git jq +curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash +sudo apt-get install -y git-lfs && git lfs install +# Install Docker CE: https://docs.docker.com/engine/install/ubuntu/ + +# 2. Initialize Docker Swarm +docker swarm init + +# 3. Clone and fetch LFS files +git clone https://github.com/charess-org/sedish.git +cd sedish +git lfs pull + +# 4. Configure +cp .env.hie .env +# Edit .env — set DOMAIN_NAME, SUBDOMAINS, RENEWAL_EMAIL, STAGING=false + +# 5. Build +./get-cli.sh linux +sudo mkdir -p /backups/elasticsearch /tmp/backups +./build-custom-images.sh +./build-image.sh + +# 6. Deploy +./instant project init --env-file .env + +# 7. Apply HAPI FHIR overrides (required after every deploy) +./packages/fhir-datastore-hapi-fhir/post-deploy.sh + +# 8. Verify +docker service ls +``` -This project deploys a multi-component Health Information Exchange (HIE) on a cloud-based AWS Linux VM using Docker Swarm. The system uses [instant OpenHIE](https://jembi.gitbook.io/instant-v2) to package and deploy several modules following the Jembi platform pattern. The deployed components include core interoperability layers, data stores, identity management, analytics, messaging, and additional custom packages for the Sedish Haiti project. +> iSantePlus instances take **10–15 minutes** to fully boot on first start. The `post-start.sh` script automatically configures xds-sender endpoints once OpenMRS is ready. --- -## Suggested System Requirements +## Environment Configuration + +Copy `.env.hie` to `.env` and configure at minimum: + +| Variable | Description | Example | +|----------|-------------|---------| +| `DOMAIN_NAME` | Base domain for all services | `sedishtest.live` | +| `SUBDOMAINS` | Comma-separated list of all subdomains | `opencr.sedishtest.live,openhimconsole.sedishtest.live,...` | +| `RENEWAL_EMAIL` | Email for Let's Encrypt notifications | `admin@example.com` | +| `STAGING` | Set to `false` for production SSL certs | `false` | +| `INSECURE` | Set to `false` to enable HTTPS | `false` | -- **Operating System:** AWS Linux VM (Ubuntu, Amazon Linux 2, etc.) -- **Docker:** Latest Docker CE installed (with Docker Swarm mode enabled) -- **Git:** Installed for source code retrieval -- **AWS:** Proper IAM roles and security group configuration for port and network isolation +See `.env.hie` for the full list of configurable variables. --- -## Environment Setup +## Services & URLs -### Linux VM Setup +After deployment, the following services are accessible via HTTPS: -1. **Provision an AWS Linux VM:** - Use your preferred AWS method (EC2, AWS Marketplace AMI, etc.) and ensure you have SSH access. +| Service | URL | Credentials | +|---------|-----|-------------| +| iSantePlus (HUEH) | `https://hueh./openmrs` | `admin` / `Admin123` | +| iSantePlus (La Paix) | `https://lapaix./openmrs` | `admin` / `Admin123` | +| iSantePlus (OFATMA) | `https://ofatma./openmrs` | `admin` / `Admin123` | +| iSantePlus (Foyer St-Camille) | `https://foyer-saint-camille./openmrs` | `admin` / `Admin123` | +| OpenHIM Console | `https://openhimconsole.` | `root@openhim.org` / `instant101` | +| OpenCR | `https://opencr./crux` | — | +| SHR (HAPI FHIR Browser) | `https://shr./fhir` | — | +| Grafana | `https://grafana.` | — | +| Keycloak | `https://keycloak.` | — | -2. **Update your system:** - ```bash - sudo apt update && sudo apt upgrade -y - ``` +> Note: iSantePlus serves on `/openmrs`, not `/`. Going to `https://hueh./` will return 404. -### Installing Git and Docker +--- -1. **Install Git:** - ```bash - sudo apt install -y git - ``` +## Patient ID Uniqueness Across Facilities -2. **Install Git LFS:** - Several large binary files (`.omod` OpenMRS modules, `.sql` database dumps) are stored in Git LFS. Without this step, those files will be 132-byte pointer stubs and the Docker image build will produce broken containers. - ```bash - curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash - sudo apt-get install -y git-lfs - git lfs install - ``` +Each iSantePlus instance has its own MySQL database (`openmrs`, `openmrs2`, `openmrs3`, ...) initialized from the same SQL dump. To prevent patient ID collisions in OpenCR, two mechanisms are used: -3. **Install Docker:** - Follow [Docker’s installation guide](https://docs.docker.com/engine/install/ubuntu/) for your Linux distribution. +1. **Sequence offsets**: Each database starts its idgen sequence at a different value (instance 1 at 100000, instance 2 at 200000, etc.) so generated IDs never overlap. -### Initializing Docker Swarm +2. **Unique FHIR system URIs**: Each instance has a unique `mpi-client.pid.local` value (e.g., `http://hueh.sedishtest.live/ws/fhir2/pid/openmrsid/`) so OpenCR can distinguish patient sources even if IDs were to collide. -1. **Enable Swarm mode:** - ```bash - docker swarm init - ``` - If you have multiple nodes, join worker nodes using the token provided by the `docker swarm init` command. +Both are configured automatically by `projects/isanteplus-db/initdb/20-configure-per-instance.sh` during fresh database initialization. The `FACILITY_NAMES` env var controls the mapping (default: `hueh,lapaix,ofatma,fsc`). -2. **Lock the Swarm:** - To secure the swarm’s Certificate Authority (CA) key, run: - ```bash - docker swarm ca --rotate --passphrase "YourSecurePassphrase" - ``` +**Patient ID format**: iSantePlus uses the Luhn Mod-30 check digit validator with the character set `0123456789ACDEFGHJKLMNPRTUVWXY`. Note that B, I, O, Q, S, Z are deliberately excluded to avoid ambiguity. --- -## HIE Setup and Configuration - -### 1. Clone the Repository - -```bash -git clone https://github.com/I-TECH-UW/sedish-haiti.org.git -cd sedish-haiti.org -``` - -### 2. Explore Project Structure -The project follows a modular structure outlined by the Instant OpneHIE V2 framework. The main configuration file is `config.yaml`, and environment variables are defined in the `.env` file. The project structure is as follows: - -``` -/sedish-haiti.org - ├── config.yaml # Main project configuration file - ├── .env # Environment variable definitions - ├── scripts/ # Helper scripts (e.g., deploy.sh) - ├── projects/ # Sedish-specific services - └── packages/ - ├── interoperability-layer-openhim/ - ├── reverse-proxy-nginx/ - ├── fhir-datastore-hapi-fhir/ - ├── monitoring/ - ├── database-postgres/ - ├── database-mysql/ - ├── identity-access-manager-keycloak/ - ├── client-registry-opencr/ - ├── analytics-datastore-elastic-search/ - ├── message-bus-kafka/ - ├── shared-health-record-fhir/ - ├── emr-isanteplus/ - ├── data-pipeline-isanteplus/ - ├── document-data-store-xds/ - ├── shared-health-record-openshr/ - ├── openhim-mediator-openxds/ - └── lnsp-mediator/ -``` - -This template `.env` file can be used as a starting point for configuration: - -```bash -# General -CLUSTERED_MODE=false - -# Log configuration -DEBUG=1 -BASHLOG_FILE=1 -BASHLOG_FILE_PATH=platform.log - -# Interoperability Layer - OpenHIM -OPENHIM_CORE_INSTANCES=1 -OPENHIM_CONSOLE_INSTANCES=1 -OPENHIM_MEDIATOR_API_PORT=443 -OPENHIM_CORE_MEDIATOR_HOSTNAME=openhimcomms.sedish.live -MONGO_SET_COUNT=1 -OPENHIM_MONGO_URL=mongodb://mongo-1:27017/openhim -OPENHIM_MONGO_ATNAURL=mongodb://mongo-1:27017/openhim - -# FHIR Datastore - HAPI FHIR -HAPI_FHIR_INSTANCES=1 -REPMGR_PARTNER_NODES=postgres-1 -POSTGRES_REPLICA_SET=postgres-1:5432 - -# Reverse Proxy - Nginx -REVERSE_PROXY_INSTANCES=1 -DOMAIN_NAME=sedish.live -SUBDOMAINS=openhimcomms.sedish.live,openhimcore.sedish.live,openhimconsole.sedish.live,keycloak.sedish.live,grafana.sedish.live,isanteplus.sedish.live,hueh.sedish.live,lapaix.sedish.live,ofatma.sedish.live,foyer-saint-camille.sedish.live,klinik-eritaj.sedish.live,ofatma-sonapi.sedish.live,gressier.sedish.live,pestel.sedish.live,stdemiragoane.sedish.live,bethel-fdn.sedish.live -STAGING=false -INSECURE=false - -# Message Bus - Kafka -KAFKA_TOPICS=map-concepts,map-locations,send-adt-to-ipms,send-orm-to-ipms,save-pims-patient,save-ipms-patient,handle-oru-from-ipms -KAFKA_HOSTS=kafka-01:9092 - -# Identity Access Manager - Keycloak -KC_FRONTEND_URL=https://keycloak.sedish.live -KC_GRAFANA_ROOT_URL=https://grafana.sedish.live -KC_SUPERSET_ROOT_URL=https://superset.domain -KC_OPENHIM_ROOT_URL=https://openhimconsole.sedish.live -GF_SERVER_DOMAIN=grafana.sedish.live - -# Resource limits -OPENHIM_MEMORY_LIMIT=4G -ES_MEMORY_LIMIT=20G -LOGSTASH_MEMORY_LIMIT=8G -KAFKA_MEMORY_LIMIT=8G -KAFDROP_MEMORY_LIMIT=500M - -LNSP_RUN_MIGRATIONS=true -LNSP_DATABASE_EXISTS=true -``` - -### 3. Build the Project - -1. Run `./get-cli.sh linux` to download the Instant OpenHIE CLI for Linux. - -2. **Fetch Git LFS files** (required before building images): - ```bash - git lfs pull - ``` - This downloads the actual `.omod` module files and `.sql` database dumps that are tracked by Git LFS. If you skip this step, the Docker image will contain 132-byte LFS pointer stubs instead of the real files, causing OpenMRS modules to silently fail to load at runtime. +## Deployment -3. Run `./build-custom-images.sh` to build the necessary Docker images. +There are two ways to deploy: the **Instant CLI** (recommended) or **manual `docker stack deploy`** (for development or when you need direct control). -4. Run `./build-images.sh` to build the management Docker image for the HIE deployment. +### Option A: Instant CLI (recommended) +The Instant CLI reads `package-metadata.json` for env var injection and handles Docker config management. **You must rebuild the management image after any local changes:** -### 4. Configure the Project +```bash +# Build the management image (required after any local file changes) +./build-image.sh -1. Update the `.env` file with your specific configuration settings. +# Deploy everything at once +./instant project init --env-file .env -### 5. Deploy the Project +# Post-deploy fixes (Instant CLI doesn't handle these) +./packages/fhir-datastore-hapi-fhir/post-deploy.sh +``` -1. Run `./instant project init --env-file .env` to do the **first-time** full deployment. - `init` runs certificate provisioning, importers, and initial configuration. Use this only once per clean environment. +Or deploy per-package in dependency order: - > For subsequent starts after a `down`, use `./instant project up --env-file .env` instead (see [Stopping and Cleaning Up](#stopping-and-cleaning-up)). +```bash +./instant package init -n database-postgres --env-file .env +./instant package init -n database-mysql --env-file .env +./instant package init -n interoperability-layer-openhim --env-file .env +./instant package init -n reverse-proxy-nginx --env-file .env +./instant package init -n fhir-datastore-hapi-fhir --env-file .env +./packages/fhir-datastore-hapi-fhir/post-deploy.sh +./instant package init -n client-registry-opencr --env-file .env +./instant package init -n shared-health-record-fhir --env-file .env +./instant package init -n emr-isanteplus --env-file .env +# Wait 10-15 min for iSantePlus to boot before deploying pipelines +./instant package init -n data-pipeline-isanteplus --env-file .env +``` -### 6. Manage individual packages +### Option B: Manual deployment (docker stack) -You can use the `mk.sh` file or the `instant` CLI to manage individual packages. For example, to bring up the OpenHIM package: +Uses local files directly — no `./build-image.sh` needed. However, env vars from `package-metadata.json` won't be substituted (use for packages that don't depend on them, or set the vars in `.env`). ```bash -./instant package up -n interoperability-layer-openhim --env-file .env -``` +# 1. Databases (no dependencies) +docker stack deploy -c packages/database-postgres/docker-compose.yml postgres +docker stack deploy -c packages/database-mysql/docker-compose.yml mysql + +# 2. Interoperability layer (bundles its own MongoDB) +docker stack deploy -c packages/interoperability-layer-openhim/docker-compose.yml \ + -c packages/interoperability-layer-openhim/docker-compose.config.yml openhim + +# 3. Reverse proxy +docker stack deploy -c packages/reverse-proxy-nginx/docker-compose.yml reverse-proxy + +# 4. FHIR datastore (needs postgres) +docker stack deploy -c packages/fhir-datastore-hapi-fhir/docker-compose.yml hapi-fhir +./packages/fhir-datastore-hapi-fhir/post-deploy.sh -## Security Best Practices +# 5. Client Registry (needs its own ES + HAPI FHIR + postgres) +docker stack deploy \ + -c packages/client-registry-opencr/docker-compose-es.yml \ + -c packages/client-registry-opencr/docker-compose-postgres.yml \ + -c packages/client-registry-opencr/docker-compose-hapi.yml \ + -c packages/client-registry-opencr/docker-compose.yml \ + client-registry-opencr -### Docker and Swarm Security +# 6. SHR Mediator (needs openhim + hapi-fhir) +docker stack deploy -c packages/shared-health-record-fhir/docker-compose.yml shared-health-record -- **Docker Secrets:** - Use Docker secrets to securely manage sensitive data (passwords, API keys). Create secrets during deployment and reference them in your services. - ```bash - echo "my-secret-value" | docker secret create my_secret - - ``` +# 7. iSantePlus EMR (needs mysql + openhim — takes 10-15 min to boot) +docker stack deploy -c packages/emr-isanteplus/docker-compose.yml isanteplus -- **Private Networks for Swarm Traffic:** - Ensure manager/worker communications occur over a private VLAN/VPC. When creating overlay networks, use: - ```bash - docker network create --driver overlay --opt encrypted my_overlay_network - ``` +# 8. FHIR Data Pipelines (needs isanteplus + openhim + hapi-fhir — deploy LAST) +docker stack deploy -c packages/data-pipeline-isanteplus/docker-compose.yml pipeline -### Host and OS Hardening +# 9. Verify all services are up +docker service ls --format 'table {{.Name}}\t{{.Replicas}}' +``` -- **Patch & Update:** - Regularly update your Linux distribution and kernel to apply security patches. +> **Note:** OpenCR may need a force restart after first deploy if ES wasn't ready: +> `docker service update --force client-registry-opencr_opencr` -- **SSH Hardening:** - - Enforce key-based authentication. - - Disable root login. - - Consider using an SSH bastion host or VPN. - -- **Firewall Configuration:** - Use iptables or nftables to whitelist only necessary inbound/outbound connections. +--- -- **SELinux/AppArmor:** - Enable SELinux (for Red Hat-based distros) or AppArmor (for Ubuntu/Debian) to add extra process-level isolation. +## Package Management -### Cloud-Specific Controls (AWS) +Each HIE component is deployed as a package. Use the `instant` CLI to manage them: -- **AWS Security Groups:** - Restrict inbound/outbound traffic to only what’s necessary for your HIE components. - -- **External WAF:** - Consider AWS WAF or third-party services to protect your public endpoints. +```bash +# Deploy a package (first time) +./instant package init -n --env-file .env -- **Load Balancer:** - Use AWS ALB/NLB to distribute traffic and integrate with AWS WAF. +# Stop a package (preserves data) +./instant package down -n --env-file .env -- **EBS/RDS Encryption:** - Use KMS-managed keys to encrypt data volumes and databases. +# Restart a package +./instant package up -n --env-file .env +``` -- **IAM Roles:** - Grant least privilege permissions to your EC2 instances and containers. +### Package Names -- **Monitoring:** - Enable CloudWatch and GuardDuty for real-time threat detection and log analysis. +| Package ID | Stack | Description | +|------------|-------|-------------| +| `reverse-proxy-nginx` | `reverse-proxy` | Nginx + Let's Encrypt SSL | +| `interoperability-layer-openhim` | `openhim` | OpenHIM Core + Console + MongoDB | +| `fhir-datastore-hapi-fhir` | `hapi-fhir` | HAPI FHIR R4 Server (SHR) | +| `shared-health-record-fhir` | `shared-health-record` | SHR Mediator | +| `emr-isanteplus` | `isanteplus` | iSantePlus EMR instances | +| `client-registry-opencr` | `client-registry-opencr` | OpenCR MPI | +| `database-postgres` | `postgres` | PostgreSQL (HAPI FHIR, Keycloak) | +| `database-mysql` | `mysql` | MySQL (iSantePlus) | +| `identity-access-manager-keycloak` | `keycloak` | Keycloak SSO | +| `monitoring` | `monitoring` | Grafana + Prometheus + Loki | + +### Important Notes + +- **`init` vs `up`**: Use `init` only for first-time deployment or after wiping data. Use `up` for restarts. +- **HAPI FHIR**: Always run `./packages/fhir-datastore-hapi-fhir/post-deploy.sh` after deploying or updating HAPI FHIR. This adds the `reverse-proxy_public` network (for SHR browser access) and sets referential integrity + placeholder target settings. The instant CLI reads compose files from the jembi/platform base image, which doesn't include our HAPI FHIR overrides — this script applies them. +- **OpenHIM**: If MongoDB was wiped, use `init` (not `up`) to re-run the config importer. +- **Pipeline resource order**: The data pipeline syncs resources in the order defined in `resourceList` in `application-isanteplus*.yaml`. Referenced resources (Practitioner, Location) must come before resources that reference them (Encounter, Observation) to avoid referential integrity errors. --- -### Docker Secrets and Swarm Locking +## FHIR Data Pipeline Management + +Each iSantePlus instance has its own dedicated pipeline that syncs FHIR resources to the SHR. Pipelines run on a schedule (incremental sync every hour) and can be managed from the terminal. + +### Architecture + +``` +pipeline-isanteplus1 → http://isanteplus:8080/openmrs/ws/fhir2/R4 → SHR (via OpenHIM) +pipeline-isanteplus2 → http://isanteplus2:8080/openmrs/ws/fhir2/R4 → SHR (via OpenHIM) +``` + +Schedules are staggered to avoid concurrent writes: +- Pipeline 1: runs at `:00` (top of hour) +- Pipeline 2: runs at `:30` (half hour) + +### Check pipeline status + +```bash +# List pipeline services +docker service ls -f name=pipeline + +# Check last run time and next scheduled run +docker service logs pipeline_pipeline-isanteplus1 --tail 5 +docker service logs pipeline_pipeline-isanteplus2 --tail 5 +``` + +### Trigger a pipeline run manually + +```bash +# Full run (re-syncs all resources) +docker exec $(docker ps -q -f name=pipeline_pipeline-isanteplus1) \ + curl -s -X POST http://localhost:8080/run -F "runMode=FULL" + +# Incremental run (only changed resources since last run) +docker exec $(docker ps -q -f name=pipeline_pipeline-isanteplus2) \ + curl -s -X POST http://localhost:8080/run -F "runMode=INCREMENTAL" +``` -- **Docker Secrets:** Store sensitive configuration (e.g., passwords) as Docker secrets. Reference these secrets in your service definitions. -- **Swarm Locking:** Use the CA rotation command (as shown above) to secure your swarm’s CA key. +### Check pipeline logs for errors + +```bash +# Check for errors in a specific pipeline +docker service logs pipeline_pipeline-isanteplus1 2>&1 | grep -i "error\|fail\|409" | tail -20 + +# Check SHR mediator for MPI resolution activity +docker service logs shared-health-record_shr 2>&1 | grep -i "MPI resolved" | tail -10 +``` + +### Restart a pipeline + +```bash +docker service update --force pipeline_pipeline-isanteplus1 +``` + +### Adding a pipeline for a new iSantePlus instance + +1. Create `packages/data-pipeline-isanteplus/config/application-isanteplusN.yaml` — copy from an existing config and change `fhirServerUrl` to point at the new instance +2. Add the new service to `packages/data-pipeline-isanteplus/docker-compose.yml` +3. Stagger the `incrementalSchedule` to avoid overlap with other pipelines --- -## Component Modules +## Adding a New iSantePlus Instance + +Each iSantePlus instance requires configuration across multiple components. Here's the checklist for adding instance N (e.g., `isanteplus5`): + +### Step 1 — MySQL database -Each package listed in the configuration file corresponds to a containerized module in the HIE. Below is a brief description of each: +The `projects/isanteplus-db/initdb/10-create-dbs.sh` script automatically creates databases `openmrs`, `openmrs2`, ..., `openmrsN` on first boot. Set `OPENMRS_DB_COUNT` in `.env` to cover the number of instances. -### Interoperability Layer – OpenHIM -- **Purpose:** Acts as the central mediator for all data exchange. It validates, routes, and logs messages between HIE components. -- **Configuration:** Managed via environment variables (e.g., API ports, MongoDB URLs). +The `20-configure-per-instance.sh` script runs on fresh database init and sets: +- xds-sender endpoints pointing to your OpenHIM domain +- idgen sequence offset (instance N starts at N * 100000) +- Unique `mpi-client.pid.local` FHIR system URI per facility -### Reverse Proxy – Nginx -- **Purpose:** Provides a reverse proxy layer to direct incoming requests to the appropriate internal services. -- **Configuration:** Uses the DOMAIN_NAME and SUBDOMAINS to configure virtual hosts. +Add the new facility to the `FACILITY_NAMES` env var (comma-separated, lowercase). -### FHIR Datastore – HAPI FHIR -- **Purpose:** Serves as the FHIR compliant datastore for healthcare records. -- **Configuration:** Linked with the OpenHIM layer for secure data exchange and uses Postgres as the backend. +### Step 2 — iSantePlus docker-compose -### Monitoring -- **Purpose:** Collects metrics and logs from all services to facilitate system health monitoring and debugging. -- **Configuration:** Environment variables define memory and instance limits. +Add the new service to `packages/emr-isanteplus/docker-compose.yml`: -### Database Modules – Postgres & MySQL -- **Purpose:** Provide robust data storage for different parts of the HIE. -- **Configuration:** Integrated with replication settings (for Postgres) and tailored resource allocations. +```yaml +isanteplusN: + image: itechuw/docker-isanteplus-server:local-2 + environment: + - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_N} + - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_N} + - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_N} + # ... (copy remaining OMRS env vars from existing instances) + volumes: + - isanteplusN-data:/openmrs/data + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + networks: + - public + - reverse-proxy + - mysql + - openhim +``` + +Add the volume under `volumes:` and the database variables to `package-metadata.json`. + +### Step 3 — Nginx reverse proxy + +Add a server block to `packages/reverse-proxy-nginx/package-conf-secure/`: + +```nginx +server { + listen 80; + server_name facilityname.*; + location / { return 301 https://$host$request_uri; } +} +server { + listen 443 ssl; + server_name facilityname.*; + location / { + resolver 127.0.0.11 valid=30s; + set $upstream_isanteplusN isanteplusN; + proxy_pass http://$upstream_isanteplusN:8080; + } +} +``` -### Analytics Datastore – ElasticSearch -- **Purpose:** Stores and indexes analytics data, enabling rapid query and reporting. -- **Configuration:** Resource limits ensure that heavy data loads do not impact system performance. +Add the subdomain to `SUBDOMAINS` in `.env`. + +### Step 4 — .env variables + +``` +OMRS_CONFIG_CONNECTION_URL_N=jdbc:mysql://mysql:3306/openmrsN?autoReconnect=true +OMRS_CONFIG_CONNECTION_USERNAME_N=openmrsN +OMRS_CONFIG_CONNECTION_PASSWORD_N=dev_password_only +SUBDOMAIN_CORE_ISANTEPLUSN=facilityname +``` + +--- + +## SSL/TLS Certificates + +### How it works + +Certificates are provisioned during `init` via Certbot. The `set-secure-mode.sh` script: +1. Generates a staging (dummy) cert to bootstrap nginx +2. Scales nginx down to free port 80 +3. Generates a production cert via HTTP-01 challenge +4. Updates nginx Docker secrets with the real cert and scales back up + +### Rate limits + +Let's Encrypt allows **5 certificates per exact domain set per 7 days**. If you hit this limit, you'll see: + +``` +too many certificates (5) already issued for this exact set of identifiers +``` -### Message Bus – Kafka -- **Purpose:** Facilitates asynchronous message passing between HIE components. -- **Configuration:** Topics and host addresses are defined through environment variables. +**Workaround**: Request a cert with a different subset of domains (a different "exact set" is not rate-limited): -### Shared Health Record – FHIR / OpenSHR -- **Purpose:** Manages shared patient records in a standardized FHIR format. -- **Configuration:** Tightly integrated with the FHIR datastore and OpenHIM for secure data flow. +```bash +# Scale down nginx to free port 80 +docker service scale reverse-proxy_reverse-proxy-nginx=0 + +# Request cert with fewer domains +docker run --rm --network host --name certbot \ + -v prod-certbot-conf:/etc/letsencrypt/archive/${DOMAIN_NAME} \ + certbot/certbot:v1.23.0 certonly -n --standalone \ + -m admin@${DOMAIN_NAME} \ + -d "${DOMAIN_NAME},subdomain1.${DOMAIN_NAME},subdomain2.${DOMAIN_NAME}" \ + --agree-tos + +# Copy certs and create Docker secrets +docker run --rm --network host -w /temp \ + -v prod-certbot-conf:/temp-certificates \ + -v instant:/temp busybox sh \ + -c "rm -rf certificates; mkdir -p certificates; cp -r /temp-certificates/* /temp/certificates" + +TIMESTAMP=$(date "+%Y%m%d%H%M%S") +docker secret create --label name=nginx "${TIMESTAMP}-fullchain.pem" \ + <(docker run --rm -v instant:/temp busybox cat /temp/certificates/fullchain1.pem) +docker secret create --label name=nginx "${TIMESTAMP}-privkey.pem" \ + <(docker run --rm -v instant:/temp busybox cat /temp/certificates/privkey1.pem) + +# Swap secrets on nginx and scale back up +CURR_FULL=$(docker service inspect reverse-proxy_reverse-proxy-nginx \ + --format '{{(index .Spec.TaskTemplate.ContainerSpec.Secrets 0).SecretName}}') +CURR_KEY=$(docker service inspect reverse-proxy_reverse-proxy-nginx \ + --format '{{(index .Spec.TaskTemplate.ContainerSpec.Secrets 1).SecretName}}') + +docker service update --replicas 1 \ + --secret-rm "$CURR_FULL" --secret-rm "$CURR_KEY" \ + --secret-add source=${TIMESTAMP}-fullchain.pem,target=/run/secrets/fullchain.pem \ + --secret-add source=${TIMESTAMP}-privkey.pem,target=/run/secrets/privkey.pem \ + reverse-proxy_reverse-proxy-nginx + +# Clean up +docker volume rm prod-certbot-conf +``` -### Sedish Haiti Custom Packages -- **Modules:** - - **emr-isanteplus** - - **data-pipeline-isanteplus** +### User-supplied certificates -- **Purpose:** These packages provide additional functionality specific to the Sedish Haiti deployment, such as electronic medical records, data pipelines, and document storage. -- **Configuration:** Managed through package-specific environment variables and integrated with the core HIE components. +1. Place `fullchain.pem` and `privkey.pem` on the host +2. Set paths in `.env`: + ``` + USE_PROVIDED_CERTIFICATES=true + HOST_PROVIDED_CERT_FULLCHAIN_PATH=/ssl/your_domain/fullchain.pem + HOST_PROVIDED_CERT_PRIVKEY_PATH=/ssl/your_domain/privkey.pem + ``` +3. Rebuild: `./build-image.sh` +4. Redeploy: `./instant package init -n reverse-proxy-nginx --env-file .env` --- -## Summary of Deployment Steps +## Redeployment Scenarios -### First-Time / Fresh Deploy (New Server) +### Redeploy a single package -#### Step 1 — Provision and prepare the server ```bash -sudo apt update && sudo apt upgrade -y +./instant package down -n --env-file .env +./instant package up -n --env-file .env + +# If HAPI FHIR: +./packages/fhir-datastore-hapi-fhir/post-deploy.sh ``` -Minimum recommended specs: **8 GB RAM**, sufficient disk for Docker images and volumes. -#### Step 2 — Install Git, Git LFS, and Docker +### Rebuild and redeploy after code changes + ```bash -# Git -sudo apt install -y git +# If iSantePlus Dockerfile or modules changed: +docker build -t itechuw/docker-isanteplus-server:local-2 packages/emr-isanteplus/ -# Git LFS — CRITICAL: without this, .omod and .sql files will be 132-byte pointer stubs -curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash -sudo apt-get install -y git-lfs -git lfs install +# Force the service to pick up the new image: +docker service update --force isanteplus_isanteplus ``` -Install Docker by following the [official Docker CE guide](https://docs.docker.com/engine/install/ubuntu/). -#### Step 3 — Initialize Docker Swarm +### Full teardown and redeploy + ```bash -docker swarm init +# 1. Stop all services +./instant project down --env-file .env + +# 2. Rebuild images (if code changed) +docker build -t itechuw/docker-isanteplus-server:local-2 packages/emr-isanteplus/ +./build-image.sh + +# 3. Deploy +./instant project init --env-file .env + +# 4. Apply HAPI FHIR overrides +./packages/fhir-datastore-hapi-fhir/post-deploy.sh + +# 5. Verify +docker service ls --format '{{.Name}} {{.Replicas}}' | grep '0/' | grep -v 'await-helper\|config-importer' ``` -#### Step 4 — Clone the repository +### Complete wipe (destroys all data) + ```bash -git clone https://github.com/I-TECH-UW/sedish-haiti.org.git -cd sedish-haiti.org +sudo bash purge-local.sh +# Then follow Quick Start from step 5 ``` -#### Step 5 — Pull Git LFS files (must happen after clone) +--- + +## Troubleshooting + +### Quick diagnostics + ```bash -git lfs pull +# Which services are down? +docker service ls --format '{{.Name}} {{.Replicas}}' | grep '0/' +# Expected at 0/1: await-helper, config-importer. Everything else should be 1/1. + +# Check logs for a specific service +docker service logs --tail 50 + +# Check logs for a specific container (faster for large log histories) +docker logs $(docker ps -q -f name=.1) --tail 50 + +# Force restart a stuck service +docker service update --force + +# Check what networks a service is on +docker inspect $(docker ps -q -f name=) \ + --format '{{range $net, $conf := .NetworkSettings.Networks}}{{$net}} {{end}}' + +# Check env vars on a running service +docker service inspect \ + --format '{{range .Spec.TaskTemplate.ContainerSpec.Env}}{{println .}}{{end}}' + +# Check env vars inside a running container +docker exec $(docker ps -q -f name=.1) env | grep ``` -Verify the `.omod` files are real — they should be megabytes, **not** 132 bytes: + +### iSantePlus returns 404 + +OpenMRS is still booting. First boot takes **10–15 minutes** (module loading, liquibase migrations, Spring context refresh). Check progress: + ```bash -ls -lh packages/emr-isanteplus/config/custom_modules/ +docker logs $(docker ps -q -f name=isanteplus_isanteplus.1) --tail 10 ``` -If any file shows `132` bytes it is still a pointer stub — re-run `git lfs pull`. -#### Step 6 — Configure `.env` +- `Refreshing Context` — still loading, almost done +- `DispatcherServlet.noHandlerFound` — REST API not mapped yet, still refreshing +- `referenceapplication.started value: true` — boot complete + +If it's stuck, check the container uptime: + ```bash -cp .env.hie .env -# Edit .env: set DOMAIN_NAME, SUBDOMAINS, RENEWAL_EMAIL, and any site-specific values +docker ps --format "{{.Names}}\t{{.Status}}" | grep isanteplus ``` -See the sample `.env` in the [Project Structure](#2-explore-project-structure) section above. -#### Step 7 — Download the Instant OpenHIE CLI +### iSantePlus container restarts every ~7 minutes + +The base image `startup.sh` uses `wait ${!}` which waits for the last background process (post-start.sh), not Tomcat. When post-start.sh completes, the container exits. This is fixed in the custom Dockerfile which captures `TOMCAT_PID=$!` and uses `wait $TOMCAT_PID`. + +If the container is still restarting, rebuild the image: + ```bash -./get-cli.sh linux +docker build -t itechuw/docker-isanteplus-server:local-2 packages/emr-isanteplus/ +docker service update --force isanteplus_isanteplus ``` -#### Step 8 — Create required host directories +### iSantePlus post-start.sh not running or timing out + ```bash -sudo mkdir -p /backups/elasticsearch +# Check post-start output for a specific instance +docker logs $(docker ps -q -f name=isanteplus_isanteplus.1) 2>&1 | grep "\[post-start\]" ``` -The Elasticsearch analytics service requires this directory to exist as a bind mount for snapshots. -#### Step 9 — Build Docker images +- `Waiting for OpenMRS to be ready...` — still polling, OpenMRS not ready yet +- `OpenMRS is ready (after Xs)` — success, then check for `Set xdssender.*` lines +- `ERROR: OpenMRS did not become ready after 900s` — timed out; OpenMRS may need more time or has an error + +If post-start timed out, check if OpenMRS is actually running: + ```bash -./build-custom-images.sh # builds isanteplus-mysql, analytics elasticsearch, and other custom images -./build-image.sh # builds the management/deployment image +docker exec $(docker ps -q -f name=isanteplus_isanteplus.1) \ + curl -sf -u admin:Admin123 http://localhost:8080/openmrs/ws/rest/v1/session ``` -#### Step 10 — Deploy (first time only) +### Patient creation fails with "Select a preferred identifier" + +The idgen auto-generation is not working. Check the idgen configuration: + ```bash -./instant project init --env-file .env +# Check idgen sequence config +docker exec $(docker ps -q -f name=mysql_mysql) \ + mysql -u openmrs -pdev_password_only openmrs -e \ + "SELECT prefix, next_sequence_value FROM idgen_seq_id_gen WHERE id = 1;" + +# Check auto-generation is enabled +docker exec $(docker ps -q -f name=mysql_mysql) \ + mysql -u openmrs -pdev_password_only openmrs -e \ + "SELECT * FROM idgen_auto_generation_option;" ``` -This provisions SSL certificates, runs all importers (OpenHIM channels/clients, HAPI FHIR database, etc.), and starts all services. **Use `init` only once per clean environment.** -#### Step 11 — Verify deployment +The `automatic_generation_enabled` column must be `1` and `source` must point to a valid `idgen_identifier_source`. + +### OpenCR merges/overwrites patients from different facilities + +Check that each instance has a unique `mpi-client.pid.local`: + ```bash -docker service ls +for svc in isanteplus isanteplus2 isanteplus3 isanteplus4; do + echo -n "$svc: " + docker exec $(docker ps -q -f name=isanteplus_${svc}.1) \ + curl -s -u admin:Admin123 \ + "http://localhost:8080/openmrs/ws/rest/v1/systemsetting/mpi-client.pid.local" 2>/dev/null \ + | grep -o '"value":"[^"]*"' | sed 's/"value":"//;s/"//' +done ``` -All services should show `1/1` (or their expected replica count). Check logs for any failures: + +If they're all the same (e.g., `http://isanteplus/ws/fhir2/pid/openmrsid/`), the `20-configure-per-instance.sh` didn't run. Fix manually: + ```bash -docker service logs +# Replace , , for each instance +docker exec $(docker ps -q -f name=mysql_mysql) \ + mysql -u -pdev_password_only -e \ + "UPDATE global_property SET property_value = 'http://./ws/fhir2/pid/openmrsid/' + WHERE property = 'mpi-client.pid.local';" ``` ---- +Then restart the iSantePlus instances to pick up the change. -### Known Gotchas on a Fresh Server +### SSL certificate shows staging issuer -| Issue | Symptom | Fix | -|---|---|---| -| Git LFS not installed before clone | `.omod` files are 132 bytes; OpenMRS returns HTTP 404 on home page | `git lfs pull`, then rebuild: `./build-custom-images.sh` and force-update the service | -| `hapi` database not created | HAPI FHIR crashes with `FATAL: database "hapi" does not exist` | `docker exec psql -U postgres -c "CREATE DATABASE hapi;"` then `docker service update --force hapi-fhir_hapi-fhir` | -| OpenHIM importer uses wrong password | Channels/clients/mediators not imported (401 errors in logs) | Default password is `instant101` — already corrected in this repo | -| nginx ports missing after `up` | Subdomains unreachable after restart | See the manual restore command in [Stopping and Cleaning Up](#stopping-and-cleaning-up) | +```bash +# Check current certificate +docker exec $(docker ps -q -f name=reverse-proxy_reverse-proxy-nginx) \ + openssl x509 -in /run/secrets/fullchain.pem -noout -issuer -subject -dates +``` ---- +If issuer contains `(STAGING)`, the production cert generation failed. Common causes: +- **Port 80 was not free** — nginx wasn't scaled down before certbot ran +- **Rate limited** — too many certs issued in the last 7 days +- **DNS not pointing to server** — the domain must resolve to this server's IP -# Post-Deployment Configuration - - -After the containers are up, complete the following manual configurations: - -## SSL/TLS Certificate Management - -This project supports two methods for managing SSL/TLS certificates for HTTPS, primarily for the Nginx reverse proxy: - -1. **Let's Encrypt (Default)**: - * Certificates are automatically provisioned and renewed via Certbot. - * Active when `USE_PROVIDED_CERTIFICATES="false"` in `.env`. - * Handled by `packages/reverse-proxy-nginx/set-secure-mode.sh`. - -2. **Provided Certificates (User-Supplied)**: - * Use certificates from a third-party Certificate Authority (CA). - * Active when `USE_PROVIDED_CERTIFICATES="true"` in `.env`. - -### Using Provided Certificates - -1. **Securely Store Certificates on Host**: - * Place your `fullchain.pem` (server certificate + intermediate CAs) and `privkey.pem` (private key) in a secure directory on the host machine where `./build-image.sh` is executed (e.g., `/ssl/your_domain.com/`). - * Ensure the private key has restrictive permissions (e.g., `chmod 600 /ssl/your_domain.com/privkey.pem`). - -2. **Configure Host Paths in `.env`**: - * In `/home/ubuntu/sedish-haiti.org/.env`, set: - ```properties - # Host paths for certificates, used during 'docker build' - HOST_PROVIDED_CERT_FULLCHAIN_PATH="/ssl/your_domain.com/fullchain.pem" - HOST_PROVIDED_CERT_PRIVKEY_PATH="/ssl/your_domain.com/privkey.pem" - ``` - -3. **Image Build Process (`./build-image.sh`)**: - * `./build-image.sh` reads these host paths from `.env`. - * Uses Docker BuildKit's `--secret` feature to securely pass these files to the build process. - * Certificates are copied into `/opt/certs/` within the management Docker image. This avoids including them in the build context or image layers directly. - -4. **Nginx Configuration (`packages/reverse-proxy-nginx/swarm.sh`)**: - * The `swarm.sh` script uses the in-image paths (defined in `.env` and `package-metadata.json`): - ```properties - # Paths inside the management container for swarm.sh - PROVIDED_CERT_FULLCHAIN_PATH="/opt/certs/fullchain.pem" - PROVIDED_CERT_PRIVKEY_PATH="/opt/certs/privkey.pem" - ``` - * `swarm.sh` creates Docker Swarm secrets from these in-image files. - * These Swarm secrets are mounted into the Nginx service container at `/run/secrets/fullchain.pem` and `/run/secrets/privkey.pem`. - -### Certificate Renewal - -#### Let's Encrypt Certificates -* Renewal is generally handled by Certbot's standard mechanisms. The initial setup is done by `set-secure-mode.sh`. For ongoing automated renewal, ensure Certbot's renewal process (e.g., via a cron job running `certbot renew` in the Certbot container) is active. - -#### Provided Certificates (Manual Process) - -1. **Obtain Renewed Certificates**: - * Get the new `fullchain.pem` and `privkey.pem` from your CA. - -2. **Replace Old Certificates on Host**: - * Update the files on the host machine at the locations specified by `HOST_PROVIDED_CERT_FULLCHAIN_PATH` and `HOST_PROVIDED_CERT_PRIVKEY_PATH` in your `.env` file. - -3. **Re-build the Management Docker Image**: - * This incorporates the new certificates into the image. - ```bash - sudo ./build-image.sh - ``` - -4. **Update the Nginx Service**: - * Re-initialize or update the `reverse-proxy-nginx` package to apply the new certificates. - ```bash - sudo ./instant package init -n reverse-proxy-nginx --env-file .env - # Or, if already initialized: - # sudo ./instant package up -n reverse-proxy-nginx --env-file .env - ``` - * This triggers `swarm.sh` to create new Docker Swarm secrets from the updated certificates in the management image and updates the Nginx service. - -- **OpenHIM Setup:** - - Change default passwords. - - Configure users, roles, and API keys. - - Set up channels/routes between OpenHIM and HAPI FHIR. -- **Database Authentication:** - - Verify that Postgres/MySQL instances are secure and that credentials are correctly passed via Docker secrets. -- **Client Systems Registration:** - - Add any external systems or client registries required to interface with the HIE. -- **Connectivity Testing:** - - Test data flows between components (e.g., send test FHIR messages through OpenHIM and verify reception in HAPI FHIR). - ---- +See the [SSL/TLS Certificates](#ssltls-certificates) section for the manual fix. -## Stopping and Cleaning Up +### SSL certificate doesn't cover a subdomain -### Deployment Lifecycle +Check the SANs on the current cert: -| Command | When to use | Volumes preserved? | -|---|---|---| -| `./instant project init --env-file .env` | First-time deploy on a clean environment | N/A | -| `./instant project down --env-file .env` | Stop all services, keep data | Yes | -| `./instant project up --env-file .env` | Restart after a `down` | Yes | -| `./instant package down -n --env-file .env` | Stop one package only | Yes | -| `./instant package up -n --env-file .env` | Restart one package after a `down` | Yes | -| `sudo bash purge-local.sh` | Full wipe — destroy everything | **No** | +```bash +docker exec $(docker ps -q -f name=reverse-proxy_reverse-proxy-nginx) \ + openssl x509 -in /run/secrets/fullchain.pem -noout -text | grep "DNS:" +``` ---- +If a subdomain is missing, regenerate the cert with the correct domain list (see rate limit workaround above). -### Scenario A — Change a single package and redeploy it +### Browser shows HSTS error (can't bypass) -Use this when you've edited config files, scripts, or environment variables for one component and don't want to restart everything. +Firefox/Zen will refuse to load a page with a staging cert if HSTS is enabled. The only fix is to get a valid production certificate. In Chrome, you can: +1. Go to `chrome://net-internals/#hsts` +2. Delete the domain under "Delete domain security policies" +3. Revisit and click "Advanced → Proceed" + +### SHR (HAPI FHIR browser) returns 502 + +HAPI FHIR needs to be on the `reverse-proxy_public` network: ```bash -# 1. Stop just the package you changed -./instant package down -n --env-file .env +docker service update --network-add reverse-proxy_public hapi-fhir_hapi-fhir +``` -# 2. Make your changes (edit files, update .env, etc.) +### HAPI FHIR "database does not exist" -# 3. Bring that package back up -./instant package up -n --env-file .env +```bash +docker exec $(docker ps -q -f name=postgres_postgres-1) \ + env PGPASSWORD=instant101 psql -U postgres -c 'CREATE DATABASE hapi;' +docker service update --force hapi-fhir_hapi-fhir ``` -Package names match the folder names under `packages/` and `projects/`, e.g.: -- `interoperability-layer-openhim` -- `fhir-datastore-hapi-fhir` -- `emr-isanteplus` -- `client-registry-opencr` -- `reverse-proxy-nginx` +### HAPI FHIR missing configuration overrides -**If your change involves rebuilding a Docker image** (e.g. you changed a Dockerfile or updated `.omod` files in `emr-isanteplus`): ```bash -# Rebuild the image first -./build-custom-images.sh +docker service inspect hapi-fhir_hapi-fhir \ + --format '{{range .Spec.TaskTemplate.ContainerSpec.Env}}{{println .}}{{end}}' \ + | grep -E 'referential|client_id' +``` + +If missing, run `./packages/fhir-datastore-hapi-fhir/post-deploy.sh`. + +### OpenHIM MongoDB "NotWritablePrimary" + +```bash +# Check replica set status +docker exec $(docker ps -q -f name=openhim_mongo-1) mongo --eval "rs.status()" -# Then force the service to use the new image -docker service update --force --image : _ -# Example: -docker service update --force --image itechuw/docker-isanteplus-server:local-2 isanteplus_isanteplus +# Initialize replica set +docker exec $(docker ps -q -f name=openhim_mongo-1) mongo --eval \ + 'rs.initiate({_id:"mongo-set",members:[{_id:0,host:"mongo-1:27017"}]})' + +# Restart OpenHIM Core +docker service update --force openhim_openhim-core + +# Re-import channels/clients (if MongoDB was wiped) +./instant package init -n interoperability-layer-openhim --env-file .env ``` -> You do **not** need to `down` the package first for an image-only update — `--force` triggers a rolling restart with the new image. ---- +### Instant CLI deploys with empty env vars -### Scenario B — Stop everything, make changes, restart all +If you run `docker stack deploy` directly (instead of via `./instant`), the `${OMRS_CONFIG_*}` variables in docker-compose.yml will resolve to empty strings because they come from `package-metadata.json`, which the instant CLI reads. -Use this when you've made cross-cutting changes (e.g. `.env` variables that affect multiple services). +**Always use the instant CLI to deploy packages:** ```bash -# 1. Stop all services (volumes are preserved) -./instant project down --env-file .env +./instant package init -n emr-isanteplus --env-file .env +``` + +If you need to update a single service's env var without redeploying: -# 2. Make your changes - -# 3. Restart all services -./instant project up --env-file .env -``` - -> **Known issue — nginx SSL ports after `up`:** The `up` command re-runs the nginx setup, which can leave nginx without its published ports (80/443) and SSL certificates. After every `up`, check that subdomains are reachable. If not, restore nginx manually: -> ```bash -> # Find the most recent cert/config timestamp -> docker secret ls | grep fullchain -> docker config ls | grep nginx -> -> # Restore nginx with the latest timestamp -> TIMESTAMP= -> docker service update \ -> --config-add source=${TIMESTAMP}-nginx.conf,target=/etc/nginx/nginx.conf \ -> --secret-add source=${TIMESTAMP}-fullchain.pem,target=/run/secrets/fullchain.pem \ -> --secret-add source=${TIMESTAMP}-privkey.pem,target=/run/secrets/privkey.pem \ -> --publish-add published=80,target=80 \ -> --publish-add published=443,target=443 \ -> reverse-proxy_reverse-proxy-nginx -> ``` +```bash +docker service update --env-add KEY=VALUE +``` + +### Checking and updating idgen sequences directly + +```bash +# Check all databases +for db in openmrs openmrs2 openmrs3 openmrs4; do + echo "=== $db ===" + docker exec $(docker ps -q -f name=mysql_mysql) \ + mysql -u "$db" -pdev_password_only "$db" -e \ + "SELECT prefix, next_sequence_value FROM idgen_seq_id_gen WHERE id = 1;" 2>&1 | grep -v Warning +done + +# Update a specific database's sequence offset +docker exec $(docker ps -q -f name=mysql_mysql) \ + mysql -u openmrs2 -pdev_password_only openmrs2 -e \ + "UPDATE idgen_seq_id_gen SET next_sequence_value = 200000 WHERE id = 1;" +``` --- -### Scenario C — Full reset (wipe everything and start fresh) +## OpenHIM Client Password Management -Use this only when you want to destroy all data and start from zero. +OpenHIM clients authenticate on port 5001 using Basic auth with SHA512-hashed passwords. -```bash -sudo bash purge-local.sh +**Generate a password hash:** + +```python +python3 -c " +import hashlib, os +password = 'instant101' +salt = os.urandom(16).hex() +hash_val = hashlib.sha512((password + salt).encode()).hexdigest() +print(f'passwordSalt: {salt}') +print(f'passwordHash: {hash_val}') +" ``` -> **Important:** -> - Run as `sudo bash purge-local.sh`, **not** `sudo ./purge-local.sh`. The script waits for all containers to fully stop before returning, so it is safe to run `./instant project init` immediately after. -> - This is **irreversible** — all persistent data (databases, certificates, configs) will be deleted. -> - After a purge, follow the [First-Time / Fresh Deploy](#first-time--fresh-deploy-new-server) steps above, starting from `./build-custom-images.sh`. +> Formula: `sha512(password + salt)` — **password first, then salt**. + +**Files that must stay in sync:** + +| File | Field | +|------|-------| +| `packages/data-pipeline-isanteplus/config/application.yaml` | `sinkUserName` / `sinkPassword` | +| `packages/interoperability-layer-openhim/importer/volume/openhim-import.json` | Client `passwordHash` / `passwordSalt` | --- +## Security Considerations -## Troubleshooting & Logging +- **Default passwords**: Change `Admin123`, `instant101`, `dev_password_only` before production use +- **Docker Secrets**: Use for sensitive configuration (passwords, API keys) +- **Swarm Locking**: Rotate the CA key with `docker swarm ca --rotate` +- **SSH Hardening**: Key-based auth only, disable root login +- **Firewall**: Restrict inbound traffic to ports 80, 443 only +- **Encryption**: Enable disk encryption for data at rest -- **Logs:** - All service logs are stored in `/tmp/logs` (or the location specified by `BASHLOG_FILE_PATH` in your .env file). Review these logs for error messages and warnings. -- **Health Checks:** - Use built-in container health checks and monitor via Docker Swarm’s service status. -- **Security Audits:** - Periodically rotate secrets and swarm CA keys. Review AWS CloudWatch and GuardDuty logs for any anomalies. +--- + +## Project Structure + +``` +sedish/ +├── .env # Environment configuration +├── build-custom-images.sh # Builds iSantePlus, MySQL, ES images +├── build-image.sh # Builds the management/deployment image +├── get-cli.sh # Downloads the Instant OpenHIE CLI +├── instant # Instant OpenHIE CLI binary +├── packages/ +│ ├── reverse-proxy-nginx/ # Nginx + Let's Encrypt +│ ├── interoperability-layer-openhim/ # OpenHIM +│ ├── fhir-datastore-hapi-fhir/ # HAPI FHIR + post-deploy.sh +│ ├── shared-health-record-fhir/ # SHR Mediator +│ ├── emr-isanteplus/ # iSantePlus EMR +│ │ ├── Dockerfile # Custom image with post-start.sh +│ │ ├── config/post-start.sh # Auto-configures xds-sender on boot +│ │ └── docker-compose.yml # Service definitions for all instances +│ ├── data-pipeline-isanteplus/ # FHIR data pipelines (one per instance) +│ │ ├── config/application-isanteplus1.yaml # Pipeline 1 → isanteplus +│ │ ├── config/application-isanteplus2.yaml # Pipeline 2 → isanteplus2 +│ │ └── docker-compose.yml +│ ├── client-registry-opencr/ # OpenCR +│ ├── database-postgres/ # PostgreSQL +│ ├── database-mysql/ # MySQL +│ ├── identity-access-manager-keycloak/ # Keycloak +│ └── monitoring/ # Grafana + Prometheus + Loki +└── projects/ + └── isanteplus-db/ # MySQL seed data for iSantePlus + ├── Dockerfile # Custom MySQL image + └── initdb/ + ├── 10-create-dbs.sh # Creates openmrs, openmrs2, ... databases + ├── 20-configure-per-instance.sh # Sets sequence offsets + unique URIs + └── isanteplus-db.sql # Base SQL dump (Git LFS) +``` --- ## Additional Resources -- [Instant OpenHIE Documentation](https://jembi.gitbook.io/instant-v2) -- [Jembi Platform README on GitHub](https://github.com/jembi/platform/blob/main/README.md) -- [Docker Swarm Best Practices](https://docs.docker.com/engine/swarm/how-swarm-mode-works/) -- [AWS Security Best Practices](https://aws.amazon.com/security/) -- [Docker Secrets Documentation](https://docs.docker.com/engine/swarm/secrets/) - -~ \ No newline at end of file +- [Instant OpenHIE v2 Documentation](https://jembi.gitbook.io/instant-v2) +- [Jembi Platform](https://github.com/jembi/platform) +- [OpenHIM Documentation](http://openhim.org/docs/) +- [HAPI FHIR Documentation](https://hapifhir.io/hapi-fhir/docs/) +- [OpenCR Documentation](https://intrahealth.github.io/client-registry/) +- [iSantePlus Wiki](https://wiki.openmrs.org/display/RES/iSantePlus) diff --git a/config.yaml b/config.yaml index 31752b3c..2c591b76 100644 --- a/config.yaml +++ b/config.yaml @@ -5,64 +5,15 @@ logPath: /tmp/logs packages: - interoperability-layer-openhim - reverse-proxy-nginx - - fhir-datastore-hapi-fhir - - monitoring - database-postgres - database-mysql - - identity-access-manager-keycloak - - client-registry-opencr - - analytics-datastore-elastic-search + - fhir-datastore-hapi-fhir - shared-health-record-fhir - # Sedish Haiti packages + - client-registry-opencr - emr-isanteplus - - data-pipeline-isanteplus - - lnsp-mediator - - - -profiles: - - name: dev - packages: - - interoperability-layer-openhim - - reverse-proxy-nginx - - fhir-datastore-hapi-fhir - - monitoring - - database-postgres - - identity-access-manager-keycloak - - client-registry-opencr - - analytics-datastore-elastic-search - - shared-health-record-fhir - - dashboard-visualiser-kibana - # Sedish Haiti packages - - emr-isanteplus - - data-pipeline-isanteplus - - document-data-store-xds - - shared-health-record-openshr - - openhim-mediator-openxds - envFiles: - - .env - dev: true - only: false - - - name: prod - packages: - - interoperability-layer-openhim - - reverse-proxy-nginx - - fhir-datastore-hapi-fhir - - monitoring - - database-postgres - - identity-access-manager-keycloak - - client-registry-opencr - - analytics-datastore-elastic-search - - shared-health-record-fhir - - dashboard-visualiser-kibana - # Sedish Haiti packages - - emr-isanteplus - - data-pipeline-isanteplus - - document-data-store-xds - - shared-health-record-openshr - - openhim-mediator-openxds - envFiles: - - .env.prod - dev: false - only: false + - data-pipeline-isanteplus # One pipeline per iSantePlus instance + # Not needed for core HIE — uncomment to enable: + # - monitoring # Grafana/Prometheus/Loki (~7 containers, ~3GB RAM) + # - identity-access-manager-keycloak # SSO — OpenHIM works without it (~1GB RAM) + # - analytics-datastore-elastic-search # Kibana analytics — OpenCR bundles its own ES (~3GB RAM) + - lnsp-mediator # Lab integration — not in active use (~500MB RAM) diff --git a/packages/client-registry-opencr/config/config.json b/packages/client-registry-opencr/config/config.json index 115e0947..cc248847 100755 --- a/packages/client-registry-opencr/config/config.json +++ b/packages/client-registry-opencr/config/config.json @@ -41,16 +41,56 @@ }, "clients": [ { - "id": "openmrs", - "displayName": "OpenMRS" + "id": "hueh", + "displayName": "HUEH" + }, + { + "id": "lapaix", + "displayName": "La Paix" + }, + { + "id": "ofatma", + "displayName": "OFATMA" + }, + { + "id": "foyer-saint-camille", + "displayName": "Foyer Saint Camille" + }, + { + "id": "klinik-eritaj", + "displayName": "Klinik Eritaj" + }, + { + "id": "ofatma-sonapi", + "displayName": "OFATMA SONAPI" + }, + { + "id": "gressierms", + "displayName": "Gressier MS" }, { - "id": "dhis2", - "displayName": "DHIS2" + "id": "pestel", + "displayName": "Pestel" }, { - "id": "lims", - "displayName": "Lab Info Management System" + "id": "stdemiragoane", + "displayName": "St Demir Agoane" + }, + { + "id": "bethel-fdn", + "displayName": "Bethel FDN" + }, + { + "id": "openshr", + "displayName": "Shared Health Record" + }, + { + "id": "shr-pipeline", + "displayName": "SHR Pipeline" + }, + { + "id": "openmrs", + "displayName": "OpenMRS" }, { "id": "cr", @@ -98,6 +138,13 @@ ], "displayName": "ART Number" }, + "codepc": { + "uri": [ + "http://isanteplus.org/openmrs/fhir2/9-code-pc", + "http://isanteplus.sedish-haiti.org/openmrs/fhir2/9-code-pc" + ], + "displayName": "Code PC" + }, "biometricnational": { "uri": [ "http://isanteplus.org/openmrs/fhir2/6-biometrics-national-reference-code" diff --git a/packages/client-registry-opencr/config/decisionRules.json b/packages/client-registry-opencr/config/decisionRules.json index dd3c9615..62270484 100755 --- a/packages/client-registry-opencr/config/decisionRules.json +++ b/packages/client-registry-opencr/config/decisionRules.json @@ -1,94 +1,368 @@ { "__comments": { - "path": "Its a fhir path, for syntax refer to https://www.hl7.org/fhir/fhirpath.html", - "matchingType": "Must be specified, it can either", + "path": "FHIR path syntax: https://www.hl7.org/fhir/fhirpath.html", "threshold": { - "levenshtein": "Lower the number, the closer the match, 0 being exact match, max threshold is 2", - "jaro-winkler": "number between 0 and 1, where 0 for no match and 1 for exact match" + "jaro-winkler": "0 = no match, 1 = exact match", + "DateDamerau": "0 = no match, 1 = exact match (handles date typos)" }, - "supported_algorithms": { - "elasticsearch": [ - "https://github.com/intrahealth/similarity-scoring" - ] + "null_handling": { + "conservative": "not a match if null", + "moderate": "doesn't affect the score", + "greedy": "treated as a match" }, - "nullHandling": { - "nullHandling": "by itself means it is used with either one value or both are null.", - "nullHandlingBothFields": "it means both values are null", - "descriptions": "if you have nullHandling and nullHandlingBothFields, then nullHandling is for when only 1 value is null and nullHandlingBothFields is for when both are null.", - "possible_values_for_nullHandling": { - "conservative": "means it's not a match", - "moderate": "means it doesn't affect the score", - "greedy": "means it is a match" - }, - "example": [ - "if you have nullHandling = 'conservative' and that's it, and one or both are null, then it won't be considered a match.", - "if you have nullHandling = 'conservative' and nullHandlingBothFields = 'greedy' then if only 1 is null, then it won't be a match, but if both are null then it will be." - ] + "haiti_identifier_systems": { + "biometric": "http://isanteplus.org/openmrs/fhir2/6-biometrics-national-reference-code", + "code_national": "http://isanteplus.org/openmrs/fhir2/5-code-national", + "isanteplus_id": "http://isanteplus.org/openmrs/fhir2/3-isanteplus-id", + "code_st": "http://isanteplus.org/openmrs/fhir2/6-code-st" } }, "rules": [ - { + "__description": "Rule 1: Biometric exact match — strongest identifier", "matchingType": "deterministic", + "rule": "1", "fields": { "biometric": { - "algorithm": "jaro-winkler-similarity", - "threshold": 1, + "algorithm": "exact", "fhirpath": "identifier.where(system='http://isanteplus.org/openmrs/fhir2/6-biometrics-national-reference-code').value", "espath": "biometric", "null_handling": "conservative", "null_handling_both": "conservative" } }, + "potentialMatchThreshold": 2, + "autoMatchThreshold": 2 + }, + { + "__description": "Rule 2: Code National exact match — national ID", + "matchingType": "deterministic", + "rule": "2", + "fields": { + "code_national": { + "algorithm": "exact", + "fhirpath": "identifier.where(system='http://isanteplus.org/openmrs/fhir2/5-code-national').value", + "espath": "codeNational", + "null_handling": "conservative", + "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 2, "autoMatchThreshold": 2 }, - { + "__description": "Rule 3: Code National + full demographics — national ID with demographic confirmation", "matchingType": "deterministic", + "rule": "3", "fields": { + "code_national": { + "algorithm": "exact", + "fhirpath": "identifier.where(system='http://isanteplus.org/openmrs/fhir2/5-code-national').value", + "espath": "codeNational", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "family": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').family", + "espath": "family", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, "given": { - "algorithm": "jaro-winkler-similarity", - "threshold": 1, - "fhirpath": "name.where(use='official').given", + "algorithm": "exact", + "fhirpath": "name.where(use='official').first().given", "espath": "given", "null_handling": "conservative", "null_handling_both": "conservative" }, + "gender": { + "algorithm": "exact", + "fhirpath": "gender", + "espath": "gender", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "birthDate": { + "algorithm": "exact", + "fhirpath": "birthDate", + "espath": "birthDate", + "null_handling": "conservative", + "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 6, + "autoMatchThreshold": 6 + }, + { + "__description": "Rule 4: iSantePlus ID + full demographics — facility ID with demographic confirmation", + "matchingType": "deterministic", + "rule": "4", + "fields": { + "isanteplus_id": { + "algorithm": "exact", + "fhirpath": "identifier.where(system='http://isanteplus.org/openmrs/fhir2/3-isanteplus-id').value", + "espath": "isanteplusId", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, "family": { - "algorithm": "jaro-winkler-similarity", - "threshold": 1, + "algorithm": "exact", + "fhirpath": "name.where(use='official').family", + "espath": "family", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "given": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').first().given", + "espath": "given", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "gender": { + "algorithm": "exact", + "fhirpath": "gender", + "espath": "gender", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "birthDate": { + "algorithm": "exact", + "fhirpath": "birthDate", + "espath": "birthDate", + "null_handling": "conservative", + "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 6, + "autoMatchThreshold": 6 + }, + { + "__description": "Rule 5: Exact demographics — given + family + gender + birthdate (no identifier needed)", + "matchingType": "deterministic", + "rule": "5", + "fields": { + "given": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').first().given", + "espath": "given", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "family": { + "algorithm": "exact", "fhirpath": "name.where(use='official').family", "espath": "family", "null_handling": "conservative", "null_handling_both": "conservative" }, + "gender": { + "algorithm": "exact", + "fhirpath": "gender", + "espath": "gender", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, "birthDate": { - "algorithm": "jaro-winkler-similarity", - "threshold": 1, + "algorithm": "exact", "fhirpath": "birthDate", "espath": "birthDate", "null_handling": "conservative", "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 5, + "autoMatchThreshold": 6 + }, + { + "__description": "Rule 6: Swapped name detection — catches given/family entered in wrong order", + "matchingType": "deterministic", + "rule": "6", + "fields": { + "given": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').first().given", + "espath": "family", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "family": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').family", + "espath": "given", + "null_handling": "conservative", + "null_handling_both": "conservative" }, "gender": { + "algorithm": "exact", + "fhirpath": "gender", + "espath": "gender", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "birthDate": { + "algorithm": "exact", + "fhirpath": "birthDate", + "espath": "birthDate", + "null_handling": "conservative", + "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 5, + "autoMatchThreshold": 6 + }, + { + "__description": "Rule 7: Fuzzy demographics — catches minor typos in names and birthdates", + "matchingType": "deterministic", + "rule": "7", + "fields": { + "family": { "algorithm": "jaro-winkler-similarity", - "threshold": 1, + "threshold": 0.8, + "fhirpath": "name.where(use='official').family", + "espath": "family", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "given": { + "algorithm": "jaro-winkler-similarity", + "threshold": 0.8, + "fhirpath": "name.where(use='official').first().given", + "espath": "given", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "gender": { + "algorithm": "exact", "fhirpath": "gender", "espath": "gender", "null_handling": "conservative", "null_handling_both": "conservative" }, + "birthDate": { + "algorithm": "DateDamerau", + "threshold": 0.8, + "fhirpath": "birthDate", + "espath": "birthDate", + "null_handling": "conservative", + "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 5, + "autoMatchThreshold": 6 + }, + { + "__description": "Rule 8: Exact names + fuzzy birthdate — catches birthdate typos with exact name match", + "matchingType": "deterministic", + "rule": "8", + "fields": { + "given": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').first().given", + "espath": "given", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "family": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').family", + "espath": "family", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "gender": { + "algorithm": "exact", + "fhirpath": "gender", + "espath": "gender", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "birthDate": { + "algorithm": "DateDamerau", + "threshold": 0.8, + "fhirpath": "birthDate", + "espath": "birthDate", + "null_handling": "conservative", + "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 5, + "autoMatchThreshold": 6 + }, + { + "__description": "Rule 9: Code National + demographics without birthdate — for patients with missing DOB", + "matchingType": "deterministic", + "rule": "9", + "fields": { + "code_national": { + "algorithm": "exact", + "fhirpath": "identifier.where(system='http://isanteplus.org/openmrs/fhir2/5-code-national').value", + "espath": "codeNational", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "family": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').family", + "espath": "family", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "given": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').first().given", + "espath": "given", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "gender": { + "algorithm": "exact", + "fhirpath": "gender", + "espath": "gender", + "null_handling": "conservative", + "null_handling_both": "conservative" + } + }, + "potentialMatchThreshold": 5, + "autoMatchThreshold": 6 + }, + { + "__description": "Rule 10: Phone + demographics — for patients without identifiers", + "matchingType": "deterministic", + "rule": "10", + "fields": { "phone": { - "algorithm": "jaro-winkler-similarity", - "threshold": 1, + "algorithm": "exact", "fhirpath": "telecom.where(system='phone').value", "espath": "phone", "null_handling": "conservative", "null_handling_both": "conservative" + }, + "family": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').family", + "espath": "family", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "given": { + "algorithm": "exact", + "fhirpath": "name.where(use='official').first().given", + "espath": "given", + "null_handling": "conservative", + "null_handling_both": "conservative" + }, + "gender": { + "algorithm": "exact", + "fhirpath": "gender", + "espath": "gender", + "null_handling": "conservative", + "null_handling_both": "conservative" } }, - "potentialMatchThreshold": 2, - "autoMatchThreshold": 5 + "potentialMatchThreshold": 5, + "autoMatchThreshold": 6 } ] } diff --git a/packages/data-pipeline-isanteplus/config/application.yaml b/packages/data-pipeline-isanteplus/config/application-isanteplus1.yaml similarity index 67% rename from packages/data-pipeline-isanteplus/config/application.yaml rename to packages/data-pipeline-isanteplus/config/application-isanteplus1.yaml index 9f3e03b5..bd8eadc2 100644 --- a/packages/data-pipeline-isanteplus/config/application.yaml +++ b/packages/data-pipeline-isanteplus/config/application-isanteplus1.yaml @@ -1,31 +1,29 @@ fhirdata: fhirFetchMode: "FHIR_SEARCH" - # This is where you set where the Data is fetched from. fhirServerUrl: "http://isanteplus:8080/openmrs/ws/fhir2/R4" fhirServerUserName: "admin" fhirServerPassword: "Admin123" - # This is where you set where the Data is sent to. sinkFhirServerUrl: "http://openhim-core:5001/SHR/fhir" - sinkUserName: "root@openhim.org" + sinkUserName: "shr-pipeline" sinkPassword: "instant101" sinkDbConfigPath: dwhRootPrefix: "/dwh/pipeline_DWH" generateParquetFiles: false - # Incremental pipeline schedule — "0 0 * * * *" = every hour incrementalSchedule: "0 0 * * * *" purgeSchedule: "0 30 * * * *" numOfDwhSnapshotsToRetain: 2 - resourceList: "Patient,Encounter,Observation,Condition,AllergyIntolerance,MedicationRequest,Practitioner,Group" + resourceList: "Practitioner,Location,Patient,Encounter,Observation,Condition,AllergyIntolerance,MedicationRequest,Group" fhirVersion: "R4" numThreads: 1 + autoGenerateFlinkConfiguration: true - rowGroupSizeForParquetFiles: 33554432 # 32mb + rowGroupSizeForParquetFiles: 33554432 recursiveDepth: 1 structureDefinitionsPath: "classpath:/r4-us-core-definitions" createHiveResourceTables: false diff --git a/packages/data-pipeline-isanteplus/config/application-isanteplus2.yaml b/packages/data-pipeline-isanteplus/config/application-isanteplus2.yaml new file mode 100644 index 00000000..902746cf --- /dev/null +++ b/packages/data-pipeline-isanteplus/config/application-isanteplus2.yaml @@ -0,0 +1,37 @@ +fhirdata: + fhirFetchMode: "FHIR_SEARCH" + + fhirServerUrl: "http://isanteplus2:8080/openmrs/ws/fhir2/R4" + fhirServerUserName: "admin" + fhirServerPassword: "Admin123" + + sinkFhirServerUrl: "http://openhim-core:5001/SHR/fhir" + sinkUserName: "shr-pipeline" + sinkPassword: "instant101" + sinkDbConfigPath: + + dwhRootPrefix: "/dwh/pipeline_DWH" + generateParquetFiles: false + + # Offset by 30 min from pipeline-1 to avoid concurrent writes to SHR + incrementalSchedule: "0 30 * * * *" + purgeSchedule: "0 0 * * * *" + numOfDwhSnapshotsToRetain: 2 + + resourceList: "Practitioner,Location,Patient,Encounter,Observation,Condition,AllergyIntolerance,MedicationRequest,Group" + + fhirVersion: "R4" + numThreads: 1 + + autoGenerateFlinkConfiguration: true + rowGroupSizeForParquetFiles: 33554432 + recursiveDepth: 1 + structureDefinitionsPath: "classpath:/r4-us-core-definitions" + createHiveResourceTables: false + createParquetViews: false + +management: + endpoints: + web: + exposure: + include: health,info,metrics,prometheus,pipeline-metrics diff --git a/packages/data-pipeline-isanteplus/docker-compose.yml b/packages/data-pipeline-isanteplus/docker-compose.yml index 7ffdae35..f1587706 100644 --- a/packages/data-pipeline-isanteplus/docker-compose.yml +++ b/packages/data-pipeline-isanteplus/docker-compose.yml @@ -1,54 +1,56 @@ version: "3.9" services: - streaming-pipeline: + pipeline-isanteplus1: image: us-docker.pkg.dev/cloud-build-fhir/fhir-analytics/main:latest environment: - - JAVA_OPTS=-Xms2g -Xmx2g + - JAVA_OPTS=-Xms1g -Xmx1g - FLINK_CONF_DIR=/app/config configs: - - source: application_yaml + - source: application_isanteplus1_yaml target: /app/config/application.yaml - source: flink_conf_yaml target: /app/config/flink-conf.yaml volumes: - - pipeline-dwh:/dwh - ports: - - target: 8080 - published: 8095 - protocol: tcp - mode: host + - pipeline-dwh-1:/dwh + networks: + - openhim + - isanteplus + - hapi-fhir + + pipeline-isanteplus2: + image: us-docker.pkg.dev/cloud-build-fhir/fhir-analytics/main:latest + environment: + - JAVA_OPTS=-Xms1g -Xmx1g + - FLINK_CONF_DIR=/app/config + configs: + - source: application_isanteplus2_yaml + target: /app/config/application.yaml + - source: flink_conf_yaml + target: /app/config/flink-conf.yaml + volumes: + - pipeline-dwh-2:/dwh networks: - openhim - - shr - isanteplus - hapi-fhir configs: - application_yaml: - file: ./config/application.yaml - name: pipeline_application_yaml - labels: - name: pipeline_application_yaml + application_isanteplus1_yaml: + file: ./config/application-isanteplus1.yaml + application_isanteplus2_yaml: + file: ./config/application-isanteplus2.yaml flink_conf_yaml: file: ./config/flink-conf.yaml - name: pipeline_flink_conf_yaml - labels: - name: pipeline_flink_conf_yaml volumes: - pipeline-dwh: + pipeline-dwh-1: + pipeline-dwh-2: networks: openhim: name: openhim_public external: true - shr: - name: shr - external: true - mysql: - name: mysql_public - external: true isanteplus: name: isanteplus_public external: true diff --git a/packages/database-mysql/config/initdb/isanteplus-db.sql b/packages/database-mysql/config/initdb/isanteplus-db.sql index 620af59e..52f4aa1c 100644 --- a/packages/database-mysql/config/initdb/isanteplus-db.sql +++ b/packages/database-mysql/config/initdb/isanteplus-db.sql @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:745ea83f0010fed2da20bcb294518b20eb2f9c31611e175041cb900c30831d4f -size 82058034 +oid sha256:9b1c6909c5a9057592ff994588254ce930de6fe6a745226d8d388be3764d4a03 +size 82058583 diff --git a/packages/emr-isanteplus/Dockerfile b/packages/emr-isanteplus/Dockerfile index a30cd10e..f2fec2f4 100644 --- a/packages/emr-isanteplus/Dockerfile +++ b/packages/emr-isanteplus/Dockerfile @@ -1,3 +1,25 @@ from ghcr.io/isanteplus/docker-isanteplus-server:v2.3.4 -add ./config/custom_modules /custom_modules \ No newline at end of file +add ./config/custom_modules /custom_modules + +# Fix: the base image's startup.sh unconditionally overwrites openmrs-runtime.properties +# with a template that lacks encryption keys. This breaks OpenMRS on subsequent restarts +# because it can't decrypt stored credentials and falls into the setup wizard loop. +# This patched version only overwrites if encryption keys are not present (i.e. first boot). +RUN sed -i 's|if \[ -f \$OMRS_RUNTIME_PROPERTIES_FILE \]; then|if [ -f $OMRS_RUNTIME_PROPERTIES_FILE ] \&\& ! grep -q "encryption.key" $OMRS_RUNTIME_PROPERTIES_FILE; then|' \ + /usr/local/tomcat/startup.sh + +# Post-start script: runs in the background after OpenMRS boots to set +# per-instance global properties (mpi-client.pid.local, xds-sender endpoints). +# These cannot be baked into the shared MySQL dump because each instance needs unique values. +COPY ./config/post-start.sh /usr/local/tomcat/post-start.sh +RUN chmod +x /usr/local/tomcat/post-start.sh + +# Inject the post-start script into startup.sh so it runs in the background +# after OpenMRS is up but before the final `wait` that holds the container open. +# We must capture the Tomcat PID before launching post-start.sh, otherwise +# `wait ${!}` waits for post-start.sh (which exits quickly) instead of Tomcat. +RUN sed -i 's|/usr/local/tomcat/bin/catalina.sh run \&|/usr/local/tomcat/bin/catalina.sh run \&\nTOMCAT_PID=$!|' /usr/local/tomcat/startup.sh && \ + sed -i '/# bring tomcat process to foreground again/i \ +/usr/local/tomcat/post-start.sh \&\n' /usr/local/tomcat/startup.sh && \ + sed -i 's|wait ${!}|wait $TOMCAT_PID|' /usr/local/tomcat/startup.sh \ No newline at end of file diff --git a/packages/emr-isanteplus/config/custom_modules/santedb-mpiclient-1.1.5-SNAPSHOT.omod b/packages/emr-isanteplus/config/custom_modules/santedb-mpiclient-1.1.5-SNAPSHOT.omod new file mode 100644 index 00000000..f2fc85ca --- /dev/null +++ b/packages/emr-isanteplus/config/custom_modules/santedb-mpiclient-1.1.5-SNAPSHOT.omod @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:457202b47f636e7bed6e069192f9fb6ff03a2b6e8f0483458c04620d8c1e4a2c +size 2940002 diff --git a/packages/emr-isanteplus/config/custom_modules/xds-sender-2.5.0-SNAPSHOT.omod b/packages/emr-isanteplus/config/custom_modules/xds-sender-2.5.0-SNAPSHOT.omod deleted file mode 100644 index 62268b4f..00000000 --- a/packages/emr-isanteplus/config/custom_modules/xds-sender-2.5.0-SNAPSHOT.omod +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37934645e9159ede98f17999be69369d9d782b6fff303f13e75ce0de0b8375a3 -size 3967152 diff --git a/packages/emr-isanteplus/config/custom_modules/xds-sender-2.5.9.omod b/packages/emr-isanteplus/config/custom_modules/xds-sender-2.5.9.omod new file mode 100644 index 00000000..49e0471b --- /dev/null +++ b/packages/emr-isanteplus/config/custom_modules/xds-sender-2.5.9.omod @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a59ccfa6bb37e21d2788198471a44eabe32c8df4de856dd233b06a5de8225a6 +size 3967900 diff --git a/packages/emr-isanteplus/config/post-start.sh b/packages/emr-isanteplus/config/post-start.sh new file mode 100755 index 00000000..65681b45 --- /dev/null +++ b/packages/emr-isanteplus/config/post-start.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# Post-start configuration for iSantePlus. +# Runs in the background after OpenMRS boots and sets global properties +# that need to match the deployment environment. +# +# Required env vars: +# FACILITY_ID - unique facility identifier (e.g., hueh, lapaix) +# FACILITY_NAME - human-readable facility name (e.g., HUEH, La Paix) +# +# Optional env vars: +# OPENHIM_DOMAIN - OpenHIM domain (default: openhimcore.sedishtest.live) + +DOMAIN="${OPENHIM_DOMAIN:-openhimcore.sedishtest.live}" +FACILITY="${FACILITY_ID:-isanteplus}" +OPENMRS_USER="${OPENMRS_ADMIN_USER:-admin}" +OPENMRS_PASS="${OPENMRS_ADMIN_PASS:-Admin123}" +OPENMRS_URL="http://localhost:8080/openmrs" + +echo "[post-start] Facility: ${FACILITY_ID} (${FACILITY_NAME})" +echo "[post-start] Waiting for OpenMRS to be ready..." + +MAX_WAIT=900 +WAITED=0 +while [ $WAITED -lt $MAX_WAIT ]; do + STATUS=$(curl -sf -o /dev/null -w "%{http_code}" -u "${OPENMRS_USER}:${OPENMRS_PASS}" \ + "${OPENMRS_URL}/ws/rest/v1/session" 2>/dev/null || echo "000") + if [ "$STATUS" = "200" ]; then + echo "[post-start] OpenMRS is ready (after ${WAITED}s)" + break + fi + sleep 10 + WAITED=$((WAITED + 10)) +done + +if [ $WAITED -ge $MAX_WAIT ]; then + echo "[post-start] ERROR: OpenMRS did not become ready after ${MAX_WAIT}s." + exit 1 +fi + +set_property() { + local prop="$1" + local value="$2" + curl -sf -u "${OPENMRS_USER}:${OPENMRS_PASS}" \ + -X POST -H 'Content-Type: application/json' \ + -d "{\"value\":\"${value}\"}" \ + "${OPENMRS_URL}/ws/rest/v1/systemsetting/${prop}" > /dev/null 2>&1 + echo "[post-start] Set ${prop} = ${value}" +} + +# XDS-Sender endpoints — point to the correct OpenHIM domain +set_property "xdssender.exportCcdEndpoint" "https://${DOMAIN}/SHR/fhir" +set_property "xdssender.mpiEndpoint" "https://${DOMAIN}/CR/fhir" + +# Per-facility OpenHIM credentials — each facility has its own client ID +# so OpenCR can identify the Point of Service +set_property "xdssender.oshr.username" "${FACILITY}" +set_property "xdssender.oshr.password" "${FACILITY}" + +# MPI client credentials — uses the same per-facility OpenHIM client +# FhirMpiClientServiceImpl uses sendingApplication as username, authtoken as password +set_property "mpi-client.msg.sendingApplication" "${FACILITY}" +set_property "mpi-client.security.authtoken" "${FACILITY}" + +echo "[post-start] Configuration complete." diff --git a/packages/emr-isanteplus/docker-compose.yml b/packages/emr-isanteplus/docker-compose.yml index dd837b5f..5ed39a96 100644 --- a/packages/emr-isanteplus/docker-compose.yml +++ b/packages/emr-isanteplus/docker-compose.yml @@ -18,6 +18,8 @@ services: - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_1} - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_1} - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} + - FACILITY_ID=hueh + - FACILITY_NAME=HUEH volumes: - isanteplus-data:/openmrs/data - /etc/timezone:/etc/timezone:ro @@ -26,6 +28,7 @@ services: - public - reverse-proxy - mysql + - openhim isanteplus2: image: itechuw/docker-isanteplus-server:local-2 @@ -44,6 +47,8 @@ services: - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_2} - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_2} - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} + - FACILITY_ID=lapaix + - FACILITY_NAME=La Paix volumes: - isanteplus2-data:/openmrs/data - /etc/timezone:/etc/timezone:ro @@ -52,226 +57,11 @@ services: - public - reverse-proxy - mysql - - isanteplus3: - image: itechuw/docker-isanteplus-server:local-2 - build: - context: . - dockerfile: Dockerfile - environment: - - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_3} - - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_3} - - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_3} - - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - volumes: - - isanteplus3-data:/openmrs/data - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - networks: - - public - - reverse-proxy - - mysql - - isanteplus4: - image: itechuw/docker-isanteplus-server:local-2 - build: - context: . - dockerfile: Dockerfile - environment: - - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_4} - - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_4} - - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_4} - - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - volumes: - - isanteplus4-data:/openmrs/data - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - networks: - - public - - reverse-proxy - - mysql - - # isanteplus5: - # image: itechuw/docker-isanteplus-server:local - # build: - # context: . - # dockerfile: Dockerfile - # environment: - # - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - # - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - # - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - # - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - # - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - # - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_5} - # - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - # - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - # - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_5} - # - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_5} - # - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - # volumes: - # - isanteplus5-data:/openmrs/data - # - /etc/timezone:/etc/timezone:ro - # - /etc/localtime:/etc/localtime:ro - # networks: - # - public - # - reverse-proxy - # - mysql - - # isanteplus6: - # image: itechuw/docker-isanteplus-server:local - # build: - # context: . - # dockerfile: Dockerfile - # environment: - # - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - # - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - # - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - # - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - # - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - # - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_6} - # - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - # - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - # - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_6} - # - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_6} - # - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - # volumes: - # - isanteplus6-data:/openmrs/data - # - /etc/timezone:/etc/timezone:ro - # - /etc/localtime:/etc/localtime:ro - # networks: - # - public - # - reverse-proxy - # - mysql - - # isanteplus7: - # image: itechuw/docker-isanteplus-server:local - # build: - # context: . - # dockerfile: Dockerfile - # environment: - # - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - # - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - # - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - # - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - # - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - # - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_7} - # - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - # - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - # - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_7} - # - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_7} - # - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - # volumes: - # - isanteplus7-data:/openmrs/data - # - /etc/timezone:/etc/timezone:ro - # - /etc/localtime:/etc/localtime:ro - # networks: - # - public - # - reverse-proxy - # - mysql - - # isanteplus8: - # image: itechuw/docker-isanteplus-server:local - # build: - # context: . - # dockerfile: Dockerfile - # environment: - # - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - # - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - # - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - # - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - # - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - # - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_8} - # - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - # - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - # - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_8} - # - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_8} - # - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - # volumes: - # - isanteplus8-data:/openmrs/data - # - /etc/timezone:/etc/timezone:ro - # - /etc/localtime:/etc/localtime:ro - # networks: - # - public - # - reverse-proxy - # - mysql - - # isanteplus9: - # image: itechuw/docker-isanteplus-server:local - # build: - # context: . - # dockerfile: Dockerfile - # environment: - # - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - # - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - # - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - # - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - # - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - # - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_9} - # - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - # - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - # - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_9} - # - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_9} - # - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - # volumes: - # - isanteplus9-data:/openmrs/data - # - /etc/timezone:/etc/timezone:ro - # - /etc/localtime:/etc/localtime:ro - # networks: - # - public - # - reverse-proxy - # - mysql - - # isanteplus10: - # image: itechuw/docker-isanteplus-server:local - # build: - # context: . - # dockerfile: Dockerfile - # environment: - # - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - # - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - # - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - # - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - # - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - # - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL_10} - # - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - # - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - # - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME_10} - # - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD_10} - # - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - # volumes: - # - isanteplus10-data:/openmrs/data - # - /etc/timezone:/etc/timezone:ro - # - /etc/localtime:/etc/localtime:ro - # networks: - # - public - # - reverse-proxy - # - mysql + - openhim volumes: isanteplus-data: isanteplus2-data: - isanteplus3-data: - isanteplus4-data: - isanteplus5-data: - isanteplus6-data: - isanteplus7-data: - isanteplus8-data: - isanteplus9-data: - isanteplus10-data: networks: public: external: true @@ -282,3 +72,6 @@ networks: reverse-proxy: name: reverse-proxy_public external: true + openhim: + name: openhim_public + external: true diff --git a/packages/emr-isanteplus/docker-compose.yml.old b/packages/emr-isanteplus/docker-compose.yml.old deleted file mode 100644 index 1626a1e4..00000000 --- a/packages/emr-isanteplus/docker-compose.yml.old +++ /dev/null @@ -1,46 +0,0 @@ -version: '3.9' - -services: - isanteplus: - #image: ghcr.io/isanteplus/docker-isanteplus-server:v2.3.4 - # See ./build-custom-images.sh for how to build local image to include custom modules - image: itechuw/docker-isanteplus-server:local - build: - context: . - dockerfile: Dockerfile - environment: - - OMRS_JAVA_MEMORY_OPTS=${OMRS_JAVA_MEMORY_OPTS} - - OMRS_CONFIG_CONNECTION_SERVER=${OMRS_CONFIG_CONNECTION_SERVER} - - OMRS_CONFIG_CREATE_DATABASE_USER=${OMRS_CONFIG_CREATE_DATABASE_USER} - - OMRS_CONFIG_CREATE_TABLES=${OMRS_CONFIG_CREATE_TABLES} - - OMRS_CONFIG_ADD_DEMO_DATA=${OMRS_CONFIG_ADD_DEMO_DATA} - - OMRS_CONFIG_CONNECTION_URL=${OMRS_CONFIG_CONNECTION_URL} - - OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE=${OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE} - - OMRS_JAVA_SERVER_OPTS=${OMRS_JAVA_SERVER_OPTS} - - OMRS_CONFIG_CONNECTION_USERNAME=${OMRS_CONFIG_CONNECTION_USERNAME} - - OMRS_CONFIG_CONNECTION_PASSWORD=${OMRS_CONFIG_CONNECTION_PASSWORD} - - OMRS_DEV_DEBUG_PORT=${OMRS_DEV_DEBUG_PORT} - volumes: - - isanteplus-data:/openmrs/data - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - networks: - - public - - reverse-proxy - - mysql - -volumes: - isanteplus-data: - -networks: - public: - external: true - name: isanteplus_public - mysql: - external: true - name: mysql_public - reverse-proxy: - name: reverse-proxy_public - external: true - - diff --git a/packages/emr-isanteplus/package-metadata.json b/packages/emr-isanteplus/package-metadata.json index 8adfbaba..2cac7134 100644 --- a/packages/emr-isanteplus/package-metadata.json +++ b/packages/emr-isanteplus/package-metadata.json @@ -8,46 +8,19 @@ "environmentVariables": { "OMRS_CONFIG_CONNECTION_SERVER": "mysql", "OMRS_CONFIG_CREATE_DATABASE_USER": "false", - "OMRS_CONFIG_CREATE_TABLES":"false", + "OMRS_CONFIG_CREATE_TABLES": "false", "OMRS_CONFIG_ADD_DEMO_DATA": "false", - "OMRS_CONFIG_CONNECTION_URL_1":"jdbc:mysql://mysql:3306/openmrs?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_2":"jdbc:mysql://mysql:3306/openmrs2?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_3":"jdbc:mysql://mysql:3306/openmrs3?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_4":"jdbc:mysql://mysql:3306/openmrs4?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_5":"jdbc:mysql://mysql:3306/openmrs5?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_6":"jdbc:mysql://mysql:3306/openmrs6?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_7":"jdbc:mysql://mysql:3306/openmrs7?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_8":"jdbc:mysql://mysql:3306/openmrs8?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_9":"jdbc:mysql://mysql:3306/openmrs9?autoReconnect=true", - "OMRS_CONFIG_CONNECTION_URL_10":"jdbc:mysql://mysql:3306/openmrs10?autoReconnect=true", - "OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE":"true", - "OMRS_JAVA_SERVER_OPTS":"-Dfile.encoding=UTF-8 -server -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Djava.awt.headlesslib=true", - "OMRS_CONFIG_CONNECTION_USERNAME_1":"openmrs", - "OMRS_CONFIG_CONNECTION_USERNAME_2":"openmrs2", - "OMRS_CONFIG_CONNECTION_USERNAME_3":"openmrs3", - "OMRS_CONFIG_CONNECTION_USERNAME_4":"openmrs4", - "OMRS_CONFIG_CONNECTION_USERNAME_5":"openmrs5", - "OMRS_CONFIG_CONNECTION_USERNAME_6":"openmrs6", - "OMRS_CONFIG_CONNECTION_USERNAME_7":"openmrs7", - "OMRS_CONFIG_CONNECTION_USERNAME_8":"openmrs8", - "OMRS_CONFIG_CONNECTION_USERNAME_9":"openmrs9", - "OMRS_CONFIG_CONNECTION_USERNAME_10":"openmrs10", - "OMRS_CONFIG_CONNECTION_PASSWORD_1":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_2":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_3":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_4":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_5":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_6":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_7":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_8":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_9":"dev_password_only", - "OMRS_CONFIG_CONNECTION_PASSWORD_10":"dev_password_only", - "OMRS_DEV_DEBUG_PORT":"1044", - "OMRS_JAVA_MEMORY_OPTS":"-Xmx2048m -Xms512m -XX:NewSize=256m", + "OMRS_CONFIG_CONNECTION_URL_1": "jdbc:mysql://mysql:3306/openmrs?autoReconnect=true", + "OMRS_CONFIG_CONNECTION_URL_2": "jdbc:mysql://mysql:3306/openmrs2?autoReconnect=true", + "OMRS_CONFIG_HAS_CURRENT_OPENMRS_DATABASE": "true", + "OMRS_JAVA_SERVER_OPTS": "-Dfile.encoding=UTF-8 -server -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Djava.awt.headlesslib=true", + "OMRS_CONFIG_CONNECTION_USERNAME_1": "openmrs", + "OMRS_CONFIG_CONNECTION_USERNAME_2": "openmrs2", + "OMRS_CONFIG_CONNECTION_PASSWORD_1": "dev_password_only", + "OMRS_CONFIG_CONNECTION_PASSWORD_2": "dev_password_only", + "OMRS_DEV_DEBUG_PORT": "1044", + "OMRS_JAVA_MEMORY_OPTS": "-Xmx2048m -Xms512m -XX:NewSize=256m", "ISANTEPLUS_VERSION": "v2.3.4", "OPENMRS_INSTANCES": "1" } -} - - - +} \ No newline at end of file diff --git a/packages/emr-isanteplus/swarm.sh b/packages/emr-isanteplus/swarm.sh index 2c129ab5..6ccef933 100644 --- a/packages/emr-isanteplus/swarm.sh +++ b/packages/emr-isanteplus/swarm.sh @@ -32,33 +32,18 @@ function import_sources() { } function initialize_package() { - - - # if [ "${MODE}" == "dev" ]; then - # log info "Running package in DEV mode" - # postgres_dev_compose_filename="docker-compose-postgres.dev.yml" - # hapi_fhir_dev_compose_filename="docker-compose.dev.yml" - # else log info "Running package in PROD mode" - #fi - - # if [ "${CLUSTERED_MODE}" == "true" ]; then - # postgres_cluster_compose_filename="docker-compose-postgres.cluster.yml" - # fi ( - #docker::deploy_service "$STACK" "${COMPOSE_FILE_PATH}" "docker-compose-mysql.yml" - - docker::deploy_service "$STACK" "${COMPOSE_FILE_PATH}" "docker-compose.yml" - ) || - { - log error "Failed to deploy package" - exit 1 - } + docker::deploy_service "$STACK" "${COMPOSE_FILE_PATH}" "docker-compose.yml" + ) || { + log error "Failed to deploy package" + exit 1 + } } function destroy_package() { - docker::stack_destroy "$STACK" + docker::stack_destroy $STACK if [[ "${CLUSTERED_MODE}" == "true" ]]; then log warn "Volumes are only deleted on the host on which the command is run. Postgres volumes on other nodes are not deleted" @@ -70,8 +55,6 @@ function destroy_package() { main() { init_vars "$@" import_sources - # chmod +x "${COMPOSE_FILE_PATH}/docker-compose.sh" - # source "${COMPOSE_FILE_PATH}/docker-compose.sh" if [[ "${ACTION}" == "init" ]] || [[ "${ACTION}" == "up" ]]; then if [[ "${CLUSTERED_MODE}" == "true" ]]; then diff --git a/packages/fhir-datastore-hapi-fhir/docker-compose.yml b/packages/fhir-datastore-hapi-fhir/docker-compose.yml index b8a222e3..9c8f29e7 100644 --- a/packages/fhir-datastore-hapi-fhir/docker-compose.yml +++ b/packages/fhir-datastore-hapi-fhir/docker-compose.yml @@ -7,6 +7,7 @@ services: mpi: public: openhim: + reverse-proxy: default: environment: - spring.datasource.url=jdbc:postgresql://${HAPI_DB_SET}/hapi?targetServerType=primary @@ -22,7 +23,7 @@ services: - hapi.fhir.auto_create_placeholder_reference_targets=true - hapi.fhir.bulk_export_enabled=true - hapi.fhir.enable_repository_validating_interceptor=true - - hapi.fhir.enforce_referential_integrity_on_write=false + - hapi.fhir.enforce_referential_integrity_on_write=true - JAVA_TOOL_OPTIONS=${HF_JAVA_OPTS} - CATALINA_OPTS=${HF_JAVA_OPTS} deploy: @@ -53,4 +54,7 @@ networks: openhim: name: openhim_public external: true + reverse-proxy: + name: reverse-proxy_public + external: true default: \ No newline at end of file diff --git a/packages/fhir-datastore-hapi-fhir/post-deploy.sh b/packages/fhir-datastore-hapi-fhir/post-deploy.sh new file mode 100755 index 00000000..d08d9436 --- /dev/null +++ b/packages/fhir-datastore-hapi-fhir/post-deploy.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Run after deploying fhir-datastore-hapi-fhir to apply settings +# that the jembi/platform base image doesn't include. +# +# The instant CLI reads compose files from the platform image, not from +# our local overrides. This script applies the missing settings. + +set -e + +echo "Applying HAPI FHIR post-deploy settings..." + +# Add reverse-proxy network (needed for SHR browser at shr./fhir) +docker service update --network-add reverse-proxy_public hapi-fhir_hapi-fhir 2>/dev/null || true + +# Ensure referential integrity + placeholder targets are set correctly +docker service update \ + --env-add "hapi.fhir.enforce_referential_integrity_on_write=true" \ + --env-add "hapi.fhir.auto_create_placeholder_reference_targets=true" \ + --env-add "hapi.fhir.allow_external_references=true" \ + hapi-fhir_hapi-fhir 2>/dev/null || true + +echo "Done." diff --git a/packages/interoperability-layer-openhim/importer/docker-compose.config.yml b/packages/interoperability-layer-openhim/importer/docker-compose.config.yml index c5a82098..65538247 100644 --- a/packages/interoperability-layer-openhim/importer/docker-compose.config.yml +++ b/packages/interoperability-layer-openhim/importer/docker-compose.config.yml @@ -6,7 +6,7 @@ services: image: node:erbium-alpine environment: OPENHIM_API_USERNAME: 'root@openhim.org' - OPENHIM_API_PASSWORD: 'openhim-password' + OPENHIM_API_PASSWORD: 'instant101' # Reject unauthorised is only needed if the OpenHIM's SSL is not setup NODE_TLS_REJECT_UNAUTHORIZED: 0 command: sh -c "node openhimConfig.js" diff --git a/packages/interoperability-layer-openhim/importer/volume/openhim-import.json b/packages/interoperability-layer-openhim/importer/volume/openhim-import.json index 30cc33e9..af8442b7 100644 --- a/packages/interoperability-layer-openhim/importer/volume/openhim-import.json +++ b/packages/interoperability-layer-openhim/importer/volume/openhim-import.json @@ -11,7 +11,8 @@ "expiry": null, "locked": false, "token": null, - "tokenType": null + "tokenType": null, + "password": "$2b$10$p4P.WSJEKJJzIfJoM147ReSIZ0lzmQXN/vndiyyJLY82WawY9FHfS" } ], "Passports": [ @@ -31,13 +32,14 @@ "Clients": [ { "roles": [ - "shr" + "shr", + "emr" ], "clientID": "openshr", "name": "OpenSHR", "passwordAlgorithm": "sha512", - "passwordSalt": "4173d0a1bba4e2fcdc3bd0cc7aa60a96", - "passwordHash": "a5b09684e7f2e9356912b725f3d739dd102049f7fdec94ab8170d24c0d11e612c6da303c263bce7446a8673aa79d927e7bc17d47522ea7fabd57dda63ad557f0" + "passwordSalt": "8bababd96b60931ce2e2401731158c76", + "passwordHash": "1073a76be9eb72706b0c3fb1ee1bcb7f1f904723be1342ac9dc1fbea9ee8cb2230c55378bc18453964f523c4e9f9bf6d849218a676cd7755afd94ebc975f1929" }, { "roles": [ @@ -46,8 +48,8 @@ "clientID": "shr-pipeline", "name": "shr-pipeline", "passwordAlgorithm": "sha512", - "passwordSalt": "e538f4a341915058a00dd342b362349c", - "passwordHash": "0e2160d1a6be5bccd28181d0301a72e16d65424e86ee4a07a5227519423e8c3c5316e5feb459977d535a112c3a97c77fd466b835d2354ef9b6275822b2b279e8" + "passwordSalt": "a3d28f95fa476a64ab72a60db496845e", + "passwordHash": "5c1e5cc3f3ea5e4590a681de9253e11defc8053c1ebf8dd8881f5b92eef997d826236304a3f4b3a0f9c4977ec466db80b5dc54b034b4bf26ceba3a66d8647776" }, { "roles": [ @@ -59,16 +61,6 @@ "passwordSalt": "d2171539db69c06085fc33eedf4a8e41", "passwordHash": "36a496767339fe41c1766213aa8ead610aa07874a6a9b20d84f36df555c48b29d5f84933821d3d3e1675155effe6eb06d9ada0af430990f5bc6ad93c80da9c10" }, - { - "roles": [ - "emr" - ], - "clientID": "isanteplus", - "name": "isanteplus", - "passwordAlgorithm": "sha512", - "passwordSalt": "a20514810f3a16068b04a39ae21f93c0", - "passwordHash": "5e57dc8fa047b7822b7248c7a1be3770aebf5041a779eaabd334906dc9d7017f995927a5d5fbd99b27325f98426b3a50830e8d4abec118276fa4b232fdd28127" - }, { "clientID": "lnsp", "name": "lnsp", @@ -79,6 +71,106 @@ "passwordHash": "7718884c4274d86c6a2f31e9d567157d88f3f79d86554a98cee105eaf489c2348470de008dda10290007165c17c73a0c86bc0fb43baa7a2f5e0f72a81fe14de9", "passwordSalt": "6e70fc2a836bf68a8956449f8dbe77a8", "customTokenID": "root@openhim.org" + }, + { + "roles": [ + "emr" + ], + "clientID": "hueh", + "name": "HUEH", + "passwordAlgorithm": "sha512", + "passwordHash": "a3f5f268b23b12d9a429b841cf9c8b177b130df40dbbbfe360edbd66aebe7287f3c540964564c16e10938bc5746bbe89a9b6b0f3f1467c4c258c31fbfc99b2e1", + "passwordSalt": "fb2548dd2b7e6450b6db3078d838eba4" + }, + { + "roles": [ + "emr" + ], + "clientID": "lapaix", + "name": "La Paix", + "passwordAlgorithm": "sha512", + "passwordHash": "5f5d3c79c113daac7f55f5a6e37c75985d40b51889d1e20a1675b6af17a4cb9b5f8794be99dabf7e71e148eafb43cababb1ebbbefcfedb3fbfa5c74cc71344fc", + "passwordSalt": "887068790868827cf10aee18cdb5d6ea" + }, + { + "roles": [ + "emr" + ], + "clientID": "ofatma", + "name": "OFATMA", + "passwordAlgorithm": "sha512", + "passwordHash": "271d2211e83c4b74a71f8f0cf870bb2fd3a12a987c28c6ac351ed9e4876987dc34950647d3c20ce4393c1238ac73e585f04820fff5d839acfc2d16cbf8b0da46", + "passwordSalt": "e5413bea88e10a9a5b1d6388af37a91e" + }, + { + "roles": [ + "emr" + ], + "clientID": "foyer-saint-camille", + "name": "Foyer Saint Camille", + "passwordAlgorithm": "sha512", + "passwordHash": "280cd46ed31807d8abd37c4b429170c1e32b814126c7afece508006e2a733a7c874df346d7f2c42945d395ff75f2970224435ac3711485574164ef1a3cda90c0", + "passwordSalt": "50f2e45702ecea750abc9f4db2b5724b" + }, + { + "roles": [ + "emr" + ], + "clientID": "klinik-eritaj", + "name": "Klinik Eritaj", + "passwordAlgorithm": "sha512", + "passwordHash": "d62fa64c276d7f9341bff72ea2c168f1bf2c39b718a4de7af9e433343173e635fa93e73ee77333783b59778918830ff1a9e3838dabd43cb80fec1ade1b87330d", + "passwordSalt": "4c4f2fa70e14d430c4490166c5210dfa" + }, + { + "roles": [ + "emr" + ], + "clientID": "ofatma-sonapi", + "name": "OFATMA SONAPI", + "passwordAlgorithm": "sha512", + "passwordHash": "2a11c4dcd56e9cfd4b02926dbd69d8e2f8c888b8ec5e7d2b135e90a3c4fcca6f234923d8e36db1994171c6ae0b7520c6d2abe19081d3846d28bc36f3aa39869d", + "passwordSalt": "89c592b55ec3193ac3018046b593be23" + }, + { + "roles": [ + "emr" + ], + "clientID": "gressierms", + "name": "Gressier MS", + "passwordAlgorithm": "sha512", + "passwordHash": "e391eaa14451bb3cb44e8d4990c6be71e016324d94c6d68e7a3b33b8510da11bfaf42cba744974c16e65eeb2cdc21edc38d2776aec55693afef4d2d349bf06de", + "passwordSalt": "ad9f7a104e10dae9332bfd3ba21d770f" + }, + { + "roles": [ + "emr" + ], + "clientID": "pestel", + "name": "Pestel", + "passwordAlgorithm": "sha512", + "passwordHash": "3032cf77f7daf7f9629f4f406662c0e26033219325243753d6214b939acc24ae60617cc034983a09ba975b418cdc3668d76e2b8bb17319730a7eeff5b45add5f", + "passwordSalt": "60121791d73ba436150076274eaed567" + }, + { + "roles": [ + "emr" + ], + "clientID": "stdemiragoane", + "name": "St Demir Agoane", + "passwordAlgorithm": "sha512", + "passwordHash": "80ffcb0f3fce5265b57e05762a13a675b56dd2a9fb1d5335c3c6acefb6ac174517a3c7f96c082197b6170dc1474ea61dd96ef01d5e4802a0f9071039541772c5", + "passwordSalt": "8b64e687bf9dd456f8fbf7c51e7c5b7e" + }, + { + "roles": [ + "emr" + ], + "clientID": "bethel-fdn", + "name": "Bethel FDN", + "passwordAlgorithm": "sha512", + "passwordHash": "936acdaeb595ede30d38925ed8ffe97ef6510f8546d39c05be41148ac7a1b11d01e78dc97caf35197b88395538b12840781ba3a4ca95dbd9920ae7916435c28b", + "passwordSalt": "b22a9c5d7acb3f5268f38e4bc98b8c2d" } ], "Channels": [ @@ -90,7 +182,6 @@ "methods": [ "GET", "POST", - "DELETE", "PUT" ], "type": "http", @@ -452,7 +543,7 @@ "test" ], "whitelist": [], - "authType": "public", + "authType": "private", "routes": [ { "name": "LNSP passthrough", diff --git a/packages/reverse-proxy-nginx/package-conf-secure/http-isanteplus-secure.conf b/packages/reverse-proxy-nginx/package-conf-secure/http-isanteplus-secure.conf index f5b9d99a..80ed9f32 100644 --- a/packages/reverse-proxy-nginx/package-conf-secure/http-isanteplus-secure.conf +++ b/packages/reverse-proxy-nginx/package-conf-secure/http-isanteplus-secure.conf @@ -27,6 +27,12 @@ server { resolver 127.0.0.11 valid=30s; set $upstream_isanteplus isanteplus; proxy_pass http://$upstream_isanteplus:8080; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_redirect http://isanteplus:8080/ https://$host/; } } @@ -59,6 +65,12 @@ server { resolver 127.0.0.11 valid=30s; set $upstream_isanteplus isanteplus; proxy_pass http://$upstream_isanteplus:8080; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_redirect http://isanteplus:8080/ https://$host/; } } @@ -91,261 +103,11 @@ server { resolver 127.0.0.11 valid=30s; set $upstream_isanteplus2 isanteplus2; proxy_pass http://$upstream_isanteplus2:8080; - } -} -server { - listen 80; - server_name ofatma.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name ofatma.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus3 isanteplus3; - proxy_pass http://$upstream_isanteplus3:8080; - } -} - -server { - listen 80; - server_name foyer-saint-camille.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name foyer-saint-camille.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus4 isanteplus4; - proxy_pass http://$upstream_isanteplus4:8080; - } -} - -server { - listen 80; - server_name klinik-eritaj.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name klinik-eritaj.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus5 isanteplus5; - proxy_pass http://$upstream_isanteplus5:8080; - } -} - -server { - listen 80; - server_name ofatma-sonapi.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name ofatma-sonapi.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus6 isanteplus6; - proxy_pass http://$upstream_isanteplus6:8080; - } -} - -server { - listen 80; - server_name gressier.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name gressier.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus7 isanteplus7; - proxy_pass http://$upstream_isanteplus7:8080; - } -} - -server { - listen 80; - server_name pestel.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name pestel.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus8 isanteplus8; - proxy_pass http://$upstream_isanteplus8:8080; - } -} - -server { - listen 80; - server_name stdemiragoane.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name stdemiragoane.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus9 isanteplus9; - proxy_pass http://$upstream_isanteplus9:8080; - } -} - -server { - listen 80; - server_name bethel-fdn.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - return 301 https://$host$request_uri; - } -} -server { - listen 443 ssl; - listen [::]:443 ssl; - server_name bethel-fdn.*; - - location /.well-known/acme-challenge/ { - resolver 127.0.0.11 valid=30s; - set $upstream_certbot certbot; - proxy_pass http://$upstream_certbot$request_uri; - } - - location / { - resolver 127.0.0.11 valid=30s; - set $upstream_isanteplus10 isanteplus10; - proxy_pass http://$upstream_isanteplus10:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_redirect http://isanteplus2:8080/ https://$host/; } } diff --git a/packages/reverse-proxy-nginx/package-conf-secure/http-shr-secure.conf b/packages/reverse-proxy-nginx/package-conf-secure/http-shr-secure.conf new file mode 100644 index 00000000..e4d407ce --- /dev/null +++ b/packages/reverse-proxy-nginx/package-conf-secure/http-shr-secure.conf @@ -0,0 +1,37 @@ +server { + listen 80; + server_name shr.*; + + location /.well-known/acme-challenge/ { + resolver 127.0.0.11 valid=30s; + set $upstream_certbot certbot; + proxy_pass http://$upstream_certbot$request_uri; + } + + location / { + return 301 https://$host$request_uri; + } +} +server { + listen 443 ssl; + listen [::]:443 ssl; + server_name shr.*; + + location /.well-known/acme-challenge/ { + resolver 127.0.0.11 valid=30s; + set $upstream_certbot certbot; + proxy_pass http://$upstream_certbot$request_uri; + } + + location / { + # Read-only access: only allow GET and HEAD requests. + # All writes must flow through OpenHIM (port 5001) for audit and auth. + limit_except GET HEAD { + deny all; + } + + resolver 127.0.0.11 valid=30s; + set $upstream_hapi hapi-fhir_hapi-fhir; + proxy_pass http://$upstream_hapi:8080; + } +} diff --git a/packages/shared-health-record-fhir/config/config.json b/packages/shared-health-record-fhir/config/config.json index 77aefc64..78c32768 100644 --- a/packages/shared-health-record-fhir/config/config.json +++ b/packages/shared-health-record-fhir/config/config.json @@ -20,6 +20,8 @@ "baseURL": "http://hapi-fhir:8080/fhir" }, "clientRegistryUrl": "http://openhim-core:5001/CR/fhir", + "clientRegistryUsername": "openshr", + "clientRegistryPassword": "openshr", "fhirConverterUrl": "http://openhim-core:5001/72f", "taskRunner": { "brokers": null diff --git a/packages/shared-health-record-fhir/docker-compose.yml b/packages/shared-health-record-fhir/docker-compose.yml index b7eeebf5..702dcbc0 100644 --- a/packages/shared-health-record-fhir/docker-compose.yml +++ b/packages/shared-health-record-fhir/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.8' services: shr: - image: itechuw/shared-health-record:v0.13.0 + image: itechuw/shared-health-record:main networks: - openhim - shr diff --git a/projects/isanteplus-db/Dockerfile b/projects/isanteplus-db/Dockerfile index 86af1bb7..3659e82a 100644 --- a/projects/isanteplus-db/Dockerfile +++ b/projects/isanteplus-db/Dockerfile @@ -6,10 +6,12 @@ WORKDIR /docker-entrypoint-initdb.d # Copy initialization files into the container COPY ./initdb/isanteplus-db.sql /docker-entrypoint-initdb.d/initial.dump COPY ./initdb/10-create-dbs.sh /docker-entrypoint-initdb.d/10-initdb.sh +COPY ./initdb/20-configure-per-instance.sh /docker-entrypoint-initdb.d/20-configure-per-instance.sh # Set permissions to ensure scripts and dumps are executable/readable RUN chmod 644 /docker-entrypoint-initdb.d/initial.dump && \ - chmod +x /docker-entrypoint-initdb.d/10-initdb.sh + chmod +x /docker-entrypoint-initdb.d/10-initdb.sh && \ + chmod +x /docker-entrypoint-initdb.d/20-configure-per-instance.sh # Expose MySQL ports EXPOSE 3306 33060 diff --git a/projects/isanteplus-db/initdb/20-configure-per-instance.sh b/projects/isanteplus-db/initdb/20-configure-per-instance.sh new file mode 100755 index 00000000..14048181 --- /dev/null +++ b/projects/isanteplus-db/initdb/20-configure-per-instance.sh @@ -0,0 +1,65 @@ +#!/bin/bash +set -e + +# This script runs after 10-create-dbs.sh and fixes global properties +# that have incorrect defaults in the shared SQL dump. +# +# The SQL dump ships with xds-sender endpoints pointing to the old +# production domain (openhim.sedish-haiti.org). This script updates +# them to point to the correct OpenHIM domain for this deployment. + +if [ -z "$OPENMRS_DB_COUNT" ]; then + OPENMRS_DB_COUNT=10 +fi + +if [ -z "$MYSQL_ROOT_PASSWORD" ]; then + echo "MYSQL_ROOT_PASSWORD is not set." + exit 1 +fi + +# Default endpoint domain — override via OPENHIM_DOMAIN env var +OPENHIM_DOMAIN="${OPENHIM_DOMAIN:-openhimcore.sedishtest.live}" + +# Map DB index → facility subdomain. Override via FACILITY_NAMES env var +# (comma-separated, e.g. "hueh,lapaix,ofatma,fsc"). +IFS=',' read -ra FACILITIES <<< "${FACILITY_NAMES:-hueh,lapaix,ofatma,fsc}" +DOMAIN_NAME="${DOMAIN_NAME:-sedishtest.live}" + +# Each facility gets its own ID range (offset by 100000) to prevent +# collisions in the MPI. No prefix needed — the Luhn Mod-30 check digit +# only allows characters in 0123456789ACDEFGHJKLMNPRTUVWXY. +SEQUENCE_OFFSET=100000 + +for i in $(seq 1 "$OPENMRS_DB_COUNT"); do + if [ "$i" -eq 1 ]; then + db="openmrs" + else + db="openmrs$i" + fi + + idx=$((i - 1)) + FACILITY="${FACILITIES[$idx]:-site${i}}" + START_SEQ=$((i * SEQUENCE_OFFSET)) + + echo "Configuring $db: facility=${FACILITY}, start_seq=${START_SEQ}" + + mysql -u root -p"$MYSQL_ROOT_PASSWORD" "$db" < 50% of the fields have page numbers defined, show data in pages','256cf60a-3d55-4233-856d-baa6f9610269',NULL,NULL,NULL,NULL),('dashboard.header.programs_to_show',NULL,'List of programs to show Enrollment details of in the patient header. (Should be an ordered comma-separated list of program_ids or names.)','00292469-a526-45fd-9917-bc505c985cc6',NULL,NULL,NULL,NULL),('dashboard.header.showConcept','5497','Comma delimited list of concepts ids to show on the patient header overview','5a39a74c-fadf-4d1b-81b7-70b9ec22209b',NULL,NULL,NULL,NULL),('dashboard.header.workflows_to_show',NULL,'List of programs to show Enrollment details of in the patient header. List of workflows to show current status of in the patient header. These will only be displayed if they belong to a program listed above. (Should be a comma-separated list of program_workflow_ids.)','01ab64ea-d931-4c4d-9e1f-df37577bece7',NULL,NULL,NULL,NULL),('dashboard.metadata.caseConversion',NULL,'Indicates which type automatic case conversion is applied to program/workflow/state in the patient dashboard. Valid values: lowercase, uppercase, capitalize. If empty no conversion is applied.','6679ce30-fca5-486f-8799-705dd3ce6c1c',NULL,NULL,NULL,NULL),('dashboard.overview.showConcepts',NULL,'Comma delimited list of concepts ids to show on the patient dashboard overview tab','c327013f-1fc7-422c-a9cf-15ffeb5f60ca',NULL,NULL,NULL,NULL),('dashboard.regimen.displayDrugSetIds','ANTIRETROVIRAL DRUGS,TUBERCULOSIS TREATMENT DRUGS','Drug sets that appear on the Patient Dashboard Regimen tab. Comma separated list of name of concepts that are defined as drug sets.','d9f957ed-fc19-497a-acb6-73f4326c141e',NULL,NULL,NULL,NULL),('dashboard.regimen.displayFrequencies','7 days/week,6 days/week,5 days/week,4 days/week,3 days/week,2 days/week,1 days/week','Frequency of a drug order that appear on the Patient Dashboard. Comma separated list of name of concepts that are defined as drug frequencies.','da0ee700-e81d-49e1-b4c3-677b7ad9b414',NULL,NULL,NULL,NULL),('dashboard.relationships.show_types',NULL,'Types of relationships separated by commas. Doctor/Patient,Parent/Child','e985abd8-79b6-4f69-b96c-c9a13d3ef14a',NULL,NULL,NULL,NULL),('dashboard.showPatientName','false','Whether or not to display the patient name in the patient dashboard title. Note that enabling this could be security risk if multiple users operate on the same computer.','83aafe2e-526e-4447-bed8-043edb069a37','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('dataexchange.mandatory','false','true/false whether or not the dataexchange module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','bce3c6e3-89a3-4eee-9f56-a8f41a97427c',NULL,NULL,NULL,NULL),('dataexchange.started','true','DO NOT MODIFY. true/false whether or not the dataexchange module has been started. This is used to make sure modules that were running prior to a restart are started again','fd61a9e0-f710-45fc-90e7-b6db352a3e0a',NULL,NULL,NULL,NULL),('datePicker.weekStart','0','First day of the week in the date picker. Domingo/Dimanche/Sunday:0 Lunes/Lundi/Monday:1','a64599df-b3b9-4906-a28a-c757dca46d08',NULL,NULL,NULL,NULL),('default_locale','en_gb','Specifies the default locale. You can specify both the language code(ISO-639) and the country code(ISO-3166), e.g. \'en_GB\' or just country: e.g. \'en\'','71870828-e88b-4d0b-9c41-47ec2586d064',NULL,NULL,NULL,NULL),('default_location','Unknown Location','The name of the location to use as a system default','ff16a585-5ea7-4272-838c-ef9241359592',NULL,NULL,NULL,NULL),('default_theme',NULL,'Default theme for users. OpenMRS ships with themes of \'green\', \'orange\', \'purple\', and \'legacy\'','98a545dc-2879-445b-ac98-e7dc0b7d19a1',NULL,NULL,NULL,NULL),('drugOrder.drugOther',NULL,'Specifies the uuid of the concept which represents drug other non coded','45582f88-6f1c-4532-aebf-0f772e1d434b',NULL,NULL,NULL,NULL),('drugOrder.requireDrug','false','Set to value true if you need to specify a formulation(Drug) when creating a drug order.','7ef44404-1138-4350-a020-2c33e64b6a9b',NULL,NULL,NULL,NULL),('emr.admissionEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the encounter type for admitting a patient','e13c00a8-c76d-4f10-8d12-6e4af0240eaa',NULL,NULL,NULL,NULL),('emr.admissionForm',NULL,'UUID of the Admission Form (not required)','7ffe49f1-2f4b-4d45-8f73-d815b7789706',NULL,NULL,NULL,NULL),('emr.atFacilityVisitType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the VisitType that we use for newly-created visits','ac7ba7ef-f0d7-47bd-813d-4657c158729f',NULL,NULL,NULL,NULL),('emr.checkInEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'',NULL,'06398a01-6472-472a-be63-ec83309e0e69',NULL,NULL,NULL,NULL),('emr.concept.diagnosisSetOfSets','160167AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',NULL,'58a128dc-26de-4bc6-b325-380a44b3f8f9',NULL,NULL,NULL,NULL),('emr.encounterMatcher',NULL,'Class name of a custom encounter matcher (e.g. org.openmrs.module.example.customEncounterMatcher)','1c4914a6-0cdb-4808-b92c-695c60c10e9c',NULL,NULL,NULL,NULL),('emr.exitFromInpatientEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the encounter type for exiting a patient from inpatient care','469d0deb-12ae-43cb-bc97-ff071542d2a3',NULL,NULL,NULL,NULL),('emr.exitFromInpatientForm',NULL,'UUID of the Discharge Form (not required)','a5c15a04-eeea-45ee-948e-7809b225c5b6',NULL,NULL,NULL,NULL),('emr.extraPatientIdentifierTypes',NULL,'A list of UUIDs indicating extra Patient Identifier Types that should be displayed','751003f7-b645-4935-9114-92e31bcdc714',NULL,NULL,NULL,NULL),('emr.primaryIdentifierType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','Primary identifier type for looking up patients, generating barcodes, etc','6b5ba4bb-8d7a-417c-bf58-b4e5a0e4f8cf',NULL,NULL,NULL,NULL),('emr.transferWithinHospitalEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the encounter type for transferring a patient within the hospital','419b581c-9731-4443-8554-74167452ab5a',NULL,NULL,NULL,NULL),('emr.transferWithinHospitalForm',NULL,'UUID of the Transfer Form (not required)','bf268837-e4ea-44fa-99f7-f1d0c3f6d8dd',NULL,NULL,NULL,NULL),('emr.unknownLocation',NULL,'UUID of the Location that represents an Unknown Location','f46fdc59-6efa-493c-ab34-b5466f7d9894',NULL,NULL,NULL,NULL),('emr.unknownProvider','f9badd80-ab76-11e2-9e96-0800200c9a66','UUID of the Provider that represents an Unknown Provider','e06c591f-5b0b-4609-92c2-9bf10856dcea',NULL,NULL,NULL,NULL),('emr.visitNoteEncounterType',NULL,'UUID of the encounter type for a visit note','549356c6-bdb0-43f8-a9f0-17ad778ffc69',NULL,NULL,NULL,NULL),('emrapi.EmrApiVisitAssignmentHandler.encounterTypeToNewVisitTypeMap',NULL,'Specifies the mapping of encounter types to new visit types for more see https://wiki.openmrs.org/x/vgF4Aw','67cfe36d-4b25-446c-a9e8-744b20c4c3c3',NULL,NULL,NULL,NULL),('emrapi.lastViewedPatientSizeLimit','50','Specifies the system wide number of patients to store as last viewed for a single user,\n defaults to 50 if not specified','6b2d82cc-deb3-4098-92a9-52b04e3c299f',NULL,NULL,NULL,NULL),('emrapi.mandatory','false','true/false whether or not the emrapi module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','67aaac39-0ea9-4caf-8cb1-050f3d3c1471',NULL,NULL,NULL,NULL),('emrapi.nonDiagnosisConceptSets',NULL,'UUIDs or mapping of non diagnosis concept sets','aae98b0c-4214-46fe-ae68-45c77e2f331c',NULL,NULL,NULL,NULL),('emrapi.started','true','DO NOT MODIFY. true/false whether or not the emrapi module has been started. This is used to make sure modules that were running prior to a restart are started again','53bf47b1-49bc-4595-95c9-c0728337f6d0',NULL,NULL,NULL,NULL),('emrapi.suppressedDiagnosisConcepts',NULL,'UUIDs or mappings of suppressed diagnosis concepts','446c7644-6479-43c0-b72a-9cb6cdcadc30',NULL,NULL,NULL,NULL),('encounterForm.obsSortOrder','number','The sort order for the obs listed on the encounter edit form. \'number\' sorts on the associated numbering from the form schema. \'weight\' sorts on the order displayed in the form schema.','090c82b2-6226-4cde-be50-17b67e097467',NULL,NULL,NULL,NULL),('EncounterType.encounterTypes.locked','false','saving, retiring or deleting an Encounter Type is not permitted, if true','7435645c-694b-4620-84b6-58d9307ac2e2','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('event.mandatory','false','true/false whether or not the event module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','730ea35a-89a5-4107-bd8f-5d71ef39c1d0',NULL,NULL,NULL,NULL),('event.started','true','DO NOT MODIFY. true/false whether or not the event module has been started. This is used to make sure modules that were running prior to a restart are started again','456a9d0c-6ca6-49e3-b4da-dcb8ee108280',NULL,NULL,NULL,NULL),('fhir2.administeringEncounterRoleUuid','546cce2d-6d58-4097-ba92-206c1a2a0462','Set administering encounter role uuid','9c2115c3-695b-4a08-a0c4-3e88da192070',NULL,NULL,NULL,NULL),('fhir2.immunizationsEncounterTypeUuid','29c02aff-9a93-46c9-bf6f-48b552fcb1fa','Set immunizations encounter type uuid','d2e88721-5ed9-4c43-9971-25a0c13e5e35',NULL,NULL,NULL,NULL),('fhir2.locationContactPointAttributeTypeUuid','abcde432-1691-11df-97a5-7038c432abcd','Set location attribute type uuid','fcff3274-374c-4988-bb1e-1288a5be7868',NULL,NULL,NULL,NULL),('fhir2.mandatory','false','true/false whether or not the fhir2 module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ef29e6be-bdb3-4a8d-81a0-2a6f6d2dad67',NULL,NULL,NULL,NULL),('fhir2.narrativesOverridePropertyFile',NULL,'Path of narrative override properties file','f8b9a879-6c48-4cf3-8adc-6e31a69aab81',NULL,NULL,NULL,NULL),('fhir2.paging.default','10','Set default page size','a29d8665-4cf2-465d-8463-8436ae847ea5',NULL,NULL,NULL,NULL),('fhir2.paging.maximum','100','Set maximum page size','987fc187-fd0a-420b-a58d-c3286f1880e6',NULL,NULL,NULL,NULL),('fhir2.personAttributeTypeUuid','14d4f066-15f5-102d-96e4-000c29c2a5d7','Set person attribute type uuid','6cfd91c7-97a3-4bd3-8870-485537fc80e3',NULL,NULL,NULL,NULL),('fhir2.personContactPointAttributeTypeUuid','14d4f066-15f5-102d-96e4-000c29c2a5d7','Set person attribute type uuid','d782f0a1-3cd5-4e1d-b2c5-89601b072df4',NULL,NULL,NULL,NULL),('fhir2.providerContactPointAttributeTypeUuid','5021b1a1-e7f6-44b4-ba02-da2f2bcf8718','Set provider attribute type uuid','4edc180d-25c9-469c-9090-bb336221ea24',NULL,NULL,NULL,NULL),('fhir2.started','true','DO NOT MODIFY. true/false whether or not the fhir2 module has been started. This is used to make sure modules that were running prior to a restart are started again','f171f837-d99f-46ef-9e01-42f0ca33c5b5',NULL,NULL,NULL,NULL),('fhir2.uriPrefix',NULL,'Prefix for the FHIR server in case this cannot be automatically detected','abf7a551-ae26-4319-9ed9-af6efc77ed01',NULL,NULL,NULL,NULL),('FormEntry.enableDashboardTab','true','true/false whether or not to show a Form Entry tab on the patient dashboard','e4039d7a-87c1-4a76-9422-721c4c6de656','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('FormEntry.enableOnEncounterTab','false','true/false whether or not to show a Enter Form button on the encounters tab of the patient dashboard','6579a662-7b46-4d29-8c03-d520d03d3ef2','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('formentryapp.mandatory','false','true/false whether or not the formentryapp module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','f7260fcb-3f00-4545-979b-3cabb309796a',NULL,NULL,NULL,NULL),('formentryapp.started','true','DO NOT MODIFY. true/false whether or not the formentryapp module has been started. This is used to make sure modules that were running prior to a restart are started again','0295c05a-8e9c-4d80-a828-78fdb1e05a55',NULL,NULL,NULL,NULL),('forms.locked','false','Set to a value of true if you do not want any changes to be made on forms, else set to false.','db268f39-bdb6-424c-b715-4fcbd7d8c2cf',NULL,NULL,NULL,NULL),('graph.color.absolute','rgb(20,20,20)','Color of the \'invalid\' section of numeric graphs on the patient dashboard.','8bed2d3f-aaf4-4423-ac25-4d22277b323e',NULL,NULL,NULL,NULL),('graph.color.critical','rgb(200,0,0)','Color of the \'critical\' section of numeric graphs on the patient dashboard.','ee9d5142-b689-47b6-85ff-2b23d1b9428c',NULL,NULL,NULL,NULL),('graph.color.normal','rgb(255,126,0)','Color of the \'normal\' section of numeric graphs on the patient dashboard.','0ff2bc6b-8822-473c-a123-2d530df78f77',NULL,NULL,NULL,NULL),('gzip.enabled','false','Set to \'true\' to turn on OpenMRS\'s gzip filter, and have the webapp compress data before sending it to any client that supports it. Generally use this if you are running Tomcat standalone. If you are running Tomcat behind Apache, then you\'d want to use Apache to do gzip compression.','a7608c0b-d774-4844-aa9c-ca9fe44747dc','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('haiticore.mandatory','false','true/false whether or not the haiticore module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','3808f06c-8673-4e86-8492-c7c0e4cb3df8',NULL,NULL,NULL,NULL),('haiticore.started','true','DO NOT MODIFY. true/false whether or not the haiticore module has been started. This is used to make sure modules that were running prior to a restart are started again','cf666ecb-3b7f-4f35-abd9-196e8a280143',NULL,NULL,NULL,NULL),('hl7_archive.dir','hl7_archives','The default name or absolute path for the folder where to write the hl7_in_archives.','8098ed61-38cd-4b6f-8509-a55af165f52d',NULL,NULL,NULL,NULL),('hl7_processor.ignore_missing_patient_non_local','false','If true, hl7 messages for patients that are not found and are non-local will silently be dropped/ignored','c44f6633-e89f-4593-8c50-0a0a0058087c','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('htmlformentry.archiveDir','htmlformentry/archive/%Y/%m','Used to specify the directory used to serialize data as a blob submitted via html forms before propagation to the database.\nIf a relative is specified then the directory is created in the default application data directory otherwise the absolute\npath is used.The %Y and %M are replaced with 4 digit year and 2 digit month respectively. If this property is empty nothing then nothing is saved.','a0e08e0c-e9a1-40f9-9c85-0ce7040c87fa',NULL,NULL,NULL,NULL),('htmlformentry.archiveHtmlForms','False','Set to True if you want to archive the submitted html forms and False otherwise','ff8d79f9-83db-43b9-9118-feae1cf4bee0',NULL,NULL,NULL,NULL),('htmlformentry.dateFormat',NULL,'Always display dates in HTML Forms in this (Java) date format. E.g. \"dd/MMM/yyyy\" for 31/Jan/2012.','fcfa9285-d80e-4cde-b8e1-10ae0c7f02d3',NULL,NULL,NULL,NULL),('htmlformentry.datePickerYearsRange','110,20','datePickerYearsRange parameter can be set here Eg:\'110,20\' meaning that the possible years that appear in the datepicker dropdown range from 20 years past the current year, and 110 years prior to the current year.','89c5ef0e-952c-4e85-a2cf-1587fd6ea409',NULL,NULL,NULL,NULL),('htmlformentry.mandatory','false','true/false whether or not the htmlformentry module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','c7e07dc0-7140-4185-b75e-65ae9d7e599f',NULL,NULL,NULL,NULL),('htmlformentry.showDateFormat','true','Set to true if you want static text for the date format to be displayed next to date widgets, else set to false.','abc005ec-321a-493a-a3d7-3fd594954e94',NULL,NULL,NULL,NULL),('htmlformentry.started','true','DO NOT MODIFY. true/false whether or not the htmlformentry module has been started. This is used to make sure modules that were running prior to a restart are started again','6ff31e00-4ae9-421c-8a29-2165b3113d43',NULL,NULL,NULL,NULL),('htmlformentry.timeFormat','HH:mm','Always display times in HTML Forms in this (Java) date format. E.g. \"HH:mm\" for 14:45.','01b34541-8037-4b32-b68e-547687003f1a',NULL,NULL,NULL,NULL),('htmlformentry19ext.mandatory','false','true/false whether or not the htmlformentry19ext module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','f1ed4d93-b67a-4403-85e5-1e36de7ba52e',NULL,NULL,NULL,NULL),('htmlformentry19ext.started','true','DO NOT MODIFY. true/false whether or not the htmlformentry19ext module has been started. This is used to make sure modules that were running prior to a restart are started again','52db204c-3cd8-49a4-b6cf-0c640a37b34c',NULL,NULL,NULL,NULL),('htmlformentryui.mandatory','false','true/false whether or not the htmlformentryui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','3ee6c616-ad81-4fea-ae1b-ef0fafefe18c',NULL,NULL,NULL,NULL),('htmlformentryui.started','true','DO NOT MODIFY. true/false whether or not the htmlformentryui module has been started. This is used to make sure modules that were running prior to a restart are started again','48983969-a93d-42f5-bf01-e13c1ab4ba0e',NULL,NULL,NULL,NULL),('htmlwidgets.mandatory','false','true/false whether or not the htmlwidgets module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','71cb9202-1832-4671-b08d-6636db090e8b',NULL,NULL,NULL,NULL),('htmlwidgets.started','true','DO NOT MODIFY. true/false whether or not the htmlwidgets module has been started. This is used to make sure modules that were running prior to a restart are started again','43081a3e-033a-419c-9768-73c00ab2c8bc',NULL,NULL,NULL,NULL),('idgen.database_version','2.5.1','DO NOT MODIFY. Current database version number for the idgen module.','a3739dff-9cf4-4872-b999-5381f235c8b7',NULL,NULL,NULL,NULL),('idgen.mandatory','false','true/false whether or not the idgen module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','01123c0b-33a2-4774-9bed-b787e972dbe0',NULL,NULL,NULL,NULL),('idgen.started','true','DO NOT MODIFY. true/false whether or not the idgen module has been started. This is used to make sure modules that were running prior to a restart are started again','a99987a1-871c-489f-b7f6-9bebc590680b',NULL,NULL,NULL,NULL),('isanteplus.adultStartingAge','14','Adult starting age in years, OpenMRS uses 13, Haiti uses\n14','0bea7ff3-842b-4b35-9776-32c69e9c6cb2',NULL,NULL,NULL,NULL),('isanteplus.bloodOxygenSaturationConceptId','5092','Blood Oxygen Saturation concept id','2287aed2-0bce-4298-8806-8b641a7ab9c0',NULL,NULL,NULL,NULL),('isanteplus.completedConceptId','1267','COMPLETED Concept id','36eff77e-d2b5-4c69-8d2e-7bdb80274cbe',NULL,NULL,NULL,NULL),('isanteplus.diastolicBloodPressureConceptId','5086','DiastolicBlood Pressure rate concept id','96b79bba-c49c-45a2-ae20-f1a56d885f9b',NULL,NULL,NULL,NULL),('isanteplus.enabledIsantePlusUI','true','Set to false to disable iSantePlus custom user interface','e7ebe52c-427b-4fa0-b360-c62b076e1a14',NULL,NULL,NULL,NULL),('isanteplus.formIdsToExcludeFromHistory',NULL,'Forms IDs to exclude from form History','27921870-d522-4e58-91b8-af144c0f0092',NULL,NULL,NULL,NULL),('isanteplus.formNeedsReviewConceptId','163341','Form needs review concept id','1e486d2b-3030-4706-9a03-bbbe35362381',NULL,NULL,NULL,NULL),('isanteplus.formStatusConceptId','163340','Form status concept id','4955e5c5-7cf0-4716-ae33-3af4d83ede09',NULL,NULL,NULL,NULL),('isanteplus.headCircumferenceConceptId','5314','Head Circumference Concept Id','a037387c-1c6c-4ac3-a77d-ad9eefe8f3b3',NULL,NULL,NULL,NULL),('isanteplus.incompleteConceptId','163339','Incomplete Concept id','179d8b84-0115-43fe-81d5-f8da1b292273',NULL,NULL,NULL,NULL),('isanteplus.mandatory','false','true/false whether or not the isanteplus module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ebeee299-5663-42b9-b428-345f859c954e',NULL,NULL,NULL,NULL),('isanteplus.metadataLastUpdatedDate','20171211','This is the last date that the iSantePlus metadata was\nloaded. This date is evaluated each time the module is started.\nChange it to load the metadata again.','2f48585a-f589-4a37-9feb-beed89d0cd39',NULL,NULL,NULL,NULL),('isanteplus.midUpperArmCircumferenceConceptId','1343','Mid Upper Arm Circumference concept id','0be400b0-4e6b-4072-961d-d7ab1bfd584e',NULL,NULL,NULL,NULL),('isanteplus.noConceptId','1066','No Concept id','ff9a984f-a465-41a0-b07c-59e7af4460f0',NULL,NULL,NULL,NULL),('isanteplus.pulseConceptId','5087','Pulse concept id','21b584b3-060c-4123-8eec-68fa5d87b6e0',NULL,NULL,NULL,NULL),('isanteplus.respiratoryRateConceptId','5242','Respiratory rate concept id','37008737-da5a-4f6b-a7cc-855dbfe88519',NULL,NULL,NULL,NULL),('isanteplus.started','true','DO NOT MODIFY. true/false whether or not the isanteplus module has been started. This is used to make sure modules that were running prior to a restart are started again','972b99c8-0741-4ef8-bbd2-b3c0da8af7e5',NULL,NULL,NULL,NULL),('isanteplus.systolicBloodPressureConceptId','5085','Systolic Blood Pressure rate concept id','f4da2d0f-7765-40e8-90c0-c169e2c9a2c3',NULL,NULL,NULL,NULL),('isanteplus.temperatureConceptId','5088','Temperature concept id','9b57e331-8d42-42af-8615-89c5cc4d9f36',NULL,NULL,NULL,NULL),('isanteplus.viralLoadConceptId','856','HIV VIRAL LOAD concept id','8a0f68c6-52d1-4a7d-8f13-3d5901f09b88',NULL,NULL,NULL,NULL),('isanteplus.yesConceptId','1065','Yes Concept id','4b209017-5c31-48d0-835b-9a71e20f1ffa',NULL,NULL,NULL,NULL),('iSantePlusReports.ipAddress','172.23.0.7',NULL,'169f1989-3986-4d9a-a850-f93b649f3ab0',NULL,NULL,NULL,NULL),('isanteplusreports.mandatory','false','true/false whether or not the isanteplusreports module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','22deed9b-4128-4841-9980-d0557980336b',NULL,NULL,NULL,NULL),('isanteplusreports.started','true','DO NOT MODIFY. true/false whether or not the isanteplusreports module has been started. This is used to make sure modules that were running prior to a restart are started again','8923ef1e-0f66-4328-8282-2d7ca3388330',NULL,NULL,NULL,NULL),('labintegration.hl7.dateFormat','yyyyMMddHHmmss','Default date format for messages','c2657525-ca8b-40d4-9392-2397445a6796',NULL,NULL,NULL,NULL),('labintegration.hl7.motherNameAttrTypeUuid','First Name of Mother','The name of the attribute type used to represent the mother name.','86270066-464a-4bba-872c-30d142817ea5',NULL,NULL,NULL,NULL),('labintegration.hl7.phoneNumAttrTypeUuid','Telephone Number','The name of the attribute type used to represent the patient phone number.','4c2e978c-ef73-4546-a4ee-3ee9a64e8a78',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.birthPlaceCity','CIEL:165198','The designation of the birth city, in the form of SOURCE:CODE. Will be used to\nretrieve the correct obs from the birth obs group.','2e3ee439-a7ed-4cf4-b7ec-4a502b1fcedd',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.birthPlaceGroup','CIEL:165194','The designation of the concept grouping birth address concepts, in the form of\nSOURCE:CODE. Will be used to retrieve the correct obs from the registration form.','cd90fb01-17d7-4005-8587-7223bea39676',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.civilStatus','CIEL:1054','The designation of the civil status concept, in the form of SOURCE:CODE. Will be\nused to retrieve the correct obs from the registration form.','620cb55a-4ae1-4539-8931-506959da37f8',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.religion','CIEL:162929','The designation of the religion concept, in the form of SOURCE:CODE. Will be\nused to retrieve the correct obs from the registration form.','bc89b111-37b1-4bbe-ad5d-a551d5e29681',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.typeUuid','873f968a-73a8-4f9c-ac78-9f4778b751b6','The UUID of the registration form.','e19f192e-f497-4742-b46c-59dd0ecbe6c3',NULL,NULL,NULL,NULL),('labintegration.mandatory','false','true/false whether or not the labintegration module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','dfff115c-a604-44b3-ba25-f1ac3dbd830c',NULL,NULL,NULL,NULL),('labintegration.openElis.inboundHost',NULL,'The host of OpenELIS used that has to match when receiving inbound messages. If not set,\nthe value will be retrieved from the OpenELIS url. Use this if the host from the outbound url\ndoes not match the IP in OpenELIS inbound messages.','a7d252b2-ba9c-48a0-b23a-89868825ea54',NULL,NULL,NULL,NULL),('labintegration.openElis.pidTypeUuid','05a29f94-c0ed-11e2-94be-8c13b969e334','UUID of the Patient Identifier Type for the OpenELIS integration.','fe6d5749-9024-4d1e-af10-f24087c6dc7d',NULL,NULL,NULL,NULL),('labintegration.openElis.receivingApplication','OpenELIS','The Namespace ID of the receiving application in the HL7v2 message being sent to OpenELIS.','7a6e49be-7208-4493-a01e-a0e2c6f732b6',NULL,NULL,NULL,NULL),('labintegration.openElis.sendingApplication','iSantePlus','The Namespace ID of the sending application in the HL7v2 message being sent to OpenELIS.','122f64ac-2612-4a75-b10f-ce14aed77c21',NULL,NULL,NULL,NULL),('labintegration.openElis.url',NULL,'The URL to the OpenELIS endpoint that accepts HL7 message posts.','faf2d931-be14-4685-8d4a-58ee4f1ccfbf',NULL,NULL,NULL,NULL),('labintegration.orderEncounterTypeUuid','f037e97b-471e-4898-a07c-b8e169e0ddc4','The UUID of EncounterType that specifies encounters with lab orders.','cb837d56-cc7d-44dd-b3be-913d9d70d522',NULL,NULL,NULL,NULL),('labintegration.production','false','Whether this module is deployed to production - true or false. Translates to the processing ID flag\nsent in HL7 messages.','3e1a1f81-5eef-4fc5-a092-05678de9514f',NULL,NULL,NULL,NULL),('labintegration.scc.pidTypeUuid',NULL,'UUID of the Patient Identifier Type for the SCC.','693e099f-d954-4c4d-9f75-5f4a07f043b3',NULL,NULL,NULL,NULL),('labintegration.started','true','DO NOT MODIFY. true/false whether or not the labintegration module has been started. This is used to make sure modules that were running prior to a restart are started again','97e2c0af-c1a3-455b-a178-a1a0a8147348',NULL,NULL,NULL,NULL),('layout.address.format','\n \n \n country\n haiticore.address.country\n \n \n address3\n haiticore.address.neighborhoodCell\n \n \n address2\n haiticore.address.address2\n \n \n address1\n haiticore.address.address1\n \n \n stateProvince\n haiticore.address.stateProvince\n \n \n cityVillage\n haiticore.address.cityVillage\n \n \n \n \n country\n 40\n \n \n address3\n 60\n \n \n address2\n 60\n \n \n address1\n 60\n \n \n stateProvince\n 40\n \n \n cityVillage\n 40\n \n \n \n \n country\n Haiti\n \n \n \n address2\n address1\n address3, cityVillage\n stateProvince, country\n \n 0\n','XML description of address formats','98fa7af1-d183-4f70-93fb-2f488000ce4c',NULL,NULL,NULL,NULL),('layout.name.format','givenfamily','Format in which to display the person names. Valid values are short, long','8ece8adf-4d79-4b52-a233-66187cb72f3a',NULL,NULL,NULL,NULL),('legacyui.mandatory','false','true/false whether or not the legacyui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','198e8868-d4b9-41f7-a669-818d77717c0a',NULL,NULL,NULL,NULL),('legacyui.started','true','DO NOT MODIFY. true/false whether or not the legacyui module has been started. This is used to make sure modules that were running prior to a restart are started again','5212f2df-791e-457b-a28b-ce2295221317',NULL,NULL,NULL,NULL),('locale.allowed.list','fr, ht, en, en_us, en_gb','Comma delimited list of locales allowed for use on system','2b4d2797-e8d1-4483-a863-02cfb4299212',NULL,NULL,NULL,NULL),('location.field.style','default','Type of widget to use for location fields','e77923c2-d262-4f8c-b8fe-40773827ea4d',NULL,NULL,NULL,NULL),('log.layout','%p - %C{1}.%M(%L) |%d{ISO8601}| %m%n','A log layout pattern which is used by the OpenMRS file appender.','44dd2b3e-af42-4abf-ad6e-eadb48a89d41',NULL,NULL,NULL,NULL),('log.level','org.openmrs.api:info','Logging levels for log4j.xml. Valid format is class:level,class:level. If class not specified, \'org.openmrs.api\' presumed. Valid levels are trace, debug, info, warn, error or fatal','cf66565e-d00b-4127-a774-07bad9e486fc',NULL,NULL,NULL,NULL),('log.location',NULL,'A directory where the OpenMRS log file appender is stored. The log file name is \'openmrs.log\'.','4683b0d6-45aa-4fab-a257-ae754ef1e855',NULL,NULL,NULL,NULL),('logic.default.ruleClassDirectory','logic/class','Default folder where compiled rule will be stored','e3231a20-9b7c-4101-8bbb-bfad2faa6fb5',NULL,NULL,NULL,NULL),('logic.default.ruleJavaDirectory','logic/sources','Default folder where rule\'s java file will be stored','6cca96f1-7139-44dc-a7d5-891530a26987',NULL,NULL,NULL,NULL),('logic.defaultTokens.conceptClasses',NULL,'When registering default tokens for logic, if you specify a comma-separated list of concept class names here, only concepts of those classes will have tokens registered. If you leave this blank, all classes will have tokens registered for their concepts.','13ac9af0-1f9b-405a-9f0f-5e3f00a37ce5',NULL,NULL,NULL,NULL),('logic.mandatory','false','true/false whether or not the logic module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','b3d2befc-61c7-4d39-b8ee-436ccb05fc16',NULL,NULL,NULL,NULL),('logic.started','true','DO NOT MODIFY. true/false whether or not the logic module has been started. This is used to make sure modules that were running prior to a restart are started again','21a52a97-c08d-4ea0-9404-efec9b204bbc',NULL,NULL,NULL,NULL),('m2sys-biometrics.accessPointID','2D10F89739EA408889F62C32CAB420E3','The m2sys server AccessPointID. This is used by default unless a mapping that matches the callers IP\n is found in the accessPointMap property.','201011d8-5c89-43f3-916a-d1d8200ace08',NULL,NULL,NULL,NULL),('m2sys-biometrics.accessPointMap',NULL,'A map of IP addresses to Access Point IDs. Has format of IP1:AccessPointID1;IP2:AccessPointID2;...\n For example 127.0.0.1:APID1;8.8.8.8:APID2... The IPs must match the IPs of the clients calling the\n server.','0a84a97f-19b5-4ea3-9b5f-332b1c097cd7',NULL,NULL,NULL,NULL),('m2sys-biometrics.captureTimeout','10000','The m2sys server CaptureTimeout.','db6f8fb5-c4b3-4454-b29d-4babdbabb112',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.api.url',NULL,'Base URL to the cloud fingerprint matching engine API endpoints.','b1d2077c-d235-47c1-95fd-f5d08ec2c084',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.app.key','521b76848bda4cd4a018edd0316120cf','Client assigned CLOUDABIS APP KEY for access to the cloud fingerprint matching engine API endpoints.','9c0cd4dd-174d-47b9-8b7c-5371dd996e53',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.customer.key','D6423BE64DCD4A119691B294A7D5A77A','User assigned customer key for grouping different CLOUDABIS Apps.','fdd4207b-08a3-4992-9360-c9c0cfe86a8b',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.engine.name','FPFF02','User preffered engine for processing CLOUDABIS requests.','cb5bff7f-df5e-4853-a532-10b5ab73a44a',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.grant.type','password','Client preferred grant type for access to the cloud fingerprint matching engine API endpoints.','e2d2c002-1eb7-4c1a-a21c-34106ff2153e',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.secret.key','jcREl+Buqt076o4XDmZ4RCBrJro=','Client assigned SECRET KEY for access to the cloud fingerprint matching engine API endpoints.','9ea5d99c-7379-4fc3-a84a-e7da568f5b56',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.template.format','FP1','Preferred template format - Usually tied to the capabilities of the user-procured fingerprint scanner.','e4071ee6-8496-4282-902f-aa2106e1eb6b',NULL,NULL,NULL,NULL),('m2sys-biometrics.customKey','31F25750D4E048D4B4A452B5DB723C5E','The m2sys server CustomKey.','6fdfa405-a6a9-4ba7-b370-4a7a0dd14555',NULL,NULL,NULL,NULL),('m2sys-biometrics.device.name','Secugen','The m2sys fingerprint scanning device name.','14f45309-5c18-45d6-a285-24b8618a8e1a',NULL,NULL,NULL,NULL),('m2sys-biometrics.local-service.url','http://200.2.133.226/M2SYS.BioPluginWeb/BioPluginServicev8.asmx?wsdl','The URL to the SOAP service of the local (local to the clinic) M2Sys BioPlugin Server.','f7f7d194-875f-4f22-ba67-c739b4706459',NULL,NULL,NULL,NULL),('m2sys-biometrics.locationID','2','The m2sys server location ID.','e545ce87-4d23-46e1-96ce-c386587f6542',NULL,NULL,NULL,NULL),('m2sys-biometrics.mandatory','false','true/false whether or not the m2sys-biometrics module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','7d15f95f-680a-430f-8b7d-fca04b6c5c47',NULL,NULL,NULL,NULL),('m2sys-biometrics.national-service.url',NULL,'The URL to the SOAP service of the national M2Sys BioPlugin Server.','ebc4cd00-ffff-48fe-a278-1878718b9eb9',NULL,NULL,NULL,NULL),('m2sys-biometrics.nationalRegistrationTaskInterval',NULL,'Interval time (in seconds) to execute retry of national registration failures task.','3f36aef6-c825-40dd-a01f-43b970e88f08',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.constTestTemplate','CYkoCIMUAIABwA4LCCkADAkLUeAJDWhyAAcO4H7ABAcekQASCOjNwAYSnSXhFAUszQEUCS3VoQ8K0OmhAwdOUQIISyxpAhcIOnJiCSdJgUIIGzrNohMLMRHDFQ9XOQMABsxKwwIJylGDBwiEiYF/eYhzi315b3N6e3p3g2ppcw==CYkoCIMUAIABwA4LCCkADAkLUeAJDWhyAAcO4H7ABAcekQASCOjNwAYSnSXhFAUszQEUCS3VoQ8K0OmhAwdOUQIISyxpAhcIOnJiCSdJgUIIGzrNohMLMRHDFQ9XOQMABsxKwwIJylGDBwiEiYF/eYhzi315b3N6e3p3g2ppcw==','A default test fingerprint template for instances when the fingerprint scanner is not available.','7276ee01-5881-4c16-a327-ae32b5ea3bac',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.national.password',NULL,'The m2sys national server password.','90c644d6-9167-4e50-8d74-8d03717b0da8',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.national.user',NULL,'The m2sys national server username.','a70ef0a3-5c37-46ed-b9ff-41bf5662ebb2',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.password',NULL,'The m2sys CloudScanr password.','f0b1e866-4706-454a-b8ad-a47febf19d78',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.url','http://localhost:15896','The m2sys CloudScanr url.','53dc502c-e91b-4867-97bb-86d65e484739',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.user',NULL,'The m2sys CloudScanr username.','894293f2-72ca-4a37-81de-c2d6eb657f0d',NULL,NULL,NULL,NULL),('m2sys-biometrics.started','true','DO NOT MODIFY. true/false whether or not the m2sys-biometrics module has been started. This is used to make sure modules that were running prior to a restart are started again','d0f32473-768e-4be5-a7b7-d5d50855c5d7',NULL,NULL,NULL,NULL),('mail.debug','false','true/false whether to print debugging information during mailing','76c4f916-9fe1-45b5-9773-224e4f4ee484',NULL,NULL,NULL,NULL),('mail.default_content_type','text/plain','Content type to append to the mail messages','f5830019-a60a-47fe-865f-78fb98b3f5f1',NULL,NULL,NULL,NULL),('mail.from','info@openmrs.org','Email address to use as the default from address','a8303d1e-de7b-45b8-bc04-2874ae7da635',NULL,NULL,NULL,NULL),('mail.password','test','Password for the SMTP user (if smtp_auth is enabled)','858118bf-794b-42c4-8266-dcf850963b34',NULL,NULL,NULL,NULL),('mail.smtp.starttls.enable','false','Set to true to enable TLS encryption, else set to false','bc0b4cb1-ed37-4e3d-a447-9f3055671dd3',NULL,NULL,NULL,NULL),('mail.smtp_auth','false','true/false whether the smtp host requires authentication','ebe1af62-5e72-4c44-a044-955a9a8b29b4',NULL,NULL,NULL,NULL),('mail.smtp_host','localhost','SMTP host name','ea0625e2-9f64-40a6-9c32-6720772fd3d4',NULL,NULL,NULL,NULL),('mail.smtp_port','25','SMTP port','e77ee4de-13f1-4a7f-b41e-eb2f720cd49d',NULL,NULL,NULL,NULL),('mail.transport_protocol','smtp','Transport protocol for the messaging engine. Valid values: smtp','9fa39a09-2b7a-415c-877c-2308cb3caa12',NULL,NULL,NULL,NULL),('mail.user','test','Username of the SMTP user (if smtp_auth is enabled)','e0f2afbe-eff3-4787-960c-e61b56c0b00d',NULL,NULL,NULL,NULL),('metadatadeploy.bundle.version.org.openmrs.module.haiticore.metadata.bundles.HaitiAddressBundle','11',NULL,'c2a7126b-c05d-4ae3-a8b2-3fa6c22a562d',NULL,NULL,NULL,NULL),('metadatadeploy.mandatory','false','true/false whether or not the metadatadeploy module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ce5f1b5e-bc32-43eb-a027-f47bb5b8a775',NULL,NULL,NULL,NULL),('metadatadeploy.started','true','DO NOT MODIFY. true/false whether or not the metadatadeploy module has been started. This is used to make sure modules that were running prior to a restart are started again','35aca365-e1bb-4fb2-bcb8-4ed3bff08dae',NULL,NULL,NULL,NULL),('metadatamapping.addLocalMappings',NULL,'Specifies whether the concept mappings to the local dictionary should be created when exporting concepts','6a58d18b-74c1-4d09-890b-48ea938a66f5',NULL,NULL,NULL,NULL),('metadatamapping.mandatory','false','true/false whether or not the metadatamapping module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','aa8482b4-b13d-484a-a79c-b647e62a5f7e',NULL,NULL,NULL,NULL),('metadatamapping.started','true','DO NOT MODIFY. true/false whether or not the metadatamapping module has been started. This is used to make sure modules that were running prior to a restart are started again','a9cde7b9-3836-4065-a8bf-d42a35c61683',NULL,NULL,NULL,NULL),('metadatasharing.enableOnTheFlyPackages','false','Specifies whether metadata packages can be exported on the fly','55172c30-b92f-494b-bf45-af29ef198e75',NULL,NULL,NULL,NULL),('metadatasharing.mandatory','false','true/false whether or not the metadatasharing module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','9078c7ab-658b-4585-a9d5-c8fd246331b1',NULL,NULL,NULL,NULL),('metadatasharing.persistIdsForClasses',NULL,'A comma separated list of class package/names that denotes classes to try and persist ids for. Common options: org.openmrs.Concept,org.openmrs.Form,org.openmrs.ConceptDatatype,org.openmrs.ConceptClass,org.openmrs.EncounterType,org.openmrs.IdentifierType,org.openmrs.RelationshipType,org.openmrs.Location','8a6dc4a6-606d-4933-83b2-11944e2b299e',NULL,NULL,NULL,NULL),('metadatasharing.preferredConceptSourceIds',NULL,'Comma-separated list of concept source Ids for preferred sources, in case an incoming concept \nhas duplicate mappings to any of these sources, no confirmation will be required unless its \ndatatype or concept class differs from that of the existing concept','66154c95-4d64-4d2d-a398-47d3ac2dd166',NULL,NULL,NULL,NULL),('metadatasharing.started','true','DO NOT MODIFY. true/false whether or not the metadatasharing module has been started. This is used to make sure modules that were running prior to a restart are started again','f2062199-7686-47bb-801f-c2c0c8af337b',NULL,NULL,NULL,NULL),('metadatasharing.webservicesKey',NULL,'Key to grant access to remote systems to consume module webservices RESTfully','5e950ae6-39fa-4756-bf64-01bd7d26bc8b',NULL,NULL,NULL,NULL),('minSearchCharacters','3','Number of characters user must input before searching is started.','3cf7f948-6543-446f-bf62-ed72789bef00',NULL,NULL,NULL,NULL),('module_repository_folder','modules','Name of the folder in which to store the modules','b2d12eb8-a129-43b3-9dd9-dc5460fee0bf',NULL,NULL,NULL,NULL),('mpi-client.backgrounThreads','true','When true indicates that ADT messages should be sent on a background thread','267714e3-ac50-4c3d-b689-13cbae7ec205',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.addr',NULL,'The address of the audit repository node','c4325e73-4d85-424f-b0bf-09febf77816c',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.bind',NULL,'The local bind address for UDP connection','f32ed00a-ab83-40c2-993c-d9c814dd8e58',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.port',NULL,'The port # to use when sending the audits','eb319b40-d72c-4741-bc9a-9fcec94b14f5',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.transport',NULL,'The transport to use (audit-udp, audit-tcp, audit-tls)','d91f0551-0baf-42dd-b05d-05644833043a',NULL,NULL,NULL,NULL),('mpi-client.endpoint.format','fhir','The messaging format (HL7 or FHIR) to use to interact with the MPI','70c96f79-1a61-440a-a033-abe35fa3870e',NULL,NULL,NULL,NULL),('mpi-client.endpoint.cr.addr','http://openhim-core:5001/CR/fhir','Identifies the location of the Client Registry endpoint',UUID(),NULL,NULL,NULL,NULL),('mpi-client.endpoint.pdq.addr','http://openhim-core:5001/CR/fhir','Identifies the location of the PDQ endpoint','2fd3b5b9-cb78-4422-b421-92e08d370543',NULL,NULL,NULL,NULL),('mpi-client.endpoint.pdq.port',NULL,'Identifies the port of the PDQ interface','b6f33177-fc65-49a4-9edc-428cc76ec20a',NULL,NULL,NULL,NULL),('mpi-client.endpoint.pix.addr','http://openhim-core:5001/CR/fhir','Identifies the location of the PIX endpoint','d0817aa7-5b3b-4e20-abf7-8645afff1d79',NULL,NULL,NULL,NULL),('mpi-client.endpoint.pix.port',NULL,'Identifies the port of the PIX interface','27fbd05c-213b-42e5-9dbb-f87abeb621b4',NULL,NULL,NULL,NULL),('mpi-client.ext.extendedAttributes','Father\'s Name:NK1-2-2?NK1-3=FTH,Mother\'s Name:PID-6-2,Place of Birth:PID-23,Telephone contact:PID-13,Email address:PID-14,National ID=PID-19','PersonAttributes (in OpenMRS) you would like imported from the message. Format= attr_name:segment_path?segment_guard=guard_value, . For example, to copy NK1-2-2 to fathers name: Father\'s Name=NK1-2-2?NK1-3=FTH','58b7d092-f2c3-49c4-bf32-4d6c46850a13',NULL,NULL,NULL,NULL),('mpi-client.ext.storeNK1AsRelationships','false','When true, store NK1 (next-of-kin) as OpenMRS relationships (note some OpenMRS software does not understand these)','f1c8eea3-4ba3-44b2-9bbc-7818d0567855',NULL,NULL,NULL,NULL),('mpi-client.http.proxyAddress',NULL,NULL,'8692bceb-c266-49f1-a8cd-0ea857c4b2d9',NULL,NULL,NULL,NULL),('mpi-client.msg.remoteApplication','OpenCR','The registered application name for *RECIPIENT* endpoint (MSH-5)','22cdaaab-ad5a-4d65-af8b-9087e465946c',NULL,NULL,NULL,NULL),('mpi-client.msg.remoteFacility','NATIONAL_DC','The registered facility name for *RECIPIENT* endpoint (MSH-6)','1cb813f8-dfce-45ad-b953-ccb84edf7c19',NULL,NULL,NULL,NULL),('mpi-client.msg.sendingApplication','isanteplus','The registered application name for *THIS* endpoint (MSH-3)','d291ed5f-5b2e-4432-a18c-1e41fb9da06d',NULL,NULL,NULL,NULL),('mpi-client.msg.sendingFacility','LOCAL','The registered facility name for *THIS* endpoint (MSH-4)','c6334657-5289-455e-bf1d-b3282a20e880',NULL,NULL,NULL,NULL),('mpi-client.pid.autoXref','iSantePlus ID,Code ST,Code National,ECID,iSante ID,Code PC','A comma separated list of patient identity domains which should be automatically cross referenced from the MPI when registration is successful','3fd49e29-6893-484f-8446-0029e9277dae',NULL,NULL,NULL,NULL),('mpi-client.pid.correlation','LOCAL','The preferred correlation identity','33ae75d9-3301-4aa9-ab24-14d9d9bb7eaf',NULL,NULL,NULL,NULL),('mpi-client.pid.defaultCountry','CA','When specified, sets the default country code to use when no country code is present','c6030838-bda5-4161-973e-c0b194fb7f98',NULL,NULL,NULL,NULL),('mpi-client.pid.enterprise','ENT_ID','Identifies the enterprise authority (globally unique) of the patient generated by the MPI','44cef6be-bc37-4e0b-9a4b-4f6f30e8e4cf',NULL,NULL,NULL,NULL),('mpi-client.pid.exportIdentitiferType','Patient ID=iSantePlus ID,Code ST=Code ST,Code National=Code National,Code PC=Code PC','When specified, indicates the patient identifier types and domains that should be exported (example: HIV Programme ID=HIV_ID)','6a358579-b3c9-46eb-8242-62906aad68e7',NULL,NULL,NULL,NULL),('mpi-client.pid.local','http://isanteplus/ws/fhir2/pid/openmrsid/','Identifies the local assigning authority of this OpenMRS instances (or a \'-\' if you don\'t want to send local identifiers)','d75bfbf0-914d-448c-a9c2-158c237c6cb4',NULL,NULL,NULL,NULL),('mpi-client.pid.nameRewriteRegex',NULL,'Identifies the regex that should be used to rewrite names. For example to extract the first prefix in Myanmar: /^(ma|mg|daw)?(.*)$/^$2^^^$1','a2208951-8f97-4aa2-879c-3f6691fa2c2d',NULL,NULL,NULL,NULL),('mpi-client.pid.nhid','iSantePlus ID','Identifies the assigning authority of the national health ID','a52204fd-858c-48ff-b4f5-c1096925f4eb',NULL,NULL,NULL,NULL),('mpi-client.reg.birthPlaceConcept','165194AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','Concept UUID for the patient place of birth construct','74530139-d963-47d7-a562-e2bf8c2c5b0a',NULL,NULL,NULL,NULL),('mpi-client.reg.mothersName','First Name of Mother','The attribute name to use for the Mother\'s maiden name','d985828d-5d84-47b3-a927-a2492f7b0856',NULL,NULL,NULL,NULL),('mpi-client.reg.patientTelephoneNumber','Telephone Number','The telephone number for the patient','394ef2b3-0d45-4fb0-b24b-015c5f3abaa3',NULL,NULL,NULL,NULL),('mpi-client.search.dateFuzz','0','The amount of fuzziness to add to fuzzy date searches (example: search for 1995,1996,1997 instead of just 1996)','a85e5541-7471-40fc-9316-2e7ac172914a',NULL,NULL,NULL,NULL),('mpi-client.security.authtoken','isanteplus','If the MPI requires an authentication token in MSH-8 enter it here','7b92c347-9ca7-4497-96a3-23775555f7a8',NULL,NULL,NULL,NULL),('mpi-client.security.authType','basic','Identifies the authentication type. Use blank, oauth or basic','2f76da4e-6e84-45f7-8cee-ad38d1bfdb37',NULL,NULL,NULL,NULL),('mpi-client.security.idp.addr',NULL,NULL,'c448b502-c8a1-4e09-afdb-1dc6115a028a',NULL,NULL,NULL,NULL),('mpi-client.security.keyStore',NULL,'If the MPI requires client certificate authentication, enter it here','aa3030c7-426d-4b53-b296-5a028c993f7b',NULL,NULL,NULL,NULL),('mpi-client.security.keyStorePassword',NULL,'The password for the keyStore','6b8d4915-5f6c-4052-b779-fb5f6818484c',NULL,NULL,NULL,NULL),('mpi-client.security.trustStore',NULL,'The trust store of to use to validate the identity of the MPI\'s certificate','b275c040-3c62-4a83-9b95-4a583b1e1aa2',NULL,NULL,NULL,NULL),('mpi-client.security.trustStorePassword',NULL,'The password used to unlock the trust store','468a512c-c4cc-4d93-aa80-fdb9f39a2b1e',NULL,NULL,NULL,NULL),('namephonetics.familyName2StringEncoder','Soundex',NULL,'02bd7d87-fb93-4e1f-907f-6a766519238a',NULL,NULL,NULL,NULL),('namephonetics.familyNameStringEncoder','Soundex',NULL,'7916c675-ece7-4951-b67c-f893a4956dad',NULL,NULL,NULL,NULL),('namephonetics.givenNameStringEncoder','Soundex',NULL,'909470af-ed33-43a1-a6fb-803fb67e62ba',NULL,NULL,NULL,NULL),('namephonetics.middleNameStringEncoder','Soundex',NULL,'936aaad9-c6e4-484f-a467-31acd12d5fad',NULL,NULL,NULL,NULL),('newPatientForm.relationships',NULL,'Comma separated list of the RelationshipTypes to show on the new/short patient form. The list is defined like \'3a, 4b, 7a\'. The number is the RelationshipTypeId and the \'a\' vs \'b\' part is which side of the relationship is filled in by the user.','08136389-c093-49da-8e9a-c08121e07696',NULL,NULL,NULL,NULL),('new_patient_form.showRelationships','false','true/false whether or not to show the relationship editor on the addPatient.htm screen','63af8912-caaa-4500-b212-8c7c0cb70e6a','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('obs.complex_obs_dir','complex_obs','Default directory for storing complex obs.','4928b05f-2b64-4ea1-9947-245ff4825ca2',NULL,NULL,NULL,NULL),('order.drugDispensingUnitsConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible drug dispensing units','d9f832df-2684-4409-ade6-686cfa2c21b8',NULL,NULL,NULL,NULL),('order.drugDosingUnitsConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible drug dosing units','504c31ca-f4a1-41ca-bda3-dc98757450b1',NULL,NULL,NULL,NULL),('order.drugRoutesConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible drug routes','fba4706b-f543-4805-86af-6b2237295d9f',NULL,NULL,NULL,NULL),('order.durationUnitsConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible duration units','1868853d-7974-46a4-b407-8c6f75f37eda',NULL,NULL,NULL,NULL),('order.nextOrderNumberSeed','1','The next order number available for assignment','fa7d6a87-674d-400e-bcf2-c6f0260bb46a',NULL,NULL,NULL,NULL),('order.orderNumberGeneratorBeanId',NULL,'Specifies spring bean id of the order generator to use when assigning order numbers','66efc0db-5820-4946-94c7-523a50fc2b6f',NULL,NULL,NULL,NULL),('order.testSpecimenSourcesConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible test specimen sources','e9f6b313-f29a-40f9-922f-ea6f67f680f9',NULL,NULL,NULL,NULL),('outgoing-message-exceptions.mandatory','false','true/false whether or not the outgoing-message-exceptions module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','abbc8653-540d-4a0a-a74a-f6d6aaf99fef',NULL,NULL,NULL,NULL),('outgoing-message-exceptions.started','true','DO NOT MODIFY. true/false whether or not the outgoing-message-exceptions module has been started. This is used to make sure modules that were running prior to a restart are started again','6b69ce59-9beb-47df-8b6d-df35a391d403',NULL,NULL,NULL,NULL),('owa.appBaseUrl',NULL,'The base URL from where the Open Web Apps are hosted','61f3dbec-bc8b-4455-9b28-42b5f08172ae',NULL,NULL,NULL,NULL),('owa.appFolderPath','/openmrs/data/owa','The default location where the apps are stored on disk','c7a2743a-1c0e-45c6-a060-f1d85054ac46',NULL,NULL,NULL,NULL),('owa.appStoreUrl','http://modules.openmrs.org','The default URL for the OpenMRS appstore','eda6f3b1-a57b-4b9b-bf59-dd4423e86801',NULL,NULL,NULL,NULL),('owa.mandatory','false','true/false whether or not the owa module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','0ca25136-adcf-41dd-b4a7-7511bc0b9d4d',NULL,NULL,NULL,NULL),('owa.started','true','DO NOT MODIFY. true/false whether or not the owa module has been started. This is used to make sure modules that were running prior to a restart are started again','1578919e-83e6-4f3c-b948-d371f8112d4d',NULL,NULL,NULL,NULL),('patient.defaultPatientIdentifierValidator','org.openmrs.patient.impl.LuhnIdentifierValidator','This property sets the default patient identifier validator. The default validator is only used in a handful of (mostly legacy) instances. For example, it\'s used to generate the isValidCheckDigit calculated column and to append the string \"(default)\" to the name of the default validator on the editPatientIdentifierType form.','2fd23ac4-60f6-4ae3-9508-9c3f15d77e09',NULL,NULL,NULL,NULL),('patient.headerAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that will be shown on the patient dashboard','6c1c3e59-8576-43f2-9799-ed92752d8555',NULL,NULL,NULL,NULL),('patient.identifierPrefix',NULL,'This property is only used if patient.identifierRegex is empty. The string here is prepended to the sql indentifier search string. The sql becomes \"... where identifier like \'\';\". Typically this value is either a percent sign (%) or empty.','6b578bf3-507c-43ed-b0aa-9ccd47a261b4',NULL,NULL,NULL,NULL),('patient.identifierRegex',NULL,'WARNING: Using this search property can cause a drop in mysql performance with large patient sets. A MySQL regular expression for the patient identifier search strings. The @SEARCH@ string is replaced at runtime with the user\'s search string. An empty regex will cause a simply \'like\' sql search to be used. Example: ^0*@SEARCH@([A-Z]+-[0-9])?$','3b223d05-8864-4ef6-9ca9-212483a9645d',NULL,NULL,NULL,NULL),('patient.identifierSearchPattern',NULL,'If this is empty, the regex or suffix/prefix search is used. Comma separated list of identifiers to check. Allows for faster searching of multiple options rather than the slow regex. e.g. @SEARCH@,0@SEARCH@,@SEARCH-1@-@CHECKDIGIT@,0@SEARCH-1@-@CHECKDIGIT@ would turn a request for \"4127\" into a search for \"in (\'4127\',\'04127\',\'412-7\',\'0412-7\')\"','98307f49-4ff2-4380-8e5e-d92794bdf4cd',NULL,NULL,NULL,NULL),('patient.identifierSuffix',NULL,'This property is only used if patient.identifierRegex is empty. The string here is prepended to the sql indentifier search string. The sql becomes \"... where identifier like \'\';\". Typically this value is either a percent sign (%) or empty.','1ff0ff33-44c3-41b2-9111-6b7d336b1581',NULL,NULL,NULL,NULL),('patient.listingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for patients in _lists_','b6603753-e0cd-45c8-9d78-e61b49a7efdd',NULL,NULL,NULL,NULL),('patient.nameValidationRegex',NULL,'Names of the patients must pass this regex. Eg : ^[a-zA-Z \\-]+$ contains only english alphabet letters, spaces, and hyphens. A value of .* or the empty string means no validation is done.','17584323-1830-4059-a6ae-7aa8a34d9e50',NULL,NULL,NULL,NULL),('patient.viewingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for patients when _viewing individually_','1fad0bd5-8990-45a0-b1ea-b473672c4142',NULL,NULL,NULL,NULL),('patientflags.database_version','1.2.10','DO NOT MODIFY. Current database version number for the patientflags module.','00af39a7-fcdb-4ca8-b7cf-55f2bfc3241d',NULL,NULL,NULL,NULL),('patientflags.mandatory','false','true/false whether or not the patientflags module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','e419103c-e090-48be-8796-7a06e753d77d',NULL,NULL,NULL,NULL),('patientflags.patientHeaderDisplay','true','DO NOT MODIFY HERE: use \"manage flag global properties\" to modify; true/false whether or not to display flags in the Patient Dashboard overview','a323ea93-bb0b-46b8-9b0e-f1676aee94dc',NULL,NULL,NULL,NULL),('patientflags.patientOverviewDisplay','true','DO NOT MODIFY HERE: use \"manage flag global properties\" to modify; true/false whether or not to display flags in the Patient Dashboard header','3b96abdd-136b-48e3-94af-785e628d8935',NULL,NULL,NULL,NULL),('patientflags.started','true','DO NOT MODIFY. true/false whether or not the patientflags module has been started. This is used to make sure modules that were running prior to a restart are started again','d876bbc6-1ebb-48a1-bc50-2367a0e3eccc',NULL,NULL,NULL,NULL),('patientflags.username','scheduler','DO NOT MODIFY HERE: user \"manage flag global properties\" to modify; Username for the OpenMRS user that will evaluate Groovy flags','c02e3d03-b072-49cc-a415-f28c47312978',NULL,NULL,NULL,NULL),('patientIdentifierTypes.locked','false','Set to a value of true if you do not want allow editing patient identifier types, else set to false.','15f0de53-19ae-442a-8180-67e9b0e6fdd5',NULL,NULL,NULL,NULL),('patientSearch.matchMode','START','Specifies how patient names are matched while searching patient. Valid values are \'ANYWHERE\' or \'START\'. Defaults to start if missing or invalid value is present.','1d59658c-6421-4e40-aba8-246e843a78fd',NULL,NULL,NULL,NULL),('patient_identifier.importantTypes',NULL,'A comma delimited list of PatientIdentifier names : PatientIdentifier locations that will be displayed on the patient dashboard. E.g.: TRACnet ID:Rwanda,ELDID:Kenya','f7169262-2dee-4e33-b344-8ce24e9e57c9',NULL,NULL,NULL,NULL),('person.attributeSearchMatchMode','EXACT','Specifies how person attributes are matched while searching person. Valid values are \'ANYWHERE\' or \'EXACT\'. Defaults to exact if missing or invalid value is present.','fd71b326-c641-4b61-8f63-4ce281aa9c25',NULL,NULL,NULL,NULL),('person.searchMaxResults','1000','The maximum number of results returned by patient searches','be882758-29f6-40ae-8755-45312ec9a976',NULL,NULL,NULL,NULL),('personAttributeTypes.locked','false','Set to a value of true if you do not want allow editing person attribute types, else set to false.','57fd246c-6984-4be8-91fb-2581f9119293',NULL,NULL,NULL,NULL),('provider.unknownProviderUuid','f9badd80-ab76-11e2-9e96-0800200c9a66','Specifies the uuid of the Unknown Provider account','4e279829-14bf-4516-a3eb-1d0206f4683b',NULL,NULL,NULL,NULL),('providermanagement.addressWidget','personAddress','Address widget to use throughout the module','a2eac209-382b-4bb5-b731-62cb14e6c79b',NULL,NULL,NULL,NULL),('providermanagement.advancedSearchPersonAttributeType',NULL,'Person attribute type, specified by uuid, to use as a search field on the advanced search page','d31a8634-2f14-41fd-993a-7615ea3b6b1c',NULL,NULL,NULL,NULL),('providermanagement.database_version','1.0','DO NOT MODIFY. Current database version number for the providermanagement module.','b3ff9505-5faa-4095-879a-a4ed690ff1b2',NULL,NULL,NULL,NULL),('providermanagement.historicalPatientListDisplayFields','Identifier:patient.patientIdentifier.identifier|Given Name:patient.personName.givenName|Family Name:patient.personName.familyName|Age:patient.age|Gender:patient.gender|Start Date:relationship.startDate|End Date:relationship.endDate','Fields to display in the historical patient lists; specified as a pipe-delimited list of label/field pairs','9250c0e1-cb52-47dc-8656-8fa20c013b72',NULL,NULL,NULL,NULL),('providermanagement.historicalProviderListDisplayFields','Identifier:provider.identifier|Given Name:provider.person.personName.givenName|Family Name:provider.person.personName.familyName|Role:provider.providerRole|Gender:provider.person.gender|Start Date:relationship.startDate|End Date:relationship.endDate','Fields to display in the historical provider lists; specified as a pipe-delimited list of label/field pairs','85ceee9c-74ca-4c8b-a69d-350740c9dce3',NULL,NULL,NULL,NULL),('providermanagement.mandatory','false','true/false whether or not the providermanagement module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','3bd8e1fa-0255-4381-a268-9e537a65a423',NULL,NULL,NULL,NULL),('providermanagement.patientListDisplayFields','Identifier:patient.patientIdentifier.identifier|Given Name:patient.personName.givenName|Family Name:patient.personName.familyName|Age:patient.age|Gender:patient.gender|Start Date:relationship.startDate','Fields to display in the patient lists; specified as a pipe-delimited list of label/field pairs','10ed00bc-31a3-4ec0-8672-15951a3c30ed',NULL,NULL,NULL,NULL),('providermanagement.patientSearchDisplayFields','Identifier:patient.patientIdentifier.identifier|Given Name:patient.personName.givenName|Family Name:patient.personName.familyName|Age:patient.age|Gender:patient.gender','Fields to display in the patient search results; specified as a pipe-delimited list of label/field pairs','f0ca8be1-4eb1-4f05-991d-b93f723660cf',NULL,NULL,NULL,NULL),('providermanagement.personAttributeTypes',NULL,'Person attributes to display on the provider dashboard; specified as a pipe-delimited list of person attribute type uuids','7bde5431-0b7b-4fe6-a44f-244e8ef472b9',NULL,NULL,NULL,NULL),('providermanagement.personSearchDisplayFields','Given Name:person.personName.givenName|Family Name:person.personName.familyName|Age:person.age|Gender:person.gender','Fields to display in the person search results; specified as a pipe-delimited list of label/field pairs','c88836ae-c450-4066-bb94-30fc51730725',NULL,NULL,NULL,NULL),('providermanagement.providerListDisplayFields','Identifier:provider.identifier|Given Name:provider.person.personName.givenName|Family Name:provider.person.personName.familyName|Role:provider.providerRole|Gender:provider.person.gender|Start Date:relationship.startDate','Fields to display in the provider lists; specified as a pipe-delimited list of label/field pairs','af0dff90-25c7-4ab6-bbb6-6864df5aead5',NULL,NULL,NULL,NULL),('providermanagement.providerSearchDisplayFields','Identifier:provider.identifier|Given Name:provider.person.personName.givenName|Family Name:provider.person.personName.familyName|Role:provider.providerRole|Gender:provider.person.gender','Fields to display in the provider search results; specified as a pipe-delimited list of label/field pairs','b218451c-2ef4-4ff7-b867-29fa21631d63',NULL,NULL,NULL,NULL),('providermanagement.restrictSearchToProvidersWithProviderRoles','false','True/false whether to restrict providers to those with roles','5edb1aa6-6dc9-49b7-b057-89825d89f881',NULL,NULL,NULL,NULL),('providermanagement.started','true','DO NOT MODIFY. true/false whether or not the providermanagement module has been started. This is used to make sure modules that were running prior to a restart are started again','ffdc6eaa-19d9-40fa-ad1c-a1029e5edb09',NULL,NULL,NULL,NULL),('providerSearch.matchMode','EXACT','Specifies how provider identifiers are matched while searching for providers. Valid values are START,EXACT, END or ANYWHERE','ff520eb6-5857-4e06-b97c-b0ae9d404d8e',NULL,NULL,NULL,NULL),('referenceapplication.mandatory','false','true/false whether or not the referenceapplication module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','51cb2b1d-8490-4c06-8d6d-e72f9057fa62',NULL,NULL,NULL,NULL),('referenceapplication.started','true','DO NOT MODIFY. true/false whether or not the referenceapplication module has been started. This is used to make sure modules that were running prior to a restart are started again','4b4de7db-8d1d-4385-aa65-430edf52e4e0',NULL,NULL,NULL,NULL),('referencedemodata.createDemoPatientsOnNextStartup','0',NULL,'aa7f67c4-6e54-48ec-84ed-f677b2a0df04',NULL,NULL,NULL,NULL),('referencedemodata.mandatory','false','true/false whether or not the referencedemodata module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','abfefcea-a894-44a2-a4f0-ba2822e0bd60',NULL,NULL,NULL,NULL),('referencedemodata.started','true','DO NOT MODIFY. true/false whether or not the referencedemodata module has been started. This is used to make sure modules that were running prior to a restart are started again','4125cff4-6fc5-4c94-8ba6-721347395d67',NULL,NULL,NULL,NULL),('referencemetadata.installedVersion','12',NULL,'9ff4f85c-2075-419d-8687-a5324e91c94a',NULL,NULL,NULL,NULL),('referencemetadata.mandatory','false','true/false whether or not the referencemetadata module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','785429cb-0916-4dcc-948e-61864306cfe1',NULL,NULL,NULL,NULL),('referencemetadata.started','true','DO NOT MODIFY. true/false whether or not the referencemetadata module has been started. This is used to make sure modules that were running prior to a restart are started again','bee222eb-d8de-4bbb-af51-8627e7766999',NULL,NULL,NULL,NULL),('registrationapp.mandatory','false','true/false whether or not the registrationapp module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','9e353a24-84d9-4d23-a0ba-b28138b0bb4a',NULL,NULL,NULL,NULL),('registrationapp.started','true','DO NOT MODIFY. true/false whether or not the registrationapp module has been started. This is used to make sure modules that were running prior to a restart are started again','82838bf5-4a21-452b-8b1c-14ea7c4043fe',NULL,NULL,NULL,NULL),('registrationcore.biometrics.implementation',NULL,'Which Biometrics engine implementation to should we connect to? Specify a Spring bean name, or leave blank to disable','49f2a619-5969-4b24-aa31-a3428d3c453b',NULL,NULL,NULL,NULL),('registrationcore.biometrics.nationalPersonIdentifierTypeUuid','5a597bcc-26ad-11e8-b467-0ed5f89f718b','Specifies UUID of the identifier type that is used to store the national biometric reference code','cd8fc610-92bf-4d59-a5e4-d4c9e7aab61e',NULL,NULL,NULL,NULL),('registrationcore.biometrics.personIdentifierTypeUuid','e26ca279-8f57-44a5-9ed8-8cc16e90e559','Specifies UUID of the identifier type that is used to store the biometric reference code','8e550acd-3baf-493f-aad4-e908c8b41f9d',NULL,NULL,NULL,NULL),('registrationcore.codePc.uuid','b7a154fd-0097-4071-ac09-af11ee7e0310','UUID of the Code PC identifier that will be generated during MPI import unless it is present.','5e7d4308-7702-40cd-8148-27d6621b8b57',NULL,NULL,NULL,NULL),('registrationcore.codeSt.uuid','d059f6d0-9e42-4760-8de1-8316b48bc5f1','UUID of the Code ST identifier that will be generated during MPI import unless it is present.','620bab1a-1fd8-472e-a690-7d04ed2bc895',NULL,NULL,NULL,NULL),('registrationcore.familyNameAutoSuggestList',NULL,'A comma separated list of common names to auto suggest for the family name field, when registering patients.','cce69412-00f0-4b7e-aef0-e4637bc7583e',NULL,NULL,NULL,NULL),('registrationcore.fastSimilarPatientSearchAlgorithm','registrationcore.BasicSimilarPatientSearchAlgorithm','Specifies a bean used for the fast similar patient search algorithm.','8b8dfca5-327e-4168-9fa2-9e8e974b7f72',NULL,NULL,NULL,NULL),('registrationcore.givenNameAutoSuggestList',NULL,'A comma separated list of common names to auto suggest for the given name field, when registering patients.','2fc32ecc-8965-4c54-955b-c99e8f1033d0',NULL,NULL,NULL,NULL),('registrationcore.identifierSourceId','1','Specifies the identifier source to use when generating patient identifiers','71c7cf48-9571-484c-a316-f2de617f353a',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.Biometrics Reference Code','5a597bcc-26ad-11e8-b467-0ed5f89f718b:2.25.300969590489438061583573695579607328089:NI',NULL,'ceff3458-38fb-4337-8951-fdeff40e72c3',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.Code National','9fb4533d-4fd5-4276-875b-2ab41597f5dd:2.25.212283553061960040061731875660599129565:PI',NULL,'060154f9-858d-4e7e-b211-53e8cc52c456',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.Code ST','d059f6d0-9e42-4760-8de1-8316b48bc5f1:2.25.276946543544871160225835991160192746993:PI',NULL,'a60ca1d0-bb7d-44ab-99f8-34fd953d7013',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.ECID','f54ed6b9-f5b9-4fd5-a588-8f7561a78401:2.16.840.1.113883.4.56:NI',NULL,'fced5bb7-0dc1-40a9-81cf-92ebb6d6086a',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.iSante ID','0e0c7cc2-3491-4675-b705-746e372ff346:2.25.36136748588937772373969278066039786242:PI',NULL,'4722ae32-0c92-444e-bd84-d902ded65739',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.iSantePlus ID','05a29f94-c0ed-11e2-94be-8c13b969e334:2.25.71280592878078638113873461180761116318:PI',NULL,'324049f6-8c07-4e6f-83e7-3a2935a83ffd',NULL,NULL,NULL,NULL),('registrationcore.mandatory','false','true/false whether or not the registrationcore module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','56719d66-2a4b-404d-82eb-dc8694767717',NULL,NULL,NULL,NULL),('registrationcore.mpi.Hl7implementation','registrationcore.mpiHl7v2HttpSender','Specifies which bean should be used to send the Hl7 Message','19789c80-2baf-47a5-82eb-1aebb20fde18',NULL,NULL,NULL,NULL),('registrationcore.mpi.implementation','registrationcore.mpi.implementation.Fhir','Which MPI to should we connect to? Specify a Spring bean name, or leave blank to disable MPI integration','e76583dc-5702-4a26-a720-a376ee821dc2',NULL,NULL,NULL,NULL),('registrationcore.mpi.password','isanteplus','Specifies password for authentication to MPI server','7fb5b791-7b0a-4839-9b82-cc11ac2ac3ad',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdq.errorHandler.implementation','outgoingmessageexceptions.PdqErrorHandlingService','Specify a Spring bean name of PDQ error handler service','08d39b95-151b-4657-9ffb-ca929de87e0a',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdqEndpoint','http://sedish.net:5001/pdq','Specifies endpoint for Hl7 PDQ Message','d981f1d8-7ba0-452e-b3db-3e3579d43935',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdqIdentifierTypeUuidList','05a29f94-c0ed-11e2-94be-8c13b969e334,f54ed6b9-f5b9-4fd5-a588-8f7561a78401,5a597bcc-26ad-11e8-b467-0ed5f89f718b,e26ca279-8f57-44a5-9ed8-8cc16e90e559,9fb4533d-4fd5-4276-875b-2ab41597f5dd,d059f6d0-9e42-4760-8de1-8316b48bc5f1',NULL,'f323a567-93b3-4f5f-9574-a00454d21776',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdqPort','3600','Specifies port for Hl7 PDQ Message','565716be-b6de-4893-b526-2f574466d58e',NULL,NULL,NULL,NULL),('registrationcore.mpi.personIdentifierId',NULL,'Specifies id of identifier type which will be used for Mpi Person Id','482495d9-dc85-450d-83c5-79d088f7439d',NULL,NULL,NULL,NULL),('registrationcore.mpi.personIdentifierTypeUuid','f54ed6b9-f5b9-4fd5-a588-8f7561a78401','Specifies UUID of the identifier type that the MPI generates and is persisted in OpenMRS','e8f9141d-0754-41d6-9eca-2c3a301a9263',NULL,NULL,NULL,NULL),('registrationcore.mpi.pix.errorHandler.implementation','outgoingmessageexceptions.PixErrorHandlingService','Specify a Spring bean name of PIX error handler service','1157126a-d3e9-4264-b580-2910ac88a872',NULL,NULL,NULL,NULL),('registrationcore.mpi.pixEndpoint','http://sedish.net:5001/pix','Specifies the endpoint for the Hl7 PIX Message','e2ea0bda-f432-43ab-9d41-0db921bcd74f',NULL,NULL,NULL,NULL),('registrationcore.mpi.pixIdentifierTypeUuidList','05a29f94-c0ed-11e2-94be-8c13b969e334,f54ed6b9-f5b9-4fd5-a588-8f7561a78401,5a597bcc-26ad-11e8-b467-0ed5f89f718b,e26ca279-8f57-44a5-9ed8-8cc16e90e559,9fb4533d-4fd5-4276-875b-2ab41597f5dd,d059f6d0-9e42-4760-8de1-8316b48bc5f1','Specifies the list of identifiers to send in a PIX query to save the patient in the MPI. Takes a list of UUID of patient identifier types - separate them with commas.','0686b37a-72b0-42df-a1ea-7124c0490b5a',NULL,NULL,NULL,NULL),('registrationcore.mpi.pixPort','3700','Specifies port for Hl7 PIX Message','2ef28640-5ec4-43da-8820-cea4affe01e9',NULL,NULL,NULL,NULL),('registrationcore.mpi.receivingApplication','SEDISH Demo MPI','Specifies the receiving application in the MSH header section of the HL7 message','d68988a1-2c06-4c13-ad7c-4cd0219d9e8a',NULL,NULL,NULL,NULL),('registrationcore.mpi.receivingFacility','OpenEMPI Demo','Specifies sending Facility in the MSH header section of the HL7 message','3dedbf34-2196-47a0-b439-50f2d23849d5',NULL,NULL,NULL,NULL),('registrationcore.mpi.reg.encounter.uuid','873f968a-73a8-4f9c-ac78-9f4778b751b6','UUID of the registration encounter type.','2f021105-cd43-413a-ba1b-97eca451201a',NULL,NULL,NULL,NULL),('registrationcore.mpi.sendingApplication','isanteplus','Specifies the sending application in the MSH header section of the HL7 message','614a6f55-f05c-4382-8df5-2c2cf9b684f5',NULL,NULL,NULL,NULL),('registrationcore.mpi.sendingFacility','Demo','Specifies sending Facility in the MSH header section of the HL7 message','3df1eca4-1b02-4045-a27a-e86c708d6a14',NULL,NULL,NULL,NULL),('registrationcore.mpi.url',NULL,'Specifies url to MPI server','94fbf926-a171-418e-a9f0-aac810405e89',NULL,NULL,NULL,NULL),('registrationcore.mpi.username','pixc','Specifies username for authentication to MPI server','b0ce1052-65d7-433f-ac54-012eb5ef952f',NULL,NULL,NULL,NULL),('registrationcore.openempi.enableProbabilisticMatching','false','Specifies if probably matching should be used','9d035f4e-808e-4833-9ffc-bd7c4e0aa605',NULL,NULL,NULL,NULL),('registrationcore.openempi.globalIdentifierDomainId',NULL,'Specifies main identifier on MPI server (e.g. \"xyz\" for OpenEMPI)','be777d39-cb2c-4d58-92e8-65e78738a7a3',NULL,NULL,NULL,NULL),('registrationcore.openmrsIdenitfier.uuid','05a29f94-c0ed-11e2-94be-8c13b969e334','UUID of the OpenMRS identifier that will be generated during MPI import unless it is present.','a455468b-5ef7-4f49-834b-54bd4bd97aeb',NULL,NULL,NULL,NULL),('registrationcore.patientNameSearch','registrationcore.BasicPatientNameSearch',NULL,'f3934af8-aeae-45b3-9176-7f2cd0920dc4',NULL,NULL,NULL,NULL),('registrationcore.preciseSimilarPatientSearchAlgorithm','registrationcore.BasicExactPatientSearchAlgorithm','Specifies a bean used for the precise similar patient search algorithm.','a72193f5-1373-4542-8216-6f6e11fe9d26',NULL,NULL,NULL,NULL),('registrationcore.started','true','DO NOT MODIFY. true/false whether or not the registrationcore module has been started. This is used to make sure modules that were running prior to a restart are started again','7faab2d0-e5f0-44f3-b98f-60b594299ae9',NULL,NULL,NULL,NULL),('report.deleteReportsAgeInHours','72','Reports that are not explicitly saved are deleted automatically when they are this many hours old. (Values less than or equal to zero means do not delete automatically)','2392ad57-4567-4cbc-82b2-affffd15bab7',NULL,NULL,NULL,NULL),('report.xmlMacros',NULL,'Macros that will be applied to Report Schema XMLs when they are interpreted. This should be java.util.properties format.','dc59defa-9dd1-4232-90ae-0e577f1fd61f',NULL,NULL,NULL,NULL),('reporting.dataEvaluationBatchSize','-1','This determines whether to run evaluators for Data in batches and what the size of those batches should be.\nA value of less than or equal to 0 indicates that no batching is desired.','4906937a-b4ba-436d-8f4f-f37ce634f463',NULL,NULL,NULL,NULL),('reporting.defaultDateFormat','dd/MMM/yyyy','Default date format to use when formatting report data','87478bcc-c8f8-4ca3-a5ae-60884813cc1a',NULL,NULL,NULL,NULL),('reporting.defaultLocale','en','Default locale to use when formatting report data','6974a1c2-941c-4f44-9fa5-3bbce019eec4',NULL,NULL,NULL,NULL),('reporting.evaluationLoggerEnabled','false','If false, will disable the built in use of the evaluation logger to log evaluation information for performance diagnostics','0a90b73c-c413-4ab5-9b8f-19e7f4912d5d',NULL,NULL,NULL,NULL),('reporting.includeDataExportsAsDataSetDefinitions','false','If reportingcompatibility is installed, this indicates whether data exports should be exposed as Dataset Definitions','d974faa9-7b3a-4ed1-8ba1-869965df4586',NULL,NULL,NULL,NULL),('reporting.mandatory','false','true/false whether or not the reporting module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','66e2b6d2-c886-4461-bf67-cce377290def',NULL,NULL,NULL,NULL),('reporting.maxCachedReports','10','The maximum number of reports whose underlying data and output should be kept in the cache at any one time','3337c65a-929d-4596-b3d3-ff42bf27081f',NULL,NULL,NULL,NULL),('reporting.maxReportsToRun','1','The maximum number of reports that should be processed at any one time','8fdbe441-ed4c-4f44-9e15-38c4813f23c1',NULL,NULL,NULL,NULL),('reporting.preferredIdentifierTypes',NULL,'Pipe-separated list of patient identifier type names, which should be displayed on default patient datasets','37823fdd-e9c3-43f0-aecf-743acaa624ea',NULL,NULL,NULL,NULL),('reporting.runReportCohortFilterMode','showIfNull','Supports the values hide,showIfNull,show which determine whether the cohort selector should be available in the run report page','89ac2f87-4f6e-483c-8b1b-00d10a49e81b',NULL,NULL,NULL,NULL),('reporting.started','true','DO NOT MODIFY. true/false whether or not the reporting module has been started. This is used to make sure modules that were running prior to a restart are started again','6702f641-051a-4c3f-83d7-b0ee6f074ea6',NULL,NULL,NULL,NULL),('reporting.testPatientsCohortDefinition',NULL,'Points to a cohort definition representing all test/fake patients that you want to exclude from all queries and reports. You may set this to the UUID of a saved cohort definition, or to \"library:keyInADefinitionLibrary\"','59321097-8d06-4a65-b3d0-b296cd5cb3b0',NULL,NULL,NULL,NULL),('reportingcompatibility.data_export_batch_size','7500','The number of patients to export at a time in a data export. The larger this number the faster and more memory that is used. The smaller this number the slower and less memory is used.','9891198c-ad38-4154-b7f9-3c408d7dbedf',NULL,NULL,NULL,NULL),('reportingcompatibility.mandatory','false','true/false whether or not the reportingcompatibility module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','6656e7ac-811e-448e-8eb4-36ac29c15e50',NULL,NULL,NULL,NULL),('reportingcompatibility.patientLinkUrl','patientDashboard.form','The link url for a particular patient to view from the cohort builder','c013335d-e616-464d-8e99-7c6d2617afee',NULL,NULL,NULL,NULL),('reportingcompatibility.started','true','DO NOT MODIFY. true/false whether or not the reportingcompatibility module has been started. This is used to make sure modules that were running prior to a restart are started again','1b8fcdf0-b560-4b53-9470-a5a4f3c8326d',NULL,NULL,NULL,NULL),('reportingrest.mandatory','false','true/false whether or not the reportingrest module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','155880ae-89f2-428f-b013-bd7ab417a8d5',NULL,NULL,NULL,NULL),('reportingrest.started','true','DO NOT MODIFY. true/false whether or not the reportingrest module has been started. This is used to make sure modules that were running prior to a restart are started again','e7a8211c-fd67-4170-817a-3d5e1008f766',NULL,NULL,NULL,NULL),('reportingui.mandatory','false','true/false whether or not the reportingui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','e1f2c5c5-b7d8-49dd-8685-16db702124bd',NULL,NULL,NULL,NULL),('reportingui.started','true','DO NOT MODIFY. true/false whether or not the reportingui module has been started. This is used to make sure modules that were running prior to a restart are started again','ffd3eda3-483d-4292-a18a-ecc6a5dd96de',NULL,NULL,NULL,NULL),('reportProblem.url','http://errors.openmrs.org/scrap','The openmrs url where to submit bug reports','9d004ee7-31dc-4a39-a32e-9ce497f53f01',NULL,NULL,NULL,NULL),('reports.moduleVersion','1.1-SNAPSHOT',NULL,'0b1f0155-ca78-4a61-a4ae-3bff6bfcb27e',NULL,NULL,NULL,NULL),('santedb-mpiclient.mandatory','false','true/false whether or not the santedb-mpiclient module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ad258897-b5bb-42e9-8a79-61739096dc68',NULL,NULL,NULL,NULL),('santedb-mpiclient.started','true','DO NOT MODIFY. true/false whether or not the santedb-mpiclient module has been started. This is used to make sure modules that were running prior to a restart are started again','2100de20-61f1-4e68-8da0-d57df6b451f4',NULL,NULL,NULL,NULL),('scheduler.password','Scheduler123','Password for the OpenMRS user that will perform the scheduler activities','05c6367e-64cb-47e9-82d3-f9209bb18ede',NULL,NULL,NULL,NULL),('scheduler.username','scheduler','Username for the OpenMRS user that will perform the scheduler activities','3cd95dc8-7d76-4267-a8be-6e14387461d3',NULL,NULL,NULL,NULL),('search.caseSensitiveDatabaseStringComparison','false','Indicates whether database string comparison is case sensitive or not. Setting this to false for MySQL with a case insensitive collation improves search performance.','63d90362-4500-4380-9507-fbb878014656',NULL,NULL,NULL,NULL),('search.indexVersion','3','Indicates the index version. If it is blank, the index needs to be rebuilt.','434ffa85-f60a-406b-9889-c8fbc237c0ff',NULL,NULL,NULL,NULL),('searchWidget.batchSize','200','The maximum number of search results that are returned by an ajax call','d5ae5616-4e21-4bc9-8722-d531da74a1b4',NULL,NULL,NULL,NULL),('searchWidget.dateDisplayFormat',NULL,'Date display format to be used to display the date somewhere in the UI i.e the search widgets and autocompletes','4b7f258a-2fc5-4327-aa74-1be7229661e2',NULL,NULL,NULL,NULL),('searchWidget.maximumResults','2000','Specifies the maximum number of results to return from a single search in the search widgets','26c56604-cf39-42b2-8be3-269ced77b8a8',NULL,NULL,NULL,NULL),('searchWidget.runInSerialMode','false','Specifies whether the search widgets should make ajax requests in serial or parallel order, a value of true is appropriate for implementations running on a slow network connection and vice versa','1938204f-b352-4b63-b398-b0d3afb69035','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('searchWidget.searchDelayInterval','400','Specifies time interval in milliseconds when searching, between keyboard keyup event and triggering the search off, should be higher if most users are slow when typing so as to minimise the load on the server','91ac48d0-37e4-4749-bcfc-e824e56a623c',NULL,NULL,NULL,NULL),('security.allowedFailedLoginsBeforeLockout','7','Maximum number of failed logins allowed after which username is locked out','1b285bad-36f6-4c81-aa6f-12a0470ab71f',NULL,NULL,NULL,NULL),('security.passwordCannotMatchUsername','true','Configure whether passwords must not match user\'s username or system id','76cfa33c-7dc7-47b3-a94a-81fc48f4e381','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('security.passwordCustomRegex',NULL,'Configure a custom regular expression that a password must match','82813b08-93f5-47fd-b692-ed13bd14649a',NULL,NULL,NULL,NULL),('security.passwordMinimumLength','8','Configure the minimum length required of all passwords','881dabb8-7771-42d9-811e-8522bace053c',NULL,NULL,NULL,NULL),('security.passwordRequiresDigit','true','Configure whether passwords must contain at least one digit','7c8d4bed-ce26-4d94-9a92-057421faa075','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('security.passwordRequiresNonDigit','true','Configure whether passwords must contain at least one non-digit','3159818d-bbaa-44d7-8d0d-2ab0dc4d096c','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('security.passwordRequiresUpperAndLowerCase','true','Configure whether passwords must contain both upper and lower case characters','21b14091-c640-41d4-8a6f-a8517884c0cc','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('serialization.xstream.mandatory','false','true/false whether or not the serialization.xstream module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','c1ffbfaf-1efe-4ab8-96f3-6d2f12ad0eb1',NULL,NULL,NULL,NULL),('serialization.xstream.started','true','DO NOT MODIFY. true/false whether or not the serialization.xstream module has been started. This is used to make sure modules that were running prior to a restart are started again','1d5bbb2c-255d-4b83-b67d-3bfa2b822b9b',NULL,NULL,NULL,NULL),('uicommons.mandatory','false','true/false whether or not the uicommons module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','efc24967-a9da-4e4d-975e-161cde921b49',NULL,NULL,NULL,NULL),('uicommons.started','true','DO NOT MODIFY. true/false whether or not the uicommons module has been started. This is used to make sure modules that were running prior to a restart are started again','78ba2c24-0ab8-47d9-8064-7f638d42804e',NULL,NULL,NULL,NULL),('uiframework.formatter.dateAndTimeFormat','dd.MMM.yyyy, HH:mm:ss','Format used by UiUtils.format for dates that have a time component','19ff170d-59bf-440b-ae88-216d6b0b7b7a',NULL,NULL,NULL,NULL),('uiframework.formatter.dateFormat','dd.MMM.yyyy','Format used by UiUtils.format for dates that do not have a time component','0e478c4f-09d1-492d-bf5b-6b64e03c8699',NULL,NULL,NULL,NULL),('uiframework.mandatory','false','true/false whether or not the uiframework module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','96eabc0d-646e-4bb7-8272-dd1126d90208',NULL,NULL,NULL,NULL),('uiframework.started','true','DO NOT MODIFY. true/false whether or not the uiframework module has been started. This is used to make sure modules that were running prior to a restart are started again','b52a1755-76a7-4438-936b-ff21615f52da',NULL,NULL,NULL,NULL),('uilibrary.mandatory','false','true/false whether or not the uilibrary module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','d4b5fc14-b53e-4360-ab45-36ce3e17ed21',NULL,NULL,NULL,NULL),('uilibrary.started','true','DO NOT MODIFY. true/false whether or not the uilibrary module has been started. This is used to make sure modules that were running prior to a restart are started again','84146ffc-f4ee-4bc7-b4bd-e565e38b845c',NULL,NULL,NULL,NULL),('user.headerAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that will be shown on the user dashboard. (not used in v1.5)','d0fecc90-8778-49db-9b4e-91904de31d23',NULL,NULL,NULL,NULL),('user.listingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for users in _lists_','63245d29-3cef-479d-9d73-f05b3da47a2f',NULL,NULL,NULL,NULL),('user.requireEmailAsUsername','false','Indicates whether a username must be a valid e-mail or not.','540381e5-3afa-45ad-8c2a-0ff633144bcb','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('user.viewingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for users when _viewing individually_','227c8088-9abb-4733-b7ad-3c22aead471c',NULL,NULL,NULL,NULL),('use_patient_attribute.healthCenter','false','Indicates whether or not the \'health center\' attribute is shown when viewing/searching for patients','9927c961-e6b9-40d9-9336-6fcfa0c6c86a','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('use_patient_attribute.mothersName','false','Indicates whether or not mother\'s name is able to be added/viewed for a patient','c45dcb53-fc73-4cbf-9ec7-08d74f86d539','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('validation.disable','false','Disables validation of OpenMRS Objects. Only takes affect on next restart. Warning: only do this is you know what you are doing!','e6dcbb41-5510-4d77-b929-a3e13f14b82c',NULL,NULL,NULL,NULL),('visits.allowOverlappingVisits','true','true/false whether or not to allow visits of a given patient to overlap','36e81cc3-fa37-4d77-a428-8d5835ae9a72','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('visits.assignmentHandler','org.openmrs.module.emrapi.adt.EmrApiVisitAssignmentHandler','Set to the name of the class responsible for assigning encounters to visits.','2c62d60f-81cf-4f60-85b4-0b424c241b31',NULL,NULL,NULL,NULL),('visits.autoCloseVisitType','Facility Visit,Patient externe','comma-separated list of the visit type(s) to automatically close','58736730-6f18-4c6f-8d0e-9baf5a102f39',NULL,NULL,NULL,NULL),('visits.enabled','true','Set to true to enable the Visits feature. This will replace the \'Encounters\' tab with a \'Visits\' tab on the dashboard.','e7259c7d-94a1-4b38-a6a4-4f59e1f7e9e1','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('visits.encounterTypeToVisitTypeMapping',NULL,'Specifies how encounter types are mapped to visit types when automatically assigning encounters to visits. e.g 1:1, 2:1, 3:2 in the format encounterTypeId:visitTypeId or encounterTypeUuid:visitTypeUuid or a combination of encounter/visit type uuids and ids e.g 1:759799ab-c9a5-435e-b671-77773ada74e4','76333113-1e10-410e-9537-595110c6ce2f',NULL,NULL,NULL,NULL),('webservices.rest.allowedips',NULL,'A comma-separate list of IP addresses that are allowed to access the web services. An empty string allows everyone to access all ws. \n IPs can be declared with bit masks e.g. 10.0.0.0/30 matches 10.0.0.0 - 10.0.0.3 and 10.0.0.0/24 matches 10.0.0.0 - 10.0.0.255.','563e56bd-390b-4030-aa38-a3d3774ae295',NULL,NULL,NULL,NULL),('webservices.rest.mandatory','false','true/false whether or not the webservices.rest module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','a63e8d1f-c209-461d-9960-e1479c4d11f8',NULL,NULL,NULL,NULL),('webservices.rest.maxResultsAbsolute','100','The absolute max results limit. If the client requests a larger number of results, then will get an error','1a1030e2-994c-480b-8031-bc9999aa0f0c',NULL,NULL,NULL,NULL),('webservices.rest.maxResultsDefault','50','The default max results limit if the user does not provide a maximum when making the web service call.','f0c96b42-f833-4dba-9d59-d66ac7e8f0bb',NULL,NULL,NULL,NULL),('webservices.rest.quietDocs','true','If the value of this setting is \"true\", then nothing is logged while the Swagger specification is being generated.','7fbc8416-4f85-4224-8a1e-bceb8a5088e6',NULL,NULL,NULL,NULL),('webservices.rest.started','true','DO NOT MODIFY. true/false whether or not the webservices.rest module has been started. This is used to make sure modules that were running prior to a restart are started again','6effbc02-a29a-460b-8683-b84aca6b30e6',NULL,NULL,NULL,NULL),('webservices.rest.uriPrefix',NULL,'The URI prefix through which clients consuming web services will connect to the web application, should be of the form http://{ipAddress}:{port}/{contextPath}','0ccc04c6-7052-40f2-b3b0-1fbdb483c0d0',NULL,NULL,NULL,NULL),('xds-sender.mandatory','false','true/false whether or not the xds-sender module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','17f6d3d8-ff94-49b8-86ee-bf64991221eb',NULL,NULL,NULL,NULL),('xds-sender.started','true','DO NOT MODIFY. true/false whether or not the xds-sender module has been started. This is used to make sure modules that were running prior to a restart are started again','1a46e568-d202-4e77-902d-afdc160f3ddb',NULL,NULL,NULL,NULL),('xdssender.ccd.errorHandler.implementation','outgoingmessageexceptions.CcdErrorHandlingService','Specify a Spring bean name of CCD error handler service','531d890b-2d7e-4fea-b31c-7d75f4cce7c4',NULL,NULL,NULL,NULL),('xdssender.ecidRoot','http://openclientregistry.org/fhir/sourceid','ECID Root','3f98635f-fe9a-44a3-b037-311181a003f7',NULL,NULL,NULL,NULL),('xdssender.encounterTypesToProcess','f037e97b-471e-4898-a07c-b8e169e0ddc4','Specifies comma separated UUIDs of encounter types that should be sent to the XDS Repository. Default value \"f037e97b-471e-4898-a07c-b8e169e0ddc4\" (Analyses de Lab encounter type)
Use \'ALL\' or leave blank to match all encounter types\"','5c98c42c-6525-4c75-b863-f154750ea748',NULL,NULL,NULL,NULL),('xdssender.exportCcd.ignoreCerts','true','Determines if ccd downloading from OpenSHR should ignore certificates','eecc3b3d-c5f1-4ecc-bfc2-64966e39151e',NULL,NULL,NULL,NULL),('xdssender.exportCcdEndpoint','https://openhim.sedish-haiti.org/SHR/fhir','Specifies the export ccd module endpoint address (OpenSHR)','032cce15-3865-4e0c-930e-858c30d33558',NULL,NULL,NULL,NULL),('xdssender.mpiEndpoint','https://openhim.sedish-haiti.org/CR/fhir','Endpoint for requests to the OpenCR MPI','1d092bd0-167a-432a-891f-c1e598be27c8',NULL,NULL,NULL,NULL),('xdssender.notificationsPullPoint.endpoint','https://openhim.sedish-haiti.org/dsub','Endpoint used to fetch Notifications from the Pull Point','72cc190e-c63e-4193-b670-36c64fa8d660',NULL,NULL,NULL,NULL),('xdssender.notificationsPullPoint.password','isanteplus.sedish-haiti.org','Password to authorize int the Notifications Pull Point','38fd37a0-d5ae-4d27-ac24-4d0095517150',NULL,NULL,NULL,NULL),('xdssender.notificationsPullPoint.username','isanteplus.sedish-haiti.org','Username to authorize int the Notifications Pull Point','238347f7-825c-47ae-bd12-143ebcadd13c',NULL,NULL,NULL,NULL),('xdssender.openmrs.moduleUsedToDetermineSoftwareVersion','isanteplusreports','Specifies the module name which will be used to determine the software version.','ab2dc3e6-751f-4280-a791-366db9af313b',NULL,NULL,NULL,NULL),('xdssender.openmrs.password','Admin123','Specifies password for authentication in OpenMRS','5c576a3c-bf90-442d-8c35-b82e9573574e',NULL,NULL,NULL,NULL),('xdssender.openmrs.provider.role.clinician',NULL,'Specifies role for add provider to XDS documents','243db3e0-0fa3-4ad8-b503-163d10518fb9',NULL,NULL,NULL,NULL),('xdssender.openmrs.provider.role.doctor',NULL,'Specifies role for add provider to XDS documents','c3997de9-ffa1-41d6-9f1e-fb5644a503a8',NULL,NULL,NULL,NULL),('xdssender.openmrs.username','admin','Specifies username for authentication in OpenMRS','7bd737a0-eb7f-401d-8950-86b8711ac1b4',NULL,NULL,NULL,NULL),('xdssender.oshr.password','OpenSHR#123','Specifies the OpenSHR password','d3e0c90e-c9a1-47b1-ad81-e0e4238990c7',NULL,NULL,NULL,NULL),('xdssender.oshr.username','isanteplus','Specifies the OpenSHR username','3a1eba1b-0885-4aff-b9a2-df602fcad48f',NULL,NULL,NULL,NULL),('xdssender.pullNotificationsTaskInterval',NULL,'Interval time (in seconds) to execute pulling notifications from Pull Point task','97351946-d56d-44c1-b79c-c953d8000a3d',NULL,NULL,NULL,NULL),('xdssender.repositoryEndpoint','https://openhim.sedish-haiti.org/xdsrepository','Specifies endpoint to XDS repository','07a7b1c4-4591-421f-9a4a-a12472092dc4',NULL,NULL,NULL,NULL),('xdssender.shrType','fhir','Type of SHR service to use','c2074671-263f-4717-bdf2-7a41f503984e',NULL,NULL,NULL,NULL),('xdssender.xdsB.errorHandler.implementation','outgoingmessageexceptions.XdsBErrorHandlingService','Specify a Spring bean name of XDS.b error handler service','4f15ed76-c9ef-44e8-be7f-c4605713b2f9',NULL,NULL,NULL,NULL),('xdssender.xdsrepository.password','isanteplus.sedish-haiti.org','Specifies password for authentication to XDS repository','04db6b44-078e-456b-96e8-06c53b767572',NULL,NULL,NULL,NULL),('xdssender.xdsrepository.username','isanteplus.sedish-haiti.org','Specifies username for authentication to XDS repository','9fdcc14a-f4c4-446f-857f-1c3388ab2b99',NULL,NULL,NULL,NULL); +INSERT INTO `global_property` VALUES ('addresshierarchy.addressToEntryMapUpdaterLastStartTime',NULL,'The module uses this field to store when the AddressToEntryMapUpdater task was last started; DO NOT MODIFY','89023287-4604-4702-9fbf-26ffd11c31b2',NULL,NULL,NULL,NULL),('addresshierarchy.allowFreetext','true','Valid values: true/false. When overriding the address portlet, allow the entry of free text for address fields associated with the address hierarchy by providing an \"Other\" option','9d04bdc8-c26d-410b-86c8-7e6e42ec09b3',NULL,NULL,NULL,NULL),('addresshierarchy.database_version','2.10.0','DO NOT MODIFY. Current database version number for the addresshierarchy module.','c9acf20b-162b-4a7d-baec-138af3c42424',NULL,NULL,NULL,NULL),('addresshierarchy.enableOverrideOfAddressPortlet','true','Valid values: true/false. When enabled, the existing \"edit\" component of the address portlet is overridden by the new functionality provided by the address hierarchy module','033e3f97-2b5a-4463-9b80-5273dccbeb60',NULL,NULL,NULL,NULL),('addresshierarchy.initializeAddressHierarchyCacheOnStartup','true','Sets whether to initialize the address hierarchy in-memory cache (which is used to speed up address hierarchy searches.\nGenerally, you want to set this to \"true\", though developers may want to set it to false during development\nto speed module start-up.','54d8d405-712c-42dc-8252-05af22e19122',NULL,NULL,NULL,NULL),('addresshierarchy.mandatory','false','true/false whether or not the addresshierarchy module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','d95bf1cc-55ad-4b6e-a117-734dc71782e6',NULL,NULL,NULL,NULL),('addresshierarchy.soundexProcessor',NULL,'If the Name Phonetics module is installed, this defines the name of a soundex algorithm used by the getPossibleFullAddresses service method.','977598dd-685f-4c64-96ab-be20abed91e8',NULL,NULL,NULL,NULL),('addresshierarchy.started','true','DO NOT MODIFY. true/false whether or not the addresshierarchy module has been started. This is used to make sure modules that were running prior to a restart are started again','ee4b9a34-8018-466e-8172-92741c233856',NULL,NULL,NULL,NULL),('adminui.mandatory','false','true/false whether or not the adminui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','b412e89c-eede-4588-8764-696b9a8e6e5a',NULL,NULL,NULL,NULL),('adminui.started','true','DO NOT MODIFY. true/false whether or not the adminui module has been started. This is used to make sure modules that were running prior to a restart are started again','0e73611c-80d8-4a40-8559-9d5407046e81',NULL,NULL,NULL,NULL),('allergy.allergen.ConceptClasses','Drug,MedSet','A comma-separated list of the allowed concept classes for the allergen field of the allergy dialog','31ae9209-8e20-48cb-bd4a-07cd9e0e223a',NULL,NULL,NULL,NULL),('allergy.concept.allergen.drug','162552AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the drug allergens concept','e885904c-556d-46cc-b5d4-cb310ae4a03a',NULL,NULL,NULL,NULL),('allergy.concept.allergen.environment','162554AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the environment allergens concept','476539a9-dee4-40ff-b4c4-8aef1c048522',NULL,NULL,NULL,NULL),('allergy.concept.allergen.food','162553AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the food allergens concept','2e7c9e5f-9907-490d-915d-ce1a7ae78196',NULL,NULL,NULL,NULL),('allergy.concept.otherNonCoded','5622AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the allergy other non coded concept','e4875628-0994-4101-89b4-51224c4fda6b',NULL,NULL,NULL,NULL),('allergy.concept.reactions','162555AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the allergy reactions concept','2e8a3e70-fd8e-4f0e-9400-eae44b623bec',NULL,NULL,NULL,NULL),('allergy.concept.severity.mild','1498AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the MILD severity concept','95f88542-d79a-401d-bc85-601639b01aa7',NULL,NULL,NULL,NULL),('allergy.concept.severity.moderate','1499AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the MODERATE severity concept','07aff921-b72f-4534-9553-ba974bca6592',NULL,NULL,NULL,NULL),('allergy.concept.severity.severe','1500AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the SEVERE severity concept','0311e4ba-e140-49df-82e8-88a29a98714d',NULL,NULL,NULL,NULL),('allergy.concept.unknown','1067AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','UUID for the allergy unknown concept','93c683e9-5ef0-4ce0-90a7-295308e8110b',NULL,NULL,NULL,NULL),('allergy.reaction.ConceptClasses','Symptom','A comma-separated list of the allowed concept classes for the reaction field of the allergy dialog','dc58fb58-2ed8-48b7-a305-abbfa93110b2',NULL,NULL,NULL,NULL),('allergyui.mandatory','false','true/false whether or not the allergyui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','c86aea6b-8c58-460b-8796-06409d45aa8f',NULL,NULL,NULL,NULL),('allergyui.started','true','DO NOT MODIFY. true/false whether or not the allergyui module has been started. This is used to make sure modules that were running prior to a restart are started again','b0cd2e5e-12d6-4455-9f0a-ed442c7349c8',NULL,NULL,NULL,NULL),('appframework.mandatory','false','true/false whether or not the appframework module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','121b3096-6faf-4dea-9555-c91d3eb11e90',NULL,NULL,NULL,NULL),('appframework.started','true','DO NOT MODIFY. true/false whether or not the appframework module has been started. This is used to make sure modules that were running prior to a restart are started again','0f595fb2-9566-409c-b561-075447d15825',NULL,NULL,NULL,NULL),('application.name','OpenMRS','The name of this application, as presented to the user, for example on the login and welcome pages.','2720b841-bf4e-426f-9817-dc0118185fb5',NULL,NULL,NULL,NULL),('appointmentscheduling.defaultTimeSlotDuration','60','Default Time Slot Duration. (In Minutes)','a30908f6-9cca-452a-9042-0132a8e00b6d',NULL,NULL,NULL,NULL),('appointmentscheduling.defaultVisitType','1','Default Visit Type for the in consultation state change.','f67b6af6-9d17-4e28-8303-04d785732122',NULL,NULL,NULL,NULL),('appointmentscheduling.hideEndVisitButtons','true','Hide \"End Visit\" buttons on the patient dashboard.','b6147209-306b-47f3-8621-4013deed82ac',NULL,NULL,NULL,NULL),('appointmentscheduling.manageAppointmentsFormTimout','60','Refresh the manage appointments page after this number of seconds. (60 Seconds Minimum,-1 to Disable auto Refresh)','7ec8641c-d969-468d-ab0f-5201c70660dd',NULL,NULL,NULL,NULL),('appointmentscheduling.mandatory','false','true/false whether or not the appointmentscheduling module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','7fccc9fe-2662-41b1-88f3-2818481636e3',NULL,NULL,NULL,NULL),('appointmentscheduling.phoneNumberPersonAttributeTypeId','8','Person attribute type id for the phone number.','5faac00c-d599-4f94-9621-5744daeb8088',NULL,NULL,NULL,NULL),('appointmentscheduling.started','true','DO NOT MODIFY. true/false whether or not the appointmentscheduling module has been started. This is used to make sure modules that were running prior to a restart are started again','48883f93-79da-4f17-91e1-c7c3c83f79c3',NULL,NULL,NULL,NULL),('appointmentschedulingui.mandatory','false','true/false whether or not the appointmentschedulingui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','5c5c683b-b71a-4777-b85b-7f5a0733cfe5',NULL,NULL,NULL,NULL),('appointmentschedulingui.started','true','DO NOT MODIFY. true/false whether or not the appointmentschedulingui module has been started. This is used to make sure modules that were running prior to a restart are started again','bd3b99b7-7d9d-46e8-96ae-1bc70c24ab0f',NULL,NULL,NULL,NULL),('appui.mandatory','false','true/false whether or not the appui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','8217a27d-0d9c-431d-a91e-f403d09ba761',NULL,NULL,NULL,NULL),('appui.started','true','DO NOT MODIFY. true/false whether or not the appui module has been started. This is used to make sure modules that were running prior to a restart are started again','0f50d7e7-3763-47fe-a918-4d7c2e6e7e07',NULL,NULL,NULL,NULL),('atlas.id','34deab1f-f03c-45aa-b4ad-ec5fb4ff0b75',NULL,'972d837b-635c-4995-87bf-5097c96d2794',NULL,NULL,NULL,NULL),('atlas.mandatory','false','true/false whether or not the atlas module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','99b3c278-889f-469a-8a8d-5ec23ab472ca',NULL,NULL,NULL,NULL),('atlas.numberOfEncounters','?','Stores the last calculated count of non-voided encounters in the system (\"?\" if never calculated).','efc21b7d-0ac3-43dc-9cb6-9a7c08d3355b',NULL,NULL,NULL,NULL),('atlas.numberOfObservations','?','Stores the last calculated count of non-voided observations in the system (\"?\" if never calculated).','757e34cd-2992-4db1-9e0e-00f2db649a8c',NULL,NULL,NULL,NULL),('atlas.numberOfPatients','?','Stores the last calculated count of non-voided patients in the system (\"?\" if never calculated).','567729ae-4b2f-4863-b8a3-95974b86b292',NULL,NULL,NULL,NULL),('atlas.sendCounts','false','Send counts to OpenMRS Atlas.','05a03de8-77a6-41e7-ad02-1f9689464421',NULL,NULL,NULL,NULL),('atlas.started','true','DO NOT MODIFY. true/false whether or not the atlas module has been started. This is used to make sure modules that were running prior to a restart are started again','4d3633b5-7127-4d4f-9d0c-730ec59ecd3f',NULL,NULL,NULL,NULL),('atlas.stopAskingToConfigure','false','When set to \'true\', we stop pestering admins to configure the atlas.','64c00c74-ec7b-4f63-bf5c-f307b17accf3',NULL,NULL,NULL,NULL),('atomfeed.filter.location','*%*%*%*%*','Value of this property is used to filter objects pulled from parent.','02d3d794-9a91-42bc-897d-b8537e5e777e',NULL,NULL,NULL,NULL),('atomfeed.mandatory','false','true/false whether or not the atomfeed module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','37b755c7-8e69-4a4d-b767-e629573d4b64',NULL,NULL,NULL,NULL),('atomfeed.started','true','DO NOT MODIFY. true/false whether or not the atomfeed module has been started. This is used to make sure modules that were running prior to a restart are started again','c5f0eb0a-4cb0-4b56-8589-382938cbd47c',NULL,NULL,NULL,NULL),('calculation.mandatory','false','true/false whether or not the calculation module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','4eecd086-4548-4cd3-b1fe-4b44afe7209d',NULL,NULL,NULL,NULL),('calculation.started','true','DO NOT MODIFY. true/false whether or not the calculation module has been started. This is used to make sure modules that were running prior to a restart are started again','7a41b487-e4d2-468c-8a63-3318003e16ef',NULL,NULL,NULL,NULL),('chartsearch.httpSolrUrl','http://localhost','Url to HTTP SOLR. Uses only if \'Use Dedicated SOLR set to\ntrue\'','f30a2ba3-2b5d-45e3-8279-714ad2a24c93',NULL,NULL,NULL,NULL),('chartsearch.mandatory','false','true/false whether or not the chartsearch module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','09997855-50c0-4709-a1a6-ba18254460ed',NULL,NULL,NULL,NULL),('chartsearch.started','true','DO NOT MODIFY. true/false whether or not the chartsearch module has been started. This is used to make sure modules that were running prior to a restart are started again','1ee0e32c-0451-4685-9b57-09099464d250',NULL,NULL,NULL,NULL),('chartsearch.useDedicatedSolrServer','false','Use dedicated SOLR server instead of embedded SOLR (true,\nfalse).\nYou will need to specify SOLR url. Requires module restart.','dd1cd95c-5b8e-4ac2-abf8-dde807c014e2',NULL,NULL,NULL,NULL),('ciel.conceptsVersion','20190408','Date or version of CIEL concept dictionary present in the database','f7703d13-8650-400c-811b-baf37d3bae91',NULL,NULL,NULL,NULL),('concept.causeOfDeath','5002','Concept id of the concept defining the CAUSE OF DEATH concept','35a0b3cd-a0a1-41d9-8d41-ba9d0d68a720',NULL,NULL,NULL,NULL),('concept.defaultConceptMapType','NARROWER-THAN','Default concept map type which is used when no other is set','cf2f8f45-9643-4ba8-9ae9-3f8a205db591',NULL,NULL,NULL,NULL),('concept.false','2','Concept id of the concept defining the FALSE boolean concept','de4df46b-d909-4b46-a4a7-d697583400e3',NULL,NULL,NULL,NULL),('concept.height','5090','Concept id of the concept defining the HEIGHT concept','436fd51c-cdec-4830-9d23-fc1b0b73b768',NULL,NULL,NULL,NULL),('concept.medicalRecordObservations','1238','The concept id of the MEDICAL_RECORD_OBSERVATIONS concept. This concept_id is presumed to be the generic grouping (obr) concept in hl7 messages. An obs_group row is not created for this concept.','2e72b3bc-d5fb-4b67-85d2-06d169de6c5d',NULL,NULL,NULL,NULL),('concept.none','1107','Concept id of the concept defining the NONE concept','b6e81798-dad7-4ea5-8a04-b456ad8fbe80',NULL,NULL,NULL,NULL),('concept.otherNonCoded','5622','Concept id of the concept defining the OTHER NON-CODED concept','cf9cb0aa-5c54-453c-9021-96257ef08a01',NULL,NULL,NULL,NULL),('concept.patientDied','1742','Concept id of the concept defining the PATIENT DIED concept','4328fe1f-4065-4368-ab85-606d2f73169a',NULL,NULL,NULL,NULL),('concept.problemList','1284','The concept id of the PROBLEM LIST concept. This concept_id is presumed to be the generic grouping (obr) concept in hl7 messages. An obs_group row is not created for this concept.','5821d12f-dc07-4d4a-b255-804917b15913',NULL,NULL,NULL,NULL),('concept.reasonExitedCare',NULL,'Concept id of the concept defining the REASON EXITED CARE concept','31ea6495-642c-4951-b1e4-d8b7853a894c',NULL,NULL,NULL,NULL),('concept.reasonOrderStopped','1812','Concept id of the concept defining the REASON ORDER STOPPED concept','fb74e000-4f43-4f84-972a-7704721b0f99',NULL,NULL,NULL,NULL),('concept.true','1','Concept id of the concept defining the TRUE boolean concept','b2b0b49c-7999-4f26-b8c6-fe0723b0dfee',NULL,NULL,NULL,NULL),('concept.weight','5089','Concept id of the concept defining the WEIGHT concept','9e8771ad-f05b-4dc0-9860-1aae4b33ffeb',NULL,NULL,NULL,NULL),('conceptDrug.dosageForm.conceptClasses',NULL,'A comma-separated list of the allowed concept classes for the dosage form field of the concept drug management form.','c80aea2f-cccc-4299-9fe5-541fcc179f8d',NULL,NULL,NULL,NULL),('conceptDrug.route.conceptClasses',NULL,'A comma-separated list of the allowed concept classes for the route field of the concept drug management form.','27f9bcc5-1042-4851-8f26-4f5239f38547',NULL,NULL,NULL,NULL),('conceptmanagementapps.snomedCtConceptSource','1ADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD',NULL,'2a6c8b5a-c997-47bf-8303-625e8a3df69e',NULL,NULL,NULL,NULL),('concepts.locked','false','if true, do not allow editing concepts','39bbd058-6634-4bf7-97e1-17772f62636a','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('concept_map_type_management.enable','false','Enables or disables management of concept map types','6fbdee26-ba1e-4a7e-a587-0914fd2ebc1d','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('conditionList.endReasonConceptSetUuid',NULL,'UUID of end reason concept set','e4689dfe-f870-4fd6-8575-a36be005ebe3',NULL,NULL,NULL,NULL),('conditionList.nonCodedUuid',NULL,'UUID of non coded concept','5ead710e-a4ae-424d-bb60-d5715555dce2',NULL,NULL,NULL,NULL),('coreapps.conceptStickyNote','CIEL:162169','Mapping of the concept used for the Sticky Note. In the form of SOURCE:NUMBER.','f5470549-e965-4f06-9d8c-c05743f835e8',NULL,NULL,NULL,NULL),('coreapps.dashboardUrl','/coreapps/clinicianfacing/patient.page?patientId={{patientId}}','Allows one to override the default dashboard url','a4ee8573-53bb-48b7-86e0-aa084dbbfae5',NULL,NULL,NULL,NULL),('coreapps.defaultPatientIdentifierLocation',NULL,'When adding a new patient identifier via the patient dashboard, the location to use if not specified (and the identifier type requires a location)','a632c250-1da8-4cb3-b1b2-d80f4733e47c',NULL,NULL,NULL,NULL),('coreapps.mandatory','false','true/false whether or not the coreapps module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','7439801d-f034-4c36-9888-3e4498121b32',NULL,NULL,NULL,NULL),('coreapps.patientDashboardEncounterCount','100','Maximum number of encounters to be loaded and displayed at once on the patient dashboard.','0d55c1d3-347a-4c96-b5c4-853e1b1c433a',NULL,NULL,NULL,NULL),('coreapps.recentDiagnosisPeriodInDays',NULL,'Number of days to consider diagnosis as recent','b1930604-af84-4f29-b9c9-7250e730d0ed',NULL,NULL,NULL,NULL),('coreapps.searchDelayLong','1000','Time, in milliseconds, that the patient search waits for an additional keystroke if only 1 or 2 characters have been entered','31ebc6e7-c2bd-4324-b6d0-222f07b89baf',NULL,NULL,NULL,NULL),('coreapps.searchDelayShort','300','Default time, in milliseconds, that the patient search waits for an additional keystroke before performed a search','46352914-36e3-4414-8759-969f0d7f70e5',NULL,NULL,NULL,NULL),('coreapps.showVisitTypeOnPatientHeaderSection','false','On the active status and patient header sections, display inpatient/outpatient (based on whether\n a visit has an admission encounter) or the associated visit type.','23e31a55-0d82-4415-9859-579d1659375e',NULL,NULL,NULL,NULL),('coreapps.started','true','DO NOT MODIFY. true/false whether or not the coreapps module has been started. This is used to make sure modules that were running prior to a restart are started again','8dba5bdf-b48c-4f42-9c67-92f0b731349f',NULL,NULL,NULL,NULL),('coreapps.transferEncounterUuid',NULL,'Set encounter uuid if you would like to create a transfer encounter when visit type is changed','6d21fe79-2b06-4877-9f92-46c3b930bfff',NULL,NULL,NULL,NULL),('coreapps.visitsPageUrl','/coreapps/patientdashboard/patientDashboard.page?patientId={{patientId}}#visits','Allows one to override the default general patient visits page','4f449e7e-f2da-443c-97bd-a32ee50312e0',NULL,NULL,NULL,NULL),('coreapps.visitsPageWithSpecificVisitUrl','/coreapps/patientdashboard/patientDashboard.page?patientId={{patientId}}&visitId={{visit.id}}#','Allows one to override the default page that displays the details of a specific patient visit','ee92fcd3-b109-4bb1-aab8-e1a1516879e5',NULL,NULL,NULL,NULL),('coreapps.visitTypeColors',NULL,'Set visit type colors in JSON-like format. Syntax\n [\n {\"uuid\":\"visit_type1_uuid\", \"color\":\"red\", \"shortName\":\"inpatient\"},\n {\"uuid\":\"visit_type2_uuid\", \"color\":\"blue\", \"shortName\":\"oper_theater\"}\n ]','758a2590-a746-499b-a884-d499d59b9e36',NULL,NULL,NULL,NULL),('dashboard.encounters.maximumNumberToShow',NULL,'An integer which, if specified, would determine the maximum number of encounters to display on the encounter tab of the patient dashboard.','137d6a22-0808-4565-adf6-99ef9a90aee7',NULL,NULL,NULL,NULL),('dashboard.encounters.providerDisplayRoles',NULL,'A comma-separated list of encounter roles (by name or id). Providers with these roles in an encounter will be displayed on the encounter tab of the patient dashboard.','bae250ec-54f8-4733-a381-51d3a5428678',NULL,NULL,NULL,NULL),('dashboard.encounters.showEditLink','true','true/false whether or not to show the \'Edit Encounter\' link on the patient dashboard','eca227fc-44c0-438a-8c34-cccac2f0e336','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('dashboard.encounters.showEmptyFields','true','true/false whether or not to show empty fields on the \'View Encounter\' window','cda1b34b-dd04-4c8b-84bf-da09c9631eed','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('dashboard.encounters.showViewLink','true','true/false whether or not to show the \'View Encounter\' link on the patient dashboard','018a4f20-9b14-4d90-9ecb-23a87a1b4c30','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('dashboard.encounters.usePages','smart','true/false/smart on how to show the pages on the \'View Encounter\' window. \'smart\' means that if > 50% of the fields have page numbers defined, show data in pages','256cf60a-3d55-4233-856d-baa6f9610269',NULL,NULL,NULL,NULL),('dashboard.header.programs_to_show',NULL,'List of programs to show Enrollment details of in the patient header. (Should be an ordered comma-separated list of program_ids or names.)','00292469-a526-45fd-9917-bc505c985cc6',NULL,NULL,NULL,NULL),('dashboard.header.showConcept','5497','Comma delimited list of concepts ids to show on the patient header overview','5a39a74c-fadf-4d1b-81b7-70b9ec22209b',NULL,NULL,NULL,NULL),('dashboard.header.workflows_to_show',NULL,'List of programs to show Enrollment details of in the patient header. List of workflows to show current status of in the patient header. These will only be displayed if they belong to a program listed above. (Should be a comma-separated list of program_workflow_ids.)','01ab64ea-d931-4c4d-9e1f-df37577bece7',NULL,NULL,NULL,NULL),('dashboard.metadata.caseConversion',NULL,'Indicates which type automatic case conversion is applied to program/workflow/state in the patient dashboard. Valid values: lowercase, uppercase, capitalize. If empty no conversion is applied.','6679ce30-fca5-486f-8799-705dd3ce6c1c',NULL,NULL,NULL,NULL),('dashboard.overview.showConcepts',NULL,'Comma delimited list of concepts ids to show on the patient dashboard overview tab','c327013f-1fc7-422c-a9cf-15ffeb5f60ca',NULL,NULL,NULL,NULL),('dashboard.regimen.displayDrugSetIds','ANTIRETROVIRAL DRUGS,TUBERCULOSIS TREATMENT DRUGS','Drug sets that appear on the Patient Dashboard Regimen tab. Comma separated list of name of concepts that are defined as drug sets.','d9f957ed-fc19-497a-acb6-73f4326c141e',NULL,NULL,NULL,NULL),('dashboard.regimen.displayFrequencies','7 days/week,6 days/week,5 days/week,4 days/week,3 days/week,2 days/week,1 days/week','Frequency of a drug order that appear on the Patient Dashboard. Comma separated list of name of concepts that are defined as drug frequencies.','da0ee700-e81d-49e1-b4c3-677b7ad9b414',NULL,NULL,NULL,NULL),('dashboard.relationships.show_types',NULL,'Types of relationships separated by commas. Doctor/Patient,Parent/Child','e985abd8-79b6-4f69-b96c-c9a13d3ef14a',NULL,NULL,NULL,NULL),('dashboard.showPatientName','false','Whether or not to display the patient name in the patient dashboard title. Note that enabling this could be security risk if multiple users operate on the same computer.','83aafe2e-526e-4447-bed8-043edb069a37','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('dataexchange.mandatory','false','true/false whether or not the dataexchange module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','bce3c6e3-89a3-4eee-9f56-a8f41a97427c',NULL,NULL,NULL,NULL),('dataexchange.started','true','DO NOT MODIFY. true/false whether or not the dataexchange module has been started. This is used to make sure modules that were running prior to a restart are started again','fd61a9e0-f710-45fc-90e7-b6db352a3e0a',NULL,NULL,NULL,NULL),('datePicker.weekStart','0','First day of the week in the date picker. Domingo/Dimanche/Sunday:0 Lunes/Lundi/Monday:1','a64599df-b3b9-4906-a28a-c757dca46d08',NULL,NULL,NULL,NULL),('default_locale','en_gb','Specifies the default locale. You can specify both the language code(ISO-639) and the country code(ISO-3166), e.g. \'en_GB\' or just country: e.g. \'en\'','71870828-e88b-4d0b-9c41-47ec2586d064',NULL,NULL,NULL,NULL),('default_location','Unknown Location','The name of the location to use as a system default','ff16a585-5ea7-4272-838c-ef9241359592',NULL,NULL,NULL,NULL),('default_theme',NULL,'Default theme for users. OpenMRS ships with themes of \'green\', \'orange\', \'purple\', and \'legacy\'','98a545dc-2879-445b-ac98-e7dc0b7d19a1',NULL,NULL,NULL,NULL),('drugOrder.drugOther',NULL,'Specifies the uuid of the concept which represents drug other non coded','45582f88-6f1c-4532-aebf-0f772e1d434b',NULL,NULL,NULL,NULL),('drugOrder.requireDrug','false','Set to value true if you need to specify a formulation(Drug) when creating a drug order.','7ef44404-1138-4350-a020-2c33e64b6a9b',NULL,NULL,NULL,NULL),('emr.admissionEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the encounter type for admitting a patient','e13c00a8-c76d-4f10-8d12-6e4af0240eaa',NULL,NULL,NULL,NULL),('emr.admissionForm',NULL,'UUID of the Admission Form (not required)','7ffe49f1-2f4b-4d45-8f73-d815b7789706',NULL,NULL,NULL,NULL),('emr.atFacilityVisitType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the VisitType that we use for newly-created visits','ac7ba7ef-f0d7-47bd-813d-4657c158729f',NULL,NULL,NULL,NULL),('emr.checkInEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'',NULL,'06398a01-6472-472a-be63-ec83309e0e69',NULL,NULL,NULL,NULL),('emr.concept.diagnosisSetOfSets','160167AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',NULL,'58a128dc-26de-4bc6-b325-380a44b3f8f9',NULL,NULL,NULL,NULL),('emr.encounterMatcher',NULL,'Class name of a custom encounter matcher (e.g. org.openmrs.module.example.customEncounterMatcher)','1c4914a6-0cdb-4808-b92c-695c60c10e9c',NULL,NULL,NULL,NULL),('emr.exitFromInpatientEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the encounter type for exiting a patient from inpatient care','469d0deb-12ae-43cb-bc97-ff071542d2a3',NULL,NULL,NULL,NULL),('emr.exitFromInpatientForm',NULL,'UUID of the Discharge Form (not required)','a5c15a04-eeea-45ee-948e-7809b225c5b6',NULL,NULL,NULL,NULL),('emr.extraPatientIdentifierTypes',NULL,'A list of UUIDs indicating extra Patient Identifier Types that should be displayed','751003f7-b645-4935-9114-92e31bcdc714',NULL,NULL,NULL,NULL),('emr.primaryIdentifierType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','Primary identifier type for looking up patients, generating barcodes, etc','6b5ba4bb-8d7a-417c-bf58-b4e5a0e4f8cf',NULL,NULL,NULL,NULL),('emr.transferWithinHospitalEncounterType','This global property had been migrated to metadata mapping in source \'org.openmrs.module.emrapi\' with code \'&s\'','UUID of the encounter type for transferring a patient within the hospital','419b581c-9731-4443-8554-74167452ab5a',NULL,NULL,NULL,NULL),('emr.transferWithinHospitalForm',NULL,'UUID of the Transfer Form (not required)','bf268837-e4ea-44fa-99f7-f1d0c3f6d8dd',NULL,NULL,NULL,NULL),('emr.unknownLocation',NULL,'UUID of the Location that represents an Unknown Location','f46fdc59-6efa-493c-ab34-b5466f7d9894',NULL,NULL,NULL,NULL),('emr.unknownProvider','f9badd80-ab76-11e2-9e96-0800200c9a66','UUID of the Provider that represents an Unknown Provider','e06c591f-5b0b-4609-92c2-9bf10856dcea',NULL,NULL,NULL,NULL),('emr.visitNoteEncounterType',NULL,'UUID of the encounter type for a visit note','549356c6-bdb0-43f8-a9f0-17ad778ffc69',NULL,NULL,NULL,NULL),('emrapi.EmrApiVisitAssignmentHandler.encounterTypeToNewVisitTypeMap',NULL,'Specifies the mapping of encounter types to new visit types for more see https://wiki.openmrs.org/x/vgF4Aw','67cfe36d-4b25-446c-a9e8-744b20c4c3c3',NULL,NULL,NULL,NULL),('emrapi.lastViewedPatientSizeLimit','50','Specifies the system wide number of patients to store as last viewed for a single user,\n defaults to 50 if not specified','6b2d82cc-deb3-4098-92a9-52b04e3c299f',NULL,NULL,NULL,NULL),('emrapi.mandatory','false','true/false whether or not the emrapi module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','67aaac39-0ea9-4caf-8cb1-050f3d3c1471',NULL,NULL,NULL,NULL),('emrapi.nonDiagnosisConceptSets',NULL,'UUIDs or mapping of non diagnosis concept sets','aae98b0c-4214-46fe-ae68-45c77e2f331c',NULL,NULL,NULL,NULL),('emrapi.started','true','DO NOT MODIFY. true/false whether or not the emrapi module has been started. This is used to make sure modules that were running prior to a restart are started again','53bf47b1-49bc-4595-95c9-c0728337f6d0',NULL,NULL,NULL,NULL),('emrapi.suppressedDiagnosisConcepts',NULL,'UUIDs or mappings of suppressed diagnosis concepts','446c7644-6479-43c0-b72a-9cb6cdcadc30',NULL,NULL,NULL,NULL),('encounterForm.obsSortOrder','number','The sort order for the obs listed on the encounter edit form. \'number\' sorts on the associated numbering from the form schema. \'weight\' sorts on the order displayed in the form schema.','090c82b2-6226-4cde-be50-17b67e097467',NULL,NULL,NULL,NULL),('EncounterType.encounterTypes.locked','false','saving, retiring or deleting an Encounter Type is not permitted, if true','7435645c-694b-4620-84b6-58d9307ac2e2','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('event.mandatory','false','true/false whether or not the event module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','730ea35a-89a5-4107-bd8f-5d71ef39c1d0',NULL,NULL,NULL,NULL),('event.started','true','DO NOT MODIFY. true/false whether or not the event module has been started. This is used to make sure modules that were running prior to a restart are started again','456a9d0c-6ca6-49e3-b4da-dcb8ee108280',NULL,NULL,NULL,NULL),('fhir2.administeringEncounterRoleUuid','546cce2d-6d58-4097-ba92-206c1a2a0462','Set administering encounter role uuid','9c2115c3-695b-4a08-a0c4-3e88da192070',NULL,NULL,NULL,NULL),('fhir2.immunizationsEncounterTypeUuid','29c02aff-9a93-46c9-bf6f-48b552fcb1fa','Set immunizations encounter type uuid','d2e88721-5ed9-4c43-9971-25a0c13e5e35',NULL,NULL,NULL,NULL),('fhir2.locationContactPointAttributeTypeUuid','abcde432-1691-11df-97a5-7038c432abcd','Set location attribute type uuid','fcff3274-374c-4988-bb1e-1288a5be7868',NULL,NULL,NULL,NULL),('fhir2.mandatory','false','true/false whether or not the fhir2 module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ef29e6be-bdb3-4a8d-81a0-2a6f6d2dad67',NULL,NULL,NULL,NULL),('fhir2.narrativesOverridePropertyFile',NULL,'Path of narrative override properties file','f8b9a879-6c48-4cf3-8adc-6e31a69aab81',NULL,NULL,NULL,NULL),('fhir2.paging.default','10','Set default page size','a29d8665-4cf2-465d-8463-8436ae847ea5',NULL,NULL,NULL,NULL),('fhir2.paging.maximum','100','Set maximum page size','987fc187-fd0a-420b-a58d-c3286f1880e6',NULL,NULL,NULL,NULL),('fhir2.personAttributeTypeUuid','14d4f066-15f5-102d-96e4-000c29c2a5d7','Set person attribute type uuid','6cfd91c7-97a3-4bd3-8870-485537fc80e3',NULL,NULL,NULL,NULL),('fhir2.personContactPointAttributeTypeUuid','14d4f066-15f5-102d-96e4-000c29c2a5d7','Set person attribute type uuid','d782f0a1-3cd5-4e1d-b2c5-89601b072df4',NULL,NULL,NULL,NULL),('fhir2.providerContactPointAttributeTypeUuid','5021b1a1-e7f6-44b4-ba02-da2f2bcf8718','Set provider attribute type uuid','4edc180d-25c9-469c-9090-bb336221ea24',NULL,NULL,NULL,NULL),('fhir2.started','true','DO NOT MODIFY. true/false whether or not the fhir2 module has been started. This is used to make sure modules that were running prior to a restart are started again','f171f837-d99f-46ef-9e01-42f0ca33c5b5',NULL,NULL,NULL,NULL),('fhir2.uriPrefix',NULL,'Prefix for the FHIR server in case this cannot be automatically detected','abf7a551-ae26-4319-9ed9-af6efc77ed01',NULL,NULL,NULL,NULL),('FormEntry.enableDashboardTab','true','true/false whether or not to show a Form Entry tab on the patient dashboard','e4039d7a-87c1-4a76-9422-721c4c6de656','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('FormEntry.enableOnEncounterTab','false','true/false whether or not to show a Enter Form button on the encounters tab of the patient dashboard','6579a662-7b46-4d29-8c03-d520d03d3ef2','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('formentryapp.mandatory','false','true/false whether or not the formentryapp module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','f7260fcb-3f00-4545-979b-3cabb309796a',NULL,NULL,NULL,NULL),('formentryapp.started','true','DO NOT MODIFY. true/false whether or not the formentryapp module has been started. This is used to make sure modules that were running prior to a restart are started again','0295c05a-8e9c-4d80-a828-78fdb1e05a55',NULL,NULL,NULL,NULL),('forms.locked','false','Set to a value of true if you do not want any changes to be made on forms, else set to false.','db268f39-bdb6-424c-b715-4fcbd7d8c2cf',NULL,NULL,NULL,NULL),('graph.color.absolute','rgb(20,20,20)','Color of the \'invalid\' section of numeric graphs on the patient dashboard.','8bed2d3f-aaf4-4423-ac25-4d22277b323e',NULL,NULL,NULL,NULL),('graph.color.critical','rgb(200,0,0)','Color of the \'critical\' section of numeric graphs on the patient dashboard.','ee9d5142-b689-47b6-85ff-2b23d1b9428c',NULL,NULL,NULL,NULL),('graph.color.normal','rgb(255,126,0)','Color of the \'normal\' section of numeric graphs on the patient dashboard.','0ff2bc6b-8822-473c-a123-2d530df78f77',NULL,NULL,NULL,NULL),('gzip.enabled','false','Set to \'true\' to turn on OpenMRS\'s gzip filter, and have the webapp compress data before sending it to any client that supports it. Generally use this if you are running Tomcat standalone. If you are running Tomcat behind Apache, then you\'d want to use Apache to do gzip compression.','a7608c0b-d774-4844-aa9c-ca9fe44747dc','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('haiticore.mandatory','false','true/false whether or not the haiticore module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','3808f06c-8673-4e86-8492-c7c0e4cb3df8',NULL,NULL,NULL,NULL),('haiticore.started','true','DO NOT MODIFY. true/false whether or not the haiticore module has been started. This is used to make sure modules that were running prior to a restart are started again','cf666ecb-3b7f-4f35-abd9-196e8a280143',NULL,NULL,NULL,NULL),('hl7_archive.dir','hl7_archives','The default name or absolute path for the folder where to write the hl7_in_archives.','8098ed61-38cd-4b6f-8509-a55af165f52d',NULL,NULL,NULL,NULL),('hl7_processor.ignore_missing_patient_non_local','false','If true, hl7 messages for patients that are not found and are non-local will silently be dropped/ignored','c44f6633-e89f-4593-8c50-0a0a0058087c','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('htmlformentry.archiveDir','htmlformentry/archive/%Y/%m','Used to specify the directory used to serialize data as a blob submitted via html forms before propagation to the database.\nIf a relative is specified then the directory is created in the default application data directory otherwise the absolute\npath is used.The %Y and %M are replaced with 4 digit year and 2 digit month respectively. If this property is empty nothing then nothing is saved.','a0e08e0c-e9a1-40f9-9c85-0ce7040c87fa',NULL,NULL,NULL,NULL),('htmlformentry.archiveHtmlForms','False','Set to True if you want to archive the submitted html forms and False otherwise','ff8d79f9-83db-43b9-9118-feae1cf4bee0',NULL,NULL,NULL,NULL),('htmlformentry.dateFormat',NULL,'Always display dates in HTML Forms in this (Java) date format. E.g. \"dd/MMM/yyyy\" for 31/Jan/2012.','fcfa9285-d80e-4cde-b8e1-10ae0c7f02d3',NULL,NULL,NULL,NULL),('htmlformentry.datePickerYearsRange','110,20','datePickerYearsRange parameter can be set here Eg:\'110,20\' meaning that the possible years that appear in the datepicker dropdown range from 20 years past the current year, and 110 years prior to the current year.','89c5ef0e-952c-4e85-a2cf-1587fd6ea409',NULL,NULL,NULL,NULL),('htmlformentry.mandatory','false','true/false whether or not the htmlformentry module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','c7e07dc0-7140-4185-b75e-65ae9d7e599f',NULL,NULL,NULL,NULL),('htmlformentry.showDateFormat','true','Set to true if you want static text for the date format to be displayed next to date widgets, else set to false.','abc005ec-321a-493a-a3d7-3fd594954e94',NULL,NULL,NULL,NULL),('htmlformentry.started','true','DO NOT MODIFY. true/false whether or not the htmlformentry module has been started. This is used to make sure modules that were running prior to a restart are started again','6ff31e00-4ae9-421c-8a29-2165b3113d43',NULL,NULL,NULL,NULL),('htmlformentry.timeFormat','HH:mm','Always display times in HTML Forms in this (Java) date format. E.g. \"HH:mm\" for 14:45.','01b34541-8037-4b32-b68e-547687003f1a',NULL,NULL,NULL,NULL),('htmlformentry19ext.mandatory','false','true/false whether or not the htmlformentry19ext module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','f1ed4d93-b67a-4403-85e5-1e36de7ba52e',NULL,NULL,NULL,NULL),('htmlformentry19ext.started','true','DO NOT MODIFY. true/false whether or not the htmlformentry19ext module has been started. This is used to make sure modules that were running prior to a restart are started again','52db204c-3cd8-49a4-b6cf-0c640a37b34c',NULL,NULL,NULL,NULL),('htmlformentryui.mandatory','false','true/false whether or not the htmlformentryui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','3ee6c616-ad81-4fea-ae1b-ef0fafefe18c',NULL,NULL,NULL,NULL),('htmlformentryui.started','true','DO NOT MODIFY. true/false whether or not the htmlformentryui module has been started. This is used to make sure modules that were running prior to a restart are started again','48983969-a93d-42f5-bf01-e13c1ab4ba0e',NULL,NULL,NULL,NULL),('htmlwidgets.mandatory','false','true/false whether or not the htmlwidgets module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','71cb9202-1832-4671-b08d-6636db090e8b',NULL,NULL,NULL,NULL),('htmlwidgets.started','true','DO NOT MODIFY. true/false whether or not the htmlwidgets module has been started. This is used to make sure modules that were running prior to a restart are started again','43081a3e-033a-419c-9768-73c00ab2c8bc',NULL,NULL,NULL,NULL),('idgen.database_version','2.5.1','DO NOT MODIFY. Current database version number for the idgen module.','a3739dff-9cf4-4872-b999-5381f235c8b7',NULL,NULL,NULL,NULL),('idgen.mandatory','false','true/false whether or not the idgen module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','01123c0b-33a2-4774-9bed-b787e972dbe0',NULL,NULL,NULL,NULL),('idgen.started','true','DO NOT MODIFY. true/false whether or not the idgen module has been started. This is used to make sure modules that were running prior to a restart are started again','a99987a1-871c-489f-b7f6-9bebc590680b',NULL,NULL,NULL,NULL),('isanteplus.adultStartingAge','14','Adult starting age in years, OpenMRS uses 13, Haiti uses\n14','0bea7ff3-842b-4b35-9776-32c69e9c6cb2',NULL,NULL,NULL,NULL),('isanteplus.bloodOxygenSaturationConceptId','5092','Blood Oxygen Saturation concept id','2287aed2-0bce-4298-8806-8b641a7ab9c0',NULL,NULL,NULL,NULL),('isanteplus.completedConceptId','1267','COMPLETED Concept id','36eff77e-d2b5-4c69-8d2e-7bdb80274cbe',NULL,NULL,NULL,NULL),('isanteplus.diastolicBloodPressureConceptId','5086','DiastolicBlood Pressure rate concept id','96b79bba-c49c-45a2-ae20-f1a56d885f9b',NULL,NULL,NULL,NULL),('isanteplus.enabledIsantePlusUI','true','Set to false to disable iSantePlus custom user interface','e7ebe52c-427b-4fa0-b360-c62b076e1a14',NULL,NULL,NULL,NULL),('isanteplus.formIdsToExcludeFromHistory',NULL,'Forms IDs to exclude from form History','27921870-d522-4e58-91b8-af144c0f0092',NULL,NULL,NULL,NULL),('isanteplus.formNeedsReviewConceptId','163341','Form needs review concept id','1e486d2b-3030-4706-9a03-bbbe35362381',NULL,NULL,NULL,NULL),('isanteplus.formStatusConceptId','163340','Form status concept id','4955e5c5-7cf0-4716-ae33-3af4d83ede09',NULL,NULL,NULL,NULL),('isanteplus.headCircumferenceConceptId','5314','Head Circumference Concept Id','a037387c-1c6c-4ac3-a77d-ad9eefe8f3b3',NULL,NULL,NULL,NULL),('isanteplus.incompleteConceptId','163339','Incomplete Concept id','179d8b84-0115-43fe-81d5-f8da1b292273',NULL,NULL,NULL,NULL),('isanteplus.mandatory','false','true/false whether or not the isanteplus module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ebeee299-5663-42b9-b428-345f859c954e',NULL,NULL,NULL,NULL),('isanteplus.metadataLastUpdatedDate','20171211','This is the last date that the iSantePlus metadata was\nloaded. This date is evaluated each time the module is started.\nChange it to load the metadata again.','2f48585a-f589-4a37-9feb-beed89d0cd39',NULL,NULL,NULL,NULL),('isanteplus.midUpperArmCircumferenceConceptId','1343','Mid Upper Arm Circumference concept id','0be400b0-4e6b-4072-961d-d7ab1bfd584e',NULL,NULL,NULL,NULL),('isanteplus.noConceptId','1066','No Concept id','ff9a984f-a465-41a0-b07c-59e7af4460f0',NULL,NULL,NULL,NULL),('isanteplus.pulseConceptId','5087','Pulse concept id','21b584b3-060c-4123-8eec-68fa5d87b6e0',NULL,NULL,NULL,NULL),('isanteplus.respiratoryRateConceptId','5242','Respiratory rate concept id','37008737-da5a-4f6b-a7cc-855dbfe88519',NULL,NULL,NULL,NULL),('isanteplus.started','true','DO NOT MODIFY. true/false whether or not the isanteplus module has been started. This is used to make sure modules that were running prior to a restart are started again','972b99c8-0741-4ef8-bbd2-b3c0da8af7e5',NULL,NULL,NULL,NULL),('isanteplus.systolicBloodPressureConceptId','5085','Systolic Blood Pressure rate concept id','f4da2d0f-7765-40e8-90c0-c169e2c9a2c3',NULL,NULL,NULL,NULL),('isanteplus.temperatureConceptId','5088','Temperature concept id','9b57e331-8d42-42af-8615-89c5cc4d9f36',NULL,NULL,NULL,NULL),('isanteplus.viralLoadConceptId','856','HIV VIRAL LOAD concept id','8a0f68c6-52d1-4a7d-8f13-3d5901f09b88',NULL,NULL,NULL,NULL),('isanteplus.yesConceptId','1065','Yes Concept id','4b209017-5c31-48d0-835b-9a71e20f1ffa',NULL,NULL,NULL,NULL),('iSantePlusReports.ipAddress','172.23.0.7',NULL,'169f1989-3986-4d9a-a850-f93b649f3ab0',NULL,NULL,NULL,NULL),('isanteplusreports.mandatory','false','true/false whether or not the isanteplusreports module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','22deed9b-4128-4841-9980-d0557980336b',NULL,NULL,NULL,NULL),('isanteplusreports.started','true','DO NOT MODIFY. true/false whether or not the isanteplusreports module has been started. This is used to make sure modules that were running prior to a restart are started again','8923ef1e-0f66-4328-8282-2d7ca3388330',NULL,NULL,NULL,NULL),('labintegration.hl7.dateFormat','yyyyMMddHHmmss','Default date format for messages','c2657525-ca8b-40d4-9392-2397445a6796',NULL,NULL,NULL,NULL),('labintegration.hl7.motherNameAttrTypeUuid','First Name of Mother','The name of the attribute type used to represent the mother name.','86270066-464a-4bba-872c-30d142817ea5',NULL,NULL,NULL,NULL),('labintegration.hl7.phoneNumAttrTypeUuid','Telephone Number','The name of the attribute type used to represent the patient phone number.','4c2e978c-ef73-4546-a4ee-3ee9a64e8a78',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.birthPlaceCity','CIEL:165198','The designation of the birth city, in the form of SOURCE:CODE. Will be used to\nretrieve the correct obs from the birth obs group.','2e3ee439-a7ed-4cf4-b7ec-4a502b1fcedd',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.birthPlaceGroup','CIEL:165194','The designation of the concept grouping birth address concepts, in the form of\nSOURCE:CODE. Will be used to retrieve the correct obs from the registration form.','cd90fb01-17d7-4005-8587-7223bea39676',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.civilStatus','CIEL:1054','The designation of the civil status concept, in the form of SOURCE:CODE. Will be\nused to retrieve the correct obs from the registration form.','620cb55a-4ae1-4539-8931-506959da37f8',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.religion','CIEL:162929','The designation of the religion concept, in the form of SOURCE:CODE. Will be\nused to retrieve the correct obs from the registration form.','bc89b111-37b1-4bbe-ad5d-a551d5e29681',NULL,NULL,NULL,NULL),('labintegration.hl7.regForm.typeUuid','873f968a-73a8-4f9c-ac78-9f4778b751b6','The UUID of the registration form.','e19f192e-f497-4742-b46c-59dd0ecbe6c3',NULL,NULL,NULL,NULL),('labintegration.mandatory','false','true/false whether or not the labintegration module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','dfff115c-a604-44b3-ba25-f1ac3dbd830c',NULL,NULL,NULL,NULL),('labintegration.openElis.inboundHost',NULL,'The host of OpenELIS used that has to match when receiving inbound messages. If not set,\nthe value will be retrieved from the OpenELIS url. Use this if the host from the outbound url\ndoes not match the IP in OpenELIS inbound messages.','a7d252b2-ba9c-48a0-b23a-89868825ea54',NULL,NULL,NULL,NULL),('labintegration.openElis.pidTypeUuid','05a29f94-c0ed-11e2-94be-8c13b969e334','UUID of the Patient Identifier Type for the OpenELIS integration.','fe6d5749-9024-4d1e-af10-f24087c6dc7d',NULL,NULL,NULL,NULL),('labintegration.openElis.receivingApplication','OpenELIS','The Namespace ID of the receiving application in the HL7v2 message being sent to OpenELIS.','7a6e49be-7208-4493-a01e-a0e2c6f732b6',NULL,NULL,NULL,NULL),('labintegration.openElis.sendingApplication','iSantePlus','The Namespace ID of the sending application in the HL7v2 message being sent to OpenELIS.','122f64ac-2612-4a75-b10f-ce14aed77c21',NULL,NULL,NULL,NULL),('labintegration.openElis.url',NULL,'The URL to the OpenELIS endpoint that accepts HL7 message posts.','faf2d931-be14-4685-8d4a-58ee4f1ccfbf',NULL,NULL,NULL,NULL),('labintegration.orderEncounterTypeUuid','f037e97b-471e-4898-a07c-b8e169e0ddc4','The UUID of EncounterType that specifies encounters with lab orders.','cb837d56-cc7d-44dd-b3be-913d9d70d522',NULL,NULL,NULL,NULL),('labintegration.production','false','Whether this module is deployed to production - true or false. Translates to the processing ID flag\nsent in HL7 messages.','3e1a1f81-5eef-4fc5-a092-05678de9514f',NULL,NULL,NULL,NULL),('labintegration.scc.pidTypeUuid',NULL,'UUID of the Patient Identifier Type for the SCC.','693e099f-d954-4c4d-9f75-5f4a07f043b3',NULL,NULL,NULL,NULL),('labintegration.started','true','DO NOT MODIFY. true/false whether or not the labintegration module has been started. This is used to make sure modules that were running prior to a restart are started again','97e2c0af-c1a3-455b-a178-a1a0a8147348',NULL,NULL,NULL,NULL),('layout.address.format','\n \n \n country\n haiticore.address.country\n \n \n address3\n haiticore.address.neighborhoodCell\n \n \n address2\n haiticore.address.address2\n \n \n address1\n haiticore.address.address1\n \n \n stateProvince\n haiticore.address.stateProvince\n \n \n cityVillage\n haiticore.address.cityVillage\n \n \n \n \n country\n 40\n \n \n address3\n 60\n \n \n address2\n 60\n \n \n address1\n 60\n \n \n stateProvince\n 40\n \n \n cityVillage\n 40\n \n \n \n \n country\n Haiti\n \n \n \n address2\n address1\n address3, cityVillage\n stateProvince, country\n \n 0\n','XML description of address formats','98fa7af1-d183-4f70-93fb-2f488000ce4c',NULL,NULL,NULL,NULL),('layout.name.format','givenfamily','Format in which to display the person names. Valid values are short, long','8ece8adf-4d79-4b52-a233-66187cb72f3a',NULL,NULL,NULL,NULL),('legacyui.mandatory','false','true/false whether or not the legacyui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','198e8868-d4b9-41f7-a669-818d77717c0a',NULL,NULL,NULL,NULL),('legacyui.started','true','DO NOT MODIFY. true/false whether or not the legacyui module has been started. This is used to make sure modules that were running prior to a restart are started again','5212f2df-791e-457b-a28b-ce2295221317',NULL,NULL,NULL,NULL),('locale.allowed.list','fr, ht, en, en_us, en_gb','Comma delimited list of locales allowed for use on system','2b4d2797-e8d1-4483-a863-02cfb4299212',NULL,NULL,NULL,NULL),('location.field.style','default','Type of widget to use for location fields','e77923c2-d262-4f8c-b8fe-40773827ea4d',NULL,NULL,NULL,NULL),('log.layout','%p - %C{1}.%M(%L) |%d{ISO8601}| %m%n','A log layout pattern which is used by the OpenMRS file appender.','44dd2b3e-af42-4abf-ad6e-eadb48a89d41',NULL,NULL,NULL,NULL),('log.level','org.openmrs.api:info','Logging levels for log4j.xml. Valid format is class:level,class:level. If class not specified, \'org.openmrs.api\' presumed. Valid levels are trace, debug, info, warn, error or fatal','cf66565e-d00b-4127-a774-07bad9e486fc',NULL,NULL,NULL,NULL),('log.location',NULL,'A directory where the OpenMRS log file appender is stored. The log file name is \'openmrs.log\'.','4683b0d6-45aa-4fab-a257-ae754ef1e855',NULL,NULL,NULL,NULL),('logic.default.ruleClassDirectory','logic/class','Default folder where compiled rule will be stored','e3231a20-9b7c-4101-8bbb-bfad2faa6fb5',NULL,NULL,NULL,NULL),('logic.default.ruleJavaDirectory','logic/sources','Default folder where rule\'s java file will be stored','6cca96f1-7139-44dc-a7d5-891530a26987',NULL,NULL,NULL,NULL),('logic.defaultTokens.conceptClasses',NULL,'When registering default tokens for logic, if you specify a comma-separated list of concept class names here, only concepts of those classes will have tokens registered. If you leave this blank, all classes will have tokens registered for their concepts.','13ac9af0-1f9b-405a-9f0f-5e3f00a37ce5',NULL,NULL,NULL,NULL),('logic.mandatory','false','true/false whether or not the logic module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','b3d2befc-61c7-4d39-b8ee-436ccb05fc16',NULL,NULL,NULL,NULL),('logic.started','true','DO NOT MODIFY. true/false whether or not the logic module has been started. This is used to make sure modules that were running prior to a restart are started again','21a52a97-c08d-4ea0-9404-efec9b204bbc',NULL,NULL,NULL,NULL),('m2sys-biometrics.accessPointID','2D10F89739EA408889F62C32CAB420E3','The m2sys server AccessPointID. This is used by default unless a mapping that matches the callers IP\n is found in the accessPointMap property.','201011d8-5c89-43f3-916a-d1d8200ace08',NULL,NULL,NULL,NULL),('m2sys-biometrics.accessPointMap',NULL,'A map of IP addresses to Access Point IDs. Has format of IP1:AccessPointID1;IP2:AccessPointID2;...\n For example 127.0.0.1:APID1;8.8.8.8:APID2... The IPs must match the IPs of the clients calling the\n server.','0a84a97f-19b5-4ea3-9b5f-332b1c097cd7',NULL,NULL,NULL,NULL),('m2sys-biometrics.captureTimeout','10000','The m2sys server CaptureTimeout.','db6f8fb5-c4b3-4454-b29d-4babdbabb112',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.api.url',NULL,'Base URL to the cloud fingerprint matching engine API endpoints.','b1d2077c-d235-47c1-95fd-f5d08ec2c084',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.app.key','521b76848bda4cd4a018edd0316120cf','Client assigned CLOUDABIS APP KEY for access to the cloud fingerprint matching engine API endpoints.','9c0cd4dd-174d-47b9-8b7c-5371dd996e53',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.customer.key','D6423BE64DCD4A119691B294A7D5A77A','User assigned customer key for grouping different CLOUDABIS Apps.','fdd4207b-08a3-4992-9360-c9c0cfe86a8b',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.engine.name','FPFF02','User preffered engine for processing CLOUDABIS requests.','cb5bff7f-df5e-4853-a532-10b5ab73a44a',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.grant.type','password','Client preferred grant type for access to the cloud fingerprint matching engine API endpoints.','e2d2c002-1eb7-4c1a-a21c-34106ff2153e',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.secret.key','jcREl+Buqt076o4XDmZ4RCBrJro=','Client assigned SECRET KEY for access to the cloud fingerprint matching engine API endpoints.','9ea5d99c-7379-4fc3-a84a-e7da568f5b56',NULL,NULL,NULL,NULL),('m2sys-biometrics.cloudabis.template.format','FP1','Preferred template format - Usually tied to the capabilities of the user-procured fingerprint scanner.','e4071ee6-8496-4282-902f-aa2106e1eb6b',NULL,NULL,NULL,NULL),('m2sys-biometrics.customKey','31F25750D4E048D4B4A452B5DB723C5E','The m2sys server CustomKey.','6fdfa405-a6a9-4ba7-b370-4a7a0dd14555',NULL,NULL,NULL,NULL),('m2sys-biometrics.device.name','Secugen','The m2sys fingerprint scanning device name.','14f45309-5c18-45d6-a285-24b8618a8e1a',NULL,NULL,NULL,NULL),('m2sys-biometrics.local-service.url','http://200.2.133.226/M2SYS.BioPluginWeb/BioPluginServicev8.asmx?wsdl','The URL to the SOAP service of the local (local to the clinic) M2Sys BioPlugin Server.','f7f7d194-875f-4f22-ba67-c739b4706459',NULL,NULL,NULL,NULL),('m2sys-biometrics.locationID','2','The m2sys server location ID.','e545ce87-4d23-46e1-96ce-c386587f6542',NULL,NULL,NULL,NULL),('m2sys-biometrics.mandatory','false','true/false whether or not the m2sys-biometrics module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','7d15f95f-680a-430f-8b7d-fca04b6c5c47',NULL,NULL,NULL,NULL),('m2sys-biometrics.national-service.url',NULL,'The URL to the SOAP service of the national M2Sys BioPlugin Server.','ebc4cd00-ffff-48fe-a278-1878718b9eb9',NULL,NULL,NULL,NULL),('m2sys-biometrics.nationalRegistrationTaskInterval',NULL,'Interval time (in seconds) to execute retry of national registration failures task.','3f36aef6-c825-40dd-a01f-43b970e88f08',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.constTestTemplate','CYkoCIMUAIABwA4LCCkADAkLUeAJDWhyAAcO4H7ABAcekQASCOjNwAYSnSXhFAUszQEUCS3VoQ8K0OmhAwdOUQIISyxpAhcIOnJiCSdJgUIIGzrNohMLMRHDFQ9XOQMABsxKwwIJylGDBwiEiYF/eYhzi315b3N6e3p3g2ppcw==CYkoCIMUAIABwA4LCCkADAkLUeAJDWhyAAcO4H7ABAcekQASCOjNwAYSnSXhFAUszQEUCS3VoQ8K0OmhAwdOUQIISyxpAhcIOnJiCSdJgUIIGzrNohMLMRHDFQ9XOQMABsxKwwIJylGDBwiEiYF/eYhzi315b3N6e3p3g2ppcw==','A default test fingerprint template for instances when the fingerprint scanner is not available.','7276ee01-5881-4c16-a327-ae32b5ea3bac',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.national.password',NULL,'The m2sys national server password.','90c644d6-9167-4e50-8d74-8d03717b0da8',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.national.user',NULL,'The m2sys national server username.','a70ef0a3-5c37-46ed-b9ff-41bf5662ebb2',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.password',NULL,'The m2sys CloudScanr password.','f0b1e866-4706-454a-b8ad-a47febf19d78',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.url','http://localhost:15896','The m2sys CloudScanr url.','53dc502c-e91b-4867-97bb-86d65e484739',NULL,NULL,NULL,NULL),('m2sys-biometrics.server.user',NULL,'The m2sys CloudScanr username.','894293f2-72ca-4a37-81de-c2d6eb657f0d',NULL,NULL,NULL,NULL),('m2sys-biometrics.started','true','DO NOT MODIFY. true/false whether or not the m2sys-biometrics module has been started. This is used to make sure modules that were running prior to a restart are started again','d0f32473-768e-4be5-a7b7-d5d50855c5d7',NULL,NULL,NULL,NULL),('mail.debug','false','true/false whether to print debugging information during mailing','76c4f916-9fe1-45b5-9773-224e4f4ee484',NULL,NULL,NULL,NULL),('mail.default_content_type','text/plain','Content type to append to the mail messages','f5830019-a60a-47fe-865f-78fb98b3f5f1',NULL,NULL,NULL,NULL),('mail.from','info@openmrs.org','Email address to use as the default from address','a8303d1e-de7b-45b8-bc04-2874ae7da635',NULL,NULL,NULL,NULL),('mail.password','test','Password for the SMTP user (if smtp_auth is enabled)','858118bf-794b-42c4-8266-dcf850963b34',NULL,NULL,NULL,NULL),('mail.smtp.starttls.enable','false','Set to true to enable TLS encryption, else set to false','bc0b4cb1-ed37-4e3d-a447-9f3055671dd3',NULL,NULL,NULL,NULL),('mail.smtp_auth','false','true/false whether the smtp host requires authentication','ebe1af62-5e72-4c44-a044-955a9a8b29b4',NULL,NULL,NULL,NULL),('mail.smtp_host','localhost','SMTP host name','ea0625e2-9f64-40a6-9c32-6720772fd3d4',NULL,NULL,NULL,NULL),('mail.smtp_port','25','SMTP port','e77ee4de-13f1-4a7f-b41e-eb2f720cd49d',NULL,NULL,NULL,NULL),('mail.transport_protocol','smtp','Transport protocol for the messaging engine. Valid values: smtp','9fa39a09-2b7a-415c-877c-2308cb3caa12',NULL,NULL,NULL,NULL),('mail.user','test','Username of the SMTP user (if smtp_auth is enabled)','e0f2afbe-eff3-4787-960c-e61b56c0b00d',NULL,NULL,NULL,NULL),('metadatadeploy.bundle.version.org.openmrs.module.haiticore.metadata.bundles.HaitiAddressBundle','11',NULL,'c2a7126b-c05d-4ae3-a8b2-3fa6c22a562d',NULL,NULL,NULL,NULL),('metadatadeploy.mandatory','false','true/false whether or not the metadatadeploy module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ce5f1b5e-bc32-43eb-a027-f47bb5b8a775',NULL,NULL,NULL,NULL),('metadatadeploy.started','true','DO NOT MODIFY. true/false whether or not the metadatadeploy module has been started. This is used to make sure modules that were running prior to a restart are started again','35aca365-e1bb-4fb2-bcb8-4ed3bff08dae',NULL,NULL,NULL,NULL),('metadatamapping.addLocalMappings',NULL,'Specifies whether the concept mappings to the local dictionary should be created when exporting concepts','6a58d18b-74c1-4d09-890b-48ea938a66f5',NULL,NULL,NULL,NULL),('metadatamapping.mandatory','false','true/false whether or not the metadatamapping module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','aa8482b4-b13d-484a-a79c-b647e62a5f7e',NULL,NULL,NULL,NULL),('metadatamapping.started','true','DO NOT MODIFY. true/false whether or not the metadatamapping module has been started. This is used to make sure modules that were running prior to a restart are started again','a9cde7b9-3836-4065-a8bf-d42a35c61683',NULL,NULL,NULL,NULL),('metadatasharing.enableOnTheFlyPackages','false','Specifies whether metadata packages can be exported on the fly','55172c30-b92f-494b-bf45-af29ef198e75',NULL,NULL,NULL,NULL),('metadatasharing.mandatory','false','true/false whether or not the metadatasharing module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','9078c7ab-658b-4585-a9d5-c8fd246331b1',NULL,NULL,NULL,NULL),('metadatasharing.persistIdsForClasses',NULL,'A comma separated list of class package/names that denotes classes to try and persist ids for. Common options: org.openmrs.Concept,org.openmrs.Form,org.openmrs.ConceptDatatype,org.openmrs.ConceptClass,org.openmrs.EncounterType,org.openmrs.IdentifierType,org.openmrs.RelationshipType,org.openmrs.Location','8a6dc4a6-606d-4933-83b2-11944e2b299e',NULL,NULL,NULL,NULL),('metadatasharing.preferredConceptSourceIds',NULL,'Comma-separated list of concept source Ids for preferred sources, in case an incoming concept \nhas duplicate mappings to any of these sources, no confirmation will be required unless its \ndatatype or concept class differs from that of the existing concept','66154c95-4d64-4d2d-a398-47d3ac2dd166',NULL,NULL,NULL,NULL),('metadatasharing.started','true','DO NOT MODIFY. true/false whether or not the metadatasharing module has been started. This is used to make sure modules that were running prior to a restart are started again','f2062199-7686-47bb-801f-c2c0c8af337b',NULL,NULL,NULL,NULL),('metadatasharing.webservicesKey',NULL,'Key to grant access to remote systems to consume module webservices RESTfully','5e950ae6-39fa-4756-bf64-01bd7d26bc8b',NULL,NULL,NULL,NULL),('minSearchCharacters','3','Number of characters user must input before searching is started.','3cf7f948-6543-446f-bf62-ed72789bef00',NULL,NULL,NULL,NULL),('module_repository_folder','modules','Name of the folder in which to store the modules','b2d12eb8-a129-43b3-9dd9-dc5460fee0bf',NULL,NULL,NULL,NULL),('mpi-client.backgrounThreads','true','When true indicates that ADT messages should be sent on a background thread','267714e3-ac50-4c3d-b689-13cbae7ec205',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.addr',NULL,'The address of the audit repository node','c4325e73-4d85-424f-b0bf-09febf77816c',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.bind',NULL,'The local bind address for UDP connection','f32ed00a-ab83-40c2-993c-d9c814dd8e58',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.port',NULL,'The port # to use when sending the audits','eb319b40-d72c-4741-bc9a-9fcec94b14f5',NULL,NULL,NULL,NULL),('mpi-client.endpoint.ar.transport',NULL,'The transport to use (audit-udp, audit-tcp, audit-tls)','d91f0551-0baf-42dd-b05d-05644833043a',NULL,NULL,NULL,NULL),('mpi-client.endpoint.format','fhir','The messaging format (HL7 or FHIR) to use to interact with the MPI','70c96f79-1a61-440a-a033-abe35fa3870e',NULL,NULL,NULL,NULL),('mpi-client.endpoint.cr.addr','http://openhim-core:5001/CR/fhir','Identifies the location of the Client Registry endpoint',UUID(),NULL,NULL,NULL,NULL),('mpi-client.endpoint.pdq.addr','http://openhim-core:5001/CR/fhir','Identifies the location of the PDQ endpoint','2fd3b5b9-cb78-4422-b421-92e08d370543',NULL,NULL,NULL,NULL),('mpi-client.endpoint.pdq.port',NULL,'Identifies the port of the PDQ interface','b6f33177-fc65-49a4-9edc-428cc76ec20a',NULL,NULL,NULL,NULL),('mpi-client.endpoint.pix.addr','http://openhim-core:5001/CR/fhir','Identifies the location of the PIX endpoint','d0817aa7-5b3b-4e20-abf7-8645afff1d79',NULL,NULL,NULL,NULL),('mpi-client.endpoint.pix.port',NULL,'Identifies the port of the PIX interface','27fbd05c-213b-42e5-9dbb-f87abeb621b4',NULL,NULL,NULL,NULL),('mpi-client.ext.extendedAttributes','Father\'s Name:NK1-2-2?NK1-3=FTH,Mother\'s Name:PID-6-2,Place of Birth:PID-23,Telephone contact:PID-13,Email address:PID-14,National ID=PID-19','PersonAttributes (in OpenMRS) you would like imported from the message. Format= attr_name:segment_path?segment_guard=guard_value, . For example, to copy NK1-2-2 to fathers name: Father\'s Name=NK1-2-2?NK1-3=FTH','58b7d092-f2c3-49c4-bf32-4d6c46850a13',NULL,NULL,NULL,NULL),('mpi-client.ext.storeNK1AsRelationships','false','When true, store NK1 (next-of-kin) as OpenMRS relationships (note some OpenMRS software does not understand these)','f1c8eea3-4ba3-44b2-9bbc-7818d0567855',NULL,NULL,NULL,NULL),('mpi-client.http.proxyAddress',NULL,NULL,'8692bceb-c266-49f1-a8cd-0ea857c4b2d9',NULL,NULL,NULL,NULL),('mpi-client.msg.remoteApplication','OpenCR','The registered application name for *RECIPIENT* endpoint (MSH-5)','22cdaaab-ad5a-4d65-af8b-9087e465946c',NULL,NULL,NULL,NULL),('mpi-client.msg.remoteFacility','NATIONAL_DC','The registered facility name for *RECIPIENT* endpoint (MSH-6)','1cb813f8-dfce-45ad-b953-ccb84edf7c19',NULL,NULL,NULL,NULL),('mpi-client.msg.sendingApplication','isanteplus','The registered application name for *THIS* endpoint (MSH-3)','d291ed5f-5b2e-4432-a18c-1e41fb9da06d',NULL,NULL,NULL,NULL),('mpi-client.msg.sendingFacility','LOCAL','The registered facility name for *THIS* endpoint (MSH-4)','c6334657-5289-455e-bf1d-b3282a20e880',NULL,NULL,NULL,NULL),('mpi-client.pid.autoXref','iSantePlus ID,Code ST,Code National,Code PC,iSante ID','A comma separated list of patient identity domains which should be automatically cross referenced from the MPI when registration is successful','3fd49e29-6893-484f-8446-0029e9277dae',NULL,NULL,NULL,NULL),('mpi-client.pid.correlation','LOCAL','The preferred correlation identity','33ae75d9-3301-4aa9-ab24-14d9d9bb7eaf',NULL,NULL,NULL,NULL),('mpi-client.pid.defaultCountry','CA','When specified, sets the default country code to use when no country code is present','c6030838-bda5-4161-973e-c0b194fb7f98',NULL,NULL,NULL,NULL),('mpi-client.pid.enterprise','ENT_ID','Identifies the enterprise authority (globally unique) of the patient generated by the MPI','44cef6be-bc37-4e0b-9a4b-4f6f30e8e4cf',NULL,NULL,NULL,NULL),('mpi-client.pid.exportIdentitiferType','iSantePlus ID=iSantePlus ID,Code ST=Code ST,Code National=Code National,Code PC=Code PC,iSante ID=iSante ID','When specified, indicates the patient identifier types and domains that should be exported (example: HIV Programme ID=HIV_ID)','6a358579-b3c9-46eb-8242-62906aad68e7',NULL,NULL,NULL,NULL),('mpi-client.pid.local','http://isanteplus/ws/fhir2/pid/openmrsid/','Identifies the local assigning authority of this OpenMRS instances (or a \'-\' if you don\'t want to send local identifiers)','d75bfbf0-914d-448c-a9c2-158c237c6cb4',NULL,NULL,NULL,NULL),('mpi-client.pid.nameRewriteRegex',NULL,'Identifies the regex that should be used to rewrite names. For example to extract the first prefix in Myanmar: /^(ma|mg|daw)?(.*)$/^$2^^^$1','a2208951-8f97-4aa2-879c-3f6691fa2c2d',NULL,NULL,NULL,NULL),('mpi-client.pid.nhid','iSantePlus ID','Identifies the assigning authority of the national health ID','a52204fd-858c-48ff-b4f5-c1096925f4eb',NULL,NULL,NULL,NULL),('mpi-client.reg.birthPlaceConcept','165194AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA','Concept UUID for the patient place of birth construct','74530139-d963-47d7-a562-e2bf8c2c5b0a',NULL,NULL,NULL,NULL),('mpi-client.reg.mothersName','First Name of Mother','The attribute name to use for the Mother\'s maiden name','d985828d-5d84-47b3-a927-a2492f7b0856',NULL,NULL,NULL,NULL),('mpi-client.reg.patientTelephoneNumber','Telephone Number','The telephone number for the patient','394ef2b3-0d45-4fb0-b24b-015c5f3abaa3',NULL,NULL,NULL,NULL),('mpi-client.search.dateFuzz','0','The amount of fuzziness to add to fuzzy date searches (example: search for 1995,1996,1997 instead of just 1996)','a85e5541-7471-40fc-9316-2e7ac172914a',NULL,NULL,NULL,NULL),('mpi-client.security.authtoken','isanteplus','If the MPI requires an authentication token in MSH-8 enter it here','7b92c347-9ca7-4497-96a3-23775555f7a8',NULL,NULL,NULL,NULL),('mpi-client.security.authType','basic','Identifies the authentication type. Use blank, oauth or basic','2f76da4e-6e84-45f7-8cee-ad38d1bfdb37',NULL,NULL,NULL,NULL),('mpi-client.security.idp.addr',NULL,NULL,'c448b502-c8a1-4e09-afdb-1dc6115a028a',NULL,NULL,NULL,NULL),('mpi-client.security.keyStore',NULL,'If the MPI requires client certificate authentication, enter it here','aa3030c7-426d-4b53-b296-5a028c993f7b',NULL,NULL,NULL,NULL),('mpi-client.security.keyStorePassword',NULL,'The password for the keyStore','6b8d4915-5f6c-4052-b779-fb5f6818484c',NULL,NULL,NULL,NULL),('mpi-client.security.trustStore',NULL,'The trust store of to use to validate the identity of the MPI\'s certificate','b275c040-3c62-4a83-9b95-4a583b1e1aa2',NULL,NULL,NULL,NULL),('mpi-client.security.trustStorePassword',NULL,'The password used to unlock the trust store','468a512c-c4cc-4d93-aa80-fdb9f39a2b1e',NULL,NULL,NULL,NULL),('namephonetics.familyName2StringEncoder','Soundex',NULL,'02bd7d87-fb93-4e1f-907f-6a766519238a',NULL,NULL,NULL,NULL),('namephonetics.familyNameStringEncoder','Soundex',NULL,'7916c675-ece7-4951-b67c-f893a4956dad',NULL,NULL,NULL,NULL),('namephonetics.givenNameStringEncoder','Soundex',NULL,'909470af-ed33-43a1-a6fb-803fb67e62ba',NULL,NULL,NULL,NULL),('namephonetics.middleNameStringEncoder','Soundex',NULL,'936aaad9-c6e4-484f-a467-31acd12d5fad',NULL,NULL,NULL,NULL),('newPatientForm.relationships',NULL,'Comma separated list of the RelationshipTypes to show on the new/short patient form. The list is defined like \'3a, 4b, 7a\'. The number is the RelationshipTypeId and the \'a\' vs \'b\' part is which side of the relationship is filled in by the user.','08136389-c093-49da-8e9a-c08121e07696',NULL,NULL,NULL,NULL),('new_patient_form.showRelationships','false','true/false whether or not to show the relationship editor on the addPatient.htm screen','63af8912-caaa-4500-b212-8c7c0cb70e6a','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('obs.complex_obs_dir','complex_obs','Default directory for storing complex obs.','4928b05f-2b64-4ea1-9947-245ff4825ca2',NULL,NULL,NULL,NULL),('order.drugDispensingUnitsConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible drug dispensing units','d9f832df-2684-4409-ade6-686cfa2c21b8',NULL,NULL,NULL,NULL),('order.drugDosingUnitsConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible drug dosing units','504c31ca-f4a1-41ca-bda3-dc98757450b1',NULL,NULL,NULL,NULL),('order.drugRoutesConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible drug routes','fba4706b-f543-4805-86af-6b2237295d9f',NULL,NULL,NULL,NULL),('order.durationUnitsConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible duration units','1868853d-7974-46a4-b407-8c6f75f37eda',NULL,NULL,NULL,NULL),('order.nextOrderNumberSeed','1','The next order number available for assignment','fa7d6a87-674d-400e-bcf2-c6f0260bb46a',NULL,NULL,NULL,NULL),('order.orderNumberGeneratorBeanId',NULL,'Specifies spring bean id of the order generator to use when assigning order numbers','66efc0db-5820-4946-94c7-523a50fc2b6f',NULL,NULL,NULL,NULL),('order.testSpecimenSourcesConceptUuid',NULL,'Specifies the uuid of the concept set where its members represent the possible test specimen sources','e9f6b313-f29a-40f9-922f-ea6f67f680f9',NULL,NULL,NULL,NULL),('outgoing-message-exceptions.mandatory','false','true/false whether or not the outgoing-message-exceptions module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','abbc8653-540d-4a0a-a74a-f6d6aaf99fef',NULL,NULL,NULL,NULL),('outgoing-message-exceptions.started','true','DO NOT MODIFY. true/false whether or not the outgoing-message-exceptions module has been started. This is used to make sure modules that were running prior to a restart are started again','6b69ce59-9beb-47df-8b6d-df35a391d403',NULL,NULL,NULL,NULL),('owa.appBaseUrl',NULL,'The base URL from where the Open Web Apps are hosted','61f3dbec-bc8b-4455-9b28-42b5f08172ae',NULL,NULL,NULL,NULL),('owa.appFolderPath','/openmrs/data/owa','The default location where the apps are stored on disk','c7a2743a-1c0e-45c6-a060-f1d85054ac46',NULL,NULL,NULL,NULL),('owa.appStoreUrl','http://modules.openmrs.org','The default URL for the OpenMRS appstore','eda6f3b1-a57b-4b9b-bf59-dd4423e86801',NULL,NULL,NULL,NULL),('owa.mandatory','false','true/false whether or not the owa module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','0ca25136-adcf-41dd-b4a7-7511bc0b9d4d',NULL,NULL,NULL,NULL),('owa.started','true','DO NOT MODIFY. true/false whether or not the owa module has been started. This is used to make sure modules that were running prior to a restart are started again','1578919e-83e6-4f3c-b948-d371f8112d4d',NULL,NULL,NULL,NULL),('patient.defaultPatientIdentifierValidator','org.openmrs.patient.impl.LuhnIdentifierValidator','This property sets the default patient identifier validator. The default validator is only used in a handful of (mostly legacy) instances. For example, it\'s used to generate the isValidCheckDigit calculated column and to append the string \"(default)\" to the name of the default validator on the editPatientIdentifierType form.','2fd23ac4-60f6-4ae3-9508-9c3f15d77e09',NULL,NULL,NULL,NULL),('patient.headerAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that will be shown on the patient dashboard','6c1c3e59-8576-43f2-9799-ed92752d8555',NULL,NULL,NULL,NULL),('patient.identifierPrefix',NULL,'This property is only used if patient.identifierRegex is empty. The string here is prepended to the sql indentifier search string. The sql becomes \"... where identifier like \'\';\". Typically this value is either a percent sign (%) or empty.','6b578bf3-507c-43ed-b0aa-9ccd47a261b4',NULL,NULL,NULL,NULL),('patient.identifierRegex',NULL,'WARNING: Using this search property can cause a drop in mysql performance with large patient sets. A MySQL regular expression for the patient identifier search strings. The @SEARCH@ string is replaced at runtime with the user\'s search string. An empty regex will cause a simply \'like\' sql search to be used. Example: ^0*@SEARCH@([A-Z]+-[0-9])?$','3b223d05-8864-4ef6-9ca9-212483a9645d',NULL,NULL,NULL,NULL),('patient.identifierSearchPattern',NULL,'If this is empty, the regex or suffix/prefix search is used. Comma separated list of identifiers to check. Allows for faster searching of multiple options rather than the slow regex. e.g. @SEARCH@,0@SEARCH@,@SEARCH-1@-@CHECKDIGIT@,0@SEARCH-1@-@CHECKDIGIT@ would turn a request for \"4127\" into a search for \"in (\'4127\',\'04127\',\'412-7\',\'0412-7\')\"','98307f49-4ff2-4380-8e5e-d92794bdf4cd',NULL,NULL,NULL,NULL),('patient.identifierSuffix',NULL,'This property is only used if patient.identifierRegex is empty. The string here is prepended to the sql indentifier search string. The sql becomes \"... where identifier like \'\';\". Typically this value is either a percent sign (%) or empty.','1ff0ff33-44c3-41b2-9111-6b7d336b1581',NULL,NULL,NULL,NULL),('patient.listingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for patients in _lists_','b6603753-e0cd-45c8-9d78-e61b49a7efdd',NULL,NULL,NULL,NULL),('patient.nameValidationRegex',NULL,'Names of the patients must pass this regex. Eg : ^[a-zA-Z \\-]+$ contains only english alphabet letters, spaces, and hyphens. A value of .* or the empty string means no validation is done.','17584323-1830-4059-a6ae-7aa8a34d9e50',NULL,NULL,NULL,NULL),('patient.viewingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for patients when _viewing individually_','1fad0bd5-8990-45a0-b1ea-b473672c4142',NULL,NULL,NULL,NULL),('patientflags.database_version','1.2.10','DO NOT MODIFY. Current database version number for the patientflags module.','00af39a7-fcdb-4ca8-b7cf-55f2bfc3241d',NULL,NULL,NULL,NULL),('patientflags.mandatory','false','true/false whether or not the patientflags module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','e419103c-e090-48be-8796-7a06e753d77d',NULL,NULL,NULL,NULL),('patientflags.patientHeaderDisplay','true','DO NOT MODIFY HERE: use \"manage flag global properties\" to modify; true/false whether or not to display flags in the Patient Dashboard overview','a323ea93-bb0b-46b8-9b0e-f1676aee94dc',NULL,NULL,NULL,NULL),('patientflags.patientOverviewDisplay','true','DO NOT MODIFY HERE: use \"manage flag global properties\" to modify; true/false whether or not to display flags in the Patient Dashboard header','3b96abdd-136b-48e3-94af-785e628d8935',NULL,NULL,NULL,NULL),('patientflags.started','true','DO NOT MODIFY. true/false whether or not the patientflags module has been started. This is used to make sure modules that were running prior to a restart are started again','d876bbc6-1ebb-48a1-bc50-2367a0e3eccc',NULL,NULL,NULL,NULL),('patientflags.username','scheduler','DO NOT MODIFY HERE: user \"manage flag global properties\" to modify; Username for the OpenMRS user that will evaluate Groovy flags','c02e3d03-b072-49cc-a415-f28c47312978',NULL,NULL,NULL,NULL),('patientIdentifierTypes.locked','false','Set to a value of true if you do not want allow editing patient identifier types, else set to false.','15f0de53-19ae-442a-8180-67e9b0e6fdd5',NULL,NULL,NULL,NULL),('patientSearch.matchMode','START','Specifies how patient names are matched while searching patient. Valid values are \'ANYWHERE\' or \'START\'. Defaults to start if missing or invalid value is present.','1d59658c-6421-4e40-aba8-246e843a78fd',NULL,NULL,NULL,NULL),('patient_identifier.importantTypes',NULL,'A comma delimited list of PatientIdentifier names : PatientIdentifier locations that will be displayed on the patient dashboard. E.g.: TRACnet ID:Rwanda,ELDID:Kenya','f7169262-2dee-4e33-b344-8ce24e9e57c9',NULL,NULL,NULL,NULL),('person.attributeSearchMatchMode','EXACT','Specifies how person attributes are matched while searching person. Valid values are \'ANYWHERE\' or \'EXACT\'. Defaults to exact if missing or invalid value is present.','fd71b326-c641-4b61-8f63-4ce281aa9c25',NULL,NULL,NULL,NULL),('person.searchMaxResults','1000','The maximum number of results returned by patient searches','be882758-29f6-40ae-8755-45312ec9a976',NULL,NULL,NULL,NULL),('personAttributeTypes.locked','false','Set to a value of true if you do not want allow editing person attribute types, else set to false.','57fd246c-6984-4be8-91fb-2581f9119293',NULL,NULL,NULL,NULL),('provider.unknownProviderUuid','f9badd80-ab76-11e2-9e96-0800200c9a66','Specifies the uuid of the Unknown Provider account','4e279829-14bf-4516-a3eb-1d0206f4683b',NULL,NULL,NULL,NULL),('providermanagement.addressWidget','personAddress','Address widget to use throughout the module','a2eac209-382b-4bb5-b731-62cb14e6c79b',NULL,NULL,NULL,NULL),('providermanagement.advancedSearchPersonAttributeType',NULL,'Person attribute type, specified by uuid, to use as a search field on the advanced search page','d31a8634-2f14-41fd-993a-7615ea3b6b1c',NULL,NULL,NULL,NULL),('providermanagement.database_version','1.0','DO NOT MODIFY. Current database version number for the providermanagement module.','b3ff9505-5faa-4095-879a-a4ed690ff1b2',NULL,NULL,NULL,NULL),('providermanagement.historicalPatientListDisplayFields','Identifier:patient.patientIdentifier.identifier|Given Name:patient.personName.givenName|Family Name:patient.personName.familyName|Age:patient.age|Gender:patient.gender|Start Date:relationship.startDate|End Date:relationship.endDate','Fields to display in the historical patient lists; specified as a pipe-delimited list of label/field pairs','9250c0e1-cb52-47dc-8656-8fa20c013b72',NULL,NULL,NULL,NULL),('providermanagement.historicalProviderListDisplayFields','Identifier:provider.identifier|Given Name:provider.person.personName.givenName|Family Name:provider.person.personName.familyName|Role:provider.providerRole|Gender:provider.person.gender|Start Date:relationship.startDate|End Date:relationship.endDate','Fields to display in the historical provider lists; specified as a pipe-delimited list of label/field pairs','85ceee9c-74ca-4c8b-a69d-350740c9dce3',NULL,NULL,NULL,NULL),('providermanagement.mandatory','false','true/false whether or not the providermanagement module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','3bd8e1fa-0255-4381-a268-9e537a65a423',NULL,NULL,NULL,NULL),('providermanagement.patientListDisplayFields','Identifier:patient.patientIdentifier.identifier|Given Name:patient.personName.givenName|Family Name:patient.personName.familyName|Age:patient.age|Gender:patient.gender|Start Date:relationship.startDate','Fields to display in the patient lists; specified as a pipe-delimited list of label/field pairs','10ed00bc-31a3-4ec0-8672-15951a3c30ed',NULL,NULL,NULL,NULL),('providermanagement.patientSearchDisplayFields','Identifier:patient.patientIdentifier.identifier|Given Name:patient.personName.givenName|Family Name:patient.personName.familyName|Age:patient.age|Gender:patient.gender','Fields to display in the patient search results; specified as a pipe-delimited list of label/field pairs','f0ca8be1-4eb1-4f05-991d-b93f723660cf',NULL,NULL,NULL,NULL),('providermanagement.personAttributeTypes',NULL,'Person attributes to display on the provider dashboard; specified as a pipe-delimited list of person attribute type uuids','7bde5431-0b7b-4fe6-a44f-244e8ef472b9',NULL,NULL,NULL,NULL),('providermanagement.personSearchDisplayFields','Given Name:person.personName.givenName|Family Name:person.personName.familyName|Age:person.age|Gender:person.gender','Fields to display in the person search results; specified as a pipe-delimited list of label/field pairs','c88836ae-c450-4066-bb94-30fc51730725',NULL,NULL,NULL,NULL),('providermanagement.providerListDisplayFields','Identifier:provider.identifier|Given Name:provider.person.personName.givenName|Family Name:provider.person.personName.familyName|Role:provider.providerRole|Gender:provider.person.gender|Start Date:relationship.startDate','Fields to display in the provider lists; specified as a pipe-delimited list of label/field pairs','af0dff90-25c7-4ab6-bbb6-6864df5aead5',NULL,NULL,NULL,NULL),('providermanagement.providerSearchDisplayFields','Identifier:provider.identifier|Given Name:provider.person.personName.givenName|Family Name:provider.person.personName.familyName|Role:provider.providerRole|Gender:provider.person.gender','Fields to display in the provider search results; specified as a pipe-delimited list of label/field pairs','b218451c-2ef4-4ff7-b867-29fa21631d63',NULL,NULL,NULL,NULL),('providermanagement.restrictSearchToProvidersWithProviderRoles','false','True/false whether to restrict providers to those with roles','5edb1aa6-6dc9-49b7-b057-89825d89f881',NULL,NULL,NULL,NULL),('providermanagement.started','true','DO NOT MODIFY. true/false whether or not the providermanagement module has been started. This is used to make sure modules that were running prior to a restart are started again','ffdc6eaa-19d9-40fa-ad1c-a1029e5edb09',NULL,NULL,NULL,NULL),('providerSearch.matchMode','EXACT','Specifies how provider identifiers are matched while searching for providers. Valid values are START,EXACT, END or ANYWHERE','ff520eb6-5857-4e06-b97c-b0ae9d404d8e',NULL,NULL,NULL,NULL),('referenceapplication.mandatory','false','true/false whether or not the referenceapplication module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','51cb2b1d-8490-4c06-8d6d-e72f9057fa62',NULL,NULL,NULL,NULL),('referenceapplication.started','true','DO NOT MODIFY. true/false whether or not the referenceapplication module has been started. This is used to make sure modules that were running prior to a restart are started again','4b4de7db-8d1d-4385-aa65-430edf52e4e0',NULL,NULL,NULL,NULL),('referencedemodata.createDemoPatientsOnNextStartup','0',NULL,'aa7f67c4-6e54-48ec-84ed-f677b2a0df04',NULL,NULL,NULL,NULL),('referencedemodata.mandatory','false','true/false whether or not the referencedemodata module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','abfefcea-a894-44a2-a4f0-ba2822e0bd60',NULL,NULL,NULL,NULL),('referencedemodata.started','true','DO NOT MODIFY. true/false whether or not the referencedemodata module has been started. This is used to make sure modules that were running prior to a restart are started again','4125cff4-6fc5-4c94-8ba6-721347395d67',NULL,NULL,NULL,NULL),('referencemetadata.installedVersion','12',NULL,'9ff4f85c-2075-419d-8687-a5324e91c94a',NULL,NULL,NULL,NULL),('referencemetadata.mandatory','false','true/false whether or not the referencemetadata module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','785429cb-0916-4dcc-948e-61864306cfe1',NULL,NULL,NULL,NULL),('referencemetadata.started','true','DO NOT MODIFY. true/false whether or not the referencemetadata module has been started. This is used to make sure modules that were running prior to a restart are started again','bee222eb-d8de-4bbb-af51-8627e7766999',NULL,NULL,NULL,NULL),('registrationapp.mandatory','false','true/false whether or not the registrationapp module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','9e353a24-84d9-4d23-a0ba-b28138b0bb4a',NULL,NULL,NULL,NULL),('registrationapp.started','true','DO NOT MODIFY. true/false whether or not the registrationapp module has been started. This is used to make sure modules that were running prior to a restart are started again','82838bf5-4a21-452b-8b1c-14ea7c4043fe',NULL,NULL,NULL,NULL),('registrationcore.biometrics.implementation',NULL,'Which Biometrics engine implementation to should we connect to? Specify a Spring bean name, or leave blank to disable','49f2a619-5969-4b24-aa31-a3428d3c453b',NULL,NULL,NULL,NULL),('registrationcore.biometrics.nationalPersonIdentifierTypeUuid','5a597bcc-26ad-11e8-b467-0ed5f89f718b','Specifies UUID of the identifier type that is used to store the national biometric reference code','cd8fc610-92bf-4d59-a5e4-d4c9e7aab61e',NULL,NULL,NULL,NULL),('registrationcore.biometrics.personIdentifierTypeUuid','e26ca279-8f57-44a5-9ed8-8cc16e90e559','Specifies UUID of the identifier type that is used to store the biometric reference code','8e550acd-3baf-493f-aad4-e908c8b41f9d',NULL,NULL,NULL,NULL),('registrationcore.codePc.uuid','b7a154fd-0097-4071-ac09-af11ee7e0310','UUID of the Code PC identifier that will be generated during MPI import unless it is present.','5e7d4308-7702-40cd-8148-27d6621b8b57',NULL,NULL,NULL,NULL),('registrationcore.codeSt.uuid','d059f6d0-9e42-4760-8de1-8316b48bc5f1','UUID of the Code ST identifier that will be generated during MPI import unless it is present.','620bab1a-1fd8-472e-a690-7d04ed2bc895',NULL,NULL,NULL,NULL),('registrationcore.familyNameAutoSuggestList',NULL,'A comma separated list of common names to auto suggest for the family name field, when registering patients.','cce69412-00f0-4b7e-aef0-e4637bc7583e',NULL,NULL,NULL,NULL),('registrationcore.fastSimilarPatientSearchAlgorithm','registrationcore.BasicSimilarPatientSearchAlgorithm','Specifies a bean used for the fast similar patient search algorithm.','8b8dfca5-327e-4168-9fa2-9e8e974b7f72',NULL,NULL,NULL,NULL),('registrationcore.givenNameAutoSuggestList',NULL,'A comma separated list of common names to auto suggest for the given name field, when registering patients.','2fc32ecc-8965-4c54-955b-c99e8f1033d0',NULL,NULL,NULL,NULL),('registrationcore.identifierSourceId','1','Specifies the identifier source to use when generating patient identifiers','71c7cf48-9571-484c-a316-f2de617f353a',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.Biometrics Reference Code','5a597bcc-26ad-11e8-b467-0ed5f89f718b:2.25.300969590489438061583573695579607328089:NI',NULL,'ceff3458-38fb-4337-8951-fdeff40e72c3',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.Code National','9fb4533d-4fd5-4276-875b-2ab41597f5dd:2.25.212283553061960040061731875660599129565:PI',NULL,'060154f9-858d-4e7e-b211-53e8cc52c456',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.Code ST','d059f6d0-9e42-4760-8de1-8316b48bc5f1:2.25.276946543544871160225835991160192746993:PI',NULL,'a60ca1d0-bb7d-44ab-99f8-34fd953d7013',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.ECID','f54ed6b9-f5b9-4fd5-a588-8f7561a78401:2.16.840.1.113883.4.56:NI',NULL,'fced5bb7-0dc1-40a9-81cf-92ebb6d6086a',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.iSante ID','0e0c7cc2-3491-4675-b705-746e372ff346:2.25.36136748588937772373969278066039786242:PI',NULL,'4722ae32-0c92-444e-bd84-d902ded65739',NULL,NULL,NULL,NULL),('registrationcore.local_mpi_identifierTypeMap.iSantePlus ID','05a29f94-c0ed-11e2-94be-8c13b969e334:2.25.71280592878078638113873461180761116318:PI',NULL,'324049f6-8c07-4e6f-83e7-3a2935a83ffd',NULL,NULL,NULL,NULL),('registrationcore.mandatory','false','true/false whether or not the registrationcore module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','56719d66-2a4b-404d-82eb-dc8694767717',NULL,NULL,NULL,NULL),('registrationcore.mpi.Hl7implementation','registrationcore.mpiHl7v2HttpSender','Specifies which bean should be used to send the Hl7 Message','19789c80-2baf-47a5-82eb-1aebb20fde18',NULL,NULL,NULL,NULL),('registrationcore.mpi.implementation','registrationcore.mpi.implementation.Fhir','Which MPI to should we connect to? Specify a Spring bean name, or leave blank to disable MPI integration','e76583dc-5702-4a26-a720-a376ee821dc2',NULL,NULL,NULL,NULL),('registrationcore.mpi.password','isanteplus','Specifies password for authentication to MPI server','7fb5b791-7b0a-4839-9b82-cc11ac2ac3ad',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdq.errorHandler.implementation','outgoingmessageexceptions.PdqErrorHandlingService','Specify a Spring bean name of PDQ error handler service','08d39b95-151b-4657-9ffb-ca929de87e0a',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdqEndpoint','http://sedish.net:5001/pdq','Specifies endpoint for Hl7 PDQ Message','d981f1d8-7ba0-452e-b3db-3e3579d43935',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdqIdentifierTypeUuidList','05a29f94-c0ed-11e2-94be-8c13b969e334,f54ed6b9-f5b9-4fd5-a588-8f7561a78401,5a597bcc-26ad-11e8-b467-0ed5f89f718b,e26ca279-8f57-44a5-9ed8-8cc16e90e559,9fb4533d-4fd5-4276-875b-2ab41597f5dd,d059f6d0-9e42-4760-8de1-8316b48bc5f1',NULL,'f323a567-93b3-4f5f-9574-a00454d21776',NULL,NULL,NULL,NULL),('registrationcore.mpi.pdqPort','3600','Specifies port for Hl7 PDQ Message','565716be-b6de-4893-b526-2f574466d58e',NULL,NULL,NULL,NULL),('registrationcore.mpi.personIdentifierId',NULL,'Specifies id of identifier type which will be used for Mpi Person Id','482495d9-dc85-450d-83c5-79d088f7439d',NULL,NULL,NULL,NULL),('registrationcore.mpi.personIdentifierTypeUuid','f54ed6b9-f5b9-4fd5-a588-8f7561a78401','Specifies UUID of the identifier type that the MPI generates and is persisted in OpenMRS','e8f9141d-0754-41d6-9eca-2c3a301a9263',NULL,NULL,NULL,NULL),('registrationcore.mpi.pix.errorHandler.implementation','outgoingmessageexceptions.PixErrorHandlingService','Specify a Spring bean name of PIX error handler service','1157126a-d3e9-4264-b580-2910ac88a872',NULL,NULL,NULL,NULL),('registrationcore.mpi.pixEndpoint','http://sedish.net:5001/pix','Specifies the endpoint for the Hl7 PIX Message','e2ea0bda-f432-43ab-9d41-0db921bcd74f',NULL,NULL,NULL,NULL),('registrationcore.mpi.pixIdentifierTypeUuidList','05a29f94-c0ed-11e2-94be-8c13b969e334,f54ed6b9-f5b9-4fd5-a588-8f7561a78401,5a597bcc-26ad-11e8-b467-0ed5f89f718b,e26ca279-8f57-44a5-9ed8-8cc16e90e559,9fb4533d-4fd5-4276-875b-2ab41597f5dd,d059f6d0-9e42-4760-8de1-8316b48bc5f1','Specifies the list of identifiers to send in a PIX query to save the patient in the MPI. Takes a list of UUID of patient identifier types - separate them with commas.','0686b37a-72b0-42df-a1ea-7124c0490b5a',NULL,NULL,NULL,NULL),('registrationcore.mpi.pixPort','3700','Specifies port for Hl7 PIX Message','2ef28640-5ec4-43da-8820-cea4affe01e9',NULL,NULL,NULL,NULL),('registrationcore.mpi.receivingApplication','SEDISH Demo MPI','Specifies the receiving application in the MSH header section of the HL7 message','d68988a1-2c06-4c13-ad7c-4cd0219d9e8a',NULL,NULL,NULL,NULL),('registrationcore.mpi.receivingFacility','OpenEMPI Demo','Specifies sending Facility in the MSH header section of the HL7 message','3dedbf34-2196-47a0-b439-50f2d23849d5',NULL,NULL,NULL,NULL),('registrationcore.mpi.reg.encounter.uuid','873f968a-73a8-4f9c-ac78-9f4778b751b6','UUID of the registration encounter type.','2f021105-cd43-413a-ba1b-97eca451201a',NULL,NULL,NULL,NULL),('registrationcore.mpi.sendingApplication','isanteplus','Specifies the sending application in the MSH header section of the HL7 message','614a6f55-f05c-4382-8df5-2c2cf9b684f5',NULL,NULL,NULL,NULL),('registrationcore.mpi.sendingFacility','Demo','Specifies sending Facility in the MSH header section of the HL7 message','3df1eca4-1b02-4045-a27a-e86c708d6a14',NULL,NULL,NULL,NULL),('registrationcore.mpi.url',NULL,'Specifies url to MPI server','94fbf926-a171-418e-a9f0-aac810405e89',NULL,NULL,NULL,NULL),('registrationcore.mpi.username','pixc','Specifies username for authentication to MPI server','b0ce1052-65d7-433f-ac54-012eb5ef952f',NULL,NULL,NULL,NULL),('registrationcore.openempi.enableProbabilisticMatching','false','Specifies if probably matching should be used','9d035f4e-808e-4833-9ffc-bd7c4e0aa605',NULL,NULL,NULL,NULL),('registrationcore.openempi.globalIdentifierDomainId',NULL,'Specifies main identifier on MPI server (e.g. \"xyz\" for OpenEMPI)','be777d39-cb2c-4d58-92e8-65e78738a7a3',NULL,NULL,NULL,NULL),('registrationcore.openmrsIdenitfier.uuid','05a29f94-c0ed-11e2-94be-8c13b969e334','UUID of the OpenMRS identifier that will be generated during MPI import unless it is present.','a455468b-5ef7-4f49-834b-54bd4bd97aeb',NULL,NULL,NULL,NULL),('registrationcore.patientNameSearch','registrationcore.BasicPatientNameSearch',NULL,'f3934af8-aeae-45b3-9176-7f2cd0920dc4',NULL,NULL,NULL,NULL),('registrationcore.preciseSimilarPatientSearchAlgorithm','registrationcore.BasicExactPatientSearchAlgorithm','Specifies a bean used for the precise similar patient search algorithm.','a72193f5-1373-4542-8216-6f6e11fe9d26',NULL,NULL,NULL,NULL),('registrationcore.started','true','DO NOT MODIFY. true/false whether or not the registrationcore module has been started. This is used to make sure modules that were running prior to a restart are started again','7faab2d0-e5f0-44f3-b98f-60b594299ae9',NULL,NULL,NULL,NULL),('report.deleteReportsAgeInHours','72','Reports that are not explicitly saved are deleted automatically when they are this many hours old. (Values less than or equal to zero means do not delete automatically)','2392ad57-4567-4cbc-82b2-affffd15bab7',NULL,NULL,NULL,NULL),('report.xmlMacros',NULL,'Macros that will be applied to Report Schema XMLs when they are interpreted. This should be java.util.properties format.','dc59defa-9dd1-4232-90ae-0e577f1fd61f',NULL,NULL,NULL,NULL),('reporting.dataEvaluationBatchSize','-1','This determines whether to run evaluators for Data in batches and what the size of those batches should be.\nA value of less than or equal to 0 indicates that no batching is desired.','4906937a-b4ba-436d-8f4f-f37ce634f463',NULL,NULL,NULL,NULL),('reporting.defaultDateFormat','dd/MMM/yyyy','Default date format to use when formatting report data','87478bcc-c8f8-4ca3-a5ae-60884813cc1a',NULL,NULL,NULL,NULL),('reporting.defaultLocale','en','Default locale to use when formatting report data','6974a1c2-941c-4f44-9fa5-3bbce019eec4',NULL,NULL,NULL,NULL),('reporting.evaluationLoggerEnabled','false','If false, will disable the built in use of the evaluation logger to log evaluation information for performance diagnostics','0a90b73c-c413-4ab5-9b8f-19e7f4912d5d',NULL,NULL,NULL,NULL),('reporting.includeDataExportsAsDataSetDefinitions','false','If reportingcompatibility is installed, this indicates whether data exports should be exposed as Dataset Definitions','d974faa9-7b3a-4ed1-8ba1-869965df4586',NULL,NULL,NULL,NULL),('reporting.mandatory','false','true/false whether or not the reporting module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','66e2b6d2-c886-4461-bf67-cce377290def',NULL,NULL,NULL,NULL),('reporting.maxCachedReports','10','The maximum number of reports whose underlying data and output should be kept in the cache at any one time','3337c65a-929d-4596-b3d3-ff42bf27081f',NULL,NULL,NULL,NULL),('reporting.maxReportsToRun','1','The maximum number of reports that should be processed at any one time','8fdbe441-ed4c-4f44-9e15-38c4813f23c1',NULL,NULL,NULL,NULL),('reporting.preferredIdentifierTypes',NULL,'Pipe-separated list of patient identifier type names, which should be displayed on default patient datasets','37823fdd-e9c3-43f0-aecf-743acaa624ea',NULL,NULL,NULL,NULL),('reporting.runReportCohortFilterMode','showIfNull','Supports the values hide,showIfNull,show which determine whether the cohort selector should be available in the run report page','89ac2f87-4f6e-483c-8b1b-00d10a49e81b',NULL,NULL,NULL,NULL),('reporting.started','true','DO NOT MODIFY. true/false whether or not the reporting module has been started. This is used to make sure modules that were running prior to a restart are started again','6702f641-051a-4c3f-83d7-b0ee6f074ea6',NULL,NULL,NULL,NULL),('reporting.testPatientsCohortDefinition',NULL,'Points to a cohort definition representing all test/fake patients that you want to exclude from all queries and reports. You may set this to the UUID of a saved cohort definition, or to \"library:keyInADefinitionLibrary\"','59321097-8d06-4a65-b3d0-b296cd5cb3b0',NULL,NULL,NULL,NULL),('reportingcompatibility.data_export_batch_size','7500','The number of patients to export at a time in a data export. The larger this number the faster and more memory that is used. The smaller this number the slower and less memory is used.','9891198c-ad38-4154-b7f9-3c408d7dbedf',NULL,NULL,NULL,NULL),('reportingcompatibility.mandatory','false','true/false whether or not the reportingcompatibility module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','6656e7ac-811e-448e-8eb4-36ac29c15e50',NULL,NULL,NULL,NULL),('reportingcompatibility.patientLinkUrl','patientDashboard.form','The link url for a particular patient to view from the cohort builder','c013335d-e616-464d-8e99-7c6d2617afee',NULL,NULL,NULL,NULL),('reportingcompatibility.started','true','DO NOT MODIFY. true/false whether or not the reportingcompatibility module has been started. This is used to make sure modules that were running prior to a restart are started again','1b8fcdf0-b560-4b53-9470-a5a4f3c8326d',NULL,NULL,NULL,NULL),('reportingrest.mandatory','false','true/false whether or not the reportingrest module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','155880ae-89f2-428f-b013-bd7ab417a8d5',NULL,NULL,NULL,NULL),('reportingrest.started','true','DO NOT MODIFY. true/false whether or not the reportingrest module has been started. This is used to make sure modules that were running prior to a restart are started again','e7a8211c-fd67-4170-817a-3d5e1008f766',NULL,NULL,NULL,NULL),('reportingui.mandatory','false','true/false whether or not the reportingui module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','e1f2c5c5-b7d8-49dd-8685-16db702124bd',NULL,NULL,NULL,NULL),('reportingui.started','true','DO NOT MODIFY. true/false whether or not the reportingui module has been started. This is used to make sure modules that were running prior to a restart are started again','ffd3eda3-483d-4292-a18a-ecc6a5dd96de',NULL,NULL,NULL,NULL),('reportProblem.url','http://errors.openmrs.org/scrap','The openmrs url where to submit bug reports','9d004ee7-31dc-4a39-a32e-9ce497f53f01',NULL,NULL,NULL,NULL),('reports.moduleVersion','1.1-SNAPSHOT',NULL,'0b1f0155-ca78-4a61-a4ae-3bff6bfcb27e',NULL,NULL,NULL,NULL),('santedb-mpiclient.mandatory','false','true/false whether or not the santedb-mpiclient module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','ad258897-b5bb-42e9-8a79-61739096dc68',NULL,NULL,NULL,NULL),('santedb-mpiclient.started','true','DO NOT MODIFY. true/false whether or not the santedb-mpiclient module has been started. This is used to make sure modules that were running prior to a restart are started again','2100de20-61f1-4e68-8da0-d57df6b451f4',NULL,NULL,NULL,NULL),('scheduler.password','Scheduler123','Password for the OpenMRS user that will perform the scheduler activities','05c6367e-64cb-47e9-82d3-f9209bb18ede',NULL,NULL,NULL,NULL),('scheduler.username','scheduler','Username for the OpenMRS user that will perform the scheduler activities','3cd95dc8-7d76-4267-a8be-6e14387461d3',NULL,NULL,NULL,NULL),('search.caseSensitiveDatabaseStringComparison','false','Indicates whether database string comparison is case sensitive or not. Setting this to false for MySQL with a case insensitive collation improves search performance.','63d90362-4500-4380-9507-fbb878014656',NULL,NULL,NULL,NULL),('search.indexVersion','3','Indicates the index version. If it is blank, the index needs to be rebuilt.','434ffa85-f60a-406b-9889-c8fbc237c0ff',NULL,NULL,NULL,NULL),('searchWidget.batchSize','200','The maximum number of search results that are returned by an ajax call','d5ae5616-4e21-4bc9-8722-d531da74a1b4',NULL,NULL,NULL,NULL),('searchWidget.dateDisplayFormat',NULL,'Date display format to be used to display the date somewhere in the UI i.e the search widgets and autocompletes','4b7f258a-2fc5-4327-aa74-1be7229661e2',NULL,NULL,NULL,NULL),('searchWidget.maximumResults','2000','Specifies the maximum number of results to return from a single search in the search widgets','26c56604-cf39-42b2-8be3-269ced77b8a8',NULL,NULL,NULL,NULL),('searchWidget.runInSerialMode','false','Specifies whether the search widgets should make ajax requests in serial or parallel order, a value of true is appropriate for implementations running on a slow network connection and vice versa','1938204f-b352-4b63-b398-b0d3afb69035','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('searchWidget.searchDelayInterval','400','Specifies time interval in milliseconds when searching, between keyboard keyup event and triggering the search off, should be higher if most users are slow when typing so as to minimise the load on the server','91ac48d0-37e4-4749-bcfc-e824e56a623c',NULL,NULL,NULL,NULL),('security.allowedFailedLoginsBeforeLockout','7','Maximum number of failed logins allowed after which username is locked out','1b285bad-36f6-4c81-aa6f-12a0470ab71f',NULL,NULL,NULL,NULL),('security.passwordCannotMatchUsername','true','Configure whether passwords must not match user\'s username or system id','76cfa33c-7dc7-47b3-a94a-81fc48f4e381','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('security.passwordCustomRegex',NULL,'Configure a custom regular expression that a password must match','82813b08-93f5-47fd-b692-ed13bd14649a',NULL,NULL,NULL,NULL),('security.passwordMinimumLength','8','Configure the minimum length required of all passwords','881dabb8-7771-42d9-811e-8522bace053c',NULL,NULL,NULL,NULL),('security.passwordRequiresDigit','true','Configure whether passwords must contain at least one digit','7c8d4bed-ce26-4d94-9a92-057421faa075','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('security.passwordRequiresNonDigit','true','Configure whether passwords must contain at least one non-digit','3159818d-bbaa-44d7-8d0d-2ab0dc4d096c','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('security.passwordRequiresUpperAndLowerCase','true','Configure whether passwords must contain both upper and lower case characters','21b14091-c640-41d4-8a6f-a8517884c0cc','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('serialization.xstream.mandatory','false','true/false whether or not the serialization.xstream module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','c1ffbfaf-1efe-4ab8-96f3-6d2f12ad0eb1',NULL,NULL,NULL,NULL),('serialization.xstream.started','true','DO NOT MODIFY. true/false whether or not the serialization.xstream module has been started. This is used to make sure modules that were running prior to a restart are started again','1d5bbb2c-255d-4b83-b67d-3bfa2b822b9b',NULL,NULL,NULL,NULL),('uicommons.mandatory','false','true/false whether or not the uicommons module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','efc24967-a9da-4e4d-975e-161cde921b49',NULL,NULL,NULL,NULL),('uicommons.started','true','DO NOT MODIFY. true/false whether or not the uicommons module has been started. This is used to make sure modules that were running prior to a restart are started again','78ba2c24-0ab8-47d9-8064-7f638d42804e',NULL,NULL,NULL,NULL),('uiframework.formatter.dateAndTimeFormat','dd.MMM.yyyy, HH:mm:ss','Format used by UiUtils.format for dates that have a time component','19ff170d-59bf-440b-ae88-216d6b0b7b7a',NULL,NULL,NULL,NULL),('uiframework.formatter.dateFormat','dd.MMM.yyyy','Format used by UiUtils.format for dates that do not have a time component','0e478c4f-09d1-492d-bf5b-6b64e03c8699',NULL,NULL,NULL,NULL),('uiframework.mandatory','false','true/false whether or not the uiframework module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','96eabc0d-646e-4bb7-8272-dd1126d90208',NULL,NULL,NULL,NULL),('uiframework.started','true','DO NOT MODIFY. true/false whether or not the uiframework module has been started. This is used to make sure modules that were running prior to a restart are started again','b52a1755-76a7-4438-936b-ff21615f52da',NULL,NULL,NULL,NULL),('uilibrary.mandatory','false','true/false whether or not the uilibrary module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','d4b5fc14-b53e-4360-ab45-36ce3e17ed21',NULL,NULL,NULL,NULL),('uilibrary.started','true','DO NOT MODIFY. true/false whether or not the uilibrary module has been started. This is used to make sure modules that were running prior to a restart are started again','84146ffc-f4ee-4bc7-b4bd-e565e38b845c',NULL,NULL,NULL,NULL),('user.headerAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that will be shown on the user dashboard. (not used in v1.5)','d0fecc90-8778-49db-9b4e-91904de31d23',NULL,NULL,NULL,NULL),('user.listingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for users in _lists_','63245d29-3cef-479d-9d73-f05b3da47a2f',NULL,NULL,NULL,NULL),('user.requireEmailAsUsername','false','Indicates whether a username must be a valid e-mail or not.','540381e5-3afa-45ad-8c2a-0ff633144bcb','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('user.viewingAttributeTypes',NULL,'A comma delimited list of PersonAttributeType names that should be displayed for users when _viewing individually_','227c8088-9abb-4733-b7ad-3c22aead471c',NULL,NULL,NULL,NULL),('use_patient_attribute.healthCenter','false','Indicates whether or not the \'health center\' attribute is shown when viewing/searching for patients','9927c961-e6b9-40d9-9336-6fcfa0c6c86a','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('use_patient_attribute.mothersName','false','Indicates whether or not mother\'s name is able to be added/viewed for a patient','c45dcb53-fc73-4cbf-9ec7-08d74f86d539','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('validation.disable','false','Disables validation of OpenMRS Objects. Only takes affect on next restart. Warning: only do this is you know what you are doing!','e6dcbb41-5510-4d77-b929-a3e13f14b82c',NULL,NULL,NULL,NULL),('visits.allowOverlappingVisits','true','true/false whether or not to allow visits of a given patient to overlap','36e81cc3-fa37-4d77-a428-8d5835ae9a72','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('visits.assignmentHandler','org.openmrs.module.emrapi.adt.EmrApiVisitAssignmentHandler','Set to the name of the class responsible for assigning encounters to visits.','2c62d60f-81cf-4f60-85b4-0b424c241b31',NULL,NULL,NULL,NULL),('visits.autoCloseVisitType','Facility Visit,Patient externe','comma-separated list of the visit type(s) to automatically close','58736730-6f18-4c6f-8d0e-9baf5a102f39',NULL,NULL,NULL,NULL),('visits.enabled','true','Set to true to enable the Visits feature. This will replace the \'Encounters\' tab with a \'Visits\' tab on the dashboard.','e7259c7d-94a1-4b38-a6a4-4f59e1f7e9e1','org.openmrs.customdatatype.datatype.BooleanDatatype',NULL,NULL,NULL),('visits.encounterTypeToVisitTypeMapping',NULL,'Specifies how encounter types are mapped to visit types when automatically assigning encounters to visits. e.g 1:1, 2:1, 3:2 in the format encounterTypeId:visitTypeId or encounterTypeUuid:visitTypeUuid or a combination of encounter/visit type uuids and ids e.g 1:759799ab-c9a5-435e-b671-77773ada74e4','76333113-1e10-410e-9537-595110c6ce2f',NULL,NULL,NULL,NULL),('webservices.rest.allowedips',NULL,'A comma-separate list of IP addresses that are allowed to access the web services. An empty string allows everyone to access all ws. \n IPs can be declared with bit masks e.g. 10.0.0.0/30 matches 10.0.0.0 - 10.0.0.3 and 10.0.0.0/24 matches 10.0.0.0 - 10.0.0.255.','563e56bd-390b-4030-aa38-a3d3774ae295',NULL,NULL,NULL,NULL),('webservices.rest.mandatory','false','true/false whether or not the webservices.rest module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','a63e8d1f-c209-461d-9960-e1479c4d11f8',NULL,NULL,NULL,NULL),('webservices.rest.maxResultsAbsolute','100','The absolute max results limit. If the client requests a larger number of results, then will get an error','1a1030e2-994c-480b-8031-bc9999aa0f0c',NULL,NULL,NULL,NULL),('webservices.rest.maxResultsDefault','50','The default max results limit if the user does not provide a maximum when making the web service call.','f0c96b42-f833-4dba-9d59-d66ac7e8f0bb',NULL,NULL,NULL,NULL),('webservices.rest.quietDocs','true','If the value of this setting is \"true\", then nothing is logged while the Swagger specification is being generated.','7fbc8416-4f85-4224-8a1e-bceb8a5088e6',NULL,NULL,NULL,NULL),('webservices.rest.started','true','DO NOT MODIFY. true/false whether or not the webservices.rest module has been started. This is used to make sure modules that were running prior to a restart are started again','6effbc02-a29a-460b-8683-b84aca6b30e6',NULL,NULL,NULL,NULL),('webservices.rest.uriPrefix',NULL,'The URI prefix through which clients consuming web services will connect to the web application, should be of the form http://{ipAddress}:{port}/{contextPath}','0ccc04c6-7052-40f2-b3b0-1fbdb483c0d0',NULL,NULL,NULL,NULL),('xds-sender.mandatory','false','true/false whether or not the xds-sender module MUST start when openmrs starts. This is used to make sure that mission critical modules are always running if openmrs is running.','17f6d3d8-ff94-49b8-86ee-bf64991221eb',NULL,NULL,NULL,NULL),('xds-sender.started','true','DO NOT MODIFY. true/false whether or not the xds-sender module has been started. This is used to make sure modules that were running prior to a restart are started again','1a46e568-d202-4e77-902d-afdc160f3ddb',NULL,NULL,NULL,NULL),('xdssender.ccd.errorHandler.implementation','outgoingmessageexceptions.CcdErrorHandlingService','Specify a Spring bean name of CCD error handler service','531d890b-2d7e-4fea-b31c-7d75f4cce7c4',NULL,NULL,NULL,NULL),('xdssender.ecidRoot','http://openclientregistry.org/fhir/sourceid','ECID Root','3f98635f-fe9a-44a3-b037-311181a003f7',NULL,NULL,NULL,NULL),('xdssender.encounterTypesToProcess','f037e97b-471e-4898-a07c-b8e169e0ddc4','Specifies comma separated UUIDs of encounter types that should be sent to the XDS Repository. Default value \"f037e97b-471e-4898-a07c-b8e169e0ddc4\" (Analyses de Lab encounter type)
Use \'ALL\' or leave blank to match all encounter types\"','5c98c42c-6525-4c75-b863-f154750ea748',NULL,NULL,NULL,NULL),('xdssender.exportCcd.ignoreCerts','true','Determines if ccd downloading from OpenSHR should ignore certificates','eecc3b3d-c5f1-4ecc-bfc2-64966e39151e',NULL,NULL,NULL,NULL),('xdssender.exportCcdEndpoint','https://openhim.sedish-haiti.org/SHR/fhir','Specifies the export ccd module endpoint address (OpenSHR)','032cce15-3865-4e0c-930e-858c30d33558',NULL,NULL,NULL,NULL),('xdssender.mpiEndpoint','https://openhim.sedish-haiti.org/CR/fhir','Endpoint for requests to the OpenCR MPI','1d092bd0-167a-432a-891f-c1e598be27c8',NULL,NULL,NULL,NULL),('xdssender.notificationsPullPoint.endpoint','https://openhim.sedish-haiti.org/dsub','Endpoint used to fetch Notifications from the Pull Point','72cc190e-c63e-4193-b670-36c64fa8d660',NULL,NULL,NULL,NULL),('xdssender.notificationsPullPoint.password','isanteplus.sedish-haiti.org','Password to authorize int the Notifications Pull Point','38fd37a0-d5ae-4d27-ac24-4d0095517150',NULL,NULL,NULL,NULL),('xdssender.notificationsPullPoint.username','isanteplus.sedish-haiti.org','Username to authorize int the Notifications Pull Point','238347f7-825c-47ae-bd12-143ebcadd13c',NULL,NULL,NULL,NULL),('xdssender.openmrs.moduleUsedToDetermineSoftwareVersion','isanteplusreports','Specifies the module name which will be used to determine the software version.','ab2dc3e6-751f-4280-a791-366db9af313b',NULL,NULL,NULL,NULL),('xdssender.openmrs.password','Admin123','Specifies password for authentication in OpenMRS','5c576a3c-bf90-442d-8c35-b82e9573574e',NULL,NULL,NULL,NULL),('xdssender.openmrs.provider.role.clinician',NULL,'Specifies role for add provider to XDS documents','243db3e0-0fa3-4ad8-b503-163d10518fb9',NULL,NULL,NULL,NULL),('xdssender.openmrs.provider.role.doctor',NULL,'Specifies role for add provider to XDS documents','c3997de9-ffa1-41d6-9f1e-fb5644a503a8',NULL,NULL,NULL,NULL),('xdssender.openmrs.username','admin','Specifies username for authentication in OpenMRS','7bd737a0-eb7f-401d-8950-86b8711ac1b4',NULL,NULL,NULL,NULL),('xdssender.oshr.password','OpenSHR#123','Specifies the OpenSHR password','d3e0c90e-c9a1-47b1-ad81-e0e4238990c7',NULL,NULL,NULL,NULL),('xdssender.oshr.username','isanteplus','Specifies the OpenSHR username','3a1eba1b-0885-4aff-b9a2-df602fcad48f',NULL,NULL,NULL,NULL),('xdssender.pullNotificationsTaskInterval',NULL,'Interval time (in seconds) to execute pulling notifications from Pull Point task','97351946-d56d-44c1-b79c-c953d8000a3d',NULL,NULL,NULL,NULL),('xdssender.repositoryEndpoint','https://openhim.sedish-haiti.org/xdsrepository','Specifies endpoint to XDS repository','07a7b1c4-4591-421f-9a4a-a12472092dc4',NULL,NULL,NULL,NULL),('xdssender.shrType','fhir','Type of SHR service to use','c2074671-263f-4717-bdf2-7a41f503984e',NULL,NULL,NULL,NULL),('xdssender.xdsB.errorHandler.implementation','outgoingmessageexceptions.XdsBErrorHandlingService','Specify a Spring bean name of XDS.b error handler service','4f15ed76-c9ef-44e8-be7f-c4605713b2f9',NULL,NULL,NULL,NULL),('xdssender.xdsrepository.password','isanteplus.sedish-haiti.org','Specifies password for authentication to XDS repository','04db6b44-078e-456b-96e8-06c53b767572',NULL,NULL,NULL,NULL),('xdssender.xdsrepository.username','isanteplus.sedish-haiti.org','Specifies username for authentication to XDS repository','9fdcc14a-f4c4-446f-857f-1c3388ab2b99',NULL,NULL,NULL,NULL); /*!40000 ALTER TABLE `global_property` ENABLE KEYS */; -- @@ -3383,7 +3383,7 @@ CREATE TABLE `idgen_seq_id_gen` ( `next_sequence_value` int(11) NOT NULL DEFAULT '-1', `base_character_set` varchar(255) NOT NULL, `first_identifier_base` varchar(50) NOT NULL, - `prefix` varchar(20) DEFAULT NULL, + `prefix` varchar(255) DEFAULT NULL, `suffix` varchar(20) DEFAULT NULL, `min_length` int(11) DEFAULT NULL, `max_length` int(11) DEFAULT NULL, @@ -3397,7 +3397,7 @@ CREATE TABLE `idgen_seq_id_gen` ( -- /*!40000 ALTER TABLE `idgen_seq_id_gen` DISABLE KEYS */; -INSERT INTO `idgen_seq_id_gen` VALUES (1,810021,'0123456789ACDEFGHJKLMNPRTUVWXY','10000',NULL,NULL,6,NULL); +INSERT INTO `idgen_seq_id_gen` VALUES (1,100000,'0123456789ACDEFGHJKLMNPRTUVWXY','10000',NULL,NULL,6,NULL); /*!40000 ALTER TABLE `idgen_seq_id_gen` ENABLE KEYS */; -- diff --git a/projects/isanteplus-db/initial-db/isanteplus-db.sql b/projects/isanteplus-db/initial-db/isanteplus-db.sql index 620af59e..52f4aa1c 100644 --- a/projects/isanteplus-db/initial-db/isanteplus-db.sql +++ b/projects/isanteplus-db/initial-db/isanteplus-db.sql @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:745ea83f0010fed2da20bcb294518b20eb2f9c31611e175041cb900c30831d4f -size 82058034 +oid sha256:9b1c6909c5a9057592ff994588254ce930de6fe6a745226d8d388be3764d4a03 +size 82058583