
    j:N             
         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ZddlmZmZ ddlmZ ddlmZ ddlmZ 	 ddlmZ dd	lmZ dd
lmZ ddlmZmZ  ddl!m"Z"m#Z$ ddl%m&Z& ddl'm#Z(m)Z) ddl*m+Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z7m#Z8 ddl9m6Z:m#Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZH ddlIm6ZJm#ZK ddlLm#ZM ddlNmOZOmPZPmQZQmRZRmSZSmTZT ddlUmVZVmWZWmXZXmYZY ddlZm[Z[ ddl\m]Z^m_Z_m`ZambZbmcZd n# ee$ r ejf        g                    d eh eei          j                                jk                             ddlmZ dd	lmZ dd
lmZ ddlmZmZ  ddl!m"Z"m#Z$ ddl%m&Z& ddl'm#Z(m)Z) ddl*m+Z,m-Z- ddl.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 ddl5m6Z7m#Z8 ddl9m6Z:m#Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZH ddlIm6ZJm#ZK ddlLm#ZM ddlNmOZOmPZPmQZQmRZRmSZSmTZT ddlUmVZVmWZWmXZXmYZY ddlZm[Z[ ddl\m]Z^m_Z_m`ZambZbmcZd Y nw xY w ejl                    dz  dz  dz  Zmemdz  j                                Znejo        p                    d          r( eejo        d                   j                                ndZq eejo        p                    d ehemd z  d!z                                j                                Zr eejo        p                    d" ehemd#z  d$z                                j                                Zs eejo        p                    d% ehemd z  d&z                                j                                Zt eejo        p                    d' ehemd z  d(z                                j                                Zu eejo        p                    d) ehemd#z  d*z                                j                                Zv eejo        p                    d+ ehemd,z  d-z                                j                                Zwejo        p                    d.          r( eejo        d.                   j                                ndZx eei          j                                jk        Zyeyd/z  Zzeyd0z  Z{eyd1z  Z|d2Z} ej~        d3          Z ed4          Zd5Zd6Z eeeh          Z eh d7          Z eh d8          Z eh d9          Z eh d:          Zd;Zdd@Z eejo        p                    dA                    ZddCZddFZddGZddJZdKdLddQZddRZddSZddTZddXZddZZdd]ZddbZdddZddiZddkZdldmdmdmdmdmdmdmdndo	ZddtZdduZddyZddzZdd|Zdd}Zdd~ZddZddZddZddZddZ	 dddZddZddZddZddZddZddZddZddZ	 dddZddZddZddZedk    r e e                      dS )zLConsume locally queued Dashboard actions outside the network-facing service.    )annotationsN)datedatetime)Path)Any)ZoneInfo)REQUIRED_PATIENT_ACTION_COLUMNS)assert_supplement_schema)validate_supplement_payload)TRANSITIONSvalidate_action)METHOD_VERSIONassert_schema)validate_capture_payload)r   bind_verified_hyrimoz_preset)ACTION_CONTRACT_VERSIONSresolve_action_preview)cleanup_expiredpromote_attachment)	MediaInfocreate_safe_derivativesmedia_runtime_self_test)apply_schemar   )
CANDIDATE_ID_REID_RETOKEN_REcandidate_rowsextract_pagesload_quarantineopen_quarantine_sourcenormalize_search_textsection_similarityvalidate_metadata)probe_original)r   )canonical_lab_pairnormalize_parameternormalize_unitnormalize_valuereconcile_documentstransfer_preview)QUALITATIVEcandidate_catalog_matchexplicit_candidate_datepreview_revision_digest)LAB_CATALOG_SPECS)aggressive_identityassignment_evidence_tokenexact_identityresolve_catalog_assignmentresolve_groupz.hermesassets
Gesundheitzhealth_data.dbHEALTH_DASHBOARD_DBHEALTH_DASHBOARD_ACTION_INBOXruntimezdashboard-actionsHEALTH_DASHBOARD_CAPTURE_MEDIAzprivate-mediacapture#HEALTH_DASHBOARD_CAPTURE_QUARANTINEzcapture-quarantine$HEALTH_DASHBOARD_DOCUMENT_QUARANTINEzdocument-quarantine!HEALTH_DASHBOARD_DOCUMENT_STORAGE	documentsHEALTH_DASHBOARD_FILEreportszhealth_dashboard_v4.htmlHEALTH_DASHBOARD_V5_FILEzhealth_symptom_quick_add.pyzhealth_dashboard_v4.pyzhealth_dashboard_v5.py)aphthengifatigueskineyesjointsvascularz[0-9a-f]{32}\.jsonzEurope/Zurichdefaultzhealth-record-6e>   deferassignignorereopenconflict	composite
irrelevantnot_assignable>   lowhighmedium>   local_aliasmanual_reviewsighi_referenceingredient_label>   unclearunknowndocumented_tolerateddocumented_not_toleratedsighi_mapping_load_v2raw
str | Nonereturnstrc                X    | | dk    rt           n| }|t          vrt          d          |S )zHReturn the one allowed regeneration profile or fail before any mutation.N z#invalid HEALTH_DASHBOARD_V5_PROFILE)V5_PROFILE_DEFAULTALLOWED_V5_PROFILESRuntimeError)r_   values     O/home/agent/.hermes/assets/Gesundheit/scripts/health_dashboard_action_worker.pyparse_v5_profilerj      s9    "%+E'''@AAAL    HEALTH_DASHBOARD_V5_PROFILEr   c                 X    t          j        t                                                    S N)r   nowLOCAL_TIMEZONEr    rk   ri   local_todayrr      s    <'',,...rk   payloaddict[str, Any]c                t   t          |           h dk    rt          d          | d         dk    s| d         dk    rt          d          	 t          j        | d                   }n)# t          t          f$ r}t          d	          |d }~ww xY w|j        d
k     s|t                      k    rt          d          | d         t          t                    r%t                    t          t                    k    rt          d          t          fdt          D                       rt          d          | d         }t          |t                    rt          |          dk    rt          d          dd|                                fdt          D             |                                dS )N>   r   notesactionscoresversioninvalid payload shapery      rw   symptom_checkinunsupported actionr   zinvalid date  zdate outside allowed rangerx   zincomplete scoresc              3  ~   K   | ]7}t          |                   t          up|         t          d           vV  8dS )   N)typeintrange.0fieldrx   s     ri   	<genexpr>z+validate_symptom_payload.<locals>.<genexpr>  s\         	VE]3&G&-uQxx*G     rk   invalid scorerv   ,  zinvalid notesc                "    i | ]}||         S rq   rq   r   s     ri   
<dictcomp>z,validate_symptom_payload.<locals>.<dictcomp>  s    <<<E5&-<<<rk   )ry   rw   r   rx   rv   )set
ValueErrorr   fromisoformat	TypeErroryearrr   
isinstancedictFIELDSanyrb   len	isoformatstrip)rs   dayexcrv   rx   s       @ri   validate_symptom_payloadr      s   
7||      0111yQ'("37H"H"H-...2 11z" 2 2 2((c12
x$#--5666XFfd## .s6{{c&kk'A'A,---
         * )))GEeS!! *SZZ#%5%5)))#<<<<V<<<  s   A) )B:B

Bc                v	   h d}t          |           |k    rt          d          | d         dk    s| d         dk    rt          d          | d         }| d	         }d
                    t          | d         pd                                                    }d
                    t          | d         pd                                                    }| d         }| d         }| d         }d
                    t          | d         pd                                                    }	d
                    t          | d         pd                                                    }
d
                    t          | d         pd                                                    }| d         }t          | d         pd          }d
                    t          | d         pd                                                    }| d         }| d         }| d         }t          |t                    rt          j        d|          st          d          t          |t                    rt          j        d|          st          d          t          |          t          us5t          |          t          usd|cxk    rdk    rn nd|cxk    rd k    sn t          d!          |t          vs|t          vs	|t          vrt          d"          d|d#fd$|d%fd&|	d'fd(|
d)fd|d*fd+|d#ffD ]K\  }}}t          |          |k    s t          j        d,|t          j                  rt          d-|           L|r|	r|
st          d.          |d/k    r6t          |          t          us|t!          d0          vrt          d1          t          |          t"          urt          d2          |t$          vrt          d3          |d4k    r|r|d/k    s|rt          d5          nc|d6k    r|d/k    s|st          d7          nE|d8k    r|d/k    s|s|rt          d9          n%|d:v r!|d/k    s|s
|s|d/k    s|rt          d;          i ddddd|d	|d|d|d|d|d|d|	d|
d|d|d|d|d|d|d|iS )<N>   notealiasrw   ry   decision	queue_key
confidencesighi_scoresource_labeltarget_countcanonical_foodmapping_methodsource_versiontarget_revisiontarget_day_countpersonal_tolerance_notepersonal_tolerance_statusingredient_review_requiredzinvalid mapping payload shapery      rw   nutrition_mappingr}   r   r    r   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   [0-9a-f]{32}zinvalid queue key[0-9a-f]{64}zinvalid mapping target revisionr{   i'  L  zinvalid mapping target countszinvalid mapping value   zcanonical foodx   zsource labelP   zsource version(   r   zpersonal tolerance note)[\x00-\x1f\x7f]|https?://|/|\\\\|\.hermeszinvalid z&required mapping documentation missingr[   r   r   zinvalid ingredient review flagz!invalid personal tolerance statusrL   z9assign requires canonical score without ingredient reviewrP   z6composite must stay unclassified for ingredient reviewrM   zignore must not classify>   rK   rN   rO   rQ   rR   z%review-state action must not classify)r   r   joinrb   splitr   re	fullmatchr   r   MAPPING_DECISIONSMAPPING_CONFIDENCEMAPPING_METHODSr   searchIr   boolPERSONAL_TOLERANCE_STATUSES)rs   requiredr   r   r   	canonicalscorer   methodr   r   r   ingredient_reviewtolerance_statustolerance_noter   r   r   
field_nametextmaximums                        ri   validate_mapping_payloadr     s     H( 7||x8999yQ'("37J"J"J-...z"H$IHHS)/R00668899EW%56<"==CCEEFFIM"E&J%&F88C 7 =2>>DDFFGGLXXc'*:";"ArBBHHJJKKN88C-2..446677D <=7#>?E2FFXXc'*C"D"JKKQQSSTTN/0O>*L12i%% .R\/9-U-U .,---os++ <2<Q`3a3a <:;;;\#%% !!,,L))))E)))))$,,,,,,,,8999(((J>P,P,PTZbqTqTq0111	%	9c*	r*	>2.	s	"NC8& 	6 	6!
D' t99w"),XZ^`b`d"e"e4
44555  C CN CABBB	tE{{#55eAhh9N9N)))d**9::::::<===8 	ZEY..2C.XYYY /	[	 	 I%6UVVV 	X		I.?7888 	T	T	TY     9,, - DEEE1% 	H 	Y	
 	 	) 	u 	j 	& 	 	. 	 	%&7 	$%5 	">  	?!" 	#$ 	,%  rk   rh   r   c                   t          | t                    st          d          	 t          j        |           }n"# t          $ r}t          d          |d }~ww xY w|j        A|j        dk     s6|                    t                    t          j	        t                    k    rt          d          |
                    d          S )Nzinvalid occurred_atr~   )tzinfominutestimespec)r   rb   r   r   r   r   r   replacerp   ro   r   )rh   parsedr   s      ri   _validate_occurred_atr     s    eS!! 0.///9'.. 9 9 9.//S89} FK$$6$6&..P^.:_:_bjbno}b~b~:~:~.///Y///s   ; 
AAAFr   r   r   r   r   c               (   t          | t                    st          d          d                    |                                           }|r|r3t          |          |k    s t          j        d|t          j                  rt          d          |S )Nzinvalid textr   r   	r   rb   r   r   r   r   r   r   r   )rh   r   r   cleaneds       ri   _payload_textr     s    eS!! )(((hhu{{}}%%G ) )S\\G%;%;ryIuw~  AC  AE  @F  @F%;(((Nrk   c                   |                      d          }|dk    rOh d}t          |           |k    sp|                      d          dk    sW|                      d          dvs@t          |                      d                    t          us| d         t	          d	          vrt          d
          | d         rt          | d                   nd}| d         }|1t          |          t          us|dk     s|dk    rt          d          d|t          | d                   | d         | d         ||t          | d         d| d         dk              t          | d         d          d	S |dk    rh d}t          |           |k    s0|                      d          dk    s|                      d          dvrt          d          d|t          | d                   | d         t          | d         dd           t          | d!         d"          t          | d#         d$          t          | d%         d&          t          | d         d          d'	S |d(k    rh d)}t          |           |k    s0|                      d          dk    s|                      d*          d+vrt          d,          | d-         }|6t          |          t          us|t	          d	          vrt          d.          d|t          | d                   | d*         t          | d         d/d           |t          | d         d          d0S t          d1          )2Nrw   symptom_event>	   labelrv   rw   ry   onset_atseverityoccurred_atsymptom_typeduration_minutesry   r{   r   >   rD   rG   rF   otherrH   aphthaerE   headacher   r   zinvalid symptom eventr   rd   r   r   i`'  zinvalid symptom durationr   r   r   r   r   rv   r   )	ry   rw   r   r   r   r   r   r   rv   medication_event>	   doseunitrv   routerw   ry   
event_typer   medication_namer   >   missed	correctedadministeredzinvalid medication eventr   r   Tr   r   r      r   <   )	ry   rw   r   r   r   r   r   r   rv   general_event>   r   rv   rw   ry   category	intensityr   r   >   heatr   stresstravel	infectionappointmentphysical_loadsleep_disruptionzinvalid general eventr   zinvalid event intensityd   )ry   rw   r   r   r   r   rv   zunsupported patient action)getr   r   r   r   r   r   r   )rs   rw   r   onsetdurationr   s         ri   validate_patient_payloadr     s   [[""F   F  F  Fw<<8##w{{9'='='B'BgkkR`FaFa  ju  Gu  Gu  y}  ~E  ~I  ~I  JT  ~U  ~U  yV  yV  ^a  ya  ya  el  mw  ex  @E  FG  @H  @H  eH  eH4555>Ej>QY%gj&9:::WY-.T(^^3%>%>(Q,,RZ]bRbRb7888?TU\]jUk?l?l  F  GU  V  dk  lv  dw  EJ  `h  s@  AH  IP  AQ  SU  `g  hv  `w  {B  `B  sC  sC  sC  N[  \c  dk  \l  nq  Nr  Nr  s  s  	s###zzzw<<8##w{{9'='='B'BgkkR^F_F_  hO  GO  GO7888?TU\]jUk?l?l  }D  EQ  }R  gt  u|  }N  uO  QT  _c  gd  gd  gd  n{  |C  DJ  |K  MO  nP  nP  Zg  ho  pv  hw  y{  Z|  Z|  GT  U\  ]d  Ue  gi  Gj  Gj  uB  CJ  KR  CS  UX  uY  uY  Z  Z  	Z  bbbw<<8##w{{9'='='B'BgkkR\F]F]  fL  GL  GL4555K(	 d9ooS&@&@IUZ[\U]U]D]D]6777?TU\]jUk?l?l  {B  CM  {N  Yf  gn  ov  gw  y|  GK  YL  YL  YL  [d  o|  }D  EL  }M  OR  oS  oS  T  T  	T
1
2
22rk   c           
        |                      d          }|dk    rt          |           h dk    s|                      d          dk    rt          d          | d         | d         }}t          |t                    r>t          j        |          r*t          |t                    rt          j        d	|          st          d          d|||t          | d
                   dS |dk    s|                      d          dk    rt          d          h d}ddh}|	                    |           rZt          |           	                    ||z            r5t          | d         t                    rt          j        | d                   st          d          | d         }|dvrt          d          | d         }t          |t                    rt          |          dk    rt          d          |dv r#t          j        |          st          d          |dv r$t          j        d|          st          d          ddd8d'} || d(         d)|d*v           }	 || d+         d,          }
 || d-         d.|d/k              }|                      d          }|                      d          }|4t          |          t          usd|cxk    rd0k    sn t          d1          |9t          |t                    rt          j        d	|          st          d2          |d3k    rt          | d
                   nt          d4d5d4d4d4d4d6          }d||| d         ||	|
||d7	}|||d<   |||d<   |S )9Nrw   document_import>   rw   sha256ry   metadataquarantine_tokenry   r{   zinvalid document importr  r  z[a-f0-9]{64}r  )ry   rw   r  r  r  document_reviewzunsupported document action>	   r   rh   rw   ry   r   r  	operation	target_iddocument_idexpected_candidate_revisionpreview_revisionr  zinvalid document reviewr  >
   page_reviewcontent_reviewcandidate_remapmetadata_revieworiginal_reviewtext_correctiondiscard_documentretry_extractioncandidate_decisioncandidate_transferr  @   zinvalid target   r  r  r  zinvalid candidate>   r
  r  zpage_[1-9][0-9]{0,2}zinvalid page targetFr   r_   r   r   r   r   r   ra   rb   c               (   t          | t                    st          d          d                    |                                           }|r|r3t          |          |k    s t          j        d|t          j                  rt          d          |S )Nzinvalid review textr   z'[\x00-\x1f\x7f]|https?://|\\\\|\.hermesr   )r_   r   r   cleans       ri   review_textz-validate_document_action.<locals>.review_text  s    #s##L:6K+L+L%L%% 	4U 	4s5zzG';';ryIsuz|~  }A  @B  @B';2333rk   rh   i  >   r  r  r  r   r   r   r   r  izinvalid candidate revisionzinvalid preview revisionr  rd   r   )document_datedocument_typeinstitutionpersonal_titleinvestigation_dayr   )	ry   rw   r  r  r  rh   r   r   r  )r_   r   r   r   r   r   ra   rb   )r   r   r   r   rb   r   r   r   r#   issubsetr   r   r   r   r   )rs   rw   tokendigestr   optionalr  targetr  rh   r   r   expected_revisionr	  r  results                   ri   validate_document_actionr%    s   [[""F"""w<<ZZZZZ^e^i^ijs^t^txy^y^y6777 23WX5Fv%%% 	8X-?-F-F 	8jY_adNeNe 	8momy  {J  LR  nS  nS 	86777Vuf`qry  {E  sF  aG  aG  H  H  	H"""gkk)&<&<&A&A6777nnnH-/ABHW%% 4S\\-B-B8hCV-W-W 4_ijqr  kA  CF  `G  `G 4  OT  O^  _f  gt  _u  Ov  Ov 42333$I  Q  Q  Q2333[!Ffc"" +c&kkB&6&6)***QQQZiZstzZ{Z{Q,---555blKbdj>k>k5.///@E       K($  GA  :A  B  B  BE;wv++D{7:.YJ^=^___H$ABB{{#566$$/@*A*A*L*LTUYjT{T{T{T{n{T{T{T{T{5666#Z8H#-N-N#VXVbcr  uE  WF  WF#34449BFW9W9W !4555]n  AC  T[  jl  ~@  UW  _a  pb  pb  ^c  ^cH6igVcNdqw  AF  NR  ^f  rz  {  {F$N_f-J&K#BRV,>%?Mrk   c                   t          | t                    st          d          |                     d          }|dv rt	          |           S |dk    rt          |           S |dk    rt          |           S |dk    rt          |           S |dv rt          |           S |dv rt          |           S |d	v rt          |           S t          d
          )Nrz   rw   >   r   r  r|   r   capture_entry   r   r   r      supplement_plansupplement_intake   observation_statusobservation_upsertobservation_checkinobservation_phase_upsertobservation_result_snapshotr}   )r   r   r   r   r%  r   r   r   r   r   validate_observation_action)rs   rw   s     ri   validate_payloadr3    s    gt$$ 20111[[""F777'000"""'000$$$'000  '000GGG'000999*7333    +7333
)
*
**rk   pairslist[tuple[str, object]]dict[str, object]c                J    i }| D ]\  }}||v rt          d          |||<   |S )Nzduplicate JSON key)r   )r4  r$  keyrh   s       ri   reject_duplicate_object_pairsr9    sB     "F  
U&==1222sMrk   Nonec                 .   t                               ddd           t                                           } t          j        | j                  r| j        t          j                    k    rt          d          t          j
        t           d           d S )N  Tmodeparentsexist_okz-action inbox is not a private owned directory)ACTION_INBOXmkdirlstatstatS_ISDIRst_modest_uidosgetuidOSErrorchmod)r  s    ri   ensure_private_inboxrL    s}    E4$???!!##H<()) GX_	-K-KEFFFH\5!!!!!rk   pathr   c                   t                               | j                  st          d          t	          j        | t          j        t          j        z            }	 t	          j        |          }t          j
        |j                  r9|j        t	          j                    k    st          j        |j                  dk    rt          d          |j        dk    rt          d          t	          j        |d          }t	          j        |           n# t	          j        |           w xY wt%          |          dk    rt          d          t'          t)          j        |                    d          t.          	                    S )
