
    Ni9                        d Z ddlmZmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlZddlmZ ddlmZmZmZ eeeef   Zded	e
e   fd
ZddZdee   d	ee   fdZdee   d	efdZd	efdZdeee	eef         d	ee   fdZd	ee	eef      fdZdee	eef      d	efdZdee	eef      d	efdZde	eef   d	efdZde	eef   d	efdZddedee   d	e fdZ! G d d      Z"y) ub   IV. Registro de actividades (familia/comunidad/otras) con asistentes — tres tablas por sección.    )datetimedate)Enum)OptionalAnyListDictTypeUnionN)Session)CourseActivityFamilyModelCourseActivityCommunityModelCourseActivityOtherModelsecreturnc                 P    t        |       }|dk(  rt        S |dk(  rt        S t        S )N	communityother)!normalize_course_activity_sectionr   r   r   )r   ss     Y/var/www/pie360backend.cl/public_html/app/backend/classes/course_activity_record_class.py_model_for_sectionr      s-    )#.AK++G|''$$    c                 |    | y t        | t              r| S t        | d      r| j                  |      S t        |       S )Nstrftime)
isinstancestrhasattrr   )vfmts     r   	_date_strr!      s:    y!Sq*zz#q6Mr   r   c                    |  t        | t              r| j                         sy t        | t              r| S 	 t	        j
                  t        |       j                         d d d      j                         S # t        t        f$ r Y y w xY w)N
   z%Y-%m-%d)r   r   stripr   r   strptime
ValueError	TypeError)r   s    r   _parse_dater(   (   ss    yZ3'	!T  Q!4jAFFHH	" s   =A5 5BBr   c           
         | yt        | t              ryt        | t              rt        | j                        S t        | t
        t        t        t        t        d      f      s+t        | d      r	 t        | dd      }||| urt        |      S t        | t        t        f      rt        | j                  dd            S t        | t              r&| t        |       k(  rt        |       dv rt        |       } t        | t              rddd	dj                  | d      S t        |       j!                         j#                         j!                  d
      }d|v r8|j%                  dd      d   j#                         }|dv r|S |dv ry|dv ry|dv ry	|dv ry|dv ry|dv ry	|dv r|S |dv ry|dv ry|dv ry	y# t        $ r Y 1w xY w)u   
    Mapea la sección del registro IV/V a BD: family | community | other.

    UI / lógica: 1=familia, 2=comunidad, 3=otras/acta (V).
    Acepta enteros, strings "1"/"2"/"3", ENUM de MySQL/SQLAlchemy y nombres en inglés.
    Nfamilyvaluezutf-8replace)errors)         r   r   z'".r.   r*   r   r   )101)202)303)familiafamiliar)	comunidad)otrosotraotroacta	reuniones)r   boolr   r   r+   r   bytesintfloattyper   getattr	Exception	bytearraydecodegetr$   lowerrsplit)r   innerr   tails       r   r   r   3   s    	y!T!T099a#uc5$t*=>71gCV	Aw-E U!^8?? !eY'(0')1TUU!USVA)0CF!S8<<QIIA$$U+A
axxxQ#))+33K;;;KKK,,##N::E  		s   1F4 4	G Gc                 d    | y	 t        |       }|dk(  ry|dk(  ryy# t        t        f$ r Y yw xY w)zH1 = Apoderado, 2 = Profesional del establecimiento (coincide con BD/UI). r.   	Apoderador/   zProfesional del establecimiento)rD   r'   r&   )r   pts     r   _participant_type_labelrT   k   sJ    yV 
Qw	Qw0 z" s    //c                    | yg }| D ]  }t        |t              st        |j                  d      xs d      j	                         }|sD|j                  dd      }	 |t        |      nd}||d}|j                  d      }|	 t        |      |d<   t        |j                  d      xs |j                  d	      xs d      j	                         }t        |j                  d
      xs |j                  d      xs d      j	                         }t        |j                  d      xs |j                  d      xs d      j	                         }	t        |j                  d      xs |j                  d      xs d      j	                         }
