
    HŴi<                         d dl mZmZmZ d dlmZ d dlmZmZ d dlZd dl	m
Z
mZmZmZmZ dZh dZded	ee   fd
Zded	ee   fdZdee   d	efdZde
d	efdZ G d d      Zy)    )OptionalAnyList)Session)datetimedateN)AnamnesisModelAnamnesisInformantModelAnamnesisInterviewerModelAnamnesisHouseholdMemberModelFolderModel   >   rewards
supportersspecialistsresponse_successlanguage_used_domainfirst_year_conditionsresponse_difficultiesnative_language_domainvaluereturnc                     | y t        | t              r| S t        | t              r%	 t        j                  | d      j                         S y # t
        $ r Y y w xY w)N%Y-%m-%d)
isinstancer   strr   strptime	Exceptionr   s    L/var/www/pie360backend.cl/public_html/app/backend/classes/anamnesis_class.py_parse_dater!      s]    }%%	$$UJ7<<>>   		s   #A 	AAc                 z    | y t        | t              r| S 	 t        j                  | d      S # t        $ r Y y w xY w)NF)ensure_ascii)r   r   jsondumpsr   r   s    r    _to_json_valuer&   ,   sA    }%zz%e44 s   . 	::c                 `    | | dk(  ry 	 t        j                  |       S # t        $ r | cY S w xY w)N )r$   loadsr   r   s    r    _from_json_valuer*   7   s8    }zz%   s    --recc                    i }t         j                  j                  D ]  }|j                  }t	        | |d      }|t
        v rt        |      ||<   3t        |t              r|r|j                  d      nd||<   \t        |t              r|r|j                  d      nd||<   |||<    |j                  d      }t        |t              rd|v r|j                  d      xs d|d<   |S )z=Convierte un AnamnesisModel a diccionario para respuesta API.Nr   z%Y-%m-%d %H:%M:%Sr   otrasr(   #first_year_conditions_other_specify)r	   	__table__columnsnamegetattrANAMNESIS_JSON_FIELDSr*   r   r   strftimer   getdict)r+   outcolr1   valfycs         r    _anamnesis_model_to_dictr;   @   s    
C''// 
xxc4&(((-CIT"47Z0TCIX&=@%89dCICI
 '')
*C#tC58WWW5E5K12J    c            	           e Zd ZdefdZdedefdZdedefdZ	 	 	 dde	e   d	e	e   d
edefdZ
dededdfdZdedefdZdededefdZy)AnamnesisClassdbc                     || _         y )N)r?   )selfr?   s     r    __init__zAnamnesisClass.__init__U   s	    r<   idr   c                 z   	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS t        |      }| j                   j                  t              j                  t        j                  |k(        j                  t        j                  t        j                        j                         }|D cg c]d  }|j                  |j                  |j                  |j                  |j                  |j                  r|j                  j!                  d      nddf c}|d<   | j                   j                  t"              j                  t"        j                  |k(        j                  t"        j                  t"        j                        j                         }|D cg c]Y  }|j                  |j                  |j$                  |j&                  |j                  r|j                  j!                  d      ndd[ c}|d	<   | j                   j                  t(              j                  t(        j                  |k(        j                  t(        j                  t(        j                        j                         }|D cg c]R  }|j                  |j                  |j                  |j                  |j*                  |j,                  |j.                  d
T c}|d<   |S c c}w c c}w c c}w # t0        $ r}	dt3        |	      dcY d}	~	S d}	~	ww xY w)z\Obtiene una anamnesis por su ID (incluye informantes, entrevistadores y miembros del hogar).errorAnamnesis no encontrada.statusmessager   N)rC   
sort_orderr1   relationshippresenceinterview_date
informants)rC   rJ   professional_idrolerM   interviewers)rC   rJ   r1   rK   age	schooling
occupationhousehold_members)r?   queryr	   filterrC   firstr;   r
   anamnesis_idorder_byrJ   allr1   rK   rL   rM   r4   r   rO   rP   r   rR   rS   rT   r   r   )
rA   rC   r+   resultrN   irQ   	householdhes
             r    r5   zAnamnesisClass.getX   s   =	:''--/66~7H7HB7NOUUWC")6PQQ-c2F 56/<<BC1<<>U>X>XY	  $
$  $$"#,,FF$%NN !

