
    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jF                  jI                  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/d9dZ0d:dZ1h dZ2g dZ3e G d d             Z4d;dZ5d<dZ6d=d Z7d>d!Z8d?d"Z9d@dAd#Z:dBd$Z;dCdDd%Z<e(d&z  dfdEd'Z=dFdGd(Z>d@dHd)Z?dIdJd*Z@dKd+ZAe(d,z  fdLd-ZBe(d.z  fdLd/ZCe(d0z  f	 	 	 	 	 dMd1ZDdNd2ZEdOdPd3ZFdOdQd4ZGdRd5ZHdSd6ZId<d7ZJeKd8k(  r eJ        yy)Ta'  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.envc                    t         j                  j                  dd      j                         } | r| S t        j                         st        dt               t        j                         j                  dz  rt        dt               t        j                  d      j                         D ]  }|j                         }|r|j                  d      r'|j                  d	      r|d
d  j                         }|j                  d      \  }}}|sc|j                         dk(  sw|j                         j                  d      j                  d      }|s|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:   JJNN126<<>E!!#J>JZ[\\$$u,L^L\]^^",,g,>IIK 
~~ts+??9%8>>#D"nnS1S)399;"88__&,,S177<F
 9.9IJ
KK    c                     i t         j                  t        t        j                               t        t        j                         dz        t               dS )Nz.config)HOMEXDG_CONFIG_HOMEr   )r%   r&   strr   homer:    r;   r9   gog_envrB   L   sD    
**DIIK tyy{Y6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                  N    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	<   y)
LabValuer?   category	parameter
str | None	referencer   r2   Nunit)__name__
__module____qualname____annotations__rl   rA   r;   r9   rg   rg   d   s&    MN
IJD*r;   rg   c                 b    t        j                  t              } t         j                  | _        | S N)sqlite3connectDBRowrow_factory)cs    r9   connry   n   s     AKKAMHr;   c                 `    t         t        t        t        fD ]  } | j	                  dd        y )NT)parentsexist_ok)REPORTSCORRECTIONSINBOXATTACHMENTSmkdir)ps    r9   ensure_dirsr   t   s*    {E;7 -	t,-r;   c                   | | dk(  ry t        | t              r| j                         j                         S t        | t              r| j                         S t	        |       j                         }dD ]6  }	 t        j                  ||      j                         j                         c S  t        j                  d|      }|r7|j                  d       d|j                  d       d|j                  d       S |S # t        $ r Y w xY w)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)r2   textfmtms       r9   normalize_dater   y   s    }%"zz|%%''%  u:D? 	$$T3/446@@BB
 			8$?A''!*Qqwwqzl!AGGAJ<88K  		s   61C<<	DDc                @   | syt        |       j                         }d }t        j                  d|      }t        j                  d|      }|r|j                  d      j                         }d|v r9t        |      dk\  r+|d   j                  dd	      |d   j                  dd	      |fS |j                         j                  d
      r|rd |d   j                  dd	      |fS |j                         j                  d      r|r|d   j                  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replacer0   )refr   rl   numsm_units        r9   split_referencer      s   s8>>DD::-t4DYYKTRF||A$$&
d{s4yA~AwsC($q'//#s*CTIIzz|s#T!W__S#.44zz|s#AwsC($44tr;   c                     t         D  cg c]  } | j                         s|  }} |st        S dd}t        ||      S c c} w )Nc                    	 t        | dd      }||j                  d      }t        |j                  xs d      | j	                         j
                  fS # t        $ r d| j	                         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      r9   scorez"best_reference_xlsx.<locals>.score   ss    	*qETBBBMM!$%B*+QVVX->->?? 	*qvvx(())	*s   AA %A=<A=r5   )r   r   returnztuple[int, float])REFERENCE_CANDIDATESexistsREFERENCE_XLSXmax)r   existingr   s      r9   best_reference_xlsxr      s?    />a188:>H>* xU## ?s   >>c                   | 
t               } | j                         st        |       t        | d      }||j                  d      }i }t        d|j                  dz         D ]/  }t        |j                  d|      j                        }|s+|||<   1 g }d}t        d|j                  dz         D ]  }|j                  |d      j                  }	|	t        |	      j                         dk(  r?t        |	      j                         }
|D cg c]=  }|j                  ||      j                  d	vs"|j                  ||      j                  ? }}|j                  |d      j                  }|
t        v r|s|s|
}|st        |rt        |      nd       \  }}}|j                         D ]  \  }}|j                  ||      j                  }|t        |      j                         dk(  rA|j!                  t#        ||
|rt        |      j                         nd |t        |      j                         |               |S c c}w )
NTr   r   r   r   rU   r   r   Nr   )r   r   FileNotFoundErrorr   r   ranger   r   cellr2   max_rowr?   r(   CATEGORY_NAMESr   itemsappendrg   )pathr   r   datescoldvaluesrh   rownamename_srx   non_empty_date_valuesr   _rl   vals                    r9   parse_reference_xlsxr      s   |"$;;=%%	tt	,B	BMM!	BEQ)* 2771c?001E#J  FHQ

Q' twwsA$$<3t9??,2T"@E q1QTVWI^I^fpIpa!6!6 q qggc1o##^#C8MH$$SX$?
1dkkm 	tFC''#s#))C{c#hnn."4MM(8VSX^^5ERVXY[^_b[c[i[i[kmqrs		tt& M !rs   #I1Ic                  	 t        | D ch c]  }|j                   c}      }i i }i }| D ][  }|j                  |j                  <   |j                  r|j                  ||j                  <   |||j                  |j                  f<   ] t        t              D ci c]  \  }}||
 c}}	t        	fd      }||||fS c c}w c c}}w )Nc                    j                  j                  | d      d      j                  | d      | j                         fS )NrU   i  r   )r'   lower)r   catsorders    r9   <lambda>z get_lab_matrix.<locals>.<lambda>   s>    488A{3KS)QSWS[S[\]_aSbdedkdkdm(n r;   r   )sortedr   rh   ri   rk   	enumerater   )
r   vr   refsmatrixirx   paramsr   r   s
           @@r9   get_lab_matrixr      s    F+qAFF+,EDD.0F *JJQ[[;; !D()QVV$%	*
 (78daQT8EDnoF&&$,, , 9s   CCc                   || _         | j                  | j                  _        t	        d| j
                  dz         D ]  }t        |      }d}t	        dt        | j                  d      dz         D ]L  }| j                  ||      j                  }|"t        |t        dt        t        |            dz               }N || j                  |   _         y )Nr   
   P   -   r   )freeze_panes
dimensionsauto_filterr   r   r   r   minr   r   r2   r   r   r?   column_dimensionswidth)r   freezer   lettermax_lenr   r   s          r9   style_sheetr      s    BOBNNQ)* 5"3'C

B/!34 	CC''#s#))Cgs2s3s8}q/@'AB	C .5V$*5r;   zaktuelle_blutwerte.xlsxc                "   t                t        |      }t        |      \  }}}}}t               }|j                  }	d|	_        t        dd      }
t        dd      }t        dd      }t        dd      }t        d	 t        d
      D         }|	j                  ddg|z          |	d   D ])  }|
|_        ||_        t        dd      |_        ||_        + d}d }|D ]+  }|j!                  |d      }||k7  rt|	j                  |gd gt#        |      dz   z  z          |	j%                  |d|t#        |      dz          |	j'                  |d      }||_        ||_        ||_        |}|dz  }|	j                  ||j!                  |d      g|D cg c]4  }|j!                  ||f      r|j!                  ||f      j(                  nd 6 c}z          |	|   D ],  }||_        t        |j*                  dkD  rdndd      |_        . |dz  }. d|	j,                  d   _        d|	j,                  d   _        t        dt#        |      dz         D ]  }d|	j,                  t1        |         _        ! t3        |	       |j5                  |        | S c c}w )NzAktuelle Blutwertesolid1F4E78fgColorFFFFFFTcolorboldD9EAF7c              3  6   K   | ]  }t        d d        yw)thinBFBFBF)styler   N)r   ).0r   s     r9   	<genexpr>z&generate_lab_report.<locals>.<genexpr>   s     KQdx88Ks      	ParameterReferenzbereichr   center)
horizontal	wrap_textr   rU   )	start_rowstart_columnend_row
end_columnr   left*   A   Br      )r   r   r   r   activetitler   r   r   r   r   fillfontr   	alignmentborderr'   r   merge_cellsr   r2   columnr   r   r   r   save)outputsourcer   r   r   r   r   r   r   r   header_fillheader_fontcat_fillcat_fontr  r   r   current_catr   catrx   r   r   s                          r9   generate_lab_reportr     s   M!&)F(6v(>%E664	B	B#BHgx8KXD1K7H5H(.HK%(KLFII{-.671 P	[9`htxKy$.  JP{  |GP
CK 
hhq+&+IIsetfE
Q778NNSq#RUV[R\]^R^N_QA(XAFRXqxKsaxs
		1dhhq"o&lq)rghfjjRSUVQWFX&**aV*<*B*B^b*b)rrsC 	xAAHYahhYZl(`frv-wq{	xq
 ')B#&(B#QE
1% @=?.s34:@OGGFOM *ss   9Jc                   t                | s&dt        j                         j                  d      z   } |t        d|  dz  }t               }|j                  }d|_        |j                  t               t               }g }	 t        |j                  d| f            }|j                          |re|D ]_  }|d   xs |d	   xs |d
   }|j                  |d   |d   |d   |d
   |d	   ||d   |d   |d   |d   |d   |d   |d   |d   |d   g       a n|xs
 t               }	t        |	      D ]r  }
