{"id":49311832,"url":"https://github.com/drpedapati/easy-double-entry","last_synced_at":"2026-04-26T13:04:43.658Z","repository":{"id":343535421,"uuid":"1177454507","full_name":"drpedapati/easy-double-entry","owner":"drpedapati","description":"REDCap External Module for simplified double data entry using repeating instances","archived":false,"fork":false,"pushed_at":"2026-03-24T05:37:37.000Z","size":4423,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-24T18:55:43.541Z","etag":null,"topics":["data-quality","double-data-entry","php","redcap","redcap-external-module"],"latest_commit_sha":null,"homepage":"https://report.cincibrainlab.com/ede-tutorial/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/drpedapati.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-10T03:22:41.000Z","updated_at":"2026-03-24T05:37:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/drpedapati/easy-double-entry","commit_stats":null,"previous_names":["drpedapati/easy-double-entry"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/drpedapati/easy-double-entry","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drpedapati%2Feasy-double-entry","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drpedapati%2Feasy-double-entry/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drpedapati%2Feasy-double-entry/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drpedapati%2Feasy-double-entry/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/drpedapati","download_url":"https://codeload.github.com/drpedapati/easy-double-entry/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drpedapati%2Feasy-double-entry/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32297940,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T09:34:17.070Z","status":"ssl_error","status_checked_at":"2026-04-26T09:34:00.993Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-quality","double-data-entry","php","redcap","redcap-external-module"],"created_at":"2026-04-26T13:04:36.912Z","updated_at":"2026-04-26T13:04:43.645Z","avatar_url":"https://github.com/drpedapati.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Easy Double Entry for REDCap\n\nA REDCap External Module that provides double data entry verification without the complexity of REDCap's built-in DDE system. No duplicate records, no `--1`/`--2` suffixes, no special user roles.\n\n![DDE Dashboard](docs/images/tut-01-dashboard.png)\n\n## Installation\n\nNo special server permissions required — just standard REDCap admin access.\n\n### Requirements\n\n- REDCap 13.0+ with PHP 8.0+\n- REDCap admin access (Control Center) to install the module\n\n### Steps\n\n1. **Download** — clone or download this repo\n2. **Copy to server** — place the folder in your REDCap `modules/` directory as `easy_double_entry_v1.0/`\n3. **Enable server-wide** — go to **Control Center \u003e External Modules** and enable Easy Double Entry\n4. **Enable on your project** — go to your project \u003e **External Modules** \u003e enable the module\n5. **Configure instruments** — in module settings, choose which instruments need double data entry and optionally list fields to exclude from comparison\n6. **Enable repeating** — in **Project Setup \u003e Repeating Instruments**, enable repeating for those same instruments\n7. **Done** — open the **DDE Dashboard** from the project sidebar\n\n\u003e **Only the instruments you select become repeating.** All other instruments (demographics, scheduling, consent, etc.) remain normal single-entry forms and are completely unaffected. No automation is re-triggered, no scheduling forms need to be re-entered.\n\n## How It Works\n\n### Easy Double Entry vs. REDCap's Built-in DDE\n\n| | Built-in DDE | Easy Double Entry |\n|---|---|---|\n| **Record structure** | Duplicates the entire record (`101--1`, `101--2`) | Single record, repeating instances on selected instruments only |\n| **Which instruments** | All instruments are duplicated — every form must be entered twice | You choose which instruments need DDE; everything else is entered once |\n| **Which fields** | Every field is compared | You choose — optionally skip clinician-scored or validity fields |\n| **Scheduling/intake forms** | Second entry person must re-enter scheduling, demographics, consent — re-triggering ASIs, alerts, and automation | Non-DDE instruments are untouched; no automation is re-triggered |\n| **User assignments** | Each record copy is locked to a specific user role; admin must reassign when staff rotate | Any authorized user can enter any round — no role assignments needed |\n| **Comparison** | Built-in side-by-side comparison tool | Built-in comparison with one-click merge and custom value entry |\n| **Data exports** | Two separate records per participant; must merge `--1`/`--2` rows in analysis | One record per participant; filter to the merge target instance for clean data |\n| **Admin overhead** | High — role management, permission changes for staff turnover | Low — enable module, pick instruments, done |\n\n### This Module's Approach\n\nEasy Double Entry works within a single record using repeating instances on only the instruments you choose:\n\n| Instance | Purpose |\n|----------|---------|\n| **Instance 1** | Round 1 — first data entry pass |\n| **Instance 2** | Round 2 — independent second pass |\n| **Instance 3** | Final merged record (verified data) |\n\n**Key point:** A record can have a mix of regular instruments (entered once) and DDE instruments (entered via instances). Your scheduling form, demographics, consent — anything not selected for DDE — works exactly as before.\n\n### Typical Workflow\n\n1. **Staff A** opens Record 101 \u003e \"Cognitive Exam\" \u003e Instance 1 \u003e enters data\n2. **Staff B** opens Record 101 \u003e \"Cognitive Exam\" \u003e Instance 2 \u003e enters data independently\n3. **Reviewer** opens the DDE Comparison page \u003e compares field-by-field \u003e resolves discrepancies \u003e merges to Instance 3\n4. Instance 3 now contains the verified, final data\n\nMeanwhile, Record 101's scheduling form, demographics, and any other non-DDE instruments were entered once, normally, with no repeating instances involved.\n\n## Data Export \u0026 Analysis\n\nSince DDE instruments use repeating instances, your data exports will include `redcap_repeat_instrument` and `redcap_repeat_instance` columns for those instruments. Here's how to get clean data:\n\n### Getting Only Final (Verified) Data\n\nThe merge target instance depends on your module settings:\n\n| Merge Target Setting | Final data lives in | Filter to |\n|---------------------|--------------------|-----------|\n| **Instance 3** (default) | Instance 3 | `redcap_repeat_instance = 3` |\n| **Instance 1** (overwrite Round 1) | Instance 1 | `redcap_repeat_instance = 1` |\n\nCheck your module settings to confirm which mode you're using, then apply the appropriate filter.\n\n**REDCap Reports:** Add a filter where `[redcap_repeat_instance]` equals your merge target instance.\n\n**API Exports (R, Python, etc.):**\n```r\n# R — default merge target (Instance 3)\nfinal_instance \u003c- 3  # change to 1 if merge target = \"Overwrite Round 1\"\nclean \u003c- data %\u003e% filter(redcap_repeat_instance == final_instance | is.na(redcap_repeat_instance))\n```\n```python\n# Python — default merge target (Instance 3)\nfinal_instance = 3  # change to 1 if merge target = \"Overwrite Round 1\"\nclean = df[(df['redcap_repeat_instance'] == final_instance) | (df['redcap_repeat_instance'].isna())]\n```\n\nThe `is.na()` / `isna()` clause keeps rows from non-repeating instruments (which have no instance number).\n\n### What Each Instance Means (Default: Merge to Instance 3)\n\n| Instance | What it contains | Keep for analysis? |\n|----------|-----------------|-------------------|\n| 1 | Round 1 raw entry | No (audit trail only) |\n| 2 | Round 2 raw entry | No (audit trail only) |\n| 3 | Final merged/verified data | **Yes** |\n\n\u003e If your merge target is set to \"Overwrite Round 1\", Instance 1 contains the final data and Instance 2 is the audit trail. There is no Instance 3 in that mode.\n\n### Non-DDE Instruments\n\nInstruments not selected for DDE have no `redcap_repeat_instance` value — they export exactly as they always have. No filtering needed.\n\n## Module Pages\n\nThe module adds three pages to your REDCap project sidebar:\n\n### DDE Dashboard\n\nProject-wide overview showing every record with color-coded instrument badges and overall DDE status (Pending, Partial, Ready to Compare, Merged).\n\n![DDE Dashboard](docs/images/tut-01-dashboard.png)\n\n### DDE Task List\n\nPrioritized action items — records ready for comparison appear at the top, followed by instruments still awaiting data entry. Each task links directly to either the data entry form or the comparison page.\n\n![DDE Task List](docs/images/tut-02-tasklist.png)\n\n### DDE Comparison \u0026 Merge\n\nSide-by-side field comparison with match/discrepancy detection:\n\n![Comparison View](docs/images/tut-04b-comparison-full.png)\n\n**Discrepancy filtering** — click \"Show Discrepancies Only\" to focus on fields that need attention. Toggling back to \"Show All Fields\" preserves any fields you've already merged:\n\n![Discrepancies Only](docs/images/tut-05-discrepancies-only.png)\n\n**Resolving discrepancies** — click Keep R1 or Keep R2 to accept a value, or use the edit button to enter a custom merged value. Resolved fields turn blue:\n\n![Resolving Discrepancies](docs/images/tut-07-resolve-clinician.png)\n\n**All resolved** — every field shows either Match (green) or Merged (blue):\n\n![All Resolved](docs/images/tut-08-all-resolved.png)\n\nAfter merge, Instance 3 contains the verified data alongside the two original entries:\n\n![Merged Record](docs/images/tut-09-record-merged.png)\n\n## Settings\n\nConfigure the module from **External Modules \u003e Manage \u003e Configure**.\n\n### Which instruments need double data entry?\n\nAdd each instrument that requires DDE. For each instrument, you can optionally list variable names to skip during comparison (e.g., clinician-only validity items that don't need double entry).\n\n| Field | Description |\n|-------|-------------|\n| **Instrument** | Select from the project's form list |\n| **Skip these variables** | Comma-separated variable names to exclude from comparison (leave blank to compare all fields) |\n\n### Who sees which instruments on the dashboard?\n\nOptional. Use filter rules to show different instruments for different participants based on a field value. Leave blank to show all instruments for everyone.\n\n| Field | Description |\n|-------|-------------|\n| **When this field** | A project variable to check (e.g., `cohort`, `age_group`) |\n| **equals this value** | The value to match (e.g., `asd`, `child`) |\n| **then show these instruments** | Comma-separated form names, or `all` |\n\n### Merge settings\n\n| Setting | Description |\n|---------|-------------|\n| **Where should merged values be saved?** | Overwrite Round 1 (Instance 1) or Save to a new Final instance (Instance 3, default) |\n| **Require a comment when resolving discrepancies** | Forces a comment on each merge for audit trail |\n| **Send email when both rounds are complete** | Email address for notification (leave blank to disable) |\n\n## Compatibility\n\n- REDCap 13.0+, PHP 8.0+, Framework Version 14\n- Works with: classic projects, longitudinal, repeating instruments, DAGs\n- Upgrade-safe: no core modifications, pure External Module\n\n## FAQ\n\n**Q: Will this mess up my existing data exports?**\nA: Only DDE-enabled instruments get repeating instances. Filter to Instance 3 for clean verified data. All other instruments export exactly as before.\n\n**Q: Does the second data entry person need to fill out our scheduling/intake forms again?**\nA: No. Only the instruments you select for DDE use repeating instances. Scheduling, demographics, consent, and any other forms are entered once, normally.\n\n**Q: Can I skip certain fields from comparison (e.g., clinician validity questions)?**\nA: Yes. In the module configuration, each instrument has an optional \"Skip these variables\" field. List the variable names (comma-separated) and they will be excluded from the comparison table entirely.\n\n**Q: Can I use this on a longitudinal project?**\nA: Yes. The module tracks event IDs and works across multiple arms/events.\n\n**Q: What permissions do users need?**\nA: Standard REDCap \"View \u0026 Edit\" or \"Edit survey responses\" rights on the instrument. No special DDE roles or user assignments required. The module checks per-instrument edit rights before allowing any merge.\n\n**Q: What happens if I disable the module later?**\nA: Your data remains in REDCap as repeating instances. Your merge target instance (Instance 3 by default, or Instance 1 if configured) still holds the verified data. You just lose the dashboard, task list, and comparison UI.\n\n**Q: What happened to the \"Auto-Merge Matching Fields\" button?**\nA: It was removed. All merges now require field-by-field review to ensure data quality. Matching fields (green rows) need no action — only discrepancies (red rows) require resolution.\n\n## File Structure\n\n```\neasy_double_entry_v1.0/\n├── EasyDoubleEntry.php      # Core module class (hooks, AJAX, comparison, merge)\n├── config.json              # Module metadata and settings schema\n├── README.md\n├── LICENSE                  # MIT\n├── pages/\n│   ├── dashboard.php        # DDE Dashboard — record status overview\n│   ├── tasklist.php         # Task List — prioritized action items\n│   └── compare.php          # Compare \u0026 Merge — side-by-side with one-click merge\n└── docs/\n    ├── tutorial.html        # Visual walkthrough (self-contained HTML)\n    └── images/              # Tutorial screenshots\n```\n\n## Tutorial\n\nA complete visual walkthrough is available at [docs/tutorial.html](docs/tutorial.html) covering the full workflow from dashboard to merged record.\n\n**Hosted version:** [https://report.cincibrainlab.com/ede-tutorial/](https://report.cincibrainlab.com/ede-tutorial/)\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n\n## Author\n\nErnest Pedapati — Cincinnati Children's Hospital Medical Center\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrpedapati%2Feasy-double-entry","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdrpedapati%2Feasy-double-entry","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrpedapati%2Feasy-double-entry/lists"}