|r||d<   |r||d
<   |	r|	|d<   |
r|
|d<   |j                  |        |rt        j                  |d      S dS # t        t        f$ r d}Y w xY w# t        t        f$ r Y qw xY w)uX   Serializa asistentes [{id, name, participant_type?, phone?, …}] a JSON string para BD.NnamerQ   idr   rW   rV   participant_typeroletipophonetelefonoemailmailrutidentification_numberF)ensure_ascii)r   dictr   rK   r$   rD   r&   r'   appendjsondumps)r   cleanitemrV   attendee_idrowrS   rZ   r\   r^   r`   s              r   _parse_attendeesrk   z   s   y"$E dD!txx'-2.446D((4+K 2=2Ic+.q *5d"CC,-B~.1"gC*+ txx'A488F+;ArBHHJD)GTXXj-AGRHNNPE)CTXXf-=CDJJLEdhhuoP2I)JPbQWWYC"F$G$G E
LL;< 5:4::e%0CtC- 	*    #I. s$   GG4G10G14HHc                    |  t        | t              r| j                         sg S t        | t              r| S 	 t        | t              rt	        j
                  |       ng }t        |t              sg S g }|D ]  }t        |t              st        |j                  d      xs d      j                         }|sD|j                  dd      }	 |t        |      nd}||d}|j                  d      }|	 t        |      |d<   t        |j                  d      xs |j                  d      xs d      j                         }t        |j                  d	      xs |j                  d
      xs d      j                         }	t        |j                  d      xs |j                  d      xs d      j                         }
t        |j                  d      xs |j                  d      xs d      j                         }|r||d<   |	r|	|d	<   |
r|
|d<   |r||d<   |j                  |        |S # t        j                  t        f$ r g cY S w xY w# t        t        f$ r d}Y w xY w# t        t        f$ r Y yw xY w)NrV   rQ   rW   r   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   )r   r   r$   listre   loadsJSONDecodeErrorr'   rc   rK   rD   r&   rd   )r   dataoutrh   rV   ri   rj   rS   rZ   r\   r^   r`   s               r   _load_attendeesrr      sP   yZ3'		!T *1c 2tzz!} dD!	 "C $%488F#)r*002hhtQ'	.9.E#k*1K &1$?XX()>*-b'&' 488F#=txx'7=2>DDFDHHW%C*)=CDJJLDHHW%?&)9?R@FFH$((5/LTXX.E%FL"MSSUCK CL CLCJ