|j                  d|
j                   |
j"                  |
j$                  d|
j$                  |
j&                  |
j(                  |
j*                  ddd|	j,                  ddg       t t/        dd      }t1        dd      }|d    D ]  }||_        ||_         t7        |d!"       |j9                  |       |S # |j                          w xY w)#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[   rZ   rW   rX   rY   r]   r^   r_   r`   ra   rb   rc   rd   re   	validiertg      ?zReferenz-XLSXr   7030A0r   r   Tr   r   A2)r   )r   r   nowstrftimer~   r   r  r	  r   REVIEW_HEADERSry   listexecutecloser   r   rh   ri   r2   rl   rk   r   r   r   r   r
  r  r   r  )batch_idr  r  r   r   rx   rowsrfinalsource_pathr   r  r  r   s                 r9   export_correction_xlsxr-    s   M(,,."9"9/"JJ~!6xjFF	B	B%BHIInADAII  D  GO  FQ  R  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 5 3 5%k2 	mAII{AJJQWWdAGGUVU[U[]^]h]hjkjpjprvx|  B  DO  DT  DT  VZ  \k  l  m	mgx8KXD1K1 9	[94 GGFOM 	
	s   G4 4Hc                   t        | d      }||j                  d      }|d   D cg c]3  }|j                  #t        |j                        j	                         nd5 }}t        |      D ci c]  \  }}||dz    }}}h d}	|	t        |      k  st        d|	t        |      z
         t               }d}
