# jnj_emails_to_fulltext_v1.0

**Verze:** 1.0
**Datum:** 2026-06-10
**Autor:** vladimir.buzalka
**Umístění:** `/mnt/user/Scripts/Janssen_emails_to_fulltext/` (v kontejneru `/scripts/Janssen_emails_to_fulltext/`)

## Účel

Inkrementální zpracování JNJ e-mailů. Ke schránce `vbuzalka@its.jnj.com` není jiný
přístup než průběžný export `.msg` souborů do `/mnt/JNJEMAILS` (~70 tis. souborů,
nové přibývají denně). Skript nové soubory:

1. **KROK 1 — IMPORT:** naparsuje a uloží do MongoDB `emaily."vbuzalka@its.jnj.com"`
   (stejné schéma a `_id` logika jako bulk import `parse_emails_tower_v1.3.py`)
2. **KROK 2 — ENRICH:** fulltext do PostgreSQL `MongoEmaily.emails` — deleguje na
   existující `/scripts/5_enrich_fulltext_emails_v1.4.py --mailbox "vbuzalka@its.jnj.com"`,
   takže PG schéma, `extractor_version` i skip-logika zůstávají identické s hlavní
   Graph pipeline (krok 5 v `0_run_pipeline`). Hlavní pipeline pak tyto záznamy
   pouze skipuje (ext_v shodná, ok=true) — žádná dvojí práce.

## Vztah k existujícím skriptům

| Skript | Role |
|--------|------|
| `parse_emails_tower_v1.3.py` | jednorázový bulk import (70k, ~48 h) — zdroj parsovací logiky |
| `1b_parse_emails_graph_delta_v1.0.py` | Graph delta pro schránky buzalka.cz — JNJ záměrně vynechána |
| `5_enrich_fulltext_emails_v1.4.py` | enrich do PG — **tento skript ho volá s `--mailbox`** |
| **`jnj_emails_to_fulltext_v1.0.py`** | **inkrementální .msg → Mongo → PG pro JNJ** |

Po ověření provozu je plán sloučit do hlavní pipeline `0_run_pipeline` jako další krok
(např. „1c: JNJ msg import").

## Inkrementalita (co se přeskakuje)

- soubory zapsané ve `state.json` → klíč `done` `{filename: message_id}`
- pojistka: `distinct("filename")` z Mongo kolekce (state se při 1. běhu sám naplní);
  `state.json` zároveň řeší duplicitní Message-ID (2 soubory → 1 dokument), které by
  se přes samotný Mongo distinct reimportovaly donekonečna
- soubory mladší než `--min-age` s (default 300) — mohou se ještě zapisovat exportem
- soubory které 3× selhaly (`MAX_FAIL`) — `--retry-failed` je zkusí znovu
- flock (`.lock`) — souběžný start se ukončí bez práce

## Spouštění

```bash
# Náhled bez zápisu (Mongo, PG i state zůstanou nedotčené):
docker exec -it python-runner python /scripts/Janssen_emails_to_fulltext/jnj_emails_to_fulltext_v1.0.py --dry-run --limit 10

# Ostrý inkrementální běh:
docker exec -it python-runner python /scripts/Janssen_emails_to_fulltext/jnj_emails_to_fulltext_v1.0.py

# Wrapper s datovaným logem (pro User Scripts / cron):
/mnt/user/Scripts/Janssen_emails_to_fulltext/run_jnj_emails_to_fulltext.sh
```

| Parametr | Význam |
|----------|--------|
| `--dry-run` | parsuje, ale nic nezapisuje (Mongo, PG, state.json) |
| `--limit N` | max N nových souborů (test) |
| `--min-age S` | přeskoč soubory mladší než S sekund (default 300) |
| `--no-enrich` | jen import do Mongo, bez PG |
| `--retry-failed` | znovu zkusit trvale selhávající soubory |
| `--msgs-dir DIR` | jiný zdrojový adresář (default `/mnt/JNJEMAILS`) |

## Výstupy a logy (vše v adresáři skriptu)

- `logs/run_YYYYMMDD_HHMM.log` — stdout běhu (přes wrapper; `run_latest.log` symlink)
- `logs/errors.log` — chyby parsování jednotlivých souborů
- `state.json` — `{done: {filename: message_id}, failed: {filename: počet}}`

## Exit kódy

- `0` — OK (včetně „nic nového")
- `1` — chyby parsování / enrich selhal / Mongo nedostupná

## Závislosti

V image `python-runner` už jsou: `extract-msg==0.55.0`, `olefile`, `pymongo`,
`python-dateutil`. KROK 2 navíc potřebuje `psycopg`, `bs4`, `lxml` — používá je
denně pipeline krok 5, takže jsou k dispozici.

## Historie verzí

- **1.0** (2026-06-10) — iniciální verze; parsovací logika 1:1 z
  `parse_emails_tower_v1.3.py`, enrich delegován na `5_enrich_fulltext_emails_v1.4.py`