OPO_O_a&6&6&?&?
&Kei
$F<  781>>"DE3>>@Y@\@\]	  &	&  $$"#,,'('8'8FFOPO_O_a&6&6&?&?
&Kei	&F>" ;<5BBbHI7BBDaDdDde	   #+  $$"#,,FF$%NN55!""#,,+F&' M_
$$	&"+  	:%#a&99	:sT   AL BL A)L
BL 
AL(BL +ALL 
L 	L:"L5/L:5L:
student_idc                    	 | j                   j                  t              j                  t        j                  |k(        j                  t        j                  j                               j                         }|sdddS | j                  |j                        S # t        $ r}dt        |      dcY d}~S d}~ww xY w)uC   Obtiene la anamnesis más reciente de un estudiante por student_id.rE   u/   No se encontró anamnesis para este estudiante.rG   N)r?   rV   r	   rW   ra   rZ   rC   descrX   r5   r   r   )rA   ra   r+   r`   s       r    get_by_student_idz AnamnesisClass.get_by_student_id   s    	:n-11Z?@.++0023	  ")6ghh88CFF## 	:%#a&99	:s$   A>B B 	B=%B82B=8B=Npageper_pagec                    	 | j                   j                  t              }|"|j                  t        j                  |k(        }|j                  t        j                  j                               }|+|dkD  r&|j                  |dz
  |z        j                  |      }|j                         }|D cg c]  }t        |       c}S c c}w # t        $ r}dt        |      dcY d}~S d}~ww xY w)zBLista anamnesis; opcionalmente filtrada por student_id y paginada.Nr      rE   rG   )r?   rV   r	   rW   ra   rZ   rC   rc   offsetlimitr[   r;   r   r   )rA   ra   re   rf   rV   rowsrr`   s           r    get_allzAnamnesisClass.get_all   s    
	:GGMM.1E%^%>%>*%LMNN>#4#4#9#9#;<EHqLdQh(%:;AA(K99;D9=>A,Q/>>> 	:%#a&99	:s0   B1C 3CC C 	C.C)#C.)C.r+   datac                    h d}|j                  d      }|t        |      |_        |j                  d      }|d|v r|j                  d      }||dk7  rt        |      nd|_        |j                  dk(  rd|_        |j                         D ]C  \  }}||v rt        ||      s|t        v rt        ||t        |             7t        |||       E y)zTAplica los campos de data al modelo (sin informants/interviewers/household_members).>   rC   	born_date
birth_typerN   rQ   birth_type_idrU   r.   rp   Nrr   rq   r(   rh   )r5   r!   rp   intrr   birth_reasonitemshasattrr3   setattrr&   )rA   r+   rn   skiprp   bt_idkeyr   s           r    _apply_data_to_modelz#AnamnesisClass._apply_data_to_model   s     \HH[)	 '	2CM)=\T1HH\*E.3rkE
tC!#C**, 	)JCd{3$++S."78S%(	)r<   c                    	 |j                  d      }|dddS | j                  j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|r| j                  |j                  |      S | j                  j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|r|j                  dz   nd}|j                         D ci c]  \  }}|dvs|| }}}d|v rM|j                  d	      xs i }	t        |	t              r(t        |	      }	|j                  d      xs d
|	d<   |	|d	<   |j                  d      xs ||d<   t        j                          |d<   t        j                          |d<   t        ||d   |d   |d         }
| j#                  |
|       | j                  j%                  |
       | j                  j'                          t)        |j                  d      xs g       D ]  \  }}t+        |
j                  |j                  d|      |j                  d      |j                  d      |j                  d      t-        |j                  d                  }| j                  j%                  |        t)        |j                  d      xs g       D ]  \  }}t/        |
j                  |j                  d|      |j                  d      |j                  d      t-        |j                  d                  }| j                  j%                  |        t)        |j                  d      xs g       D ]  \  }}t1        |
j                  |j                  d|      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d            }| j                  j%                  |        | j                  j                  t2              j	                  t2        j
                  |k(  t2        j4                  t6        k(        j                  t2        j8                  j                               j                         }|r|j8                  dz   nd}t3        dd|t6        ||
j                  d ddt        j                          t        j                          d!      }| j                  j%                  |       | j                  j;                          | j                  j=                  |
       d"d#|
