# Projekt: Import EDC reportů do MongoDB

## Stav: rozpracováno (2026-05-20)

## Co je hotovo

### Skript `U:/janssen/medidata/edc_import.py`
- Import CSV reportů z Medidata Rave EDC do MongoDB
- Spuštění: `python edc_import.py downloads/*.csv`
- Default MongoDB: `mongodb://192.168.1.76:27017` (bez autentikace)
- Default databáze: `edc`
- Parametry: `--host`, `--db`

### Dva typy CSV souborů — skript je detekuje automaticky

**1. Data Listing reporty** (mají příponu `_DataListing.csv`)
- Sloupce: pevná metadata + Field1Value/Field1Label … Field300Value/Field300Label
- Kolekce: odvozena z názvu souboru mezi `EDC_` a `_DataListing`
  - např. `MDD3003_DateofVisit`, `MDD3003_InterimInvestigatorSignature`
- Upsert klíč: `form.recordId`
- Struktura dokumentu: `study`, `site{}`, `subject{}`, `form{}`, `fields{}`, `lastModified`, `importedAt`, `sourceFile`, `_meta{}`
- Importováno a otestováno: `MDD3003_DateofVisit` (381 záznamů)

**2. QueryDetails reporty** (mají sloupec `QueryID(ReQry)`)
- Kolekce: vždy `queries` (všechny studie dohromady)
- Upsert klíč: `queryId`
- Struktura dokumentu: `study`, `site{}`, `subject{}`, `visit`, `page`, `field`, `queryGroup`, `queryId`, `queryStatus`, `openedBy/Date`, `answeredBy/Date`, `closedBy/Date`, `daysNotYetClosed`, `daysToAnswer`, `daysToClose`, `queryText`, `answerText`, `importedAt`, `sourceFile`, `_meta{}`
- Importováno: 2091 queries (MDD3003, stav 2026-05-20)

### Daily snapshots pro queries
- Kolekce: `queries_snapshots`
- Každý import QueryDetails zapíše i snapshot s `snapshotDate` (datum ze jména souboru)
- Upsert klíč: `(queryId, snapshotDate)` — žádné duplikáty, bezpečný reimport
- Účel: sledování vývoje statusů v čase (Open → Answered → Closed → requeried)
- Objem: ~3000 queries × 365 dní × 2 roky ≈ 2M dokumentů — MongoDB zvládá

### Logika pro QueryDetails se dvěma soubory
Každý den se stahují dva soubory:
- Menší: pouze Open + Answered queries
- Větší: všechny queries včetně Closed

Oba se importují — upsert na `queryId` zajistí, že každá query je v `queries` jednou.
Menší soubor je podmnožina většího → výsledek je vždy kompletní sada.

### Indexy
**queries:**
- `queryId` (unique)
- `subject.label`, `site.number`, `queryStatus`, `openedDate`

**queries_snapshots:**
- `(queryId, snapshotDate)` (unique)
- `snapshotDate`, `queryStatus`, `site.number`, `subject.label`

**Data Listing kolekce:**
- `form.recordId` (unique, sparse)
- `subject.id`, `site.id`, `study`, `lastModified`

## Co zbývá udělat
- [ ] Importovat zbývající soubory ze složky `downloads`
- [ ] Nastavit zálohování MongoDB (obdoba `mysqldump` → `mongodump`)
- [ ] Případně naplánovat automatické denní stahování + import

## Příklady dotazů

```js
// Aktuální open queries
db.queries.find({ queryStatus: "Open" })

// Trend open queries v čase
db.queries_snapshots.aggregate([
  { $match: { queryStatus: "Open" } },
  { $group: { _id: "$snapshotDate", count: { $sum: 1 } } },
  { $sort: { _id: 1 } }
])

// Historie statusů jedné query
db.queries_snapshots.find(
  { queryId: "20915933" },
  { snapshotDate: 1, queryStatus: 1 }
).sort({ snapshotDate: 1 })

// Queries pacienta
db.queries.find({ "subject.label": "CZ100040001" })

// Všechny záznamy ze site
db.MDD3003_DateofVisit.find({ "site.number": "S10-CZ10004" })
```

## Soubory
- Skript: `U:/janssen/medidata/edc_import.py`
- Log: `U:/janssen/medidata/edc_import.log`
- Stažené CSV: `U:/janssen/medidata/downloads/`