Nzinvalid filename  zinvalid action file permissionsi    zinvalid action filei   zaction too largeutf-8)object_pairs_hook)NAME_REr   namer   rH  openO_RDONLY
O_NOFOLLOWfstatrD  S_ISREGrF  rG  rI  S_IMODEst_sizereadcloser   r3  jsonloadsdecoder9  )rM  
descriptorr  r_   s       ri   load_actionra    sM   TY'' -+,,,r{R]:;;J8J''X-..	@")++--|H,--66>???d""2333gj$''

3xx$+,,,
3::g&&:WXXX  s   B$D D+r   rx   dict[str, int]rv   c                   t           t          d          t          j        t	          t
                    dt	          t                     d| d|g}t          D ]/}|                    d| t	          ||                   f           0t          j	        |dddd           t           t          k    rMt          j	        t          j        t	          t                    d	t	          t                    gdddd           d S d S )
NHEALTH_DASHBOARD_DB is required--dbz--datez--notesz--Tr   checktimeoutcapture_outputr   --output)DASHBOARD_DBrg   sys
executablerb   	QUICK_ADDr   extend
subprocessrunDEFAULT_DASHBOARD_DBDASHBOARD_V4DASHBOARD_FILE)r   rx   rv   commandr   s        ri   apply_symptom_actionrv  %  s    <===IL	G  ; ;Uc&-&8&89::::N7$DtTTTT+++^S..
C<O<OP	
 	
 	
 	
 	
 	
 ,+rk   normalized_namec                    d|                      d          z   }t          j        |                                          d d         S )Ns   health-nutrition-queue-v1:rP      )encodehashlibr  	hexdigest)rw  materials     ri   nutrition_queue_keyr~  ?  s?    ,/E/Eg/N/NNH>(##--//44rk   	max_scorer[   loadfloatc                    |rdS dS )Nr[   
classifiedrq   )r  r[   r  s      ri   _score_labelr  D  s     y<rk   float | Nonec                    	 t          |           }n# t          t          f$ r Y d S w xY w||k    r"|t          d          t          d          hvr|nd S )Ninfz-inf)r  r   r   )rh   numerics     ri   _public_numericr  J  sl    ,,z"   tt((WU5\\5QW==<Y-Y-Y77_ccs    ''kcalgmg)	zenergy.energyznutrient.proteinznutrient.carbznutrient.fatznutrient.fiberznutrient.sugarznutrient.saturatedznutrient.saltznutrient.sodium
connectionsqlite3.Connectionitem_ids	list[int]c                   |sdS d                     d |D                       }i }|                     d| d|          D ]~}t          |d         pd          }t          |d         pd          }t          |d	                   }|t          vs|t          |         k    s|b|                    |d
          |z   ||<   t          j        d t          |	                                          D             d          S )Nz{},c              3     K   | ]}d V  dS )?Nrq   )r   _s     ri   r   z#_nutrient_totals.<locals>.<genexpr>b  s"      22AC222222rk   z[SELECT nutrient_key,value,unit FROM nutrition_item_nutrients
            WHERE item_id IN ()nutrient_keyrd   r   rh           c                6    i | ]\  }}|t          |d           S )   )round)r   r8  rh   s      ri   r   z$_nutrient_totals.<locals>.<dictcomp>o  s&    UUU
UsE%OOUUUrk   r  :)
separators)
r   executerb   r  NUTRIENT_ALLOWLISTr   r]  dumpssorteditems)r  r  placeholderstotalsrowr8  r   rh   s           ri   _nutrient_totalsr  _  s#    t882222222L!F!!	1+	1 	1 	1  
3 
3
 #n%+,,3v;$"%%G--(((D4Fs4K,K,Ku}jjc**U2s:UUfV\\^^>T>TUUUblmmmmrk   c                `   h dh dh dh dddhh dh dd	d
hddhh dd
}|                                 D ]w\  }}|                     d|f                                          }|t          d          d |                     d| d          D             }||k    st          d          xdS )zCFail closed without creating or altering schema in the action path.>   idrS  datum	item_hash>   item_idr   r   >   statusexample_namerw  >   sourcer   
updated_atr   r   r   r   >   r   	action_idr   action_hash>   r  affected_dayrw  rw  r  personal_status>   mealr  histamine_labelhistamine_score)
nutrition_itemsnutrition_histamine_scoresnutrition_review_queuehistamine_food_ruleshistamine_food_aliasesnutrition_mapping_action_lognutrition_mapping_provenance"nutrition_composite_product_reviewpersonal_food_tolerancenutrition_meal_summary9SELECT 1 FROM sqlite_master WHERE type='table' AND name=?Nz nutrition mapping schema missingc                |    h | ]9}t          t          |t          j                  r|d          n|d                   :S )rS  r{   )rb   r   sqlite3Rowr   r  s     ri   	<setcomp>z2assert_nutrition_mapping_schema.<locals>.<setcomp>  sM     
 
 
 z#w{;;GFQHH
 
 
rk   PRAGMA table_info(""))r  r  fetchonerg   )r  r   tableexpectedexistsactuals         ri   assert_nutrition_mapping_schemar  r  s.    @??&R&R&R"O"O"O g g g#*,<"=(](](](X(X(X/@(.K$46G#H"Y"Y"Y H $>>++ C Cx##G%
 

(** 	 >ABBB
 
!))*I*I*I*IJJ
 
 
 6!!ABBB "C Crk   r  sqlite3.Row
int | Nonec                z   | d         }t          | d         pd                                          }t          | d         pd                                          }t          | d         pd                                          }t          |          t          usd|cxk    rdk    rn n|r|dvs	|t          vrd S |S )	Nr   r   rd   traffic_lightr   r   r  >   redgreenorangeyellowr  )rb   r   r   r   r   )r  r   r   trafficr   s        ri   _classified_scorer    s    EC()/R006688I#o&,"--3355GS&,"--3355JU3EQ LLL///tLrk   c                   t          |                     d|f                    }|                     d|f           |s|                     d|f           d S dddddddg t                      g d
}i }|D ]%}|d         dv r|d         nd	}|                    |dddddddg t                      g d
          |fD ]}|d
xx         dz  cc<   |d                             t          |d                              dD ]L\  }}	||         |d                             |	           )||	xx         t          ||                   z  cc<   Mt          |          }
|
|dxx         dz  cc<   |d                             |
           |dxx         |
z  cc<   ݐ'|	                                D ]\  }t          d         pdg          }t          |t          d                   t          d                             }fddD             }|                     d|||d         |d         |d         |d         t          d
                   t          | d                   d         st          d         d          nd |f
           t          |d         pdg          }t          |t          |d                   t          |d                             }|                     d|d|d         v rd n"t          t          |d                   d          d|d         v rd n"t          t          |d                   d          d|d         v rd n"t          t          |d                   d          d|d         v rd n"t          t          |d                   d          t          |d
                   t          | |d                   |d         st          |d         d          nd |t          |d                   |f           d S )Na  SELECT i.id,i.meal,i.kcal,i.protein_g,i.carb_g,i.fat_g,
                      h.canonical_food,h.sighi_score,h.traffic_light,h.confidence
               FROM nutrition_items i LEFT JOIN nutrition_histamine_scores h ON h.item_id=i.id
               WHERE i.datum=?z0DELETE FROM nutrition_meal_summary WHERE datum=?z4DELETE FROM nutrition_daily_summary_v2 WHERE datum=?r  r   )
r  proteincarbfatr  r[   r  rx   missingidsr  >   lunchsnackdinner	breakfast
unassignedr  r{   r  r  ))r  r  )	protein_gr  )carb_gr  )fat_gr  r  r[   rx   r  c           	     p    i | ]2}||d          v rdn"t          t          |                   d          3S )r  Nr{   )r  r  )r   r8  buckets     ri   r   z+recompute_nutrition_day.<locals>.<dictcomp>  sY      I  I  I^a#sfY&777ttU5PSCUCUWX=Y=Y  I  I  Irk   )r  r  r  r  zINSERT OR REPLACE INTO nutrition_meal_summary
               (datum,meal,kcal,protein_g,carb_g,fat_g,item_count,nutrient_json,histamine_score,histamine_label,updated_at)
               VALUES(?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP)r  r  r  r  a  INSERT OR REPLACE INTO nutrition_daily_summary_v2
           (datum,kcal,protein_g,carb_g,fat_g,item_count,nutrient_json,histamine_score,histamine_max,histamine_unknown_count,histamine_label,updated_at)
           VALUES(?,?,?,?,?,?,?,?,?,?,?,CURRENT_TIMESTAMP))listr  r   
setdefaultappendr   addr  r  r  maxr  r  r  )r  r   rowsr  by_mealr  r  r"  r  destr   r  r   valuesr  s                 @ri   recompute_nutrition_dayr    sU   " F	
 	
 D IC6RRR QTWSYZZZc3sQ[\fiuw  EH  EJ  EJ  SU  V  VF)+G ( (!&k-VVVs6{{\h##D33PS\_jkxy  DG  SU  be  bg  bg  pr  +s  +s  t  tv& 	( 	(F7OOOq OOO5M  SY000 r 7 7v;&9%))$////4LLLE#f+$6$66LLLL%c**E}y!!!Q&!!!!x ''...v%'	(   	
 	
fx(/QC00	YF9,=(>(>fVn@U@UVV I  I  I  I  fH  I  I  I@ $vy(96&>6RW=Z]^del^mZnZn  qA  BL  NT  UZ  N[  q\  q\  ~D  EN  ~O  ^Y  ^c  dj  kq  dr  tu  ^v  ^v  ^v  UY  [`  a		
 	
 	
 	
 F8$+,,ICy(9$:$:E&.<Q<QRRE	> fY///DDU5;P;PRS5T5T	!222DDeF9DU>V>VXY8Z8ZfY///DDU5;P;PRS5T5TVI...DDE%u:N:NPQ4R4Rw  Z77,29,=GE&.!$$$4y!""	
	    rk   r  c                X   t           t          d          t          j        t	          j        | dd                              d                                                    }t          j	        t                     }t          j
        |_        	 |                    d           t          |           |                    d           |5  |                    d	|f                                          }|=|d
         |k    rt          d          	 ddd           |                                 dS t!          || d                   }|t          d          |d         | d         k    s>t#          |d                   | d         k    st#          |d                   | d         k    rt          d          t%          |d         pd          t'          | d                   t'                    k    rt          d          t)                    |                    d          }|                    d          }t-          |          dk    rt          d          fd|D             }t-          |          | d         k    rt          d          t/          d |D                       }	t-          |	          | d         k    st-          |	          dk    rt          d          |                    dt-          |          |	d         |	d         f           | d          }
| d!         d"k    rdn| d!         }| d#         }| d$         }| d%         }| d&         }| d'         d(k    rZ| d%         d)k    }t1          ||
|*          }||d!         |k    rt          d+          |rd)nd,}|d&         }|d-         }|d.         }| d'         }t2          }|d(k    r(|t          d/          |d0t5          ||
|          z   z  }|d1k    r|                    d2df           n|d(k    r|D ]-}|                    d3|d4         |
|d5||| d6         pd7f           .| d8         d"k    r'|                    d9|
| d8         | d:         pdf           t7          fd;|D                       }|                    d<|rd=nd>f           nX|d?v r|                    d@f           n<|dAv r8t7          fdB|D                       }|                    d<|rd=ndCf           |	D ]m}|d(k    rt9          ||           |                    dD||| d         |
pd|||||| d6         t#          | dE                   | d8         | d:         pd||f           n|                    dF||| d         || d         |
pd|||||| d6         t#          | dE                   | d8         | d:         pd|f           ddd           n# 1 swxY w Y   |                                 dS # |                                 w xY w)GzAApply one preview-bound group review atomically and idempotently.Nrd  Tr  )	sort_keysr  rP  PRAGMA foreign_keys=ONBEGIN IMMEDIATEzFSELECT action_hash FROM nutrition_mapping_action_log WHERE action_id=?r  conflicting idempotency keyr   zmapping group not foundr   r   r   zmapping preview target changedr  rd   r   z+mapping alias does not match group identityaN  SELECT i.id,i.item_hash,i.datum,i.name,
                              h.item_id AS mapped_item_id,h.canonical_food,h.sighi_score,
                              h.traffic_light,h.tags,h.confidence,h.reason
                         FROM nutrition_items i
                         LEFT JOIN nutrition_histamine_scores h ON h.item_id=i.idi i z$nutrition mapping row limit exceededc                `    g | ]*}t          |d                    t                    k    (|+S )rS  )_exact_food_identity)r   r  r  s     ri   
<listcomp>z(apply_mapping_action.<locals>.<listcomp>  sC       'F448L\8Z8ZZZ ZZZrk   c                H    h | ]}|d          
t          |d                     S )r  rb   r  s     ri   r  z'apply_mapping_action.<locals>.<setcomp>  s-    VVVSWVs3w<00VVVrk   r   a@  INSERT OR IGNORE INTO nutrition_review_queue
                   (normalized_name,example_name,occurrence_count,first_seen,last_seen,
                    suggested_canonical_food,suggested_score,reason,status,updated_at)
                   VALUES(?,?,?,?,?,NULL,NULL,'derived exact review group','open',CURRENT_TIMESTAMP)r   r   r   r[   r   r   r   r   r   rL   rV   )r   require_aliasz;local reference is absent, ambiguous, or version-mismatchedrX   provenance_sourceprovenance_versionz!assigned mapping score is missing|rP   zINSERT OR REPLACE INTO nutrition_composite_product_review
                       (normalized_name,canonical_food,status,updated_at)
                       VALUES(?,?, 'needs_ingredient_review', CURRENT_TIMESTAMP)a  INSERT INTO nutrition_histamine_scores
                           (item_id,canonical_food,sighi_score,traffic_light,tags,confidence,reason,scored_at)
                           VALUES(?,?,?,?,?,?,?,CURRENT_TIMESTAMP)
                           ON CONFLICT(item_id) DO UPDATE SET
                             canonical_food=excluded.canonical_food,
                             sighi_score=excluded.sighi_score,
                             traffic_light=excluded.traffic_light,
                             tags=excluded.tags,
                             confidence=excluded.confidence,
                             reason=excluded.reason,
                             scored_at=CURRENT_TIMESTAMPr  r  r   zuser-confirmed mapping reviewr   a  INSERT INTO personal_food_tolerance
                           (canonical_food,personal_status,evidence_level,notes,updated_at)
                           VALUES(?,?, 'user_documented', ?, CURRENT_TIMESTAMP)
                           ON CONFLICT(canonical_food) DO UPDATE SET
                             personal_status=excluded.personal_status,
                             evidence_level=excluded.evidence_level,
                             notes=excluded.notes,
                             updated_at=CURRENT_TIMESTAMPr   c              3     K   | ]c}t          t          |d          pd                    k    o6t          |d                    t                    k    ot          |          du V  ddS rS  rd   N)_normalize_food_identityrb   r  r  r   r  r  
normalizeds     ri   r   z'apply_mapping_action.<locals>.<genexpr>e  s       - -  -SV1B-C-CDD
R 7,S[99=QR^=_=__7)#..$6- - - - - -rk   z_UPDATE nutrition_review_queue SET status=?,updated_at=CURRENT_TIMESTAMP WHERE normalized_name=?rT  mapped>   rK   rN   rO   zdUPDATE nutrition_review_queue SET status='open',updated_at=CURRENT_TIMESTAMP WHERE normalized_name=?>   rM   rQ   rR   c              3     K   | ]R}t          t          |d          pd                    k    o%t          |d                    t                    k    V  SdS r  )r  rb   r  r  s     ri   r   z'apply_mapping_action.<locals>.<genexpr>w  s{          -SV1B-C-CDD
R `,S[99=QR^=_=__     rk   ignoreda  INSERT OR IGNORE INTO nutrition_mapping_provenance
                       (action_id,normalized_name,decision,alias,canonical_food,sighi_score,confidence,
                        mapping_method,source_label,source_version,note,ingredient_review_required,
                        personal_tolerance_status,personal_tolerance_note,definition_version,affected_day)
                       VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)r   a  INSERT INTO nutrition_mapping_action_log
                   (action_id,action_hash,queue_key,decision,alias,canonical_food,sighi_score,confidence,
                    mapping_method,source_label,source_version,note,ingredient_review_required,
                    personal_tolerance_status,personal_tolerance_note,definition_version)
                   VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?))rk  rg   r{  r  r]  r  rz  r|  r  connectr  row_factoryr  r  r  r\  resolve_mapping_groupr   rb   r  r  	fetchmanyr   r  r3   HISTAMINE_DEFINITION_VERSIONr1   r   r  )rs   r  r  r  existinggroupitem_cursor	all_items	item_rowsaffectedr   r   effective_source_labeleffective_source_versioneffective_methodeffective_confidencer  ruler   effective_definition_versionr  unresolved_same_legacysiblingr   r  r  s                           @@ri   apply_mapping_actionr    sv   <===.
7dzBBBII'RR ikk  ..J$[Jy3444'
333,--- s	 s	!))X  hjj  #M*k99&'DEEEs	 s	 s	 s	 s	 s	j 	W **gk6JKKE}"#<==='(G4E,FFFu^,--1HHHu/011W=O5PPP"#CDDDu^4:;;L#GG$4559Ml9[9[[["#PQQQ1,??J$,,U K $--g66I9~~''"#IJJJ   (  I 9~~!888"#CDDDVVIVVVWWH8}}(: ;;;s8}}t?S?S"#CDDDh \3y>>8A;QSU     01I#M2i??DDW]E[E%,^%<"'./?'@$&'78#*<#8 z"h.. '(8 9] J1&"/	   <4#6%#?#?&'deee4A#X==GX '+L'9$)-.A)B&+/0D+E(z*H+G(8##=&'JKKK,6Oy%7 7 1 , ;&&""T  &	    X%%$  C&&
<  Iy%GW0'&/2dEd   " 679DD&&= &#$?@#$=>F$   *- - - - - -  )	- - - * *& ""u5CVV8ZP    <<<""zM    GGG        )    
 ""u&5VVIzB  
    x''+J<<<""B ":x9I9K\X\35EG]0'&/3wOkGlCmCm ;<gF_>`>hdh4c    > {GK,@(GT[L\%u.BDT*,Dgfo <=>>Hc@d56>$@\  Ms	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	 s	j 	
s>   ;X AW2X 6R0W2&X 2W66X 9W6:X X)c                H   t          j                    D ]\  }}|                     d|f                                          }|t	          d          d |                     d| d          D             t          fd|D                       rt	          d          d S )Nr  zpatient-action schema missingc                8    h | ]}t          |d                    S r{   r  r  s     ri   r  z0_assert_patient_action_schema.<locals>.<setcomp>  s/     
 
 
CAKK
 
 
rk   r  r  c              3  &   K   | ]\  }}|vV  d S rn   rq   )r   rS  _kindr  s      ri   r   z0_assert_patient_action_schema.<locals>.<genexpr>  s,      ==kdEt6!======rk   )r	   r  r  r  rg   r   )r  r  columnsr  r  s       @ri   _assert_patient_action_schemar%    s    9?AA 
@ 
@w##G%
 