t        j                         j                  d	      }	 t        d
|j                  dz         D ]  }t        |j                  ||j                  dd            j                  xs d      j	                         j!                         }|dv r^|j                  ||d         j                  }|j                  ||d         j                  xs/ |j                  ||j                  d|d               j                  }t#        |j                  ||d         j                        }|r|dv s|s|j                  d      r,|j                  ||j                  dd            j                  nd}|j                  d      r,|j                  ||j                  dd            j                  nd}t%        |rt        |      nd      \  }}}|j                  d      r,|j                  ||j                  dd            j                  n| j&                  }|j)                  dt        |      ||f      j+                         }|r>|j)                  dt        |      ||||rt        |      ndt        |      |||d   f	       nS|j)                  dt        |      t        |      t        |      |||||rt        |      nd|||dd t        |      |f       |
dz  }
 |j-                          |j/                          |
S c c}w c c}}w # |j/                          w xY w)zNRead reviewed correction workbook and upsert validated values into laborwerte.Tr   r   r   Nr   >   r\   r_   rY   zMissing required columns: z%Y-%m-%d %H:%M:%Sr   rW   r  >   	   gelöschtreject	abgelehnt	geloeschtrY   r\   r[   r_   r   r]   r^   rc   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   r2   r?   r(   r   setr   ry   r   r"  r#  r   r   r   r'   r   r   r   r   r&  fetchonecommitr'  )r   r(  r   r   rx   headersr   hidxrequiredcountr"  r   rW   paramr2   abnahmer]   r   rminrmaxr   rc   r   s                           r9   apply_correctionsr@  4  s   	tt	,B	BMM!	BLNqERqqww':s177|!!#BRGR )' 2
311a!e8
3C
3@Hs3x5hS6I5JKLLAE
,,.
!
!"5
6CBJJN+ 	Ccggh&:;AAP[QWWY__aFJJGGC%5!67==EGGC\!2399~RWWS#''RcehiuevJw=x=~=~E$RWWS#o2F%G%M%MNGEZ/wCF779CUbggc3779a#89??[_GGJwwO`Ga"''#sww'8!<=CCgkC+CHFMD$ADARRWWS#''(A"67==X\XaXaFyy  "Q  TW  X]  T^  `g  ip  Sq  r  {  {  }H		  Tu:wdCHQUWZ[aWbdlnqs{  }A  tB  CD 		 \u:s5z3u:wdT[il]`ad]ervx{  ~E  GJ  KN  LN  GO  QT  U[  Q\  ^f  gh QJE+	, 	

		LE S
3@ 	
	s   8O/OKO Oc                    t               }	 t        |j                  d| f            |j                          S # |j                          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 ?)ry   r%  r&  r'  )limitrx   s     r9   latest_docsrC  ]  sJ    AAII  |  D  ~F  G  H			s	   8 A