j                  d$S c c}}w # t>        $ r2}| j                  jA                          dtC        |      dcY d}~S d}~ww xY w)%zCrea o actualiza anamnesis: si ya existe para el estudiante, actualiza (borra y recarga informantes, entrevistadores, miembros del hogar); si no, crea nueva.ra   NrE   zstudent_id es requerido.rG   rh   rN   rQ   rU   r.   r   r(   r-   version
added_dateupdated_date)ra   r~   r   r   rN   rJ   r1   rK   rL   rM   rY   rJ   r1   rK   rL   rM   rQ   rO   rP   rY   rJ   rO   rP   rM   rU   rR   rS   rT   rY   rJ   r1   rK   rR   rS   rT   r   )	school_id	course_idra   document_id
version_id	detail_idrO   fileperiod_yearr   r   deleted_datesuccesszAnamnesis creada correctamente.rH   rI   rC   )"r5   r?   rV   r	   rW   ra   rZ   rC   rc   rX   updater~   ru   r   r6   r   nowr{   addflush	enumerater
   r!   r   r   r   r   ANAMNESIS_DOCUMENT_IDr   commitrefreshr   rollbackr   )rA   rn   ra   existinglastr~   kvpayloadr:   r+   r]   iteminvr_   last_foldernew_version_idfolderr`   s                      r    storezAnamnesisClass.store   s   h	:,/J!")6PQQ n-11Z?@.++0023	  {{8;;55 n-11Z?@.005578	  -1t||a'aG(,

u1At8tq!tuGu4<kk"9:@bc4(s)C#'88,Q#R#XVXCL7:G34!%)!4!?GI$,LLNGL!&.llnGN# J	@R_fgs_t  DK  LZ  D[  \C%%c73GGKKGGMMO %TXXl%;%ArB 	!4-!$#xxa8&)!%.!9!XXj1#.txx8H/I#J C 	! %TXXn%=%CD !4/!$#xxa8$(HH->$?&)#.txx8H/I#J C ! %TXX.A%B%HbI 
41!$#xxa8&)!%.!9"hh{3#xx5 A
 k***j8++/DD +005578  >Ik44q8aN %1)&& ! #<<>%\\^!F GGKKGGNNGGOOC '4U]`]c]cdd] v^  	:GG%#a&99	:sC   V3 BV3 0BV3 V-V- QV3 -V3 3	W.<'W)#W.)W.c                    	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS t        j                         |_        |j                         D ci c]  \  }}|dvs|| }}}d|v rM|j                  d      xs i }t        |t              r(t        |      }|j                  d      xs d|d<   ||d<   | j                  ||       | j                   j                  t              j                  t        j                  |k(        j!                          | j                   j                  t"              j                  t"        j                  |k(        j!                          | j                   j                  t$              j                  t$        j                  |k(        j!                          t'        |j                  d	      xs g       D ]  \  }}	t        ||	j                  d
|      |	j                  d      |	j                  d      |	j                  d      t)        |	j                  d                  }
| j                   j+                  |
        t'        |j                  d      xs g       D ]v  \  }}	t#        ||	j                  d
|      |	j                  d      |	j                  d      t)        |	j                  d                  }
| j                   j+                  |
       x t'        |j                  d      xs g       D ]  \  }}	t%        ||	j                  d
|      |	j                  d      |	j                  d      |	j                  d      |	j                  d      |	j                  d            }| j                   j+                  |        | j                   j-                          | j                   j/                  |       dd|j                  dS c c}}w # t0        $ r2}| j                   j3                          dt5        |      dcY d}~S d}~ww xY w)z`Actualiza una anamnesis existente y reemplaza informantes, entrevistadores y miembros del hogar.rE   rF   rG   r}   r.   r   r(   r-   rN   rJ   r1   rK   rL   rM   r   rQ   rO   rP   r   rU   rR   rS   rT   r   r   z$Anamnesis actualizada correctamente.r   N)r?   rV   r	   rW   rC   rX   r   r   r   ru   r5   r   r6   r{   r
   rY   deleter   r   r   r!   r   r   r   r   r   r   )rA   rC   rn   r+   r   r   r   r:   r]   r   r   r_   r`   s                r    r   zAnamnesisClass.update@  s   7	:''--/66~7H7HB7NOUUWC")6PQQ'||~C(,

u1At8tq!tuGu4<kk"9:@bc4(s)C#'88,Q#R#XVXCL7:G34%%c73 GGMM1299:Q:^:^bd:dellnGGMM34;;<U<b<bfh<hipprGGMM78??@]@j@jnp@pqxxz$TXXl%;%ArB 	!4-!##xxa8&)!%.!9!XXj1#.txx8H/I#J C 	! %TXXn%=%CD !4/!##xxa8$(HH->$?&)#.txx8H/I#J C ! %TXX.A%B%HbI 
41!##xxa8&)!%.!9"hh{3#xx5 A
 GGNNGGOOC '4Zbebhbhii_ v`  	:GG%#a&99	:s=   AP ,P PPM=P P 	Q!'QQQ)NN
   )__name__
__module____qualname__r   rB   rs   r   r5   rd   r   rm   r	   r6   r{   r   r    r<   r    r>   r>   T   s    7 ?:c ?:c ?:B:C :C :" %)"	:SM: sm: 	:
 
:&) )d )t )2j:$ j:3 j:X9: 9:D 9:S 9:r<   r>   )typingr   r   r   sqlalchemy.ormr   r   r   r$   app.backend.db.modelsr	   r
   r   r   r   r   r3   r!   r   r&   r*   r6   r;   r>   r   r<   r    <module>r      s    & & " #    	 
s 
x~ 
# (3- HSM c . T (e: e:r<   