(** 	 >>???
 
#-#5#56UE6U6U6U#V#V
 
 
 ====W===== 	@>???	@
@ 
@rk   c                ~   t           t          d          t          j        t                     }	 |                    d           t          |           |                    d           | d         dk    rz|                    d| d         | d         pd | d	         | d
         | d         | d         | d         pd | d         | d         | d         pd | d         | d         | d         pd f           ng|                    d| d         | d         | d         pd | d	         | d
         | d         | d         | d         | d         | d         | d         pd f           |                                 n## t          $ r |                                  w xY w	 |	                                 d S # |	                                 w xY w)Nrd  r  r  rw   r*  a(  INSERT INTO supplement_plans
                   (product,brand_variant,nutrient_key,amount,unit,schedule_type,weekdays,
                    interval_days,start_date,end_date,composition_source,
                    assignment_reliability,notes)
                   VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)productbrand_variantr  amountr   schedule_typeweekdaysinterval_days
start_dateend_datecomposition_sourceassignment_reliabilityrv   zINSERT INTO supplement_intakes
                   (plan_id,product,brand_variant,nutrient_key,amount,unit,status,
                    occurred_at,composition_source,assignment_reliability,notes)
                   VALUES(?,?,?,?,?,?,?,?,?,?,?)plan_idr  r   )
rk  rg   r  r  r  r
   commit	Exceptionrollbackr\  )rs   r  s     ri   apply_supplement_actionr5    s   <===..J'3444 ,,,,---8 1118 I&(@(HDN+WX->O,gj.A.ITO,gl.CJ'/49M1N45ww7G7O4     4
 I&	(:O,4gn6MH%wv8IM*G4H,I45ww7G7O4   	    	
 	
s   D:E, +F& , FF& &F<c                 $  5 t           t          d          t          |           } t          j        t          |                                                                                     }t          j	        t                     }t          j
        |_        g }	 |                    d           t          |           t          |           t          |           t!          |           |                                 |                    d           |                    d| d         f                                          }|rw|d         |k    st'          |d                   | d         k    rt          d          |                                 t+          |d	                   |                                 S t/          j        t2                                        d
          }| d         p| d         }|r|                    d|f                                          }||d         dk    s|d         | d         k    rt          d          t+          |d                   t'          |d                   dz   }	}|                    d| d         rdnd|f           nd\  }}	t7          d          }
|s|
}| d         }d }d |                    d          D             }| d         dk    r|                    d          t:          v rzt=          |           t?          ||           \  }}}}tA          j!        ||d                    st          d!          |d         d"k    r|d#         d$k    r|t          d%          |                    d&t+          |d'         pd(          f                                          }|t+          |d)                   | d         k    rt          d*          t'          |d+                   }|d         d"k    re|                    d,||t'          |d+                   nd | d-         |d         |d.         |d/         |d0         f                                          }n]|                    d1||t'          |d+                   nd | d-         |d         |d2         |d3         f                                          }|r|d4         st          d5          ||t'          |d+                   nd |t+          |d6         pd(          nd(|t+          |d7         pd(          nd(|t+          |d8         pd(          nd(|t'          |d+                   nd t+          |d'         pd(          d9}nH| d         dk    r<d:|v r8d; |                    d<          D             }|d=         |vrt          d>          | d         d?k    r<d@|v r8dA |                    dB          D             }|d=         |vrt          dC          | d         dDv rD|d         dEk    r8|                    d          d"k    r|dF         s|dG         st          dH          | d         dIk    rdJdKdLdMdNdOdPdQ5tE          5fdR|dS         #                                D                       }|r|dT         st          dU          |                    dV| d-         t          |          f                                          }|r|d4         st          dW          | dX         D ]}tI          tJ          tL          |          }|                    dY|dZ         f                                          }|ro|d[         |d\         |                    d]          fD ]"}|rtL          |z  '                    d^_           #|(                    tS          |                     d^|d`<   nda|d`<   |*                    |           tW          db |D                       dck    stW          dd |D                       dk    rt          de          | d         rdnd}|                    df|
||	| d         | d-         | dg         t          |          || d         | d         |f           |D ]J}|                    dh|d+         |
|dZ         |di         |dj         |dk         |dl         |dm         |dn         |do         |                    dp          |                    dq          |                    dr          |d[         |d\         |                    d]          |                    ds          |                    dt          |du         |dv         |dw         |                    dx          |                    dy          dz|                    d{          pd |                    d|          pd |f           L| d         r|sd}}|                    d~| d| d         f          ,                                D ]S}|d         dk    rdnd}|                    d| ddt[          |          z   dt7          |          |
g||R            T| d-         .                    dd          d)         } d |                    d          D             }!| d         sv| d         dk    rd|!v r|d         dk    rd n|d         }"|d         p|d         }#t          d|d         |d         |d|         |d         |
d          }$d |                    d          D             }%h d/                    |%          r3|                    d| |#|"|$|d         pd | d-         | d-         f           n|                    d| |#|"|$|d         pd f           n| d         dk    r_d:|!v rZ||d         d"k    r||d.          d|d/          d|d0          }&|d         p|d         }'|                    d| |d=         |&|'pd |d         |d         pd d| d-         |d         |d         |d6         pd |d7         pd |d8         pd |d         pd |d         pd |d         pd |d         pd |d         pd ||d.         |d/         |d0         |d         |d#         d$k    rdEnd |                    d          pd f           |                    d          rg|d#         d$k    s"|d.         |d/         |d0         |d         fdk    rt          d          ta          ||d         t+          |d                              nd1                    d |d2         |d3         fD                       }(|d         p|d         }'|                    d| |d=         |(pd |'pd |d         |d         pd d| d-         |d         |d         |d         pd |d         pd |d2         pd |d3         pd |d         pd |d         pd |d         pd |d         pd |d         pd |d         pd |d         |d         pd |d         pd |f           nd1                    d |d         |d         fD                       })d |                    d          D             }*d-|*v rD|                    d| |d=         |)pd |d         pd |d         |d         pd d| d-         f           nU|                    d| |d=         |)pd |d         pd |d         |d         pd df           n| d         d?k    rHd|!v rD|                    d|d=         |d         |d         |d         | d-         |d         pd f           n| d         dk    rd|!v rd |                    d          D             }+|                    d          },|,dk    rd}-d}.|d         }/d}0d}1d }2nK|,dk    rd}-|d         }.|d         }/d}0d}1d }2n,|d         }-|d         }.|d         dk    rd n|d         }2|2}/d }0d}1d-dh/                    |+          r.|                    d| |-|.|/|0|1|d         pd | d-         |2f	           n|                    d| |-|.|/|0|1|d         pd f           n| d         dIk    rd|!v rd̈́ |                    d          D             }+|dS         #                                D ]e\  }3}/d-|+v r2|                    d| |3|/|d         d|d         pd | d-         f           ;|                    d| |3|/|d         d|d         pd f           f|                    d| d         | d         ||
|f           |                                 te          tJ                     |
|                                 S # tf          $ r |                                 |D ]y}|                    d`          r|                    d[          |                    d\          |                    d]          fD ]"}4|4rtL          |4z  '                    d^_           #z w xY w# |                                 w xY w)Nrd  r  r  z[SELECT action_hash,entry_id,request_version FROM capture_action_log WHERE idempotency_key=?idempotency_keyr  request_versionr  entry_idsecondsr   corrects_entry_idwithdraws_entry_idzMSELECT id,root_id,version,status,capture_type FROM capture_entries WHERE id=?r  activecapture_typezversion target is not activeroot_idry   r{   z.UPDATE capture_entries SET status=? WHERE id=?r   	withdrawn)rd   r{   cap_datac                8    h | ]}t          |d                    S r   r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp>  s2     
 
 
 AKK
 
 
rk   z1SELECT name FROM sqlite_master WHERE type='table'
medicationcontractr	  z!stale medication preview revisionzhealth.medication_action.v2r>  
correctionz$structured correction target missingz;SELECT entry_id FROM capture_action_log WHERE action_hash=?business_revisionrd   r   z,structured correction capture target changedr  a  SELECT 1 FROM medication_administrations
                       WHERE business_revision IS NOT NULL AND medication_id=?
                         AND COALESCE(planned_event_id,-1)=COALESCE(?,-1)
                         AND COALESCE(occurred_at,'')=?
                         AND lower(trim(COALESCE(event_type,'')))=?
                         AND COALESCE(actual_quantity_value,'')=?
                         AND COALESCE(actual_dosage_form,'')=?
                         AND COALESCE(actual_strength,'')=? LIMIT 1r   quantity_valuedosage_formstrengtha  SELECT 1 FROM medication_administrations
                       WHERE business_revision IS NOT NULL AND medication_id=?
                         AND COALESCE(planned_event_id,-1)=COALESCE(?,-1)
                         AND COALESCE(occurred_at,'')=?
                         AND lower(trim(COALESCE(event_type,'')))=?
                         AND COALESCE(actual_dose_value,'')=?
                         AND COALESCE(actual_dose_unit,'')=? LIMIT 1actual_dose_valueactual_dose_unitduplicate_confirmedz#possible duplicate medication eventplanned_quantity_valueplanned_dosage_formplanned_strength)medication_idplanned_event_idrO  rP  rQ  corrects_event_idprescription_business_revisionmedication_administrationsc                8    h | ]}t          |d                    S rD  r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp>Z  2     ! ! ! CF! ! !rk   lSELECT DISTINCT medication_name FROM medication_administrations WHERE trim(COALESCE(medication_name,''))<>''rS  ,medication is not in the known exact catalog
supplementsupplement_plansc                8    h | ]}t          |d                    S rD  r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp>c  rX  rk   zRSELECT DISTINCT product FROM supplement_plans WHERE trim(COALESCE(product,''))<>''z)supplement is not in the known exact plan>   rE  r[  r   plan_value_confirmeddeviation_confirmedz6planned administration requires conscious confirmationmeasurement)F      )r      )#      )r   r   )"   *   )ra  r   )r   r   )systolic	diastolicpulseweighttemperatureoxygen_saturationblood_glucosec              3     K   | ]=\  }}|         d          t          |          cxk    o|         d         k    nc  V  >dS )r   r{   N)r  )r   r8  rh   softs      ri   r   z'apply_capture_action.<locals>.<genexpr>|  sp        C IaLE%LL@@@@DIaL@@@@@     rk   r  plausibility_confirmedz'plausible outlier requires confirmationzwSELECT 1 FROM capture_entries WHERE capture_type='measurement' AND occurred_at=? AND payload_json=? AND status='active'z+duplicate measurement requires confirmationattachmentsax  SELECT media_name,thumbnail_name,proxy_name,mime_type,media_kind,byte_size,width,height,
                frame_count,auxiliary_count,duration_seconds,container,codec,preview_sha256,proxy_sha256,
                preview_status,decoder_name,decoder_version,probe_version,unconfirmed_captured_at
                FROM capture_attachments WHERE sha256=? ORDER BY created_at LIMIT 1r  
media_namethumbnail_name
proxy_nameT
missing_okreusedFc              3  .   K   | ]}|d          dk    V  dS )
media_kindphotoNrq   r   items     ri   r   z'apply_capture_action.<locals>.<genexpr>  s,      BBtL!W,BBBBBBrk   r   c              3  .   K   | ]}|d          dk    V  dS )rz  videoNrq   r|  s     ri   r   z'apply_capture_action.<locals>.<genexpr>  sO        NB  NBptdS_N`dkNk  NB  NB  NB  NB  NB  NBrk   zcapture media count exceededzINSERT INTO capture_entries(id,root_id,version,capture_type,occurred_at,ended_at,payload_json,status,corrects_entry_id,withdraws_entry_id,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?)ended_ata  INSERT INTO capture_attachments(
                id,entry_id,sha256,mime_type,media_kind,byte_size,width,height,frame_count,auxiliary_count,
                duration_seconds,container,codec,media_name,thumbnail_name,proxy_name,preview_sha256,proxy_sha256,
                preview_status,decoder_name,decoder_version,probe_version,unconfirmed_captured_at,review_status,
                description,body_region,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)	mime_typerz  	byte_sizewidthheightframe_countauxiliary_countduration_seconds	containercodecpreview_sha256proxy_sha256preview_statusdecoder_namedecoder_versionprobe_versionunconfirmed_captured_at
unverifieddescriptionbody_regiona9  sha256,mime_type,media_kind,byte_size,width,height,frame_count,auxiliary_count,duration_seconds,container,codec,media_name,thumbnail_name,proxy_name,preview_sha256,proxy_sha256,preview_status,decoder_name,decoder_version,probe_version,unconfirmed_captured_at,review_status,explicit_pair_id,description,body_regionzSELECT z* FROM capture_attachments WHERE entry_id=?r   r  vid_img_z,INSERT INTO capture_attachments(id,entry_id,z,created_at) VALUES(?,?z,?z,?)Tc                8    h | ]}t          |d                    S rD  r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp>  s2     
 
 
 AKK
 
 
rk   symptomsymptom_logr   r[   titler   mobile_capturecountongoing)r  r   r  r  r  r9  c                8    h | ]}t          |d                    S r!  r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp>  s/     # # #$'CAKK# # #rk   zPRAGMA table_info(symptom_log)>   r   r   r   zINSERT INTO symptom_log(datum,symptom,schwergrad,kontext,notizen,occurred_at,onset_at,duration_minutes) VALUES(?,?,?,?,?,?,?,NULL)r   zSINSERT INTO symptom_log(datum,symptom,schwergrad,kontext,notizen) VALUES(?,?,?,?,?)r   u    · route_originalroute_normalizeda  INSERT INTO medication_administrations(
                            datum,medication_name,dose,route,event_type,scheduled_next_date,notes,source,occurred_at,
                            medication_id,planned_event_id,planned_quantity_value,planned_dosage_form,
                            planned_strength,route_original,route_normalized,injection_region,
                            injection_side,injection_detail,business_revision,actual_quantity_value,
                            actual_dosage_form,actual_strength,corrects_event_id,corrected_target_status,
                            correction_reason)
                            VALUES(?,?,?,?,?,NULL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'dashboard_medication_action_version_tworR  rS  injection_regioninjection_sideinjection_detailrT  correction_reasonbind_verified_preset)1Spritzez40 mg/0,4 mlsubcutaneousz$verified preset confirmation changedrU  c              3     K   | ]}||V  	d S rn   rq   r   parts     ri   r   z'apply_capture_action.<locals>.<genexpr>  s<       / /%)fj/ / / / / / /rk   a_  INSERT INTO medication_administrations(
                            datum,medication_name,dose,route,event_type,scheduled_next_date,notes,source,occurred_at,
                            medication_id,planned_event_id,planned_dose_value,planned_dose_unit,actual_dose_value,
                            actual_dose_unit,route_original,route_normalized,injection_region,injection_side,
                            injection_detail,lot_number,corrects_event_id,corrected_target_status,correction_reason,
                            business_revision) VALUES(?,?,?,?,?,NULL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)dashboard_v5_medication_actionplanned_dose_valueplanned_dose_unit
lot_numbercorrected_target_statusc              3  <   K   | ]}|d vt          |          V  dS )>   Nrd   Nr  r  s     ri   r   z'apply_capture_action.<locals>.<genexpr>7  s?       $ $ z11 D		1111$ $rk   r)  r   c                8    h | ]}t          |d                    S r!  r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp><  s4      *F  *F  *F##c!f++  *F  *F  *Frk   z-PRAGMA table_info(medication_administrations)zINSERT INTO medication_administrations(datum,medication_name,dose,route,event_type,notes,source,occurred_at) VALUES(?,?,?,?,?,?,?,?)r   dashboard_v5_mobile_capturezvINSERT INTO medication_administrations(datum,medication_name,dose,route,event_type,notes,source) VALUES(?,?,?,?,?,?,?)supplement_intakeszINSERT INTO supplement_intakes(plan_id,product,brand_variant,nutrient_key,amount,unit,status,occurred_at,composition_source,assignment_reliability,notes) VALUES(NULL,?,NULL,'other',?,?,?,?, 'user_documented','documented',?)eventhealth_eventsc                8    h | ]}t          |d                    S r!  r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp>T  s2     ! ! ! AKK! ! !rk   z PRAGMA table_info(health_events)
event_kindsaunasauna_recoverySaunar   mindashboard_v5_manual_capturetrainingmanual_trainingactivity_typezzINSERT INTO health_events(date,category,parameter,value,unit,source,notes,occurred_at,intensity) VALUES(?,?,?,?,?,?,?,?,?)z`INSERT INTO health_events(date,category,parameter,value,unit,source,notes) VALUES(?,?,?,?,?,?,?)c                8    h | ]}t          |d                    S r!  r  r  s     ri   r  z'apply_capture_action.<locals>.<setcomp>  s"     o o oSV o o ork   zINSERT INTO health_events(date,category,parameter,value,unit,source,notes,occurred_at,intensity) VALUES(?,'manual_measurement',?,?,?,?,?,?,NULL)zsINSERT INTO health_events(date,category,parameter,value,unit,source,notes) VALUES(?,'manual_measurement',?,?,?,?,?)zsINSERT INTO capture_action_log(idempotency_key,request_version,action_hash,entry_id,processed_at) VALUES(?,?,?,?,?))4rk  rg   r   r{  r  _canonical_jsonrz  r|  r  r  r  r  r  apply_capture_schemaassert_capture_schemaapply_media_schemaassert_media_schemar2  r  r   r4  rb   r\  r   ro   rp   r   _opaquer   MEDICATION_ACTION_CONTRACTSassert_medication_schemar   hmaccompare_digestr   r  r   CAPTURE_QUARANTINECAPTURE_MEDIAunlinkupdater   r  sumfetchallr   r   r  r   r   r   r3  )6rs   r  r  promotedr  ro   r  r"  r?  ry   r9  rB  medication_contextknown_tablesr#  prescriptionplannedcorrection_targetlinked_capturerR  	duplicateknown_medicationsknown_supplementsunusualr  
attachmentduplicate_mediaduplicate_nameentry_statusr$  oldprefixr   available_tablesr   r   contextsymptom_columnslegacy_doselegacy_routeactual_doser   medication_columnsevent_columnsr  r   	parameterrh   r   r  r   r8  rS  rp  s6                                                        @ri   apply_capture_actionr    s5   <===&w//G.!9!9!@!@!B!BCCMMOOK..J$[J%'HL3444Z(((j))):&&&J''',---%%i&')
 
 (** 	  	-';66x 1233w?P7QQQ"#@AAA!!!x
+,,r 	q l>**44i4HH/0QG<P4Q	 	%''_  hjj 
 (#x//.)W^-DDD"#ABBB"6)#455s6);L7M7MPQ7QWG@#*+>#?PKK[     %GW6?? 	Gv48
 
!))*]^^
 
 
 >"l22txx