c                 \   t               } 	 i }dD ]*  }| j                  d|       j                         d   ||<   , | j                  d      j                         d   |d<   | j                  d      j                         d   |d<   || j                          S # | j                          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)ry   r&  r5  r'  )rx   outtables      r9   	db_countsrR  e  s    A  Q 	RE%:5'#BCLLNqQCJ	R%&YY  0G  &H  &Q  &Q  &S  TU  &V!"ii(  A  J  J  L  MN  ON			s   A<B B+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  rX  scripts      r9   generate_dashboardr_  r  s9     I 88FJNNCNNCK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   NrT  zhealth_dashboard_v4.py--outputTrU  rW  r]  s      r9   generate_dashboard_v4rb    s@    I 88FJNNCNNCKS[IQUVMr;   zhealth_dashboard_v5.htmlc           
         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   NrT  zhealth_dashboard_v5.py--dbra  TrU  rW  )dbr  rX  r^  s       r9   generate_dashboard_v5rf    sO    
 I 88FJNN	Vfc"gz3v;O Mr;   c                    t         dz  dz  }t        j                  t        j                  t        |      dt        |       gd       y)zURefresh aggregate-only exploratory correlations for the explicitly selected database.rT  zmultimodal_correlations.pyrd  TrU  N)rY  rX  rZ  r[  r\  r?   )re  r^  s     r9    generate_multimodal_correlationsrh    s5    I <<FNNCNNCKRANr;   c                   t                | xs" t        j                         j                         } |xs t        d|  dz  }t               }	 t        |j                  d| f            }t        |j                  d| f            }t        |j                  d| f            }|j                          d|  dg}t        |||g      s|dgz  }|r8|d	g|D cg c]$  }d
