
    Q[j%a                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZmZmZ ddlmZ ddlmZmZ ddlZddlmZmZ dd	lmZmZmZmZm Z  dd
l!m"Z"  eej#        $                    d                    Z%e%dz  Z&e%dz  Z'e%dz  Z(e%dz  Z)e%dz  Z*e*dz  Z+e'dz  e*dz  e%dz  dz  dz  gZ,dZ- ej.                    dz  dz  dz  Z/dXdZ0dYdZ1h dZ2g dZ3e G d d                       Z4dZd"Z5d[d$Z6d\d(Z7d]d+Z8d^d-Z9d_d`d1Z:dad4Z;dbdcd8Z<e(d9z  dfddd<Z=dedfd>Z>d_dgd@Z?dhdidDZ@djdFZAe(dGz  fdkdHZBe(dIz  fdkdJZCe(dKz  fdldMZDdmdNZEdndodPZFdndpdRZGdqdSZHdrdUZId[dVZJeKdWk    r eJ             dS dS )sa'  Health intelligence pipeline for JARVIS.

Functions:
- Parse the user-maintained lab reference XLSX.
- Export 4-eyes correction workbooks.
- Generate the current lab report in the desired pivot format.
- Generate a simple HTML dashboard and daily/weekly markdown reports.
- Apply reviewed correction XLSX files to the master DB.
- Register local inbox files in the document table.

This script deliberately keeps OCR/Docling extraction separate from final DB writes:
newly extracted lab values should first go into laborwerte_staging and be reviewed.
    )annotationsN)	dataclass)datedatetime	timedelta)Path)AnyIterable)Workbookload_workbook)	AlignmentBorderFontPatternFillSide)get_column_letterz~/.hermes/assets/Gesundheitzhealth_data.dbinboxreportscorrectionsattachmentsz$Laborwerte_Uebersicht_2021-2025.xlsxz!260510_Laborwerte_Uebersicht.xlsxbackup_originalzfriday.uplink@gmail.comz.hermessecretszgog_keyring.envreturnstrc                 l   t           j                            dd                                          } | r| S t                                          st          dt                     t                                          j        dz  rt          dt                     t          	                    d          
                                D ]}|                                }|r|                    d          r.|                    d	          r|d
d                                          }|                    d          \  }}}|rX|                                dk    r@|                                                    d                              d          }|r|c S t          dt                     )NGOG_KEYRING_PASSWORD z-Missing gog keyring secret environment file: ?   z/Unsafe permissions on gog keyring secret file: utf-8encoding#zexport    ="'z GOG_KEYRING_PASSWORD missing in )osenvirongetstripGOG_SECRET_ENVis_fileRuntimeErrorstatst_mode	read_text
splitlines
startswith	partition)valueraw_linelinekeysep	raw_valuesecrets          @/home/agent/.hermes/assets/Gesundheit/scripts/health_pipeline.pyload_gog_keyring_passwordr<   6   s   JNN1266<<>>E !!## ][>[[\\\$u, _]^]]^^^",,g,>>IIKK 
 
~~ 	ts++ 	??9%% 	$8>>##D"nnS11S) 	399;;"888__&&,,S1177<<F 
J.JJ
K
KK    dict[str, str]c                     i t           j        t          t          j                              t          t          j                    dz            t                      dS )Nz.config)HOMEXDG_CONFIG_HOMEr   )r'   r(   r   r   homer<    r=   r;   gog_envrD   L   sU    
*DIKK  ty{{Y677 9 ; ;	   r=   >      Entzündung   Hämatologie   Schilddrüse   Auto-Antikörper gegen   Schilddrüse & HormoneLeber & NiereBlutstatus LeukSpezielle GerinnungInfektion / AutoimmunElektrolyte & VitamineImmunologie / InfektionBlutfette & StoffwechselBlutbild automatisch absolutVirale Hepatitiden A,B,C,D,EUrinHormoneProteine	Gerinnung	SonstigesBlutabnahmen)status	kategorieparameter_namewert_extrahiertwert_korrigiert
wert_finaleinheitreferenzbereichabnahme_datumbefund_datumflag
confidencequelledokument_id	kommentarc                  P    e Zd ZU ded<   ded<   ded<   ded<   ded<   dZded	<   dS )
LabValuer   category	parameter
str | None	referencer   r4   Nunit)__name__
__module____qualname____annotations__rn   rC   r=   r;   ri   ri   d   sS         MMMNNNIIIJJJDr=   ri   sqlite3.Connectionc                 Z    t          j        t                    } t           j        | _        | S N)sqlite3connectDBRowrow_factory)cs    r;   connr|   n   s    AKAMHr=   Nonec                 n    t           t          t          t          fD ]} |                     dd           d S )NT)parentsexist_ok)REPORTSCORRECTIONSINBOXATTACHMENTSmkdir)ps    r;   ensure_dirsr   t   s=    {E;7 - -	t,,,,- -r=   r4   r	   rl   c                x   | | dk    rd S t          | t                    r&|                                                                 S t          | t                    r|                                 S t	          |                                           }dD ]M}	 t          j        ||                                                                          c S # t          $ r Y Jw xY wt          j	        d|          }|rC|
                    d           d|
                    d           d|
                    d           S |S )Nr   )%Y-%m-%dz%d.%m.%Yz%d.%m.%yz%Y/%m/%dz#(20\d{2})[-_.]?(\d{2})[-_.]?(\d{2})   -      )