7K7KOj7j7j$Z000J`GK KG|W6G &'8$?Q:RSS H"#FGGGJ#@@@T&\UaEaEa$,&'MNNN!+!3!3Q*+>?E2FFH" " (**  ")S1B-C-CwObGc-c-c&'UVVVT 233MJ#@@@&..G &.5.AGDM***t.X-.]0CT*EU	  (** 	" '..H &.5.AGDM***t.X0148J3K	  (**   J&;!< J"#HIII!.:A:MC$6$6$6SWZaZm#g6N.O.USU*V*V*VsuT[Tgs73H+I+OR'P'P'PmoNUNaC0B(C(Ir$J$J$JgiEVEbS):4)@%A%A%Ahl25lCV6W6][]2^2^" " ^$449UYe9e9e! !%-- C ! ! ! F|#444"#QRRR>"l227I\7Y7Y! !%--h ! ! ! F|#444"#NOOON#'CCCX.00$$(EEE/0 ]D9N4O ]"#[\\\>"m33%&"#'%.!( D     "&x."6"6"8"8    G  Nt$<= N"#LMMM"** J')>)>?  hjj   R&;!< R"#PQQQ]+ 	( 	(E+,>uUUJ(00W H%'  hjj   -'1,'?L\A]_i_m_mnz_{_{&| Q QN% Q&7??4?PPP!!$"7"7888'+
8$$',
8$OOJ''''BBBBBBBQFF#  NB  NB  yA  NB  NB  NB  KB  KB  EF  KF  KF=>>>&-.B&CQ{{ B'&
#%%+,,-	
 	
 	
  # 	 	Ju t$h
80DjQ\F]|,j.EzRYGZ\fgo\p}-z:K/Ljnn]oNpNpNN;//1H1H*UaJb/0*..2N2NPZP^P^_oPpPpNN>22J?O4PR\]kRl01:>>/3R3RT^TbTbc|T}T} $((="9"9"AT488MCZCZCb^bdg	   " &' 	 	 RG!))*gG*g*g*gjq  sF  kG  jI  J  J  S  S  U  U  #&q6W#4#4&""w7wwcgjmnqjrjrcrwwwV__h::c::    m$**32215
 
!))*]^^
 
 
 +, L	~&)33IY8Y8Y#'#4	#A#A44tKGXW9j)9)"2$($4!%g'+M':#'	?$, 	 	# #+5+=+=>^+_+_# # # CBBKKO\\ && ]!$# L0D#M2#M2    &&meXwV8LM    (L88=Y]m=m=m%1J'+HHH)-.>)?&m&m$}BU&m&m[_`j[k&m&m'+,<'='YFXAY"**^ !$T&\;@TPT $XV0D I7S`Ka 2? CEWXjEk 23K L TPT 23H I QT 23E F N$ $%5 6 >$EW@X@`\` $%7 8 @D$GWBXB`\` $%7 8 @D+ $%5 6]8KTR\M] 23F G26v,,2N2NTX $)< = = E  4  88$:;;  $V < <$()9$:D<O$($4d;M6N$" &V$V $V
 '33Y&Z&Z Z8 * 2? C #$67W$X Y Y   '*hh / /.23F.GN`Ia-b/ / / ' ' (,,<'='YFXAY"**o !$T&\;3F$H\X\ $XV0D @'-BX 2? CEWXjEk $%9 : BdDI\D]Deae $%8 9 AT4HZC[Cc_c $%5 6 >$EW@X@`\` $%7 8 @D$GWBXB`\` $%7 8 @D$|BTB\X\ 23F GNgIhIplp $%8 9 AT;   , 88 $ $%)(^T&\$B$ $ $  D
 *F  *FASAS  UD  BE  BE  *F  *F  *F&$(:::"** c $v,d7m>StUYZbUceijpeqeyuy  |Y  [b  cp  [q  r   
 #** U $v,d7m>StUYZbUceijpeqeyuy  |Y  Z    (L88=QUe=e=e"" vVXVX.V,
 
 
 
 (G33K[8[8[! !)112TUU! ! ! "XXl33
((/H 'I !34E D:F $II:--0H $_ 5I !34E D:F $II#J/H $WI $[ 1Y > >DDU  &ED:F!;/88GG && U$%! " L0D#M2%
    &&z$%! " L0D    (M99oQa>a>a o o
8J8JKm8n8n o o o"&x."6"6"8"8 
 
JC$55"** o #ud6l<Y[_`f[g[okoqx  zG  rH  I   
 #** R #ud6l<Y[_`f[g[okop    	 B)*)*		
 		
 		
 	*+++ 	    " 		C 		CJ~~h'' |,,/00|,, C C
  C"T)11T1BBBC 	 	s)   DAF$ ;AF$ F$BAI I AI IAIc                   t           t          d          t          j        t                     }	 t	          |           |                    d           |                    d           | d         }t          |                              dd          d         }| d         d	k    rT| d
         dk    r| d         n| d
         }|                    d||| d         | d         || d         pd | d         f           n| d         dk    rd |                    d          D             }| d         |vrt          d          d                    d | d         | d         fD                       }|                    d|| d         |pd | d         pd | d         | d         pd |f           n=|                    d|| d         | d         | d          | d         pd || d          f           |	                                 n## t          $ r |                                  w xY w	 |                                 d S # |                                 w xY w)!Nrd  r  r  r   r  r{   r   rw   r   r   r   r   zINSERT INTO symptom_log
                   (datum,symptom,schwergrad,kontext,notizen,occurred_at,onset_at,duration_minutes)
                   VALUES(?,?,?,'additional_symptom',?,?,?,?)r   rv   r   r   r   c                8    h | ]}t          |d                    S rD  r  r  s     ri   r  z'apply_patient_action.<locals>.<setcomp>  s4      p  p  pSSQ[[  p  p  prk   rY  r   rZ  r   c              3     K   | ]}||V  	d S rn   rq   r  s     ri   r   z'apply_patient_action.<locals>.<genexpr>  s(      XXTSWXDXXXXXXrk   r   r   zINSERT INTO medication_administrations
                   (datum,medication_name,dose,route,event_type,notes,source,occurred_at)
                   VALUES(?,?,?,?,?,?, 'dashboard_v5_patient_action', ?)r   r   zINSERT INTO health_events
                   (date,category,parameter,value,unit,source,notes,occurred_at,intensity)
                   VALUES(?,?,?,?,NULL,'dashboard_v5_patient_action',?,?,?)r   r   )rk  rg   r  r  r%  r  rb   r   r   r2  r3  r4  r\  )rs   r  r   r   r  knownr   s          ri   apply_patient_actionr    s   <===..J%%j1113444,---m,+$$S!,,Q/8//*1.*AW*L*Lgg&&RYZhRiGA gwz2GG4DkSZ[eSfSnjnpw  yK  qL  M	    X"444 p  pJ,>,>  @n  -o  -o  p  p  pE()66"#QRRR88XXgfowv-OXXXXXDL g/0$,$@P@XTXZabnZoqx  zA  rB  rJ  FJ  LW  X	    O gj)77+;W[=QSZ[bScSkgkmx  {B  CN  {O  P	   	    	
 	
s   GG: 9H4 : HH4 4I
r  c                0    | t          j        d          z   S )N   )secrets	token_hexr  s    ri   r  r    s    G%b))))rk   c                2    t          j        | ddd          S )NTr  ensure_asciir  r  )r]  r  )rh   s    ri   r  r    s    :e$$:VVVVrk   observation_idc                
    ddl m}m}m}m} ddlmm d fd}d|d d          }                     d|f          	                                d S  | |          }	|	d         d         dv r-t          d |	d         D                       r | ||          }
n | ||          }
 ||
          }t                               d|f          	                                d                   }                     d|||t          |d                   t          |d                   t          |d                   t          |d         t          j        t                                         d          f	           d S )Nr   )evaluate_observationevaluate_planobservation_detailsnapshot_payload)APIError_series	metric_idrb   startr   endra   rt   c                    	  | |                                 |                                 dd          S # $ r}|j        dv rg dddidcY d }~S  d }~ww xY w)Nr   )metricfromto
resolution>   metric_not_foundmetric_not_releasedrd   r   not_documented)pointsr   r  )r   code)r  r  r  errorr  r  r  s       ri   loaderz,_insert_observation_snapshot.<locals>.loader  s    	7:)U__EVEV^a^k^k^m^m  ~C  (D  (D  E  E  E 	 	 	zHHH"$bVEU<VWWWWWWWW	s    48 AAAAAresult_   z5SELECT 1 FROM personal_observation_results WHERE id=?
influences>   event.saunaevent.trainingnutrition.profilenutrition.histaminec              3  B   K   | ]}|                     d            V  dS )zevent.N)
startswithr|  s     ri   r   z/_insert_observation_snapshot.<locals>.<genexpr>  sJ       x x*.DOOH%%%x x x x x xrk   outcomeszaSELECT COALESCE(MAX(result_version),0)+1 FROM personal_observation_results WHERE observation_id=?zINSERT INTO personal_observation_results
           (id,observation_id,result_version,configuration_json,phases_json,summary_json,
            method_version,configuration_hash,created_at) VALUES(?,?,?,?,?,?,?,?,?)configurationphasessummaryconfiguration_hashr:  r   )r  rb   r  r   r  r   ra   rt   )dashboard_v5.observation_enginer  r  r  r   dashboard_v5.read_apir  r  r  r  allr   r  r   r   ro   rp   r   )r  r  r  r  r  r  r   r  	result_iddetailanalysissnapshotry   r  r  s   `            @@ri   _insert_observation_snapshotr'    s9    zyyyyyyyyyyy77777777        +)CRC.**I?) hjj 	
N;;FlA"oootw x x282Dx x x u uo !=^VDD''
NFKK))H*$$  &I  LZ  K\  ]  ]  f  f  h  h  ij  k  l  lG	W 
NG_Xo=V-W-W	(+	,	,ohy>Q.R.R	"67n9U9U9_9_ir9_9s9s	u	    rk   c                8   t           t          d          |pLt          j        t	          |                                                                                     d d         }t          j        d|          st          d          t          j        t                     }t          j        |_        	 |                    d           t          |           |                    d           t!          j        t$                                        d          }| d	         }|d
k    r| d         pd|d d          }|                    d|f                                          }| d         dk    rQt+          |                    d|f                                          d                   }|dk    rt          d          || d         rt          d          | d         dvrt          d          |                    d|d| d         | d         t	          | d                   t	          | d                   | d         | d         | d          | d!         | d         | d"         t+          | d#                   t,          ||f           n| d         nt/          |d                   }	| d         t0          |	         vrt          d$          |                    d%|| d          | d!         f                                          }
|
t          d&          |                    d'| d         | d         t	          | d                   t	          | d                   | d         | d         | d          | d!         | d         | d"         t+          | d#                   t,          ||f           |	d(k    r| d         d(k    rt3          |||           ne|d)k    r|                    d*| d         f                                          }|
|d         d+v rt          d,          | d          |d          k     s| d!         |d!         k    rt          d-          | d.         pt5          d/          }|                    d0|f                                          }| d1         | d2         | d          | d!         | d3         t	          | d4                   t	          | d5                   | d         | d         | d6         | d7         f}|>| d.         rt          d8          |                    d9|| d         g|||R            n|d         | d         k    rt          d:          |                    d;g |||R            n|d<k    r|                    d*| d         f                                          }|-|d         dk    s!|d          | d=         cxk    r|d!         k    sn t          d>          | d.         pd }|rn|                    d?|f                                          }|3|d         | d         k    s!|d          | d=         cxk    r|d!         k    sn t          d@          nm|                    dA| d         | d=         | d=         f                                          }t9          |          dk    rt/          |d         dB                   nd }|                    dCt5          dD          | d         || d=         | d6         | dE         | dF         | dG         | dH         | dI         | dJ         | dK         | d"         ||f           n|dLk    r}|                    d| d         f                                          }|t          d$          | d         t/          |d                   k    r+|                                 	 |                                 d S | d         t0          t/          |d                            vrt          d$          | d         dk    r[|d         dk    rOt+          |                    dM                                          d                   }|dk    rt          d          |                    dN| d         || d         f           |d         d(k    r#| d         d(k    rt3          || d         |           nc|                    d| d         f                                          }||d         d(k    rt          dO          t3          || d         |           |                                 n## t>          $ r |                                   w xY w	 |                                 d S # |                                 w xY w)PNrd  ry  r   zinvalid observation action idr  r  r:  r   rw   r.  r  obs_r  z3SELECT status FROM personal_observations WHERE id=?r  r=  zJSELECT count(*) FROM personal_observations WHERE status='active' AND id<>?r   r  z#maximum active observations reachedzobservation not found>   draftr=  z&initial observation status not alloweda7  INSERT INTO personal_observations
                       (id,contract_version,title,question,influences_json,outcomes_json,lag_min,lag_max,
                        start_date,end_date,status,note,include_doctor,method_version,created_at,updated_at)
                       VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)r{   r  questionr  r  lag_minlag_maxr-  r.  r   include_doctorzstatus transition not allowedziSELECT 1 FROM personal_observation_phases WHERE observation_id=? AND (start_date<? OR end_date>?) LIMIT 1z observation range excludes phasezUPDATE personal_observations SET title=?,question=?,influences_json=?,outcomes_json=?,lag_min=?,lag_max=?,
                       start_date=?,end_date=?,status=?,note=?,include_doctor=?,method_version=?,updated_at=? WHERE id=?	completedr0  zGSELECT status,start_date,end_date FROM personal_observations WHERE id=?>   archivedr/  zobservation cannot be editedzphase outside observationphase_idphase_zASELECT observation_id FROM personal_observation_phases WHERE id=?
phase_typerS  behavior_goalmetricsevents	adherencerv   zphase not founda  INSERT INTO personal_observation_phases
                  (id,observation_id,phase_type,name,start_date,end_date,behavior_goal,metrics_json,events_json,lag_min,lag_max,adherence,notes,created_at,updated_at)
                  VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)zphase owner mismatchzUPDATE personal_observation_phases SET phase_type=?,name=?,start_date=?,end_date=?,behavior_goal=?,metrics_json=?,events_json=?,lag_min=?,lag_max=?,adherence=?,notes=?,updated_at=? WHERE id=?r/  r   zno active observation for dayzUSELECT observation_id,start_date,end_date FROM personal_observation_phases WHERE id=?zinvalid checkin phasezSELECT id FROM personal_observation_phases WHERE observation_id=? AND start_date<=? AND end_date>=? ORDER BY start_date,id LIMIT 2r  a  INSERT INTO personal_observation_checkins
              (id,observation_id,phase_id,day,adherence,stress,sleep_disruption,infection,unusual_activity,travel,
               medication_change_fact,supplement_change_fact,note,created_at,updated_at)
              VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
              ON CONFLICT(observation_id,day) DO UPDATE SET phase_id=excluded.phase_id,adherence=excluded.adherence,
               stress=excluded.stress,sleep_disruption=excluded.sleep_disruption,infection=excluded.infection,
               unusual_activity=excluded.unusual_activity,travel=excluded.travel,medication_change_fact=excluded.medication_change_fact,
               supplement_change_fact=excluded.supplement_change_fact,note=excluded.note,updated_at=excluded.updated_atcheck_r   r   r   unusual_activityr   medication_change_factsupplement_change_factr-  z@SELECT count(*) FROM personal_observations WHERE status='active'zAUPDATE personal_observations SET status=?,updated_at=? WHERE id=?z/only completed observations can be recalculated)!rk  rg   r{  r  r  rz  r|  r   r   r   r  r  r  r  r  assert_observation_schemar   ro   rp   r   r  r   r   rb   r   r'  r  r  r   r2  r\  r3  r4  )rs   r  normalized_action_idr  ro   rw   r  r  active_count
old_statusoutsideownerr1  r  phasematchesr  s                    ri   apply_observation_actionrD    s    <===$   ''))) )ikk#2#) <)=>> :8999..J$[Jt3444!*---,---l>**44i4HH")))$%56\:\AUVYWYVYAZ:\:\N!))*_bparss||~~Hx H,,":#5#5`#%$ $ (**Q$   !  !  1$$&'LMMM+, @&'>???8$,???&'OPPP""B $Agg&6wz7J?[bco[pKqKq$WZ%899'):LWU^M_`ght`uZ():76?3wWgOhKiKijxy|  ~AB    )*2  (!344
8$K
,CCC&'FGGG$,,  .Y  \j  kr  s  k@  AH  IS  AT  [U  V  V  _  _  a  a&&'IJJJ""|W%gj&9/'R^J_:`:`apqx  zD  rE  bF  bFY'	(:7<;PQXYcQdelmuevw~  @F  xG!1233N3~W   ,,1Bk1Q1Q0^Mabbb111&&'psz  |L  tM  sO  P  P  Y  Y  [  [E}h3K K K"#ABBB|$u\':::gj>QTYZdTe>e>e"#>???z*?gh.?.?H!))*mpxoz{{  E  E  G  GHL)'&/',:OPWXbPcdkl{d|  ~M  NU  V_  N`  ~a  ~a  bq  ry  zB  rC  bD  bD  EL  MV  EW  X_  `i  Xj  kr  s~  k  @G  HO  @P  QF:& :&'8999"" $;=EgN^F_<pag<phk<plo<p<pr r r r ,-9I1JJJ&'=>>>""  $i  kA  ms  kA  tw  kA  x@  kA  kA  B  B  B  B,,,&&'psz  |L  tM  sO  P  P  Y  Y  [  [E}h8 ; ;5CVZabgZhC}C}C}C}lqr|l}C}C}C}C}"#BCCCz*2dH L"**  ,C  FN  EP  Q  Q  Z  Z  \  \=E*:$;wGW?X$X$X`efr`sw~  @E  xF  a[  a[  a[  a[  JO  PZ  J[  a[  a[  a[  a[&'>??? a[ #**  ,p  sz  {K  sL  MT  UZ  M[  \c  di  \j  rk  l  l  u  u  w  w25g,,//WQZ-...t  { x  )9!:8GENSZ[fSghopxhy  {B  CU  {V  W^  _j  Wk  ls  tF  lG  HO  PX  HY  Za  bz  Z{  |C  D\  |]  ^e  fl  ^m  nq  ru  vw w w w +++""#XZabrZsYuvv  B  BC{"#BCCCx CH$6$666!!###( 	' x CH4F4F(GGG"#BCCCx H,,X(1J1J":#5#56x#y#y  $C  $C  $E  $E  FG  $H   I   I1$$&'LMMMbdkltduvy  {B  CS  {T  dU  V  V  V8}++0A[0P0P,ZAQ9RThiii""#XZabrZsYuvv  B  BC{c(m{::"#TUUU(G<L4MNbccc    	
 	
s&   5\e	 E*e	 f 	 e))f fc                "   t           t          d          t          | d         t                    \  }}|d         | d         k    rt          d          t	          | d                   }t
                                          r(t
                                          rt          d          t
                              ddd	           t          j
        t
          d           t          d
          }t          j        t                                        d          }t!          j        t                     }t           j        |_        d }d }d }		 |                    d           t+          |           t-          |           t/          |           t1          |           t3          |           |                                 t7          ||          }	|                    d|d         f                                          }|r,|d         r$t;          t=          |d                             }nyt
          | |d          z  }|	J t          j        |	          }