|d   xs d d|d    |d   rd|d    ndz   & c}dz  }|r)|dg|D cg c]  }d
|d    d|d   xs d d c}dz  }|r.|dg|D cg c]  }d
|d    d|d    d|d   xs d  c}dz  }|g dz  }|j                  dj                  |      d       t               }|j                  d d!| | t        |      d"f       |j                          |j                          |S # |j                          w xY wc c}w c c}w c c}w )#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ährungz- mahlzeitMahlzeitz: beschreibungwirkungu    → z## Symptomesymptomz (
schwergradzn/a)z## Tagebuch / Gesundheitsdatenkategorititelu    — inhalt)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}   ry   r%  r&  r'  any
write_textjoinr?   r6  )dayr  rx   erntbsymlinesr*  s           r9   generate_daily_reportr    s   M

)'')C@w#7uC!@@FA199ux{w}~!))jmplrst199psvrxyz		-cU3R8ER~CDD
/  c  Z]  %^  UVr!J-*E:)Fb>IZH[%\z{  }F  {Gbghijshtgu`v  MO  &P  %^  c  `b  c  	c
-f]`"aXYR)~R,8P57QQR#S"afceff	2  Cz|5}uv1Z=/AgJ<W\]^_g]h]nln\o6p5}  C  @B  C  	C	  v  vE
dii&9A		  C  FM  OR  TW  Y\  ]c  Yd  f~  E  @  BC  BJ  BJ  BL  NO  NU  NU  NWM 	
	
 %^"a5}s   AG )G+G0:G5G(c                   t                | r$t        j                  | d      j                         nt        j                         }|t        d      z
  }|xs, t        d|j                          d|j                          dz  }t               }	 |j                  d|j                         |j                         f      j                         d   }|j                  d	|j                         |j                         f      j                         d   }|j                  d
|j                         |j                         f      j                         d   }|j                  d      j                         d   }|j                          d|j                          d|j                          ddd| d| d| d| ddddddddg}	|j                  dj                  |	      d       t               }|j                  dd|j                         |j                         t        |      df       |j                          |j                          |S # |j                          w xY w) Nr      )daysweekly_health_report_r   rk  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 ?rN  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.rv  r   r   rw  weeklyzWochenbericht generiert)r   r   r   r   ry  r   r}   r   ry   r&  r5  r'  r{  r|  r?   r6  )
end_dayr  endstartrx   docsr~  r  reviewsr  s
             r9   generate_weekly_reportr    s   M;B(

GZ
0
5
5
7

C)##Eaw#89J8K1S]]_L]]`!aaFAyybejetetevx{  yF  yF  yH  eI  J  S  S  U  VW  XiiUX]XgXgXiknkxkxkzW{|  F  F  H  IJ  KiiSV[VeVeVgilivivixUyz  D  D  F  GH  I))st}}  AB  C		
)%//*;)<E#--/ARSUW ?vFJbcfbgHh  mA  BE  AF  kG  Kg  ho  gp  Iq  su  T  VY  []\  _c	E dii&9A		  C  FN  PU  P_  P_  Pa  cf  cp  cp  cr  tw  x~  t  AZ  E[  \  ^_  ^f  ^f  ^h  jk  jq  jq  jsM 	
	s   C%I Ic                 6   t                t               } d}	 t        j                         D ]3  }|j	                         r|j
                  j                  d      r0|j                  j                         }|dvrO|dv rdnd}|dk(  rd}|j
                  j                         t        fdd	D              rd
nt        fddD              rdnd}| j                  dt        |      |j
                  f      j                         }|r| j                  d|j
                  t        |      |t        |j                         j                  dz        d|ddf       |dz  }6 | j!                          | j#                          |S # | j#                          w xY w)Nr   r   >   .pdf.jpg.png.jpegr  >   r  r  r  imagepdfr  c              3  &   K   | ]  }|v  
 y wrr   rA   r   xname_ls     r9   r   z'register_inbox_files.<locals>.<genexpr>  s     %kaa6k%k   )laborblutchemiehaematu   hämatLABORc              3  &   K   | ]  }|v  
 y wrr   rA   r  s     r9   r   z'register_inbox_files.<locals>.<genexpr>  s1       Bb  ST  CD  HN  CN  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   ry   r   iterdirr*   r   r0   suffixr   rz  r&  r?   r5  r   r,   st_sizer6  r'  )rx   r;  r   ext	data_typerh   r   r  s          @r9   register_inbox_filesr    s{   MAE 	A99;!&&"3"3C"8((.."CDD#&*C#CIg~!	VV\\^F"%%k;j%k"kw  B  Bb  Xa  Bb  bqz  hsHYY[^abc^dfgflfl]mnwwyFII  Zvvs1vy#affh6F6Ft6K2LeU]_fhxy{QJE!	" 	

		L 	
	s   EF Fc           
     j   ddt         ddt        |       d|ddg
}t        j                  |t	               d	      }	 t        j                  |      }|j                  d
      xs3 |j                  di       j                  d
      xs |j                         S # t        $ r |j                         cY S w xY w)Ngogz-adriveupload--parentz--jsonz
