From 2d65ad2988efed3599de09ac1b414b75cebddafb Mon Sep 17 00:00:00 2001 From: Vladimir Buzalka Date: Tue, 2 Jun 2026 22:57:44 +0200 Subject: [PATCH] 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 --- .../{ => Trash}/parse_emails_tower_v1.1.md | 0 .../{ => Trash}/parse_emails_tower_v1.1.py | 0 claude-memory/MEMORY.md | 7 ++ claude-memory/feedback_worktree.md | 11 +++ claude-memory/project_covance.md | 26 ++++++ .../project_dropbox_file_transfer.md | 24 +++++ claude-memory/project_edc_mongo.md | 92 +++++++++++++++++++ claude-memory/project_graph_email_import.md | 40 ++++++++ 8 files changed, 200 insertions(+) rename Python-runner/{ => Trash}/parse_emails_tower_v1.1.md (100%) rename Python-runner/{ => Trash}/parse_emails_tower_v1.1.py (100%) create mode 100644 claude-memory/MEMORY.md create mode 100644 claude-memory/feedback_worktree.md create mode 100644 claude-memory/project_covance.md create mode 100644 claude-memory/project_dropbox_file_transfer.md create mode 100644 claude-memory/project_edc_mongo.md create mode 100644 claude-memory/project_graph_email_import.md diff --git a/Python-runner/parse_emails_tower_v1.1.md b/Python-runner/Trash/parse_emails_tower_v1.1.md similarity index 100% rename from Python-runner/parse_emails_tower_v1.1.md rename to Python-runner/Trash/parse_emails_tower_v1.1.md diff --git a/Python-runner/parse_emails_tower_v1.1.py b/Python-runner/Trash/parse_emails_tower_v1.1.py similarity index 100% rename from Python-runner/parse_emails_tower_v1.1.py rename to Python-runner/Trash/parse_emails_tower_v1.1.py diff --git a/claude-memory/MEMORY.md b/claude-memory/MEMORY.md new file mode 100644 index 0000000..4a8ef55 --- /dev/null +++ b/claude-memory/MEMORY.md @@ -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 diff --git a/claude-memory/feedback_worktree.md b/claude-memory/feedback_worktree.md new file mode 100644 index 0000000..d387069 --- /dev/null +++ b/claude-memory/feedback_worktree.md @@ -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. diff --git a/claude-memory/project_covance.md b/claude-memory/project_covance.md new file mode 100644 index 0000000..baa918f --- /dev/null +++ b/claude-memory/project_covance.md @@ -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. diff --git a/claude-memory/project_dropbox_file_transfer.md b/claude-memory/project_dropbox_file_transfer.md new file mode 100644 index 0000000..f324cc7 --- /dev/null +++ b/claude-memory/project_dropbox_file_transfer.md @@ -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. diff --git a/claude-memory/project_edc_mongo.md b/claude-memory/project_edc_mongo.md new file mode 100644 index 0000000..a5b0563 --- /dev/null +++ b/claude-memory/project_edc_mongo.md @@ -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/` diff --git a/claude-memory/project_graph_email_import.md b/claude-memory/project_graph_email_import.md new file mode 100644 index 0000000..2787e3c --- /dev/null +++ b/claude-memory/project_graph_email_import.md @@ -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.