3=> JI   ), 	 I& 	K	 	* s5   'H0 I4I)0III&%I&)I<;I<	attendeesc                    g }| D ]r  }t        |j                  d      xs |j                  d      xs d      j                         }|st        |j                  d            }|j	                  |r|nd       t dj                  |      S )uI   Texto para columna «apoderado o profesional» (mismo orden que nombres).rZ   r[   rQ   rY      —; )r   rK   r$   rT   rd   join)rs   partsars       r   attendees_rafcnia_liner{      s{    E (f4v4"5;;='.@(ABA!Q'	(
 99Ur   c                    g }| D ]  }t        |j                  d      xs |j                  d      xs d      j                         }t        |j                  d      xs |j                  d      xs d      j                         }|r|r|j                  | d|        |r|j                  |       |r|j                  |       |j                  d        dj	                  |      S )	u<   Texto para columna teléfono/mail (mismo orden que nombres).r\   r]   rQ   r^   r_   z / ru   rv   )r   rK   r$   rd   rw   )rs   rx   ry   r\   r^   s        r   attendees_rafcnit_liner}      s    E 
 AEE'N=aeeJ&7=2>DDFAEE'N9aeeFm9r:@@BULLE7#eW-.LLLLLL
  99Ur   ry   c                     t        | j                  d      xs | j                  d      xs d      j                         }|r|S dS )z%Columna RUT en acta de reuniones (V).r`   ra   rQ   ru   r   rK   r$   )ry   rz   s     r   attendee_rut_cellr      s>    AEE%L@AEE"9:@bAGGIA1ur   c                     t        | j                  d      xs | j                  d      xs d      j                         }|r|S dS )u7   Columna teléfono en acta de reuniones (V), sin correo.r\   r]   rQ   ru   r   )ry   ps     r   attendee_phone_cellr      s=    AEE'N5aeeJ/526<<>A1ur   rz   sectionc                    |t        |      nd}dddd|   }| j                  | j                  ||| j                  r| j                  j	                         nd t        | j                        | j                  | j                  | j                  | j                  t        | j                        t        | j                        dS )Nr*   r.   r/   r0   r3   )rW   	course_idr   
section_idr   rs   
objectives
activities
agreementsresults
created_at
updated_at)r   rW   r   r   	isoformatrr   rs   r   r   r   r   r!   r   r   )rz   r   r   r   s       r   _row_to_dictr      s    8?8K
+G
4QYCA:3?Jdd[[ &'ff  "$$Q[[1llllll99-- r   c                       e Zd ZdefdZddedee   defdZ	dededefd	Z
d
edefdZded
ededefdZdededefdZy)CourseActivityRecordClassdbc                     || _         y N)r   )selfr   s     r   __init__z"CourseActivityRecordClass.__init__
  s	    r   Nr   r   r   c           	      x   	 |t        |      j                         dk7  rt        |      }t        |      }| j                  j                  |      j                  |j                  |k(        j                  |j                  j                         |j                  j                               j                         }d|D cg c]  }t        ||       c}dS g }dt        fdt        fdt         ffD ]b  \  }}| j                  j                  |      j                  |j                  |k(        j                         D ]  }|j#                  ||f        d |j%                  d d	
       d|D cg c]  \  }}t        ||       c}}dS c c}w c c}}w # t&        $ r}	dt        |	      g dcY d}	~	S d}	~	ww xY w)zVLista registros del curso, opcionalmente filtrados por section=family|community|other.NrQ   successstatusrp   r*   r   r   c                 j    | d   j                   xs t         j                  | d   j                  xs dfS )Nr.   r   )r   minrW   )ts    r   <lambda>z<CourseActivityRecordClass.get_by_course_id.<locals>.<lambda>'  s(    qtyy4DHHadgglC r   T)keyreverseerrorr   messagerp   )r   r$   r   r   r   queryfilterr   order_byr   descrW   allr   r   r   r   rd   sortrH   )
r   r   r   wantModelrowsrz   mergedr   es
             r   get_by_course_idz*CourseActivityRecordClass.get_by_course_id  s    	F"s7|'9'9';r'A8A*40GGMM%(VEOOy89Xejjoo/ASU	  #,UY5ZPQl1d6K5Z[[?AF45:;23 
,
U GGMM%(VEOOy89SU,A
 MM3(+,
, KKC  
 $<BC&#qa-C # 6[& D 	F%#a&"EE	FsC   B>F  FF BF 0FF F 	F9 F4.F94F9rW   c                 2   	 t        |      }t        |      }| j                  j                  |      j	                  |j
                  |k(        j                         }|sddd dS dt        ||      dS # t        $ r}dt        |      d dcY d }~S d }~ww xY w)Nr   Registro no encontrado.r   r   r   )
r   r   r   r   r   rW   firstr   rH   r   )r   rW   r   r   r   rj   r   s          r   	get_by_idz#CourseActivityRecordClass.get_by_id1  s    	H&w/E4W=D''--&--ehh"n=CCEC")6OY]^^'c41HII 	H%#a&$GG	Hs$   A"A4 %A4 4	B=BBBrp   c                    	 t        |j                  d            }t        |j                  d            }t        |      }t	        |j                  d            }t        |j                  d            }|j                  d      xs dj                         xs d }|j                  d      xs dj                         xs d }|j                  d      xs dj                         xs d }	|j                  d	      xs dj                         xs d }
t        j                         } |||||||	|
||
	      }| j                  j                  |       | j                  j                          | j                  j                  |       dd|j                  t        ||      dS # t        $ r2}| j                  j!                          dt#        |      dcY d }~S d }~ww xY w)Nr   r   r   rs   r   rQ   r   r   r   )	r   r   rs   r   r   r   r   r   r   r   zRegistro creado.r   r   rW   rp   r   r   r   )rD   rK   r   r   r(   rk   r$   r   nowr   addcommitrefreshrW   r   rH   rollbackr   )r   rp   r   r   r   date_valrs   r   r   r   r   r   rj   r   s                 r   storezCourseActivityRecordClass.store<  s   "	:DHH[12I3DHHY4GHC&s+E"488F#34H(+)>?I((<06B==?G4J((<06B==?G4J((<06B==?G4Jxx	*0b779ATG,,.C##%%%
C GGKKGGNNGGOOC #-ff$S#.	   	:GG%#a&99	:s   FF! !	G*'GGGc                    	 t        |      }t        |      }| j                  j                  |      j	                  |j
                  |k(        j                         }|sdddS d|v rt        |j                  d            |_	        d|v rt        |j                  d            |_        d|v r,|j                  d      xs dj                         xs d |_        d|v r,|j                  d      xs dj                         xs d |_        d	|v r,|j                  d	      xs dj                         xs d |_        d
|v r,|j                  d
      xs dj                         xs d |_        t#        j$                         |_        | j                  j)                          | j                  j+                  |       dd|t-        ||      dS # t.        $ r2}| j                  j1                          dt3        |      dcY d }~S d }~ww xY w)Nr   r   r   r   rs   r   rQ   r   r   r   r   zRegistro actualizado.r   )r   r   r   r   r   rW   r   r(   rK   r   rk   rs   r$   r   r   r   r   r   r   r   r   r   r   rH   r   r   )r   rW   rp   r   r   r   rj   r   s           r   updatez CourseActivityRecordClass.updatea  s   	:&w/E4W=D''--&--ehh"n=CCEC")6OPP~&txx'78d" 0+1F Gt#"&((<"8">B!E!E!G!O4t#"&((<"8">B!E!E!G!O4t#"&((<"8">B!E!E!G!O4D #xx	28b??AIT%\\^CNGGNNGGOOC #2$S$/	   	:GG%#a&99	:s%   A!G	 $E$G	 		H'G?9H?Hc                    	 t        |      }| j                  j                  |      j                  |j                  |k(        j                         }|sdddS | j                  j                  |       | j                  j                          dd|dS # t        $ r2}| j                  j                          dt        |      dcY d }~S d }~ww xY w)Nr   r   r   r   zRegistro eliminado.)r   r   rW   )r   r   r   r   rW   r   deleter   rH   r   r   )r   rW   r   r   rj   r   s         r   r   z CourseActivityRecordClass.delete  s    
	:&w/E''--&--ehh"n=CCEC")6OPPGGNN3GGNN'4IQSTT 	:GG%#a&99	:s$   AB :B 	C'C
C
Cr   )__name__
__module____qualname__r   r   rD   r   r   r   r   r   rc   r   r   r    r   r   r   r   	  s    7 "F# "F "FQT "FH	HC 	H# 	H# 	H#:$ #:3 #:J: :D :3 :3 :@: :s :s :r   r   )z%Y-%m-%d %H:%M:%Sr   )#__doc__r   r   enumr   typingr   r   r   r	   r
   r   re   sqlalchemy.ormr   app.backend.db.modelsr   r   r   CourseActivityRowModelr   r   r!   r(   r   rT   rk   rr   r{   r}   r   r   rc   r   r   r   r   r   <module>r      s   h #  9 9  "    %C %D)?$@ %8C= Xd^ 5# 53 5p# #Dd38n!56 #D8C= #DL+$tCH~. +\d4S>&: s d4S>&: s "c3h C 4S> c * Xc] d &C: C:r   