t          j         |t          j!        t          j"        z  t          j#        z  t          j$        z  d          }	 t          j%        |
dd          5 }t          j%        |dd          5 }tM          j'        ||d           |(                                 t          j)        |*                                           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t          j+        |
           t          j+        |           n-# t          j+        |
           t          j+        |           w xY w|                    d           |                    d                                          r|                    d           |                    d| |d          t=          |          |d         dk    rdndtY          d t[          |d!                   d"z   d#z            d$|d%         |d         d&d'd(t=          |          |d)         pd |d*         pd f           t[          |                    d+                                          d,                   }|                    d-|||d         |rt[          |d.                   nd |d/         |d0         pd |d1         pd |d2         pd ||f
           |.                    d3          }t_          |t`                    rtc          doi |}d d d d d4d5}	 |2                    tg          |t
          ||                     n"# th          tj          tl          j7        f$ r Y nw xY w|                    d6||j8        |j9        |j:        |j;        |j<        |j=        |j>        |j?        |j@        |jA        |jB        |d7         |d8         |d9         |d:         |d;         |jC        |jD        |jE        |jF        |f           |                                 |rt          |g |gd<           |                                 ||	t          j+        |	           |+                                 |H                    d=           t          | d          d>z  H                    d=           S 	 t          jJ        d?@          5 }t          ||d         t;          |                    \  }}}}d d d            n# 1 swxY w Y   dA |D             }t          dB |D                       }|r|ndC}|dDk    r|                    d           |                    dE|f           |                    dF||||f           |                                 t          |g |gd<           |                                 ||	t          j+        |	           |+                                 |H                    d=           t          | d          d>z  H                    d=           S dGM                    dH t          |d           D                       }dGM                    dI t          |d           D                       }t          dJ          }|                    d           |                    dK||||||||f           |                    dL||d%         f          O                                }d,}g }g } t          t          |||          d           D ]B\  }!\  }"}#}$t          j:        |#R                                S                                          T                                }%dM\  }&}'|D ]}(t          |"t=          |(dN                             })|%t=          |(dO                   k    rdPt[          |(dQ                   |d z   }}'}& n$|)dRk    r|&dPk    rdSt[          |(dQ                   }'}&|r|&dTk    rdU}&|                    dVt          dW          |d |!|"|#|$|%|&|'f
           |&dPk    r*|V                    |"           | V                    |!           Dt          |||| |d X          }*|*D ]g}+|                    dY|+d.         ||+dZ         |+d[         |+d\         |+d]         |+d^         |+d_         |+d`         |+da         |+db         |+dc         |f           h|                    ddt=          |          f           t          |d           D ]/\  }!}#|#r(|                    det=          |          |!|!|#dff           0|                    dg|||f           |                    dh||rdindj|*rdkndl||t          |          ||f           |                                 ng# t          $ rZ |Z                                 |                    dm||f           |                    dn|f           |                                 Y nw xY wt          |g |gd<           |                                 ||	t          j+        |	           |+                                 |H                    d=           t          | d          d>z  H                    d=           S # t          $ rD |Z                                 |r,|s*|                                r|H                    d=            w xY w# |	t          j+        |	           |+                                 |H                    d=           t          | d          d>z  H                    d=           w xY w)pNrd  r  r  zdocument hash mismatchr  z&document storage must not be a symlinkTr<  )r?  r>  r@  doc_r:  r   r  zSELECT d.id,d.local_original_path FROM dokumente d JOIN document_processing p ON p.document_id=d.id WHERE p.sha256=? ORDER BY d.id LIMIT 1local_original_pathsuffixrO  rbF)closefdwb   )lengthr  zJSELECT 1 FROM sqlite_master WHERE type='table' AND name='dokumente_status'z<INSERT OR IGNORE INTO dokumente_status(status) VALUES('neu')zINSERT INTO dokumente(datei_name,dateipfad,daten_typ,groessekbytes,status,kategorie,datei_hash,quelle,review_status,processing_quality,local_original_path,document_date,institution)
               VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)mimeapplication/pdfpdfimager{   sizei  i   neur  dashboard_v5_local_intakenicht_geprueftpendingr  r  zSELECT last_insert_rowid()r   ab  INSERT INTO document_processing(document_id,intake_id,original_status,extraction_status,content_status,search_status,transfer_status,sha256,duplicate_document_id,page_count,investigation_day,personal_title,personal_note,created_at,updated_at)
               VALUES(?,?,'available','not_started','pending','not_searchable','no_candidates',?,?,?,?,?,?,?,?)r  
page_countr  r  r   
media_infofailed)preview_namer  ru  r  r  au  INSERT INTO document_media(document_id,media_kind,mime_type,original_sha256,byte_size,width,height,frame_count,auxiliary_count,duration_seconds,container,codec,preview_name,proxy_name,preview_sha256,proxy_sha256,preview_status,decoder_name,decoder_version,probe_version,unconfirmed_captured_at,created_at)
                VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)rZ  ru  r  r  r  document_idsensure_schemarv  .jsonzhealth-doc-extract-r  c                ,    g | ]}t          |          S rq   r!   r   pages     ri   r  z)apply_document_import.<locals>.<listcomp>  s!    NNN 5d ; ;NNNrk   c              3  4   K   | ]}t          |          V  d S rn   )r   ra  s     ri   r   z(apply_document_import.<locals>.<genexpr>  s(      @@tT@@@@@@rk   no_usable_textmedia_previewz|UPDATE dokumente SET extrahierte_inhalte='',processing_quality='media_preview',verarbeite_datum=CURRENT_TIMESTAMP WHERE id=?zUPDATE document_processing SET extraction_status='no_usable_text',content_status='partial',search_status='not_searchable',transfer_status='no_candidates',engine=?,engine_version=?,page_count=0,last_error_code=NULL,updated_at=? WHERE document_id=?

c              3  ,   K   | ]\  }}d | d| V  dS [SEITE ]
Nrq   r   indexr   s      ri   r   z(apply_document_import.<locals>.<genexpr>  s7      'j'j{ud(B%(B(BD(B(B'j'j'j'j'j'jrk   c              3  ,   K   | ]\  }}d | d| V  dS rh  rq   rk  s      ri   r   z(apply_document_import.<locals>.<genexpr>  s8      )w)wPT*DE*D*Dd*D*D)w)w)w)w)w)wrk   text_zINSERT INTO document_text_versions(id,document_id,version,source_kind,original_text,normalized_text,engine,engine_version,created_at) VALUES(?,?,1,?,?,?,?,?,?)zSELECT pg.document_id,pg.original_text,pg.section_hash FROM document_pages pg JOIN dokumente d ON d.id=pg.document_id
                   WHERE pg.document_id<>? AND d.kategorie=? ORDER BY d.document_date DESC,d.id DESC LIMIT 100)first_documentedNoriginal_textsection_hash	identicalr  q=
ףp?
near_matchro  newINSERT INTO document_pages(id,document_id,text_version,page_number,original_text,normalized_text,confidence,section_hash,repetition_status,compared_document_id) VALUES(?,?,?,?,?,?,?,?,?,?)page_page_numbersidentity_scopetext_versiona   INSERT OR IGNORE INTO document_candidates(id,document_id,candidate_type,value_text,unit,page_number,section_number,context_text,engine,confidence,source_text_version,candidate_fingerprint,created_at)
                       VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)candidate_type
value_textr   page_numbersection_numbercontext_textenginer   source_text_versioncandidate_fingerprint;DELETE FROM health_document_machine_fts WHERE document_id=?vINSERT INTO health_document_machine_fts(document_id,page_number,section_number,content,review_label) VALUES(?,?,?,?,?)machine_unreviewedzmUPDATE dokumente SET extrahierte_inhalte=?,processing_quality=?,verarbeite_datum=CURRENT_TIMESTAMP WHERE id=?zUPDATE document_processing SET extraction_status=?,search_status=?,transfer_status=?,engine=?,engine_version=?,page_count=?,updated_at=? WHERE document_id=?machine_searchablenot_searchablecandidates_availableno_candidateszUPDATE document_processing SET extraction_status='failed',search_status='not_searchable',last_error_code='extraction_failed',updated_at=? WHERE document_id=?zFUPDATE dokumente SET processing_quality='extraction_failed' WHERE id=?rq   )[rk  rg   r   DOCUMENT_QUARANTINEr#   DOCUMENT_STORAGEr  
is_symlinkrB  rH  rK  r  r   ro   rp   r   r  r  r  r  r  apply_document_schemaassert_document_schemar  r  assert_reconciliation_schemar2  r    r  r   rb   duprT  O_WRONLYO_CREATO_EXCLrV  fdopenshutilcopyfileobjflushfsyncfilenor\  r  r   r   r   r   r   r  r   rJ  r   rp  TimeoutExpiredrz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)   r  tempfileTemporaryDirectoryr   r  r   	enumerater  zipr{  casefoldrz  r|  r"   r  r   r   r3  r4  ),rs   recordr  r  	intake_idro   r  destinationr  	source_fdsrc_fddst_fdsrcdstr  media_recordinfo
derivativetempr  engine_versionpagesconfidencesnormalized_pagesusefulextraction_statusfull_originalfull_normalized
version_idpreviousrepeatedcandidate_pagescandidate_page_numberspage_nooriginalr  r   r   
repetitioncomparedr  
similarity
candidatesr}  s,                                               ri   apply_document_importr    s   <===$W-?%@BUVVNFFh78,,,3444 !455H   E%5%@%@%B%B ECDDD4edCCCHu%%%I
,~
&
&
0
0)
0
D
DC..J$[J#K$(I IK^3444j)))z***:&&&J'''$Z000*66::	&& YH
 
 (** 	  	3#89 	3s9-B#CDDEEKK*	-M6(;K-M-MMK(((VI&&FW["+
*BRY*NQSQ^*^`effF3YvtU;;; hsBIfVZdiDjDjDj hnq&sC	BBBBCIIKKKQSQYZ]ZdZdZfZfQgQgQgh h h h h h h h h h h h h h h h h h h h h h h h h h h h h h    "(6"2"2"2"2   "(6"2"2"2"2,---jkkttvv 	_]^^^4-6(+--s;/?/?&QW.\mJmJmszS((4/D8995(?B[]cdl]m(*:Is;GWGWYabqYrYzvzm$,.	
 	
 	
 *,,-IJJSSUUVWXYYs6(#3I4_C	$4H4H4H[_`fgs`tu}  R  vS  v[  W[  \d  eu  \v  \~  z~  G  HN  O  W  SW  X[  \_  `	
 	
 	

 zz,//lD)) 	,,|,,D)-tQUei  |D  E  EJ!!"9+GWYbdh"i"ijjjjZ)BC   GT_T^DKW[Wabfbmnrn~  @D  @T  UY  Uj  ko  ky  z~  zD  EO  P^  E_  `j  kw  `x  yC  DT  yU  V`  ao  Vp  q{  |L  qM  NR  N_  `d  `t  uy  uG  HL  Hd  eh  i  
 	 	
2K=W\]]]]^h^o^o^q^q^qZ  HY&&&	'*<"=DDD	DLLX\L]]]]aC	 ,4IJJJ td=J;X^_eXfhlmqhrhr=s=s:{t t t t t t t t t t t t t t tNNNNN@@/?@@@@@F*0 F6F((""#4555""  $b  ep  dr  s  s  s""  $`  ci  jx  y|  }H  bI  J  J  J!!####Jr}[`aaaablbsbsbububu @  HY&&&	'*<"=DDD	DLLX\L]]]]G #KK'j'jV_`eghViVi'j'j'jjjM$kk)w)wXabrtuXvXv)w)w)wwwO ))J0111 rK}_VTbcfg   "))rXo67  hjj	 
 H)+O02"?HUScdoIpIpqr?s?s ; ;;;(J
 
(;(;(=(=(D(D(F(FGGQQSS'?$
H# U UC!3Hc#oBV>W>W!X!XJS%8!9!9999Dc#mJ\F]F]_gjk_khH
mrmr!S((Z;-F-F/;S]AS=T=TH
T
.@ @ @u*"" SW%%k!GHZPZ[ablmuv   ,,#**8444*11':::'Xn  H  VW  X  X  XJ"  ""<$ZD1A,B4CUVZ[aVbcghucvw{  }M  xN  OS  Tb  Oc  dh  iq  dr  sw  xD  sE  FJ  K`  Fa  bf  g~  b  @C  D   
 \_bcn_o_o^qrrr'01A1'E'E d d# d&&  (`  be  fq  br  br  sz  {B  CM  Nb  ac  d  d  d   O  Q^  _p  q|  P}  ~  ~  ~ s"6#W#7#7GWr|  YRXnXn  CR  SY  Zh  il  mr  is  is  tw  xC  D    	  	  	 !!!     AD  EP  @Q  R  R  Rgithvwww		 
 	Jr}SXYYYY  HY&&&	'*<"=DDD	DLLX\L]]]]    h	h{/A/A/C/Ch[EWEWcgEWEhEhEh
  HY&&&	'*<"=DDD	DLLX\L]]]]s   Es %M= <M	AL2&M	2L6	6M	9L6	:M	=M= 	MM= MM= )s =*N''F?s '*V s V1.s 0V11Cs 1o *\<0o <]  o ] B7o #M8o s A!q =s ?q  ,s At""t% %A)vr  ro   c                V   |                      d|f                                          }t          |d         p|d                   }|j        dk    s|j        #|                                 t          d          t          |j        pd          	                    d          rE|                      d|f           |                      d	||f           |                                 d S 	 t          j        d
          5 }|j        dk    rdn|j        dk    rdnd}t          |          d| z  }t          j        t          j        |j                  d          5 }|                    d          5 }	t#          j        ||	d           |	                                 t          j        |	                                           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   t-          ||j        pdt          |                    \  }
}}}d d d            n# 1 swxY w Y   d |D             }t/          |          sE|                      d|f           |                      d||f           |                                 d S t1          |                      d|f                                          d                   }d                    d t5          |d          D                       }d                    d t5          |d          D                       }|                      dt7          d          |||
|||
||f	           |                      d |f                                          }t          |                      d!|f                                          d                   }g }g }t5          t;          |||          d          D ]0\  }\  }}}|rd"nd#}d }t=          j        |                                 !                                          "                                }|D ]t}tG          |t          |d$                             }|t          |d%                   k    rd&}t1          |d'                   } n|d(k    rd)}t1          |d'                   }u|                      d*t7          d+          |||||||||f
           |d&k    r*|$                    |           |$                    |           2|                      d,|f           tK          ||