--no-inputT)envr   r3  file)
ACCOUNTr?   rX  check_outputrB   jsonloadsr'   r(   r   )r   	parent_idcmdrP  datas        r9   
gog_uploadr    s    $(CIz9V^`l
mC

!
!#794
@Czz#xx~N&"!5!9!9$!?N399;N yy{s   AB B21B2c                    t        j                         } | j                  dd      }|j                  d       |j                  d      }|j	                  d       |j	                  d       |j                  d      }|j	                  d	       |j	                  d       |j                  d
       |j                  d       |j                  d      }|j	                  dt
        d       |j                  d      }|j	                  dt
        d       |j                  d      }|j	                  d       |j                  d      }|j	                  d       |j                  d       |j                  d      }|j	                  d       |j	                  dd       | j                         }	|	j                  dk(  rt        t                      y |	j                  dk(  rJt        t        |	j                  |	j                  rt        |	j                                     y d              y |	j                  dk(  r6t        dt        t        |	j                        |	j                                y |	j                  d
k(  rt        t                      y |	j                  dk(  rt        t!                      y |	j                  dk(  rt        t#        |	j$                               y |	j                  dk(  rt'        |	j$                         y |	j                  dk(  rt        t)        |	j*                               y |	j                  dk(  rt        t-        |	j.                               y |	j                  dk(  rt        dt1                       y |	j                  dk(  r3t        t3        t        |	j4                        |	j6                               y y )Nr  T)destr:  zgenerate-lab-reportzexport-correctionz
--batch-idra  zapply-correctionsxlsx	dashboardzdashboard-v4zdashboard-v5rd  )typer:  correlationszdaily-reportz--datezweekly-reportz
--end-datezregister-inboxr  r   r  )r:  u   Übernommen: zRegistriert: )argparseArgumentParseradd_subparsers
add_parseradd_argumentr   
parse_argsr  printr  r-  r(  r  r@  r  r_  rb  rf  re  rh  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
             r9   mainr    s   		 	 	"B




6CNN()^^/0F&2E2El2SU[UhUhisUtnn01G73G3G3OQXQeQefrQsNN;NN>"^^N3NTDA^^N3NTDANN>*EE,>,>x,H^^O,Ff.A.A,.ONN#$~~h'H)>)>v)FH]H]^hswH]Hx==?Dxx((!#$	(	($T]]D4E_`Z^_`	(	(/TYYOPQR	[	  "#	^	##%&	^	##DGG,-	^	#(1	^	##DII./	_	$$T]]34	%	%24567	X	jdii$++67 
r;   __main__)r   r?   )r   zdict[str, str])r   zsqlite3.Connection)r   None)r2   r	   r   rj   )r   rj   r   z)tuple[str | None, str | None, str | None])r   r   rr   )r   Path | Noner   list[LabValue])r   r  r   z\tuple[list[str], list[str], dict[tuple[str, str], LabValue], dict[str, str], dict[str, str]])C2)r   r	   r   r?   r   r  )r  r   r  r  r   r   r   )r(  rj   r  r  r  r  r   r   )r   r   r(  rj   r   r   )   )rB  r   r   zlist[sqlite3.Row])r   zdict[str, Any])r  r   r   r   )re  r   r  r   r   r   )re  r   r   r  )NN)r}  rj   r  r  r   r   )r  rj   r  r  r   r   )r   r   )r   r   r  r?   r   r?   )L__doc__
__future__r   r  csvhtmlr  r%   r   shutilrs   rX  r[  uuiddataclassesr   r   r   r   pathlibr   typingr	   r
   openpyxlr   r   openpyxl.stylesr   r   r   r   r   openpyxl.utilsr   r   
expanduserrY  ru   r   r}   r~   r   r   r   r  r@   r)   r:   rB   r   r$  rg   ry   r   r   r   r   r   r   r   r  r-  r@  rC  rR  r_  rb  rf  rh  r  r  r  r  r  rm   rA   r;   r9   <module>r     s   #  
   	 	    
  ! . .     , F F ,BGG<=>	w

]"]"EE	//88},/UU 
 $y(947HHL,   -
&&$!H-
5 (/1J'Jbf "JD&R
 '.0G&G 
 *13M)M  77 
O408'8T zF r;   