Add Claude memory store synced via Gitea
Move ~/.claude/projects/U--janssen/memory into repo (claude-memory/) linked back via a directory junction so memory persists across machines. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
# Memory Index
|
||||||
|
|
||||||
|
- [Pracovat v maintree](feedback_worktree.md) — vždy pracuj v `U:/janssen/`, ne ve worktree větvích
|
||||||
|
- [Projekt Covance UCO3001](project_covance.md) — report vzorků studie 77242113UCO3001, skript `create_report.py`, zdroj + logika OK statusů
|
||||||
|
- [EDC import do MongoDB](project_edc_mongo.md) — skript `medidata/edc_import.py`, import Data Listing + QueryDetails CSV do MongoDB (192.168.1.76), kolekce `queries` + `queries_snapshots` pro tracking vývoje queries v čase
|
||||||
|
- [Dropbox file transfer](project_dropbox_file_transfer.md) — přenos souborů z JNJ PC do Dropboxu přes msgreceiver kontejner na Unraidu
|
||||||
|
- [Graph email import](project_graph_email_import.md) — import JNJ emailů do schránky vladimir.buzalka@buzalka.cz přes Graph API
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
name: Pracovat v maintree
|
||||||
|
description: Uživatel preferuje práci v hlavním repozitáři, ne ve worktree
|
||||||
|
type: feedback
|
||||||
|
---
|
||||||
|
|
||||||
|
Vždy pracuj přímo v hlavním repozitáři (`U:/janssen/`), ne ve worktree větvích.
|
||||||
|
|
||||||
|
**Why:** Uživateli to nevadí a je to jednodušší — vyhneme se problémům jako spouštění skriptů se starými cestami z worktree.
|
||||||
|
|
||||||
|
**How to apply:** Soubory čti a edituj z `U:/janssen/`, skripty spouštěj přímo odtud.
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
name: Projekt Covance UCO3001
|
||||||
|
description: Klinická studie 77242113UCO3001 — generování přehledového reportu vzorků
|
||||||
|
type: project
|
||||||
|
---
|
||||||
|
|
||||||
|
Skript `U:/janssen/Covance_UCO3001/create_report.py` generuje xlsx report ze vzorků Covance.
|
||||||
|
|
||||||
|
**Zdroj dat:**
|
||||||
|
- `Protocol 77242113UCO3001 - All Samples.xlsx` — hlavní zdroj vzorků (header=0, sloupec pacienta = `Patient No.`)
|
||||||
|
- `_EDCStdRpt-DataListing.csv` — návštěvy pacientů pro list "Seznam pacientů"
|
||||||
|
|
||||||
|
**Výstup:** `U:/Dropbox/!!!Days/Downloads Z230/YYYY-MM-DD 77242113UCO3001 Speciment Inventory report.xlsx`
|
||||||
|
|
||||||
|
**Struktura výstupního souboru:**
|
||||||
|
1. List **"Zdroj"** — kopie zdrojového xlsx, sloupce autofitnuté
|
||||||
|
2. List **"Přehled vzorků"** — přehled vzorků per pacient (BXSCR screening + visity I-0, I-2, I-4) s hyperlinkami do Zdroje
|
||||||
|
3. List **"Seznam pacientů"** — návštěvy z CSV
|
||||||
|
|
||||||
|
**Klíčová logika:**
|
||||||
|
- Zelená buňka (OK) = Sample Status je `Received`, `In Inventory` nebo `Shipped`
|
||||||
|
- Červená buňka = vše ostatní (Not Received, Cancelled, Removed) nebo chybějící záznam
|
||||||
|
- Excel row offset = index + 2 (header v řádku 1)
|
||||||
|
- `get_specimen_info` i `get_label_info` filtrují pouze OK_STATUSES
|
||||||
|
|
||||||
|
**Why:** Původní soubor `3001Specimeninventoryreport_30c1e108.xlsx` byl nahrazen novým `Protocol 77242113UCO3001 - All Samples.xlsx`, který má header v řádku 1 a jiný název sloupce pacienta.
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
name: dropbox-file-transfer
|
||||||
|
description: Přenos souborů z JNJ počítače do Dropboxu přes msgreceiver Docker kontejner na Unraidu
|
||||||
|
metadata:
|
||||||
|
node_type: memory
|
||||||
|
type: project
|
||||||
|
originSessionId: a5eaa623-110f-4feb-b3c0-46457c93d222
|
||||||
|
---
|
||||||
|
|
||||||
|
Systém pro přenos souborů z JNJ počítače do Dropboxu (`/!!!Days/Downloads Z230/`).
|
||||||
|
Kontejner msgreceiver nyní také importuje JNJ emaily do Graph API — viz [[graph-email-import]].
|
||||||
|
|
||||||
|
**Architektura:**
|
||||||
|
- `EmailsImport/janssenpc_file_send.py` — běží na JNJ PC, čte soubory z `C:\Users\vbuzalka\OneDrive - JNJ\##JNJPrenos\`, posílá je na `https://msgs.buzalka.cz/upload-dropbox`, po úspěšném uploadu maže
|
||||||
|
- `EmailsImport/DockerCustomApp/app.py` — FastAPI kontejner `msgreceiver` na Unraidu (192.168.1.76:8765), endpoint `/upload-dropbox` nahrává soubory přes Dropbox API
|
||||||
|
- Dropbox credentials (APP_KEY, APP_SECRET, REFRESH_TOKEN) jsou v `.env` uvnitř Docker image
|
||||||
|
- Kontejner config: volume `/mnt/user/JNJEMAILS:/msgs`, port 8765, restart unless-stopped
|
||||||
|
- Unraid appdata: `\\tower\appdata\msgreceiver\` (`/mnt/user/appdata/msgreceiver/`)
|
||||||
|
|
||||||
|
**Why:** JNJ počítač nemá přímý přístup k Dropboxu, přenos jde přes Unraid jako prostředníka.
|
||||||
|
|
||||||
|
**How to apply:** Při změnách v `DockerCustomApp/` je potřeba rebuild image na Unraidu (SSH root@192.168.1.76, heslo v BUILD.md). Postup: SFTP upload souborů → `docker build` → `docker stop/rm/run`. Bez redeploye se změny neprojeví (2026-05-29: 442 .db souborů se nehromadilo kvůli chybějícímu redeployi). Refresh token z `10 GetOneTimeDropBoxAuth.py` platí dokud se appka neodvolá.
|
||||||
|
|
||||||
|
Souvisí s [[edc-mongo-import]] — stejný Docker server.
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# 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/`
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
name: graph-email-import
|
||||||
|
description: Import JNJ emailů do schránky vladimir.buzalka@buzalka.cz přes Microsoft Graph API
|
||||||
|
metadata:
|
||||||
|
node_type: memory
|
||||||
|
type: project
|
||||||
|
originSessionId: current
|
||||||
|
---
|
||||||
|
|
||||||
|
Import emailů z JNJ Outlook schránky do osobní schránky `vladimir.buzalka@buzalka.cz` přes Microsoft Graph API.
|
||||||
|
|
||||||
|
**Architektura:**
|
||||||
|
- `EmailsImport/janssenpc_email_send_new_v1.4.py` — běží na JNJ PC, posílá .msg + `folder` parametr (plná cesta, např. `/vbuzalka@its.jnj.com/Inbox/TMP`) na `https://msgs.buzalka.cz/upload`
|
||||||
|
- `EmailsImport/DockerCustomApp/app.py` v1.3 — FastAPI kontejner `msgreceiver` na Unraidu, při příjmu .msg s `folder`:
|
||||||
|
1. Uloží .msg na disk (jako dřív)
|
||||||
|
2. Parsuje .msg (extract_msg) — subject, body, from, to, cc, datum, přílohy
|
||||||
|
3. Mapuje JNJ folder cestu na Graph folder pod `Inbox/JNJ/...`
|
||||||
|
4. Vytváří chybějící složky automaticky
|
||||||
|
5. Importuje email přes Graph API jako přijatý (ne draft — MAPI property `PR_MESSAGE_FLAGS 0x0E07 = 1`)
|
||||||
|
- Bez `folder` parametru (starý klient) — email se uloží na disk ale neimportuje do Graph (zpětná kompatibilita)
|
||||||
|
|
||||||
|
**Mapování složek:**
|
||||||
|
- `/vbuzalka@its.jnj.com/Inbox` → `Inbox/JNJ/Inbox`
|
||||||
|
- `/vbuzalka@its.jnj.com/Sent Items` → `Inbox/JNJ/Sent Items`
|
||||||
|
- `/vbuzalka@its.jnj.com/Inbox/TMP` → `Inbox/JNJ/Inbox/TMP`
|
||||||
|
- `/Online Archive - vbuzalka@its.jnj.com/Inbox` → `Inbox/JNJ/Online Archive/Inbox`
|
||||||
|
|
||||||
|
**Azure AD App (PythonMailer):**
|
||||||
|
- Tenant: `7d269944-37a4-43a1-8140-c7517dc426e9` (TrialHelp s.r.o.)
|
||||||
|
- Client ID: `4b222bfd-78c9-4239-a53f-43006b3ed07f`
|
||||||
|
- Permissions: Mail.Send (Application), Mail.ReadWrite (Application), User.Read (Delegated) — all granted
|
||||||
|
- Credentials v app.py (Docker image), NE na JNJ PC
|
||||||
|
|
||||||
|
**Logování na JNJ PC:**
|
||||||
|
- `C:\Users\vbuzalka\SQLITE\jnjemails_uploads.log` — každý upload (filename, folder, response)
|
||||||
|
- `C:\Users\vbuzalka\SQLITE\jnjemails_errors.log` — chyby
|
||||||
|
|
||||||
|
**Staré emaily (69k):** zatím neimportovány, plánován jednorázový batch import.
|
||||||
|
|
||||||
|
Souvisí s [[dropbox-file-transfer]] — stejný Docker kontejner msgreceiver.
|
||||||
Reference in New Issue
Block a user