t          |d-         pd          t          |d.         pd          d/|||0          }|D ]g} |                      d1| d2         || d3         | d4         | d5         | d6         | d7         | d8         | d9         | d:         | d;         | d<         |f           h|                      d=t          |          f           t5          |d          D ]-\  }}|                      d>t          |          |||d?f           .|                      d@||
|f           |                      dA|
|rdBndCtM          |          |
|||f           |                                 d S # |                                 w xY w)DNzXSELECT local_original_path,dateipfad,document_date,institution FROM dokumente WHERE id=?rG  	dateipfad	availablezdocument original unavailablerd   zvideo/zaUPDATE dokumente SET review_status='nicht_geprueft',processing_quality='media_preview' WHERE id=?zUPDATE document_processing SET extraction_status='no_usable_text',content_status='partial',search_status='not_searchable',transfer_status='no_candidates',engine='media_preview',last_error_code=NULL,updated_at=? WHERE document_id=?zhealth-document-retry-r  rO  z.pdfz	image/pngz.pngz.jpgr  rI  rK  rL  c                ,    g | ]}t          |          S rq   r`  ra  s     ri   r  z-retry_document_extraction.<locals>.<listcomp>D  s!    HHH$/55HHHrk   z>UPDATE dokumente SET review_status='nicht_geprueft' WHERE id=?zUPDATE document_processing SET extraction_status='no_usable_text',content_status='partial',search_status='not_searchable',last_error_code=NULL,updated_at=? WHERE document_id=?QSELECT COALESCE(MAX(version),0)+1 FROM document_text_versions WHERE document_id=?r   rf  c              3  ,   K   | ]\  }}d | d| V  dS rh  rq   r   ir   s      ri   r   z,retry_document_extraction.<locals>.<genexpr>I  s7      !Z!ZVQt"8A"8"8$"8"8!Z!Z!Z!Z!Z!Zrk   r{   c              3  ,   K   | ]\  }}d | d| V  dS rh  rq   r  s      ri   r   z,retry_document_extraction.<locals>.<genexpr>I  s        w{  w{  SY  ST  UY  xN  BC  xN  xN  HL  xN  xN  w{  w{  w{  w{  w{  w{rk   zINSERT INTO document_text_versions(id,document_id,version,source_kind,original_text,normalized_text,engine,engine_version,created_at) VALUES(?,?,?,?,?,?,?,?,?)rn  zzSELECT document_id,original_text,section_hash FROM document_pages WHERE document_id<>? ORDER BY document_id DESC LIMIT 100=SELECT intake_id FROM document_processing WHERE document_id=?ru  ro  rp  rq  rr  r  rs  rt  rv  rw  zEDELETE FROM document_candidates WHERE document_id=? AND status='open'r  r  r  r  rx  zINSERT OR IGNORE INTO document_candidates(id,document_id,candidate_type,value_text,unit,page_number,section_number,context_text,engine,confidence,source_text_version,candidate_fingerprint,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)r  r|  r}  r   r~  r  r  r  r   r  r  r  r  r  ziUPDATE dokumente SET extrahierte_inhalte=?,processing_quality=?,review_status='nicht_geprueft' WHERE id=?a)  UPDATE document_processing SET extraction_status=?,content_status='partial',search_status='machine_searchable',transfer_status=?,page_count=?,engine=?,engine_version=?,last_error_code=NULL,retry_count=retry_count+1,reconciliation_revision=reconciliation_revision+1,updated_at=? WHERE document_id=?r  r  )'r  r  r$   r  r`  r\  rg   rb   rN  r  r  r  r   rH  r  r  rT  r  r  r  r  r  r   r   r   r   r  r  r  r  r{  r  r  rz  r|  r"   r  r   r   )!r  r  ro   documentprobe	directoryrH  copiedr  r"  r  r  r  r  r  ry   rp  normalized_textr  intake_scoper  r  r  r  r  r   r  r  	page_hashr  r  r  r}  s!                                    ri   retry_document_extractionr  3  s
   !!"|  J  ~L  M  M  V  V  X  XH8$9:Sh{>STTE|{""e&6&>\*IJJJ
5:''11 ~  BM  AO  	P  	P  	P  D  GJ  KV  FW  	X  	X  	X#(0HIII 	rY$z->>>VVej\gNgNgFFmsF)__'8'8'88F26%"233D99 eVV[[QUEVEV eZ`"6&9996<<>>>28TZTaTaTcTcKdKdKde e e e e e e e e e e e e e e e e e e e e e e e e e e e e e9FvuzO_]_aefoapap9q9q6FNE;	r 	r 	r 	r 	r 	r 	r 	r 	r 	r 	r 	r 	r 	r 	r IH%HHH#$$ 	l_al`nooo   Q  SV  Wb  Rc  d  d  d2 	1 J&&'z  }H  |J  K  K  T  T  V  V  WX  Y  Z  Zkk!Z!ZyQVWXGYGY!Z!Z!ZZZkqkvkv  w{  w{  ]f  gw  xy  ]z  ]z  w{  w{  w{  l{  l{[j  }  F  GN  O  O  P[  \c  dj  kx  yH  IO  P^  _b  ~c  	d  	d  	d##  %a  cn  bp  q  q  z  z  |  |++,kmxlz{{  E  E  G  G  HI  J  K  K228A#eL\]hBiBijk8l8l 	s 	s4G4Xj (@uu.@J4(nZ%8%8%:%:%A%A%C%CDDNNPPI ^ ^-hs3;O7P7PQQ
c#n"56666;
Y\]`an]oYpYpPXrwrws??|Jc#mJ\F]F]X   ^  `g  ho  `p  `p  q|  }D  EL  MU  V`  ak  lu  v@  AI  _J  K  K  K[((/*@*@*J*J*JLbLiLijqLrLrLrbdocqrrr!/&#hWfNgNmkmJnJn  ~A  BJ  KX  BY  B_  ]_  ~`  ~`  :a  :a  oE  Ua  ov  w  w  w
 	| 	|D   K  MQ  RV  MW  Xc  dh  iy  dz  {  @L  {M  NR  SY  NZ  [_  `m  [n  os  tD  oE  FJ  KY  FZ  [_  `h  [i  jn  o{  j|  }A  BW  }X  Y]  ^u  Yv  wz  L{  |  |  |  |XZ]^iZjZjYlmmm"+,<Q"?"?  	Q  	QGJASAS  UM  OR  S^  O_  O_  `g  ho  pz  {O  NP  BQ  BQ  BQ  BQ  G  IV  W]  ^i  Hj  	k  	k  	k  G  IO  jt  PI  Pf  Pf  zI  JM  NS  JT  JT  U[  \j  kn  oz  H{  	|  	|  	|s   +Z  AH)G(4AGG(GG(GG(H)(G,	,H)/G,	0-H)Z )H--Z 0H-1AZ O(Z Z(tuple[str | None, str | None]c                   | sdS d}d                     t          |                                                     }t          j        d| d| d|t          j                  }|rR|                    d                              dd	          |                    d
                              dd	          fS t          j        d| d|          }|rr|                    d                              dd                              dd          }|                    d
                              dd	          }|dv rd |fn|d fS dS )N)NN[+-]?\d+(?:[.,]\d+)?r   z\s*(u   )\s*(?:-|–|—|bis)\s*(z)(?:\s+[^\d]*)?\s*r{   r  .r   u   \s*(<=|>=|<|>|≤|≥)\s*(   ≤<=   ≥>=>   <r  )r   rb   r   r   r   r   r  r   )r_   numberr   range_match
comparatoroperatorrh   s          ri   _reference_boundsr  c  sQ    y"F	#c((..""	#	#D`V``f```aefhfjkkK [  ##++C44[5F5Fq5I5I5Q5QRUVY5Z5ZZZ|T&TTTUYZZJ H!!!$$,,U488@@tLLq!!))#c22':55U||E$<G9rk   c           	     B   | sd S d}d                     t          |                                                     }t          j        d| d| d| d|t          j                  }t          |r|                    d          nd                                          }|pd S )	Nr  r   z	\s*(?:(?:u   )\s*(?:-|–|—|bis)\s*(?:u   )|(?:<=|>=|<|>|≤|≥)\s*(?:z))\s*(.*?)\s*r{   rd   )r   rb   r   r   r   r   r  r   )r_   r  r   matchrH  s        ri   _reference_unitr  s  s     t"F	#c((..""	#	#D
,  BF  B  Bv  B  Blr  B  B  B  CG  HJ  HL  M  ME.u{{1~~~B//5577F>Trk   objectc                    t          |           }||n\dd                    t          | pd                                                                                                                    z   S )Nzqual:r   rd   )r(   r   rb   r   r  r   )r_   r  s     ri   _laboratory_value_identityr  }  s]    C  G)77wsxxCI2@T@T@V@V@_@_@a@a@g@g@i@i7j7j/jjrk   candidate_idc                   	 t          | |          }n# t          $ r Y d S w xY w|d         dk    r|                     d||f                                          }|rt	          |d         |d                   nd }|st          d          ||d         d<   t          |d         |d	         |d
         |d                   \  }}	|r|	st          d          |	|d         d<   d                    t          |d	         pd          	                                          pd |d         d	<   dt          j        |                                                                          d d         z   }
|                     d|
|||d         d|d         t          |d                   t          |d                   |d         |d         |d         |d         |d         ||f           d S )Ntarget_area
laboratoryzSELECT c.value_text,c.context_text,c.unit,m.normalized_parameter,m.normalized_unit
                 FROM document_candidates c JOIN document_candidate_matches m ON m.candidate_id=c.id
                WHERE c.id=? AND c.document_id=?r}  r  z-laboratory candidate observation date missingru  r   r   normalized_parameternormalized_unitz+laboratory candidate catalog target missingr  r   rd   	transfer_r  a[  INSERT INTO document_transfer_staging(id,candidate_id,document_id,target_area,status,operation,old_value_json,new_value_json,source_page,expected_text_version,expected_candidate_revision,expected_reconciliation_revision,idempotency_key,reviewed_action_id,created_at)
      VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(candidate_id) DO NOTHINGreviewed_pending_previewr  r  source_pageexpected_text_versionr   expected_reconciliation_revisionr7  )r*   r   r  r  r-   rg   r,   r   rb   r   r{  r  rz  r|  r  )r  r  r  r  ro   preview	candidateobservation_dater  proposedstage_ids              ri   _stage_document_candidater    s    L99   }--&&4 +&	
 

 (** 	 hqz0<1HSaIbcccvz 	PNOOO/v29\3J9U[K\]fg}]~  @I  J[  @\  ]  ]	( 	N 	NLMMM$,{#"xxIf,=,C(D(D(J(J(L(LMMUQUv(;(;(=(=>>HHJJ3B3OOH TU]^jkvw~  @M  xN  Oi  jq  r}  j~  N  OV  W\  O]  ^  ^  _n  ov  w|  o}  _~  _~  F  GT  U  V]  ^u  Vv  w~  \  w]  ^e  fH  ^I  JQ  Rc  Jd  en  or  Ust t t t ts    
!!c                n   |                      d|f                                          }|t          d          |d         dk    rd S |d         dk    rt          d          |                      d|f                                          }|
|d         dvrt          d	          t          |d
                   t          |d                   k    st          |d                   t          |d                   k    sXt          |d                   t          |d                   k    s,t          |d                   t          |d                   k    rt          d	          |d         dk    r|d         r|d         st          d          t	          j        t          |d                             }t          |d                   }d }	|dk    rt          |                    d          pd          }
t          j	        d|
          }d
                    d|
v r|
                    dd          d         n|
                                                                                                          }|s	|t          vs*|                    d          r|                    d           st          d!          |re|                    d"                              d#d$                              d%d&                              d'd(                              dd          n|t#          |d          |                    d)                    \  }g }|                      d*t          |d                   f          D ]s}t#          |d+         |d,                   \  }}||k    rL|                    t          |d-                   t'          |d.                   ||d/         |d0         f           tt)          fd1|D             d           }|r
|d"         }	n`|rt          d2          t+          |                    d3                    \  }}|                    d3          r||t          d4          t-          |                    d3                    }|r/t/          |          t/                    k    rt          d5          t          |                    d3          pd          pd }|                      d6t          |d                    t          |                    d)          pd          |rd7| nd |||
d8d9d:d;dd<t          |d=                    d>d t          |d                   f          }|j        t          d?          t          |j                  }	n|d@k    rN|                    d          st          dA          t          |d                   d dB         }t          |                    d)          pd          d dC         }|                      dDt          |d                   ||f                                          }|rt          |d"                   }	n|                      dEt          |d                   ||ddFdGt          |d=                    d8|t          |d                   dHz   f	          }|j        t          dI          t          |j                  }	n{|dJk    re|                    d          st          dK          |                      dLf                                          d"         }t          |d                   d dM         }|                      dNt          |d                   t          |pd          d dB         |f                                          }|rt          |d"                   }	n|                      dOt          |d                   dt          |pd          d dB         |ddGt          |d=                    |f          }|j        t          dP          t          |j                  }	nt          dQ          |                      dR||	||f           |                      dS|f           d S )TNzNSELECT * FROM document_transfer_staging WHERE candidate_id=? AND document_id=?zcandidate not stagedr  transferredr  zcandidate transfer blockedaL  SELECT c.status,c.candidate_revision,c.source_text_version,p.reconciliation_revision,p.original_status,p.original_reviewed_at,
      EXISTS(SELECT 1 FROM document_pages pg WHERE pg.document_id=c.document_id
        AND pg.text_version=c.source_text_version AND pg.page_number=c.page_number AND pg.reviewed_at IS NOT NULL) AS source_page_reviewed,
      (SELECT COALESCE(MAX(version),0) FROM document_text_versions WHERE document_id=c.document_id) AS latest_version
      FROM document_candidates c JOIN document_processing p ON p.document_id=c.document_id WHERE c.id=? AND c.document_id=?   	confirmedcorrected_confirmedzcandidate transfer stalecandidate_revisionr  r  r  latest_versionreconciliation_revisionr  original_statusr  original_reviewed_atsource_page_reviewed candidate source review requirednew_value_jsonr  r  rh   rd   u"   [<>≤≥]?\s*[-+]?\d+(?:[.,]\d+)?r   r  r{   r   r  zincomplete laboratory transferr   r  r  r  r  r  r  r   zSELECT id,parameter_name,wert,einheit,dokument_id,canonical_document_id FROM laborwerte
          WHERE COALESCE(abnahme_datum,befund_datum)=? AND verified_against_original=1parameter_nameeinheitr  wertdokument_idcanonical_document_idc              3     K   | ]=}|d          t                    k    |d         k    '|d         |d         hv 9|V  >dS )r{   r   r  r   N)r  )r   r}  r  public_unitrh   s     ri   r   z/_transfer_document_candidate.<locals>.<genexpr>  s        a  aTtAw@Z[`@a@a7a7afjklfmozfzfz  @K  PT  UV  PW  X\  ]^  X_  O`  @`  @`D  @`  @`  @`  @`  a  ark   zlaboratory transfer conflict	referencez#laboratory reference range conflictz"laboratory reference unit conflictaC  INSERT INTO laborwerte(dokument_id,parameter_name,wert,einheit,bemerking,reference_min,reference_max,wert_original,quelle,validierungsstatus,source_type,reference_range_source,verified_against_original,canonical_document_id,provenance_note,abnahme_datum,befund_datum)
              VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)zQuell-Referenzbereich: r  	validiertdocument_candidatescanned_originalzreviewed document page r  z; candidate provenance retainedzlaboratory transfer failedrE  zincomplete medication transferr   r   zSELECT id FROM medication_administrations WHERE datum=? AND medication_name=? AND COALESCE(dose,'')=? AND event_type='administered' LIMIT 1zINSERT INTO medication_administrations(datum,medication_name,dose,route,event_type,notes,source,created_at,occurred_at) VALUES(?,?,?,?,?,?,?,?,?)r   zVerified document page zT12:00:00+02:00zmedication transfer failedr   zincomplete appointment transferz,SELECT institution FROM dokumente WHERE id=?r   zVSELECT id FROM arztbesuche WHERE datum=? AND COALESCE(klinik,'')=? AND grund=? LIMIT 1ziINSERT INTO arztbesuche(datum,arzt,klinik,grund,zusammenfassung,notizen,created_at) VALUES(?,?,?,?,?,?,?)zappointment transfer failedzunsupported transfer targetzUPDATE document_transfer_staging SET status='transferred',transfer_action_id=?,canonical_row_id=?,transferred_at=? WHERE candidate_id=? AND status='reviewed_pending_preview'zgUPDATE document_processing SET transfer_status='partially_transferred',updated_at=? WHERE document_id=?)r  r  rg   r   r]  r^  rb   r   r   r   r   r   r   r  r+   r  r   r%   r  r  nextr  r  r'   	lastrowid)r  r  r  r  ro   stagecurrentrs   r"  canonical_id	raw_valuer   qualitativepublic_parametersame_parameterexisting_rowexisting_parameterexisting_unitexactlowerupperreference_unitsource_referencecursorrS  r   r  r  reasonr  rh   s    `                           @@ri   _transfer_document_candidater$    s;   


mo{  }H  oI  J  J  S  S  U  UE}<(>???X%%ffX222Fb9c9c3c   AM  NY  @Z	[ [ \d  \d  \f  \f	 
 '(+3VVV]i  kE  ^F  ^F  XF
7'())3u5R/S+T+TTTX[\cdy\zX{X{  ~A  BG  H_  B`  ~a  ~a  Ya  Ya  eh  ip  qA  iB  eC  eC  EH  IN  Of  Ig  Eh  Eh  eh  eh  lo  pw  xQ  pR  lS  lS  UX  Y^  _A  YB  UC  UC  lC  lC  JV  Wq  Jr  Jr  Dr%&33@V8W3\cdz\{3  DP  Qs  Dt  Dt  ~tJs5!123344GCm@T<U<UVcgVb|gkk'**0b11	y>yIIHH3);K;Kiooc!44Q77QZaaccllnnttvvww  	k;k99'++fBUBU9]d]h]hit]u]u9  }I  Jj  }k  }k  wkjp  Bfll1oo%%eD1199%EEMMcRUVV^^_bcefff  wB%78LW[[Y_M`M`%a%a$&.. 0Z[^_fgm_n[o[oZqs s 	B 	BL-?M]@^_klu_v-w-w,}!#333%%s<+='>'>?YZfgmZn?o?op}  K  LY  Z  [g  h  [@  'A  B  B  B  a  a  a  a  a  a^  a  a  a  bf  g  g 	/eAh 
	/,/M"N"NN)'++k*B*BCCKE%{{;''  FEMemR^  `E  SF  SF  MF*7;;{+C+CDDN  W."@"@.Q\B]B]"]"]dp  rV  eW  eW  _W [!9!9!?R@@HD%% ';<GGT_L`HaHabghklslwlwx~ll  mF  DF  iG  iG  xH  HR  Ht  br  Ht  Ht  Ht  NR  SX  Y^  _h  iz  {F  G[  \n  op  q|  }Q  WZ  [`  an  [o  Wp  Wp  }Q  }Q  }Q  RV  WZ  [b  ci  [j  Wk  Wk  <lm mF'l;W.X.X(XV-..LL			{{6""W6V)W)W#W!""4C4(c'++f2E2E2K.L.LSbS.Q##  %r  tw  x  @F  xG  tH  tH  IM  NR  sS  T  T  ]  ]  _  _ 	/Xa[!1!1LL%%  'z  |  @G  HN  @O  |P  |P  QU  VZ  []  ^l  mb  GJ  KP  Q^  K_  G`  G`  mb  mb  ct  ux  y|  }D  EK  }L  yM  yM  N_  y_  {`  a  aF'l;W.X.X(XV-..LL			{{6""X6W)X)X#X&&'UWbVdeennppqrs{~  @G  HO  @P  |Q  |Q  RV  SV  RV  |Wtz##$|  B  CJ  KQ  CR  S  S  TW  Xc  Xi  gi  Tj  Tj  ko  lo  ko  Tp  qw  ~x  y  y  B  B  D  D 	/Xa[!1!1LL%%  'R  TW  X_  `f  Xg  Th  Th  ik  lo  p{  pA  A  lB  lB  CG  DG  CG  lH  IO  PR  SH  mp  qv  wD  qE  mF  mF  SH  SH  IL  SM  N  NF'l;X.Y.Y(YV-..LL9::	:  G  IR  S_  `c  dp  Hq  r  r  r  A  CF  GR  BS  T  T  T  T  Trk   c                )   @AB t           t          d          t          j        t                     }t          j        |_        	 |                    d           t          |           t          |           t          |           t          |           |                                 |                    d           |                    d d         f                                          }|t          d          t          |d                   }t          j        t!                                                                                               }|                    d|f                                          }|rE|d         |k    rt          d	          |                                 |                                 d S  d
         }t+          j        t.                                        d          }|dv rK|                    d d         ||f                                          }	|	t          d                               d          }
                     d          }t5          |	d                   dk    }|r|
