
    `i8                        d dl mZ d dlmZmZ d dlmZ d dlmZ d dlZdZ	d$d	Z
d%dZd&dZd'dZd Zd(d)dZd*dZd+dZe	fd,d Zd-d#ZdS ).    )annotations)datetimetimezone)Session)EpicObservationNzobservation_debug.jsonsstrc                
   | sd S 	 |                      d          rEt          j        |                     dd                                        t
          j                  S t          j        |           S # t          $ r Y d S w xY w)NZz+00:00)endswithr   fromisoformatreplace
astimezoner   utc
ValueError)r   s    H/var/www/html/epic_fhir/sentinel-connect/connectors/observation_store.pyparse_fhir_dtr      s     t::c?? 	])!))C*B*BCCNNx|\\\%a(((   tts   AA4  A4 4
BBrefc                N    | sd S d| v r|                      dd          d         n| S )N/   )split)r   s    r   ref_idr      s5     t#&#::399S!Q36    codeabledictc                    | sdS |                      d          pg }|sdS |d         pi }|                     d          |                     d          |                     d          fS )N)NNNcodingr   systemcodedisplay)get)r   codingsc0s      r   pick_primary_codingr%      sq     "!!ll8$$*G "!!		rBFF8bffVnnbffY.?.?@@r   obsc                8   dddddddd}d| v rd|d<   |                      d          |d<   nld| v rUd|d<   |                      d          pi }t          |          \  }}}||d<   ||d<   |                     d	          p||d
<   nd| v rd|d<   |                      d          pi }|                     d          }|dnt          |          |d<   |                     d          |d<   |                     d          |d<   |                     d          |d<   nd| v r+d|d<   t          |                      d                    |d<   nPd| v r+d|d<   t          |                      d                    |d<   n!d| v rd|d<   |                      d          |d<   |S )zH
    Supports common value[x] shapes and returns a normalized dict.
    N)
value_typevalue_string
value_codevalue_systemvalue_display
value_unitvalue_numbervalueStringr(   r)   valueCodeableConceptr+   r*   textr,   valueQuantityvaluer.   unitr-   r   r    valueBooleanvalueIntegervalueDateTime)r"   r%   r	   )r&   outvsysr    dispqvals           r   extract_value_fieldsr>   '   s   
  C )L!ggm44N	3	&	&2LGG*++1r-a00T4!N L uuV}}4O	C		+LGGO$$*eeGnn&)kdds3xxNEE&MMLeeHooNEE&MML	3		*L!#''."9"9::N	3		*L!#''."9"9::N	C		+L!ggo66NJr   c                    | d S 	 t          j        | d          S # t          $ r t          j        | t          d          cY S w xY w)NF)ensure_ascii)defaultr@   )jsondumps	TypeErrorr	   r3   s    r   _to_json_textrF   Y   sc    }tBz%e4444 B B Bz%5AAAAAABs    &AAFsessionr   org_iddebugboolc                   |                     d          }|sd S |                     t                                        |                                          }|st          |          }||_        ||_        |                     d          pi }|                     d          |_        t          |                     d                    pd|_	        |                     d          pi }|                     d          |_
        |                     d          pi }|                     d          |_        |                     d          |_        |                     d	          pi }	|	                     d
          |_        |	                     d          pi gd         pi }
|
                     d          |_        |
                     d	          |_        |
                     d          |_        t#          |                     d                    |_        t#          |                     d                    |_        t)          |          }|                     d          |_        |                     d          |_        |                     d          |_        |                     d          |_        |                     d          |_        |                     d          |_        |                     d          |_        t9          |                     d                    |_        t9          |                     d                    |_        t9          |                     d                    |_        t9          |                     d                    |_         t9          |                     d                    |_!        t9          |                     d                    |_"        t9          |          |_#        |r tI          |||          }tK          |           | &                    |           | '                                 | (                    |           |S )Nid)observation_idsubject	reference 	encounterspecimenstatusr    r1   r   r   r   r!   effectiveDateTimeissuedr(   r)   r*   r+   r,   r-   r.   categoryinterpretationnote	hasMemberbasedOnreferenceRange))r"   queryr   	filter_byone_or_nonerH   fhir_idpatient_referencer   
patient_idencounter_referencespecimen_referencerS   	code_textcode_primary_systemcode_primary_codecode_primary_displayr   effective_datetimeissued_datetimer>   r(   r)   r*   r+   r,   r-   r.   rF   category_jsoninterpretation_json	note_jsonhas_member_jsonbased_on_jsonreference_range_jsonraw_json_build_obs_debug_payload_store_obs_debugaddcommitrefresh)rG   rH   r&   rI   obs_idrowsubjencspeccode_objcoding0r9   payloads                r   upsert_observationr~   b   s   WWT]]F t
--
(
(
2
2&
2
I
I
U
U
W
WC 5V444CJCK779#D HH[11CDHH[11228bCN
''+


$"C!ggk22C77:$"D!XXk22C""CJwwv$"HLL((CM||H%%-"q17RG%kk(33C#KK//C&{{955C*3773F+G+GHHC'(9(9::CS!!AUU<((CNuu^,,CUU<((CNuu^,,Co..CUU<((CNuu^,,C &cggj&9&9::C+CGG4D,E,EFFC!#''&//22CM'(<(<==C%cggi&8&899C,SWW5E-F-FGGC %%CL "*3Q77!!!KKNNOOCJr   r9   returnc                   |                      d          }|dk    rD|                      d          }|                      d          }d| d|                                 S |dk    rEd|                      d	           d
|                      d           d|                      d           dS |dv r| d|                      d           S |dk    rd|                      d           S dS )Nr(   r2   r.   r-   zvalueQuantity:  r0   zvalueCodeableConcept: r,   z (r+   |r*   ))r/   r5   r7   z: r)   r6   zvalueInteger: zvalue: <none>)r"   strip)r9   tnumr4   s       r   
_fmt_valuer      s   	lAOeeN##uu\""---t--33555"""po(>(>pp!%%BWBWppZ[Z_Z_`lZmZmpppp<<<..quu^,,...N7n 5 5777?r   c                   i d|                      d          d|                      d          d|                      d          pi                      d          d|                      d          d|                      d          d	|j        d
|j        d|j        d|j        dt          |          d|                     d          d|                     d          d|                     d          d|                     d          d|                     d          d|                     d          d|                     d          dd |                                 D             iS )NrM   rL   rS   r`   rN   rO   rT   rU   rd   rg   re   rf   r3   r(   r.   r-   r)   r+   r*   r,   raw_value_keysc                <    g | ]}|                     d           |S rE   )
startswith).0ks     r   
<listcomp>z,_build_obs_debug_payload.<locals>.<listcomp>   s)    JJJALL4I4IJ1JJJr   )r"   rd   rg   re   rf   r   keys)r&   rw   r9   s      r   rq   rq      s   #''$--#''(## 	cggi006B;;KHH 	SWW%899	
 	#''(## 	S] 	 8 	s6 	S2 	A 	aeeL)) 	n-- 	aeeL))  	n--!" 	n--#$ 	aeeL))%& 	//'* 	JJchhjjJJJ+  r   r}   pathNonec                   	 t          |dd          5 }|                    t          j        | dt                    dz              d d d            d S # 1 swxY w Y   d S # t
          $ r}t          d|            Y d }~d S d }~ww xY w)Nazutf-8)encodingF)r@   rA   
z"[WARN] failed to write debug log: )openwriterB   rC   r	   	Exceptionprint)r}   r   fes       r   rr   rr      s    8$g... 	Q!GGDJwUCHHH4OPPP	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 8 8 861667777777778s:   A! 3AA! AA! AA! !
B+BBbundleintc                    d}|                     d          pg D ]1}|pi                      d          pi }t          | ||           |dz  }2|S )Nr   entryresourcer   )r"   r~   )rG   rH   r   countr   ress         r   store_observation_bundler      sc    Ejj!!'R  wBmmJ''-27FC000
Lr   )r   r	   )r   r	   )r   r   )r&   r   )F)rG   r   rH   r	   r&   r   rI   rJ   )r9   r   r   r	   )r&   r   r9   r   r   r   )r}   r   r   r	   r   r   )rG   r   rH   r	   r   r   r   r   )
__future__r   r   r   sqlalchemy.ormr   
epic_tokenr   rB   DEBUG_LOG_PATHr   r   r%   r>   rF   r~   r   rq   rr   r    r   r   <module>r      sF   " " " " " " ' ' ' ' ' ' ' ' " " " " " " & & & & & & )   7 7 7 7A A A A/ / / /dB B B< < < < <~      4 1? 8 8 8 8 8     r   