isinstancer   r   	isoformatr   r*   strptime
ValueErrorresearchgroup)r4   textfmtms       r;   normalize_dater   y   s7   }t%"" (zz||%%'''% !   u::D?  	$T3//4466@@BBBBB 	 	 	D	
	8$??A 9''!**88qwwqzz88AGGAJJ888Ks   8C
CCref)tuple[str | None, str | None, str | None]c                   | sdS t          |                                           }d }t          j        d|          }t          j        d|          }|r'|                    d                                          }d|v rLt          |          dk    r9|d                             dd	          |d                             dd	          |fS |                                                    d
          r!|rd |d                             dd	          |fS |                                                    d          r!|r|d                             dd	          d |fS d d |fS )NNNNz[-+]?\d+(?:[.,]\d+)?u1   (?:\d|[<>])\s*([A-Za-zµ%/][A-Za-z0-9µ/%^ .-]*)$r   r   r   r   ,.<>)	r   r*   r   findallr   r   lenreplacer2   )r   r   rn   numsm_units        r;   split_referencer      sN     s88>>DD:-t44DYKTRRF '||A$$&&
d{{s4yyA~~AwsC(($q'//#s*C*CTIIzz||s## 5 5T!W__S#..44zz||s## 5 5AwsC(($44tr=   r   c                 `    d t           D             } | st          S dd}t          | |          S )	Nc                :    g | ]}|                                 |S rC   )exists).0r   s     r;   
<listcomp>z'best_reference_xlsx.<locals>.<listcomp>   s%    >>>a188::>>>>r=   r   r   r   tuple[int, float]c                   	 t          | dd          }||j        d                  }t          |j        pd          |                                 j        fS # t          $ r d|                                 j        fcY S w xY w)NFT)	read_only	data_onlyr   )r   
sheetnamesint
max_columnr.   st_mtime	Exception)r   wbwss      r;   scorez"best_reference_xlsx.<locals>.score   s    	*qETBBBBBM!$%B*++QVVXX->?? 	* 	* 	*qvvxx())))	*s   AA %A>=A>r7   )r   r   r   r   )REFERENCE_CANDIDATESREFERENCE_XLSXmax)existingr   s     r;   best_reference_xlsxr      sM    >>/>>>H * * * * xU####r=   pathPath | Nonelist[LabValue]c                   | t                      } |                                 st          |           t          | d          }||j        d                  i }t          dj        dz             D ]1}t                              d|          j	                  }|r|||<   2g }d}t          dj
        dz             D ]                    d          j	        }|%t          |                                          dk    rFt          |                                          }fd	|D             }	                    d          j	        }
|t          v r|
s|	s|}|	st          |
rt          |
          nd           \  }}}|                                D ]\  }}                    |          j	        }|%t          |                                          dk    rH|                    t#          |||
r!t          |
                                          nd |t          |                                          |                     |S )
NTr   r   r   r   rW   r   r   c                    g | ]:}                     |          j        d v                     |          j        ;S )Nr   )cellr4   )r   r{   rowr   s     r;   r   z(parse_reference_xlsx.<locals>.<listcomp>   sD     q q q1QTVWI^fpIpIpa!6IpIpIpr=   )r   r   FileNotFoundErrorr   r   ranger   r   r   r4   max_rowr   r*   CATEGORY_NAMESr   itemsappendri   )r   r   datescoldvaluesrj   namename_snon_empty_date_valuesr   _rn   valr   r   s                 @@r;   parse_reference_xlsxr      sV   |"$$;;== &%%%	tt	,	,	,B	BM!	BEQ)**  2771c??011 	E#JFHQ
Q'' t twwsA$<3t99??,,22T"" q q q q q q q qggc1oo#^##C#8M#H$ 	$%>SXXX$??
1dkkmm 	t 	tFC''#s##)C{c#hhnn.."44MM(8V5VSXX^^5E5E5ERVXY[^_b[c[c[i[i[k[kmqrrssss		t
 Mr=   r   \tuple[list[str], list[str], dict[tuple[str, str], LabValue], dict[str, str], dict[str, str]]c                .   t          d | D                       }i i }i }| D ]8}|j        |j        <   |j        r|j        ||j        <   |||j        |j        f<   9d t          t                    D             t          fd          }||||fS )Nc                    h | ]	}|j         
S rC   )r   )r   vs     r;   	<setcomp>z!get_lab_matrix.<locals>.<setcomp>   s    +++qAF+++r=   c                    i | ]\  }}||	S rC   rC   )r   ir{   s      r;   
<dictcomp>z"get_lab_matrix.<locals>.<dictcomp>   s    888daQ888r=   c                                                              | d          d                               | d          |                                 fS )NrW   i  r   )r)   lower)r   catsorders    r;   <lambda>z get_lab_matrix.<locals>.<lambda>   sJ    488A{3K3KS)Q)QSWS[S[\]_aSbSbdedkdkdmdm(n r=   r   )sortedrj   rk   rm   r   	enumerater   )r   r   refsmatrixr   paramsr   r   s         @@r;   get_lab_matrixr      s    ++F+++,,EDD.0F * *JQ[; 	, !D()QV$%%88i77888EDnnnnnoooF&&$,,r=   C2r   freezec                   || _         | j        | j        _        t	          d| j        dz             D ]}t          |          }d}t	          dt          | j        d          dz             D ]Z}| 	                    ||          j
        }|;t          |t          dt          t          |                    dz                       }[|| j        |         _        d S )Nr   
   P   -   r   )freeze_panes
dimensionsauto_filterr   r   r   r   minr   r   r4   r   r   r   column_dimensionswidth)r   r   r   lettermax_lenr   r   s          r;   style_sheetr      s    BOBNQ)** 5 5"3''C
B//!344 	C 	CC''#s##)Cgs2s3s88}}q/@'A'ABB-4V$**5 5r=   zaktuelle_blutwerte.xlsxoutputsourcec           	     j   t                       t          |          }t          |          \  }}}}t                      }|j        }d|_        t          dd          }	t          dd          }
t          dd          }t          dd          }t          d	 t          d
          D              }|
                    ddg|z              |d         D ]-}|	|_        |
|_        t          dd          |_        ||_        .d}d }|D ]|                    d          }||k    r|
                    |gd gt#          |          dz   z  z              |                    |d|t#          |          dz              |                    |d          }||_        ||_        ||_        |}|dz  }|
                    |                    d          gfd|D             z              ||         D ],}||_        t          |j        dk    rdndd          |_        -|dz  }d|j        d         _        d|j        d         _        t          dt#          |          dz             D ]!}d|j        t/          |                   _        "t1          |           |                    |            | S )NzAktuelle Blutwertesolid1F4E78fgColorFFFFFFTcolorboldD9EAF7c              3  8   K   | ]}t          d d          V  dS )thinBFBFBF)styler  N)r   )r   r   s     r;   	<genexpr>z&generate_lab_report.<locals>.<genexpr>   s/      KKQdx888KKKKKKr=      	ParameterReferenzbereichr   center)
horizontal	wrap_textr   rW   )	start_rowstart_columnend_row
end_columnr   c                z    g | ]7}                     |f          r                     |f          j        nd 8S ru   )r)   r4   )r   r   r   r   s     r;   r   z'generate_lab_report.<locals>.<listcomp>  sK    )r)r)rghfjjRSUVQWFXFX*b&**aV*<*<*B*B^b)r)r)rr=   left*   A   Br      )r   r   r   r   activetitler   r   r   r   r   fillfontr   	alignmentborderr)   r   merge_cellsr   columnr   r   r   r   save)r   r   r   r   r   r   r   r   r   header_fillheader_fontcat_fillcat_fontr   r   r   current_catcatr{   r   r   r   s                       @@r;   generate_lab_reportr*     s   MMM!&))F(6v(>(>%E664	B	B#BHgx888KXD111K7H555H(...HKK%((KKKLFII{-.67771 P P	[9`htxKyKyKy$.  JP{  |G  |G
CK 
 
hhq+&&+IIsetfE

Q77888NNSq#RUV[R\R\]^R^N___QA(XAFRXqxKsaxs
		1dhhq"oo&)r)r)r)r)rlq)r)r)rrsssC 	x 	xAAHYahYZll((`frv-w-w-wq{{q&(B#&(B#QE

1%% @ @=?.s334::OOOGGFOOOMr=   batch_idc                   t                       | s)dt          j                                        d          z   } |t          d|  dz  }t                      }|j        }d|_        |                    t                     t                      }g }	 t          |                    d| f                    }|                                 n# |                                 w xY w|r|D ]}|d         p|d	         p|d
         }|                    |d         |d         |d         |d
         |d	         ||d         |d         |d         |d         |d         |d         |d         |d         |d         g           nn|pt                      }	t          |	          D ]N}
|                    d|
j        |
j        |
j        d|
j        |
j        |
j        |
j        ddd|	j        ddg           Ot/          dd          }t1          dd          }|d          D ]}||_        ||_        t7          |d!"           |                    |           |S )#zExport a review workbook. If batch_id exists in staging, export it; otherwise export reference XLSX as initial validated review.
reference_z%Y%m%d_%H%M%SNKORREKTUR_Laborwerte_.xlsxLaborwerte_KorrekturzcSELECT * FROM laborwerte_staging WHERE batch_id=? ORDER BY kategorie, parameter_name, abnahme_datumr^   r]   r\   rY   rZ   r[   r_   r`   ra   rb   rc   rd   re   rf   rg   	validiertg      ?zReferenz-XLSXr   7030A0r   r   Tr  r   A2)r   )r   r   nowstrftimer   r   r  r  r   REVIEW_HEADERSr|   listexecutecloser   r   rj   rk   r4   rn   rm   r   r   r   r   r  r  r   r#  )r+  r   r   r   r   r{   rowsrfinalsource_pathr   r$  r%  r   s                 r;   export_correction_xlsxr>    s3   MMM K(,.."9"9/"J"JJ~FxFFFF	B	B%BHIInADAII  D  GO  FQ  R  R  S  S									 m 	S 	SAlOSq):';SqAR?SEIIq{AkNA6F4GK\I]_`ar_suz|}  H  }I  KL  M^  K_  ab  cr  as  uv  wE  uF  HI  JP  HQ  ST  Ua  Sb  de  fn  do  qr  s@  qA  CD  EP  CQ  R  S  S  S  S	S 5 3 5 5%k22 	m 	mAII{AJQWdAGUVU[]^]hjkjprvx|  B  DO  DT  VZ  \k  l  m  m  m  mgx888KXD111K1 9 9	[4    GGFOOOMs   $C
 
C r   c                d   t          | d          }||j        d                  }d |d         D             }d t          |          D             }h d}|t          |          k    s"t	          d|t          |          z
             t                      }d}t          j                                        d	          }		 t          d
|j
        dz             D ]}
t          |                    |
|                    dd                    j        pd                                                                          }|dv rj|                    |
|d                   j        }|                    |
|d                   j        p4|                    |
|                    d|d                             j        }t#          |                    |
|d                   j                  }|r|dv s|s|                    d          r/|                    |
|                    dd                    j        nd}|                    d          r/|                    |
|                    dd                    j        nd}t%          |rt          |          nd          \  }}}|                    d          r/|                    |
|                    dd                    j        n| j        }|                    dt          |          ||f                                          }|rQ|                    dt          |          ||||rt          |          ndt          |          ||	|d         f	           np|                    dt          |          t          |          t          |          |||||rt          |          nd|	||	dd         t          |          |f           |dz  }|                                 |                                 n# |                                 w xY w|S )zNRead reviewed correction workbook and upsert validated values into laborwerte.Tr   r   c                l    g | ]1}|j         &t          |j                                                   nd2S r   )r4   r   r*   )r   r{   s     r;   r   z%apply_corrections.<locals>.<listcomp>8  s8    RRRqqw':s17||!!###RRRr=   r   c                     i | ]\  }}||d z   S )r   rC   )r   r   hs      r;   r   z%apply_corrections.<locals>.<dictcomp>9  s"    
3
3
311a!e
3
3
3r=   >   r^   ra   r[   zMissing required columns: z%Y-%m-%d %H:%M:%Sr   rY   r1  >   	   gelöschtreject	abgelehnt	geloeschtr[   r^   r]   ra   r   r_   Nr`   re   zmSELECT id FROM laborwerte WHERE parameter_name=? AND abnahme_datum=? AND COALESCE(einheit,'')=COALESCE(?, '')zUPDATE laborwerte SET wert=?, wert_original=COALESCE(wert_original, wert), einheit=?, reference_min=?, reference_max=?, bemerking=?, quelle=?, validierungsstatus='validiert', review_batch_id=?, befund_datum=COALESCE(befund_datum, ?) WHERE id=?ida.  INSERT INTO laborwerte (parameter_name, wert, wert_original, einheit, reference_min, reference_max, einheiten, bemerking, ermittlung_datum, abnahme_datum, befund_datum, quelle, validierungsstatus, review_batch_id)
                             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'validiert', ?)r   )r   r   r   setr   r|   r   r4  r5  r   r   r   r   r)   r4   r*   r   r   r   r   r8  fetchonecommitr9  )r   r+  r   r   headersidxrequiredr{   countr4  r   rY   paramr4   abnahmer_   r   rminrmaxr   re   r   s                         r;   apply_correctionsrS  4  s~   	tt	,	,	,B	BM!	BRRBqERRRG
3
3	' 2 2
3
3
3C@@@Hs3xxKhS6IKKLLLAE
,..
!
!"5
6
6CBJN++ 	 	Ccggh&:&:;;AP[QQWWYY__aaFJJJGGC%5!677=EGGC\!2339~RWWS#''RcehiuevJwJw=x=x=~E$RWWS#o2F%G%G%MNNG EZ//w/CF779CUCU_bggc3779a#8#899??[_GGJwwO`GaGak"''#sww'8!<<==CCgkC+,ECHHHFFMD$ADARARaRWWS#''(A"6"677==X\XaFyy  "Q  TW  X]  T^  T^  `g  ip  Sq  r  r  {  {  }  }H h		  Tu::wd<UCHHHQUWZ[aWbWbdlnqs{  }A  tB  CD D D D 		 \u::s5zz3u::wdT[il]v]`ad]e]e]ervx{  ~E  GJ  KN  LN  KN  GO  QT  U[  Q\  Q\  ^f  gh h h QJEE	


									Ls    MP P-   limitlist[sqlite3.Row]c                    t                      }	 t          |                    d| f                    |                                 S # |                                 w xY w)NzSELECT id,datei_name,kategorie,status,review_status,upload_datum, length(COALESCE(extrahierte_inhalte,'')) text_len FROM dokumente ORDER BY id DESC LIMIT ?)r|   r7  r8  r9  )rU  r{   s     r;   latest_docsrX  ]  sf    AAII  |  D  ~F  G  G  H  H									s   #A Adict[str, Any]c                    t                      } 	 i }dD ]5}|                     d|                                           d         ||<   6|                     d                                          d         |d<   |                     d                                          d         |d<   ||                                  S # |                                  w xY w)N)	dokumente
laborwertelaborwerte_staging
ernaehrungtagebuchsymptomehealth_eventshealth_insightszSELECT count(*) FROM r   zUSELECT count(*) FROM dokumente WHERE length(trim(COALESCE(extrahierte_inhalte,'')))>0documents_with_textUSELECT count(*) FROM laborwerte_staging WHERE status IN ('zur_pruefung','extrahiert')open_reviews)r|   r8  rI  r9  )r{   outtables      r;   	db_countsrh  e  s   A  Q 	R 	RE#B5#B#BCCLLNNqQCJJ%&YY  0G  &H  &H  &Q  &Q  &S  &S  TU  &V!"ii(  A  A  J  J  L  L  MN  ON									s   BC   Czhealth_dashboard.htmlc                ~    ddl }t          dz  dz  } |j        t          j        t          |          gd           | S )a  Generate dashboard via robust v3 renderer.

    The previous inline Chart.js annotation-plugin implementation failed silently
    in some browsers/CDN states, leaving only titles/reference text visible.
    v3 uses plain Chart.js datasets for lines/reference bands/event markers.
    r   Nscriptszhealth_dashboard_v3.pyTcheck
subprocessBASErunsys
executabler   r   rn  scripts      r;   generate_dashboardru  r  sI     I 88FJNCNCKK0====Mr=   zhealth_dashboard_v4.htmlc                    ddl }t          dz  dz  } |j        t          j        t          |          dt          |           gd           | S )z?Generate the complete mobile and privacy-hardened dashboard v4.r   Nrj  zhealth_dashboard_v4.py--outputTrk  rm  rs  s      r;   generate_dashboard_v4rx    sR    I 88FJNCNCKKS[[IQUVVVVMr=   zhealth_dashboard_v5.htmldbc           
         ddl }t          dz  dz  } |j        t          j        t          |          dt          |           dt          |          gd           |S )	z@Generate the parallel Dashboard v5 preview without replacing v4.r   Nrj  zhealth_dashboard_v5.py--dbrw  Trk  rm  )ry  r   rn  rt  s       r;   generate_dashboard_v5r|    si    
 I 88FJN	Vfc"ggz3v;;O    Mr=   c                    t           dz  dz  }t          j        t          j        t          |          dt          |           gd           dS )zURefresh aggregate-only exploratory correlations for the explicitly selected database.rj  zmultimodal_correlations.pyr{  Trk  N)ro  rn  rp  rq  rr  r   )ry  rt  s     r;    generate_multimodal_correlationsr~    sD    I <<FNCNCKKRANNNNNNr=   dayc           	        t                       | p$t          j                                                    } |pt          d|  dz  }t                      }	 t          |                    d| f                    }t          |                    d| f                    }t          |                    d| f                    }|                                 n# |                                 w xY wd|  dg}t          |||g          s|dgz  }|r|d	gd
 |D             dz  }|r|dgd |D             dz  }|r|dgd |D             dz  }|g dz  }|
                    d                    |          d           t                      }|                    dd| | t          |          df           |                                 |                                 |S )Ndaily_health_report_.mdzVSELECT mahlzeit,beschreibung,wirkung,notizen FROM ernaehrung WHERE datum=? ORDER BY idzLSELECT kategori,titel,inhalt,wirkung FROM tagebuch WHERE datum=? ORDER BY idzQSELECT symptom,schwergrad,wirkung,notizen FROM symptome WHERE datum=? ORDER BY idu   # Tagesbericht Gesundheit — r   z/Keine neuen strukturierten Tagesdaten gefunden.u   ## Ernährungc                f    g | ].}d |d         pd d|d          |d         rd|d          ndz   /S )- mahlzeitMahlzeit: beschreibungwirkungu    → r   rC   r   r;  s     r;   r   z)generate_daily_report.<locals>.<listcomp>  s      %^  %^  %^  UV%\!J-*E:%\%\>IZ%\%\z{  }F  {G  aO`vhijsht`v`v`v  MO  &P  %^  %^  %^r=   z## Symptomec                <    g | ]}d |d          d|d         pd dS )r  symptomz (
schwergradzn/a)rC   r  s     r;   r   z)generate_daily_report.<locals>.<listcomp>  s:    "a"a"aXY#S)#S#S,8P5#S#S#S"a"a"ar=   z## Tagebuch / Gesundheitsdatenc           	     L    g | ]!}d |d          d|d          d|d         pd "S )r  kategorir  titelu    — inhaltr   rC   r  s     r;   r   z)generate_daily_report.<locals>.<listcomp>  sG    5}5}5}uv6p1Z=6p6pAgJ6p6p]^_g]h]nln6p6p5}5}5}r=   )u   ## Nächste sinnvolle Schritteu1   - Offene Korrektur-XLSX prüfen, falls vorhanden.zM- Bei neuen Labor-/Befunddokumenten Verarbeitung abwarten und Freigabe geben.
r   r    fINSERT INTO report_runs(report_type, period_start, period_end, output_path, summary) VALUES(?,?,?,?,?)dailyzTagesbericht generiert)r   r   todayr   r   r|   r7  r8  r9  any
write_textjoinr   rJ  )r  r   r{   erntbsymliness          r;   generate_daily_reportr    s   MMM

)''))C@w!@!@!@!@@FA199ux{w}~~!))jmplrsstt199psvrxyyzz									3c33R8ER~ ECDD
 c/  c  %^  %^  Z]  %^  %^  %^  c  `b  c  	c
 g-f"a"a]`"a"a"afceff	 C2  C5}5}z|5}5}5}  C  @B  C  	C	  v  v  v  vE
dii&&999A		  C  FM  OR  TW  Y\  ]c  Yd  Yd  f~  E  @  @  @  BC  BJ  BJ  BL  BL  BL  NO  NU  NU  NW  NW  NWMs   A,C C,end_dayc                   t                       | r't          j        | d                                          nt          j                    }|t          d          z
  }|p4t          d|                                 d|                                 dz  }t                      }	 |	                    d|                                |                                f          
                                d         }|	                    d	|                                |                                f          
                                d         }|	                    d
|                                |                                f          
                                d         }|	                    d          
                                d         }|                                 n# |                                 w xY wd|                                 d|                                 ddd| d| d| d| ddddddddg}	|                    d                    |	          d           t                      }|	                    dd|                                |                                t          |          df           |                                 |                                 |S ) Nr      )daysweekly_health_report_r   r  zGSELECT count(*) FROM dokumente WHERE date(upload_datum) BETWEEN ? AND ?r   z;SELECT count(*) FROM ernaehrung WHERE datum BETWEEN ? AND ?z9SELECT count(*) FROM symptome WHERE datum BETWEEN ? AND ?rd  u   # Wochenbericht Gesundheit — z bis r   z## Zusammenfassungz- Neue/registrierte Dokumente: u   - Ernährungseinträge: u   - Symptomeinträge: z- Offene Labor-Korrekturen: u   ## Einschätzunguu   - Korrelationen werden belastbarer, sobald YAZIO-/Wearable-Daten täglich vollständig und Laborwerte validiert sind.u   - Auffälligkeiten sollten als Musterhinweise verstanden und bei medizinischer Relevanz mit Ärztinnen/Ärzten besprochen werden.z## Offene Aktionenz<- Dokumente ohne Volltext weiter mit Docling nachbearbeiten.uB   - Korrektur-XLSX prüfen und danach Freigabe zur Übernahme geben.r  r   r    r  weeklyzWochenbericht generiert)r   r   r   r   r  r   r   r   r|   r8  rI  r9  r  r  r   rJ  )
r  r   endstartr{   docsr  r  reviewsr  s
             r;   generate_weekly_reportr    s   MMM;B
T(
GZ
0
0
5
5
7
7
7
C)####Eaw!a9J9J!a!aS]]__!a!a!aaFAyybejetetevevx{  yF  yF  yH  yH  eI  J  J  S  S  U  U  VW  XiiUX]XgXgXiXiknkxkxkzkzW{||  F  F  H  H  IJ  KiiSV[VeVeVgVgilivivixixUyzz  D  D  F  F  GH  I))stt}}  AB  C									S%//*;*;SS#--//SSUWFFFHhcfHhHh  kG  BE  kG  kG  Iq  ho  Iq  Iq  su  T  VY  []\  _c	E dii&&999A		  C  FN  PU  P_  P_  Pa  Pa  cf  cp  cp  cr  cr  tw  x~  t  t  AZ  E[  \  \  \  ^_  ^f  ^f  ^h  ^h  ^h  jk  jq  jq  js  js  jsMs   $D)G" "G8c                    t                       t                      } d}	 t                                          D ]P}|                                r|j                            d          r2|j                                        }|dvrP|dv rdnd}|dk    rd}|j                                        t          fdd	D                       rd
nt          fddD                       rdnd}| 
                    dt          |          |j        f                                          }|r| 
                    d|j        t          |          |t          |                                j        dz            d|ddf           |dz  }R|                                  |                                  n# |                                  w xY w|S )Nr   r   >   .pdf.jpg.png.jpegr/  >   r  r  r  imagepdfr/  c              3      K   | ]}|v V  	d S ru   rC   r   xname_ls     r;   r	  z'register_inbox_files.<locals>.<genexpr>  s'      %k%kaa6k%k%k%k%k%k%kr=   )laborblutchemiehaematu   hämatLABORc              3      K   | ]}|v V  	d S ru   rC   r  s     r;   r	  z'register_inbox_files.<locals>.<genexpr>  s[        Bb  Bb  ST  CD  HN  CN  Bb  Bb  Bb  Bb  Bb  Bbr=   )befundberichtmrictultraschallu   röntgenroentgenBEFUNDE	SONSTIGESz:SELECT id FROM dokumente WHERE dateipfad=? OR datei_name=?zINSERT INTO dokumente(datei_name,dateipfad,daten_typ,groessekbytes,status,kategorie,quelle,review_status) VALUES(?,?,?,?,?,?,?,?)i   neur   nicht_geprueftr   )r   r|   r   iterdirr,   r   r2   suffixr   r  r8  r   rI  r   r.   st_sizerJ  r9  )r{   rN  r   ext	data_typerj   r   r  s          @r;   register_inbox_filesr    s   MMMAE 	 	A99;; !&"3"3C"8"8 (..""CDDD#&*C#C#CIg~~!	V\\^^F"%%k%k%k%k;j%k%k%k"k"k  sww  B  Bb  Bb  Bb  Bb  Xa  Bb  Bb  Bb  b  b  rsqzqz  hsHYY[^abc^d^dfgfl]mnnwwyyF II  Zvs1vvy#affhh6Ft6K2L2LeU]_fhxy{ { {QJEE	


									Ls   E?F5 5G	parent_idc           
        ddt           ddt          |           d|ddg
}t          j        |t	                      d	          }	 t          j        |          }|                    d
          p<|                    di                               d
          p|                                S # t          $ r |                                cY S w xY w)Ngogz-adriveupload--parentz--jsonz
--no-inputT)envr   rG  file)
ACCOUNTr   rn  check_outputrD   jsonloadsr)   r*   r   )r   r  cmdrf  datas        r;   
gog_uploadr    s    $(CIIz9V^`l
mC

!#7994
@
@
@Cz#xx~~N&"!5!5!9!9$!?!?N399;;N   yy{{s   A%B) )C
	C
c                 R   t          j                    } |                     dd          }|                    d           |                    d          }|                    d           |                    d           |                    d          }|                    d	           |                    d           |                    d
           |                    d           |                    d          }|                    dt
          d           |                    d          }|                    dt
          d           |                    d          }|                    d           |                    d          }|                    d           |                    d           |                    d          }|                    d           |                    dd           |                                 }	|	j        dk    rt          t                                 d S |	j        dk    r?t          t          |	j        |	j        rt          |	j                  nd                      d S |	j        dk    r9t          dt          t          |	j                  |	j                              d S |	j        d
k    rt          t                                 d S |	j        dk    rt          t!                                 d S |	j        dk    r#t          t#          |	j                             d S |	j        dk    rt'          |	j                   d S |	j        dk    r#t          t)          |	j                             d S |	j        dk    r#t          t-          |	j                             d S |	j        dk    r t          dt1                                  d S |	j        dk    r6t          t3          t          |	j                  |	j                             d S d S )Nr  T)destrM  zgenerate-lab-reportzexport-correctionz
--batch-idrw  zapply-correctionsxlsx	dashboardzdashboard-v4zdashboard-v5r{  )typerM  correlationszdaily-reportz--datezweekly-reportz
--end-datezregister-inboxr  r   r  )rM  u   Übernommen: zRegistriert: )argparseArgumentParseradd_subparsers
add_parseradd_argumentr   
parse_argsr  printr*  r>  r+  r   rS  r  ru  rx  r|  ry  r~  r  r   r  end_dater  r  r   parent)
apsubp_corrp_applyp_dashboard_v5p_correlationsp_dayp_weekp_uploadargss
             r;   mainr    s   		 	"	"B




6
6CNN()))^^/00F&2E2El2S2S2SU[UhUhisUtUtUtnn011G73G3G3O3O3OQXQeQefrQsQsQsNN;NN>"""^^N33NTDAAA^^N33NTDAAANN>**EE,>,>x,H,H,H^^O,,Ff.A.A,.O.O.ONN#$$$~~h''H)>)>v)F)F)FH]H]^hswH]HxHxHx==??Dx(((!##$$$$$	(	(	($T]4^D4E4E4EZ^__`````	(	(	(Q/TYOOQQRRRRR	[	 	  ""#####	^	#	##%%&&&&&	^	#	##DG,,-----	^	#	#(11111	^	#	##DI../////	_	$	$$T]3344444	%	%	%62446677777	X		jdi$+6677777 
	r=   __main__)r   r   )r   r>   )r   rs   )r   r}   )r4   r	   r   rl   )r   rl   r   r   )r   r   ru   )r   r   r   r   )r   r   r   r   )r   )r   r	   r   r   r   r}   )r   r   r   r   r   r   r   )r+  rl   r   r   r   r   r   r   )r   r   r+  rl   r   r   )rT  )rU  r   r   rV  )r   rY  )r   r   r   r   )ry  r   r   r   r   r   )ry  r   r   r}   )NN)r  rl   r   r   r   r   )r  rl   r   r   r   r   )r   r   )r   r   r  r   r   r   )L__doc__
__future__r   r  csvhtmlr  r'   r   shutilrv   rn  rq  uuiddataclassesr   r   r   r   pathlibr   typingr	   r
   openpyxlr   r   openpyxl.stylesr   r   r   r   r   openpyxl.utilsr   r   
expanduserro  rx   r   r   r   r   r   r   r  rB   r+   r<   rD   r   r6  ri   r|   r   r   r   r   r   r   r   r*  r>  rS  rX  rh  ru  rx  r|  r~  r  r  r  r  r  ro   rC   r=   r;   <module>r     s    # " " " " "  



   				 				       



  ! ! ! ! ! ! . . . . . . . . . .                        , , , , , , , , F F F F F F F F F F F F F F , , , , , ,tBG<==>>	w

]"]"EE	//88},/UU 
 $y(947HHL L L L,                  - - - -
   &   &$ $ $ $! ! ! ! !H- - - -
5 
5 
5 
5 
5 (/1J'Jbf " " " " "J    D& & & & &R    
 
 
 
 '.0G&G 
 
 
 
 
 *13M)M      77    O O O O    4    0   8   '8 '8 '8 '8T zDFFFFF r=   