|t          d          |r.|dk    r(                     d          dk    rt          d          |
5t          |	d                   t          |
          k    rt          d          |d                    t5          |	d         pd                                                    }d|v r6|                    dd          d                                         d d          nd}t=          ||	d!         |	d"         |	d#                   \  }}t?          t5           d                   t          |	d                   t5          |	d$         pd          |||d                    t5          |	d!         p	|	d#         pd                                                    pd tA          |	d         |	d%                   d                    t5          |	d&         pd                                                    d d          pd t5          |	d'         pd          pd t5          |	d(         pd          pd )          }tC          j"        |t5          |                    st          d*          |d+k    p|dk    o                     d          d,k    }|r+|	d-         d.k    r|	d'         r|	d(         st          d/          |d0k    r'tG          |||           tI          |g |gd12           n|d3k    r5|                    d4|||f          j%        }|dk    rt          d5          n|d6k    r~t           d                             d7d          d                   B|                    d8||||Bf          j%        }|dk    rt          d9          |                    d:||f           n#|d;k    r d<         }|                    d=|d>         pd |d?         |d@         pd |f           |                    dA|dB         pd |dC         pd |dD         pd ||f           tI          |g |gd12           n|dEk    rytM           fdFtO          j(                    D             d           }|t          dG          |\  }}|                    dH d         ||f                                          @@
@dI         dJvrt          dK          tS          @d!                   tS          |j*                  k    rt          dL          tW          |          }tS          |j*                  Ag }@dM         r|                    dN@dM         f          D ]r}tY          |dO         |dP                   \  }}||k    rK|-                    t]          |dQ                   tS          |          t5          |dQ                   f           s@AfdR|D             }|rdSn|rdTndU}|rdVn|rdWndX}t          j        t!           d         |j/        |@dM         @dY         Ata          |          dZ                                                                                    }|                    d[||Ata          |          ta          |          dk    r|d\         d]         nd || d         f           |                    d^|| d         |f           |                    d_| d         t5          @d"         pd          ||j*        |f           |                    d`||f           t          |                    da|f                                          d\                   } t          |                    db|f                                          d\                   }!|                    dc| |!|!rddnde||f           
n|dk    rd,ddfdVdXdWdg}" d         }#|#|"vrt          dh          |                    di d         ||f                                          @@
@dI         dJvrt          dK          djdkdldVdmdmdg|#         }$|#dWk    rdnn|#dk    r do         nd }%|                    dp| d         |$t5          @d                   |% d!         pd |f           |#dqk    rv|                    dr|"|#         |#dk    r do         nd  d!         pd | d         ||f          j%        }|dk    rt          dK          |#dsv rtc          || d         ||           t          |                    dt||f                                          d\                   } |                    du|f                                          }&|&s| rdvndf}'|                    dw|'||f           tI          |g |gd12           n'|d+k    rV d         dxk    rt          dy          te          || d         ||           |                    dz|| d         |f           n|d{k    r|                    d||f                                          }(|(t          d}          |(d~         dk    })|(d-         d.k    p|(d'          pt          |(d                   }*|) o7|(d         dvp-t          |(d                   dk     pt          |(d                   }+|)o|(d         dk    },|*s|+s|,rt          d}          |                    d|f           |                    d|)rdnd||f           |)s|                    d                                          r{|                    d|f                                          }-|                    dt5          |          f           |                    dt5          |          f           |                    d||f          3                                }.|.D ]}/|/d         dk    rdnd}0|                    d|0 dt5          |          t          |/d                   dt5          |-d         pd          d d          t5          |-d         pd          d d         t5          |-d@         pd          d d          t5          |-d         pd          d d         t5          |/d                   f           |                    dt5          |          f           tI          |g |gd12           n|dk    r>|                    d||f           |                    dt5          |          f           nt           d                             d7d          d                   B|                    d||f          3                                }1|1rBd |1D             vrt          d9          t          |                    d|f                                          d\                   }2g }3g }4|1D ]l}/t          |/d                   Bk    r do         nt5          |/d                   }5ti          |5          }6|3-                    d|/d          d|5            |4-                    d|/d          d|6            t          |/d                   Bk    rd n|/d         }7t          |/d                   Bk    rd n|/d         }8|                    dtk          d          ||2t          |/d                   |5|6|/d         t          j        |66                                                                                                          |/d         |/d         |7|8f           nd                    |3          }9d                    |4          }6|                    dtk          d          ||2|9|6||f           |                    dt5          |          f           |1D ]}/t          |/d                   Bk    r do         nt5          |/d                   }5|                    dt5          |          t          |/d                   t          |/d                   ti          |5          df           |                    d|9|f           t5          |                    d|f                                          d\                   }:|                    d|f                                          };B fd|1D             }<to          |<dt5          |;d>         pd          t5          |;d@         pd          dd |1D             |:|2          }=|=D ]a}>|                    d|>d         ||>d         |>d         |>d!         |>d         |>d         |>d%         |>d         |>d         |2|>d         |f           b|                    d||f           tI          |g |gd12           |dv rdn|}?|                    d|||? d         pd ||f           |                                 n## tp          $ r |                                  w xY w	 |                                 d S # |                                 w xY w)Nrd  r  r  z=SELECT document_id FROM document_processing WHERE intake_id=?r  zdocument not foundz>SELECT payload_hash FROM document_review_log WHERE action_id=?payload_hashzaction replay mismatchr  r:  r   r  a  SELECT c.candidate_type,c.candidate_revision,c.value_text,c.context_text,c.unit,c.source_text_version,c.page_number,
                          m.normalized_parameter,m.normalized_unit,m.reference_text,m.comparison_digest,
                          p.original_status,p.original_reviewed_at,
                          (SELECT pg.reviewed_at FROM document_pages pg
                            WHERE pg.document_id=c.document_id AND pg.text_version=c.source_text_version
                              AND pg.page_number=c.page_number AND pg.reviewed_at IS NOT NULL LIMIT 1) AS source_page_reviewed_at
                     FROM document_candidates c
                     JOIN document_candidate_matches m ON m.candidate_id=c.id
                     JOIN document_processing p ON p.document_id=c.document_id
                    WHERE c.id=? AND c.document_id=?
                      AND c.source_text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?)r  zcandidate revision conflictr  r	  r|  laboratory_valuez"candidate preview binding requiredr  r   r  z4laboratory correction requires a regenerated previewr  r   r}  rd   r  r{   r   r   r  r  comparison_digestr  reference_textr  source_page_reviewed_at)r  r  r(  target_parameterr  r  r   r  reference_rangesource_original_revisionsource_page_revisionz#candidate preview revision conflictr  r  r  r  r  r  Fr[  r  zUPDATE document_processing SET original_reviewed_at=?,content_status=CASE WHEN content_status='pending' THEN 'partial' ELSE content_status END,updated_at=? WHERE document_id=? AND original_status='available'zoriginal unavailabler
  r  zUPDATE document_pages SET reviewed_at=?,review_action_id=? WHERE document_id=? AND text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?) AND page_number=?zunknown document pagezUPDATE document_processing SET content_status=CASE WHEN content_status='pending' THEN 'partial' ELSE content_status END,updated_at=? WHERE document_id=?r  r  zIUPDATE dokumente SET document_date=?,kategorie=?,institution=? WHERE id=?r  r  r  ztUPDATE document_processing SET investigation_day=?,personal_title=?,personal_note=?,updated_at=? WHERE document_id=?r  r  r   r  c              3  H   K   | ]\  }}|j         d          k    ||fV  dS )rh   N)r  )r   r  specrs   s      ri   r   z(apply_document_review.<locals>.<genexpr>9  sA      zzy$W[WeipqxiyWyWy)T"WyWyWyWyzzrk   zunknown laboratory targeta  SELECT c.value_text,c.unit,c.status,m.normalized_parameter,m.normalized_date,
                          m.normalized_value,m.reference_text
                     FROM document_candidates c JOIN document_candidate_matches m ON m.candidate_id=c.id
                    WHERE c.id=? AND c.document_id=? AND c.candidate_type='laboratory_value'
                      AND c.source_text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?)r  >   rT  conflictingzcandidate not openzlaboratory remap unit mismatchnormalized_datezSELECT parameter_name,wert,einheit FROM laborwerte
                         WHERE COALESCE(abnahme_datum,befund_datum)=?
                           AND verified_against_original=1r  r  r  c                P    g | ]"}|d          d         k    |d         k     |#S )r   normalized_valuer{   rq   )r   r}  r  r  s     ri   r  z)apply_document_review.<locals>.<listcomp>X  sH      A  A  AdQ9M_C`8`8`eijkelpeeTeeerk   exact_matchvalue_conflictnot_presentalready_presentr1  rT  r4  )r  manual_metricr  r   rh   r   database_matchesa
  UPDATE document_candidate_matches
                      SET match_status=?,normalized_parameter=?,normalized_unit=?,
                          database_match_count=?,existing_database_value=?,comparison_digest=?,compared_at=?
                    WHERE candidate_id=?r   r   zUPDATE document_candidates SET status=?,candidate_revision=candidate_revision+1,reviewed_at=?
                    WHERE id=? AND document_id=?zINSERT INTO document_candidate_review_events
                   (action_id,candidate_id,decision,original_value,corrected_value,corrected_unit,processed_at)
                   VALUES(?,?,'corrected',?,?,?,?)zUPDATE document_processing SET reconciliation_revision=reconciliation_revision+1,transfer_status='candidates_available',updated_at=? WHERE document_id=?zaSELECT COUNT(*) FROM document_candidates WHERE document_id=? AND status IN ('open','conflicting')zSELECT COUNT(*) FROM document_candidate_matches m JOIN document_candidates c ON c.id=m.candidate_id WHERE c.document_id=? AND m.match_status IN ('value_conflict','ambiguous')zUPDATE document_reconciliation SET open_decisions=?,conflict_count=?,queue_bucket='now_reviewable',reason_code=?,prepared_at=? WHERE document_id=?rO   decision_requiredrejected)r  r  r<  r8  deferredr1  zinvalid candidate decisionzSELECT value_text,unit,status FROM document_candidates WHERE id=? AND document_id=? AND source_text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?)correctr   rejectrK   __incomplete__rh   zINSERT INTO document_candidate_review_events(action_id,candidate_id,decision,original_value,corrected_value,corrected_unit,processed_at) VALUES(?,?,?,?,?,?,?)r=  a%  UPDATE document_candidates SET status=?,corrected_value_text=?,corrected_unit=?,reviewed_at=?,candidate_revision=candidate_revision+1 WHERE id=? AND document_id=? AND source_text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?) AND status IN ('open','conflicting')r  zSELECT COUNT(*) FROM document_candidates WHERE document_id=? AND source_text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?) AND status IN ('open','conflicting')zSELECT 1 FROM document_transfer_staging WHERE document_id=? AND status IN ('reviewed_pending_preview','ready_for_transfer') LIMIT 1r  zQUPDATE document_processing SET transfer_status=?,updated_at=? WHERE document_id=?transferzinvalid transfer confirmationzINSERT INTO document_candidate_review_events(action_id,candidate_id,decision,original_value,processed_at) SELECT ?,id,'transfer',value_text,? FROM document_candidates WHERE id=? AND document_id=?r  a1  SELECT p.original_status,p.original_reviewed_at,p.extraction_status,
                (SELECT COUNT(*) FROM document_pages pg WHERE pg.document_id=p.document_id AND pg.text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=p.document_id)) AS page_count,
                (SELECT COUNT(*) FROM document_pages pg WHERE pg.document_id=p.document_id AND pg.text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=p.document_id) AND pg.reviewed_at IS NULL) AS unreviewed_pages,
                (SELECT COUNT(*) FROM document_candidates c WHERE c.document_id=p.document_id AND c.source_text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=p.document_id) AND c.status IN ('open','conflicting')) AS unresolved_candidates,
                (SELECT media_kind FROM document_media m WHERE m.document_id=p.document_id) AS media_kind,
                (SELECT preview_status FROM document_media m WHERE m.document_id=p.document_id) AS preview_status
                FROM document_processing p WHERE p.document_id=?zdocument review incompleterz  r  unresolved_candidatesr  >   ocr
text_layerrW  unreviewed_pagesr  readyz8UPDATE dokumente SET review_status='geprueft' WHERE id=?ziUPDATE document_processing SET content_status='reviewed',search_status=?,updated_at=? WHERE document_id=?r  reviewed_searchablezMSELECT 1 FROM sqlite_master WHERE type='table' AND name='health_document_fts'z@SELECT kategorie,institution,daten_typ FROM dokumente WHERE id=?z3DELETE FROM health_document_fts WHERE document_id=?z<DELETE FROM health_document_repeated_fts WHERE document_id=?zSELECT page_number,normalized_text,repetition_status FROM document_pages WHERE document_id=? AND text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?) ORDER BY page_numberrepetition_statusrr  health_document_repeated_ftshealth_document_ftszINSERT INTO z](document_id,chunk_no,title,category,institution,document_type,content) VALUES(?,?,?,?,?,?,?)r~  u   Dokument · 	kategoriezOhne Kategorier   	daten_typ   r  r  r  zUPDATE document_processing SET content_status='discarded',transfer_status='rejected',search_status='not_searchable',updated_at=? WHERE document_id=?a  SELECT page_number,original_text,confidence,repetition_status,compared_document_id,reviewed_at,review_action_id FROM document_pages WHERE document_id=? AND text_version=(SELECT MAX(version) FROM document_text_versions WHERE document_id=?) ORDER BY page_numberc                8    h | ]}t          |d                    S r~  r   r|  s     ri   r  z(apply_document_review.<locals>.<setcomp>  s&    7k7k7kUYD<O8P8P7k7k7krk   r  rp  ri  rj  reviewed_atreview_action_idzINSERT INTO document_pages(id,document_id,text_version,page_number,original_text,normalized_text,confidence,section_hash,repetition_status,compared_document_id,reviewed_at,review_action_id) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)rw  r   compared_document_idrf  zINSERT INTO document_text_versions(id,document_id,version,source_kind,original_text,normalized_text,engine,engine_version,corrected_by_action_id,created_at) VALUES(?,?,?,'manual_correction',?,?,'manual','1',?,?)rn  r  machine_corrected_unreviewedz\UPDATE dokumente SET extrahierte_inhalte=?,processing_quality='manual_correction' WHERE id=?r  z:SELECT document_date,institution FROM dokumente WHERE id=?c                |    g | ]8}t          |d                    k    rd         nt          |d                   9S )r~  rh   rp  )r   rb   )r   rb  r~  rs   s     ri   r  z)apply_document_review.<locals>.<listcomp>  s]      P  P  Py}s43F/G/G/T/T77++Z]^bcr^sZtZt  P  P  Prk   manualr  c                8    g | ]}t          |d                    S rO  rP  ra  s     ri   r  z)apply_document_review.<locals>.<listcomp>  s]      MA  MA  MA  ko  NQ  RV  Wd  Re  Nf  Nf  MA  MA  MArk   rx  a  INSERT INTO document_candidates(id,document_id,candidate_type,value_text,unit,page_number,section_number,context_text,engine,confidence,status,source_text_version,candidate_fingerprint,created_at)
                    VALUES(?,?,?,?,?,?,?,?,?,?,'open',?,?,?)r  r  r  r  zUPDATE document_processing SET content_status='partial',search_status='machine_searchable',reconciliation_revision=reconciliation_revision+1,updated_at=? WHERE document_id=?>   r  r  zzINSERT INTO document_review_log(action_id,document_id,action_type,target_id,payload_hash,processed_at) VALUES(?,?,?,?,?,?))9rk  rg   r  r  r  r  r  r  r  r  r  r2  r  r   r{  r  r  rz  r|  r4  r\  r   ro   rp   r   r   rb   r   r   r   r,   r.   r-   r  r  r  r)   rowcountr  r/   r  r'   r   r&   r%   r  r(   r  r   r  r$  r  r!   r  r  r   r3  )Crs   r  r  r  r  r   r  r  ro   boundr#  supplied_previewrequires_bindingr}  r  r  r  current_previewrequires_source_reviewchangedr  selectedr  r0  r  r  r  r  r  match_statusnext_statusr(  
open_countconflict_count
status_mapr   event_decisionevent_valuestagedrA  	readinessis_videocommon_incompletetext_incompletevideo_incompleter  reviewed_pagesrb  r"  current_pagesry   original_partsnormalized_parts	page_textr  rQ  review_actionr   r  document_metadatarevised_pagesrevised_candidatesr}  logged_operationr  r  r~  sC   `                                                               @@@ri   apply_document_reviewrw    s!   <===..J$[JF 3444z***:&&&J'''$Z000,---  !`bijwbxaz{{  E  E  G  G;l+?@@@#m,-- 8 8 ? ? A ABBLLNN%%&fhqgstt}} 	*'611F^9_9_3_!!!n m K(	l>**44i4HHWWW&&
y %{K@  hjj  }"#@AAA ',I J J&{{+=>>"5)9#:;;?QQ I%6%>BRBZ"#GHHH [I1E$E$E'++V`JaJaezJzJz"#YZZZ ,U;O5P1Q1QUXYjUkUk1k1k"#@AAA+ XXc%*=*C&D&D&J&J&L&LMM
ILPZIZIZJ,,S!44Q7==??EE`b	&=fu5K/LeTeNf' '#	8 #:!$W[%9!:!:sSXYmSnOoOo&)%0C*D*J&K&K^f'9#eFm&Uu=N7O&USU"V"V"\"\"^"^__gcg%<U<=PRWXfRg%h%h$'HHS7G1H1NB-O-O-U-U-W-W$X$XY]Z]Y]$^$fbf-07M1N1TRT-U-U-]Y]),U3L-M-SQS)T)T)\X\	# 	# 	# *?C@P<Q<QRR N&'LMMM%.2F%F &11\gkk*6M6MQ\6\ # & G'(K7701 834 8 ##EFFF***%j+sCCC
2K=W\]]]]]+++ ((  *{  }@  AD  EP  |Q  R  R  [G!||<0F#G#GG|-''gk288Q??BCCK ((  *c  eh  ir  s~  J  KV  dW  X  X  aG!||<0G#H#HH   z  |  @K  {L  M  M  M  M+++z*Hjlt  vE  mF  mN  JN  OW  Xg  Oh  iq  r  i@  iH  DH  IT  lU  V  V  V   V  X`  at  Xu  X}  y}  ~F  GW  ~X  ~`  \`  ai  jp  aq  ay  uy  z}  ~I  WJ  K  K  K
2K=W\]]]]]+++zzzz:K:Q:S:Szzz H "#>???%-"d"**y
 %{K@  hjj   Ih$7?V$V$V"#7888i/00N494M4MMM"#CDDD#67G#H#H ,TY77ON*+ 	I * 2 2> 013	! ! I IH 9K8TdKegopygz8{8{5&)-===&--x?O/P/PR`anRoRoqtu}  E  vF  rG  rG  /H  I  I  I A  A  A  A  An  A  A  AE,1l==>7l7G7G_lL/4e++>:e--_eK '!(!5%)^!5%&78&'9:+(+N(;(;! !   688
! 
! ikk  ,
 !(#'',/,?,?1,D,DN1%a(($%K(	    4c7;#7E  
 6 GK0#i@V6W6][]2^2^`prvr{  ~A  B	    kk"   Z//  1T  Wb  Vd  e  e  n  n  p  p  qr  s  t  tJ !3!3  5e  hs  gu  "v  "v  "  "  "A  "A  BC  "D  E  EN e^>-bZZObdgitu    ...&1H]is  GX  dj  yF  G  GJz*Hz))>Z1[1[+[ ((  *]  _f  gr  _s  t  @K  ^L  M  M  V  V  X  XI Ih$7?U$U$U\hi}\~\~V~(1_g  {L  X_  nu  v  v  w  @N.6-.G.G**ai  nC  bC  bCWU\M]M]  IMK   @  BK  LS  T_  L`  ao  ps  t}  ~J  tK  pL  pL  MX  Y`  ag  Yh  Yp  lp  qt  Au  v  v  v##$,,  .U  Wa  bj  Wk  @H  La  @a  @a  ls  t{  l|  l|  gk  ls  tz  l{  lC  C  DG  HO  P[  H\  ]h  it  Vu  v  v  a<<|4H'I'I!IBBBC\]ghst{  }H  uI  JS  TW  DX  DX  DXZ//  1r  t  @K  sL  M  M  V  V  X  X  YZ  [  \  \J%%  'l  ny  m{  |  |  E  E  G  GF17U:U--:Hrt|  ~A  BM  tN  O  O  O
2K=W\]]]]]...z"J..\Ba5b5b/b(K@TU^_bccc   e  gp  qt  u|  }H  uI  JU  fV  W  W  W  W***"** ,D FQNT T U]T\T^T^   "#?@@@ .'9H )*; < K  !`S\]sStOt  !`x{  }F  G^  }_  y`  y`"*l  v	:M0NVj0j  1unqr{  }I  sJ  oK  oK  NO  oO  1u  SV  W`  as  Wt  Su  SuO'RI6F,G7,R  AO A7G A"#?@@@Y[fZhiii   K  ai  MD  M]  M]  oD  EH  IT  LU  V  V  V `
 2 2  4C  !D  !D  !M  !M  !O  !O `%--.pr}q  A  A  J  J  L  L""#XZ]^iZjZjYlmmm""#acfgrcscsbuvvv)11  3}  J  KV  ~W   X   X   a   a   c   c* ` `D=ABU=VXc=c=c99i~F&&  (\f  (\  (\  (\  ^a  bm  ^n  ^n  or  sw  xE  sF  oG  oG  HL  WZ  [c  do  [p  [D  tD  WE  WE  FI  GI  FI  WJ  HL  HL  MP  QY  Ze  Qf  Ql  jl  Mm  Mm  nq  oq  nq  Mr  sv  w  @M  wN  wT  RT  sU  sU  VZ  WZ  VZ  s[  \_  `h  it  `u  `{  y{  \|  \|  }@  ~@  }@  \A  BE  FJ  K\  F]  B^  B^  ]_  `  `  `  `\^abm^n^n]pqqq
2K=W\]]]]],,,   v  x{  |G  wH  I  I  I\^abm^n^n]pqqqqgk288Q??BCCK&.. Vk*  hjj  ! <K7k7k]j7k7k7k$k$k"#:;;;*,,  .A  CN  BP  Q  Q  Z  Z  \  \  ]^  _  `  `GN/% x x03D4G0H0HK0W0WGG,,]`aefuav]w]w	29==
%%&S]0C&S&S	&S&STTTVfVmVm  o]x|  ~K  yL  o]  o]  Q[  o]  o]  W^  W^  W^&)$}*=&>&>+&M&MddSWXeSf(+D,?(@(@K(O(OUYZlUm""  $C  EL  MT  EU  EU  Va  bi  jm  nr  s@  nA  jB  jB  CL  MW  X\  ]i  Xj  kr  ky  zD  zM  zM  zO  zO  zV  zV  zX  zX  kY  kY  kc  kc  ke  ke  fj  k~  f  @D  E[  @\  ]h  iv  Dw  x  x  x  xkk.11IfkkJZ>[>[:   u  w~  F  wG  wG  HS  T[  \e  fp  qz  {~  v  @  @  @\^abm^n^n]pqqq% b b03D4G0H0HK0W0WGG,,]`aefuav]w]w	""  $\  ^a  bm  ^n  ^n  or  sw  xE  sF  oG  oG  HK  LP  Q^  L_  H`  H`  av  w@  aA  aA  B`  ]a  b  b  b  b}  @I  JU  V  W  W  WZ//0oq|p~  I  I  K  K  LM  N  O  OL(001mozn|}}  G  G  I  I P  P  P  P  P  BO  P  P  PM-mHVYZkl{Z|  [C  AC  WD  WD  SV  Wh  iv  Ww  W}  {}  S~  S~  F  F  MA  MA  s@  MA  MA  MA  Q]  kr   s   s   s* ] ]"" $@AEdKX\]mXnos  uA  pB  CG  HN  CO  PT  Ub  Pc  dh  iy  dz  {  @N  {O  PT  U]  P^  _c  dp  _q  ry  z~  V  zW  X[  A\] ] ] ]   O  QT  U`  Pa  b  b  b
2K=W\]]]]1:>f1f1f--lu  X  Zc  do  p@  AH  IT  AU  A]  Y]  ^d  eh  Yi  	j  	j  	j % % %u% 	 Zs1   E.AR 
AKAR RAS R AR?R?AS SAS/dict[str, Any] | strstr | dict[str, int]c           	     B   d }t          | t                    r0t          |t                    r|t          d          d| ||d}d}n(| }t          |t                    st          d          |}|d         dk    rt	          |          }n|d         dk    rt          ||           n|d         dk    r$t          |d	         |d
         |d                    n|d         dk    rt          ||           nz|d         dk    rt          |          }n^|d         dv rt          |           nD|d         dv rt          |           n*|d         dv rt          ||           nt          d          t          t          j        t          t                    dt          t                     dt          t                    dt#                                                      g}t&          t(          k    r|                    g d           t-          j        |dddd           |S )Nzinvalid legacy symptom actionr|   )rw   r   rx   rv   zlegacy-symptom-actionzinvalid action idrw   r   r  r   rx   rv   r   r'  r(  r)  r,  r}   re  rj  z--today)z--health-record-6ez--explorer-6cz--calendar-day-6dTr   rf  )r   rb   r   r   r  rw  rv  r  r  r  r5  rD  DASHBOARD_V5_FILErl  rm  DASHBOARD_V5rk  rr   r   DASHBOARD_V5_PROFILEV5_PROFILE_HEALTH_RECORD_6Ero  rp  rq  )rs   r  rv   r#  normalized_payloadr=  
v5_commands          ri   apply_actionr    s   
 !I'3 ))T** 	>em<==='	.
 .
  7$)S)) 	20111((#'888)*<==			H	%):	:	:02FGGGG	H	%):	:	:v&x(w'	
 	
 	
 	

 
H	%)<	<	</1EFFFF	H	%	8	8();<<			H	% * 
 

 	/0000	H	%)Q	Q	Q 23333	H	% * 
 
 	!!35IJJJJ-...$N!""MM##%%	

  #>>>LLL   		
 	
 	
 	
 rk   rw   c                   t          j        d|           st          d          |dvrt          d          t          dz  }|                                r#|                                rt          d          |                    ddd	
           t          j	        |d           ||  dz  }|d|  dt          j
                     dz  }d| |dt          j        t                                        d          d}t          j        |t          j        t          j        z  t          j        z  t          j        z  d          }	 t          j        |dd          5 }t+          j        ||d	d	d           |                    d           |                                 t          j        |                                           d d d            n# 1 swxY w Y   t          j        ||           t          j	        |d           	 |                                 d S # t:          $ r Y d S w xY w# 	 |                                 w # t:          $ r Y w w xY wxY w)Nr   zinvalid receipt action id   r|   r   zunsupported receipt actionreceiptsz'receipt directory must not be a symlinkr<  FTr=  r^  r  .tmpr{   	processedr:  r   )ry   r  rw   r  processed_atrO  wrP  encodingr  r  
)r   r   r   rA  r  r  rg   rB  rH  rK  getpidr   ro   rp   r   rT  r  r  r  rV  r  r]  dumpwriter  r  r  r   r  FileNotFoundError)r  rw   receipt_dirr"  r  rs   r`  handles           ri   write_action_receiptr  7	  s   <33 64555===5666+K F 6 6 8 8 FDEEE5%$???H[%   i....F:Y::::::D ^44>>	>RR G r{RZ7")CbmSUZ[[JYz3999 	&VIgvDDU_````LLLLNNNHV]]__%%%		& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&
 	
4   
	KKMMMMM  	 	 	DD		KKMMMM  	 	 	D	sg   H/ A)GH/ GH/ G-H/ H 
H,+H,/I1II
IIIIr7  r  r  c                ~   t          j        d|           r|dvst          j        d|          st          d          t          dz  }|                                r#|                                rt          d          |                    ddd	
           t          j	        |d           ||  dz  }|d|  dt          j
                     dz  }d||t          j        t                                        d          d}t          j        |t          j        t          j        z  t          j        z  t          j        z  d          }	 t          j        |dd          5 }t+          j        ||d	d	d           |                    d           |                                 t          j        |                                           d d d            n# 1 swxY w Y   t          j        ||           t          j	        |d           |                    d	           d S # |                    d	           w xY w)Nr   >   r<  r  r   zinvalid capture receiptzcapture-receiptsz/capture receipt directory must not be a symlinkr<  FTr=  r^  r  r  r   r:  r   )ry   r  r  r  rO  r  rP  r  r  r  r  rv  )r   r   r   rA  r  r  rg   rB  rH  rK  r  r   ro   rp   r   rT  r  r  r  rV  r  r]  r  r  r  r  r  r   r  )	r7  r  r  r  r"  r  r  r`  r  s	            ri   write_capture_receiptr  Z	  sw   L/::4222|O[99 3 2333!33K N 6 6 8 8 NLMMM5%$???H[%   o4444F@_@@ry{{@@@@D" ^44>>	>RR	 F bkBJ&2R]BE J%Yz3999 	&VITTj    LLLLNNNHV]]__%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	
4   
t$$$$$t$$$$s1   H$ "A)GH$ GH$ G-H$ $H<c                 "   t           t          dt          j                   dS 	 t	                       n,# t
          $ r t          dt          j                   Y dS w xY wt                       d} t          t          	                    d                    D ]}d }d }	 t          |          }|                    d          dk    rTt          |          }t          j        t          |                                                                                    }|                    d          d	k    r$t%          |d
         |d         |d                    nt%          ||j                   |                    d          dv r(t)          |j        t+          |d                              |                    d          dk    r|t-          |d         d|           |                                 ]# t
          $ r | dz  } |rD|                    d          dk    r+|)	 t-          |d         d|           n# t
          $ r Y nw xY w	 |                    |                    d                     n# t4          $ r Y nw xY wY w xY w| rdndS )Nrd  )filer   z$local media decoder self-test failedr   z*.jsonrw   r'  r|   r   rx   rv   r  r7  r  r{   r<  z.failed)rk  printrl  stderrr   r3  rL  r  rA  globra  r   r   r{  r  r  rz  r|  r  stemr  rb   r  r  r   with_suffixrJ  )failuresrM  rs   receipt_action_hashs       ri   mainr  ~	  s   /cjAAAAq!!!!   43:FFFFqq H|((2233  )-*.	!$''G{{8$$7727;;&-n_W5M5M5T5T5V5V&W&W&a&a&c&c#{{8$$(999WV_gh.?AQRRRRWdi000{{8$$(PPP$TYGH4E0F0FGGG{{8$$77<O<[%g.?&@+ObcccKKMMMM 
	 
	 
	MH 7;;x00OCCH[Hg)'2C*DjReffff    DT--i889999   
	 11asj   5 %AA EG55,J"H:9J:
IJIJ(I43J4
J>J JJJ__main__)r_   r`   ra   rb   )ra   r   )rs   rt   ra   rt   )rh   r   ra   rb   )rh   r   r   r   r   r   ra   rb   )rs   r   ra   rt   )r4  r5  ra   r6  )ra   r:  )rM  r   ra   rt   )r   rb   rx   rb  rv   rb   ra   r:  )rw  rb   ra   rb   )r  r   r[   r   r  r  ra   rb   )rh   r   ra   r  )r  r  r  r  ra   rb   )r  r  ra   r:  )r  r  ra   r  )r  r  r   rb   ra   r:  )rs   rt   r  rb   ra   r:  )rs   rt   ra   r:  )rs   rt   ra   rb   )r  rb   ra   rb   )r  r  r  rb   r  rb   ra   r:  rn   )rs   rt   r  r`   ra   r:  )r  r  r  r   ro   rb   ra   r:  )r_   r`   ra   r  )r_   r`   ra   r`   )r_   r  ra   rb   )r  r  r  r   r  rb   r  rb   ro   rb   ra   r:  )rs   rx  r  ry  rv   r`   ra   r`   )r  rb   rw   rb   ra   r:  )r7  rb   r  rb   r  rb   ra   r:  )ra   r   )__doc__
__future__r   r]  rH  r   rD  rp  rl  r  r{  r  r  r  r  r   r   pathlibr   typingr   zoneinfor   "dashboard_v5.patient_action_schemar	   dashboard_v5.sprint6f_b_schemar
    dashboard_v5.supplement_contractr   !dashboard_v5.observation_contractr   r   r2  dashboard_v5.sprint6f_c_schemar   r   r<  dashboard_v5.capture_contractr   dashboard_v5.medication_schemar  r    dashboard_v5.medication_contractr   r  r   dashboard_v5.capture_mediar   r   dashboard_v5.media_validationr   r   r   dashboard_v5.sprint6i_b_schemar   r  r  dashboard_v5.sprint6h_b_schemar  r  dashboard_v5.document_reviewr   r   r   r   r   r   r    r!   r"   r#   dashboard_v5.document_originalsr$   dashboard_v5.sprint6i_a_schemar  r  dashboard_v5.sprint6i_c_schemar  $dashboard_v5.document_reconciliationr%   r&   r'   r(   r)   r*   dashboard_v5.lab_reviewr+   r,   r-   r.   dashboard_v5.metric_catalog_v2r/   %dashboard_v5.nutrition_mapping_reviewr0   r  r1   r2   r  r3   r4   r  ModuleNotFoundErrorrM  insertrb   __file__resolveparenthomeBASErr  environr   rk  rA  r  r  r  r  rt  r{  
SCRIPT_DIRrn  rs  r|  r   compilerR  rp   re   r~  	frozensetrf   r   r   r   r   r  rj   r}  rr   r   r   r   r   r   r%  r3  r9  rL  ra  rv  r~  r  r  r  r  r  r  r  r  r%  r5  r  r  r  r  r'  rD  r  r  r  r  r  r  r$  rw  r  r  r  r  __name__
SystemExitrq   rk   ri   <module>r     s+   R R " " " " " "  				 				      



       # # # # # # # #                  vRRRRRRGGGGGGLLLLLL               GFFFFF               ONNNNNNNiiiiiiiiii                                      ?>>>>>        ]\\\\\ e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e~~~~~~~~~~~~@@@@@@                ; ; ;HOOAss44>>1133:;;<<<RRRRRRGGGGGGLLLLLL               GFFFFF               ONNNNNNNiiiiiiiiii                                      ?>>>>>        ]\\\\\ e  e  e  e  e  e  e  e  e  e  e  e  e  e  e  e~~~~~~~~~~~~@@@@@@               k;z ty{{Y)L8//88::  
z~~+,,DD)	*++33555	 
 tJNN'D92233  
 
'))  JNN(##d_.Dy.P*Q*Q   
'))	  TJNN-D93344  
 
'))  dJNN.D94455  
 
'))  4JNN+D?"[011  
 
'))  JNND999::  
 
'))  
z~~011DD.	/0088:::	 
 T(^^##%%,
66	4444	K
"**
+
+/** 0 i!35P QRR I	 	 	   Y88899 )cccdd'iNNN    7     ('
7T(U(UVV / / / /" " " "Jm m m m`	0 	0 	0 	0 AF      3 3 3 36, , , ,^+ + + +6   " " " "   0
 
 
 
45 5 5 5
   d d d d 
 
 n n n n&C C C C8    > > > >BB B B BJ@ @ @ @+ + + +\T T T Tl) ) ) )X* * * *W W W W# # # #N 6:@ @ @ @ @F]^ ]^ ]^ ]^@- - - -`       k k k k
t t t t4<T <T <T <T~K  K  K  K b K K K K K\       F"% "% "% "%H'  '  '  ' T z
*TTVV

 s   B6D C?HH