
    \Cj'                        d dl mZmZ d dlmZmZmZmZ d dlm	Z	m
Z
m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mZmZmZmZmZmZmZmZm Z m!Z! d dl"m#Z# d dl$m%Z% d d	l&m'Z' d d
l(m)Z)m*Z*  eddg          Z+ edd           ee          fde,dz  deddfdZ- G d de	          Z. G d de	          Z/ G d de	          Z0 G d de	          Z1 G d de	          Z2 G d d e	          Z3 G d! d"e	          Z4 G d# d$e	          Z5 G d% d&e	          Z6 G d' d(e	          Z7 G d) d*e	          Z8 G d+ d,e	          Z9 G d- d.e	          Z: G d/ d0e	          Z; G d1 d2e	          Z< G d3 d4e	          Z= G d5 d6e	          Z> G d7 d8e	          Z?d9e@ddfd:ZAd;e!de@fd<ZBd=eCdz  d>e,de,fd?ZDded;e!deEfd@ZFded;e!ddfdAZGdedBe!dCede@fdDZHd;ede@fdEZId;ede@fdFZJd;ede@fdGZKdedHede@fdIZLdJede@fdKZMddedMeCdNe,dOe,dz  def
dPZNded=eCdQeOeC         dePeC         fdRZQe+R                    dS ee-          gT           ee          fdede@fdU            ZSe+T                    dV ee-          gT           ee          fd=eCdWe.dede@fdX            ZUe+T                    dY ee-          gT           ee          fd=eCdWe/dede@fdZ            ZVdedBe!d[edeCfd\ZWe+R                    d] ee-          gT           ee          fdede@fd^            ZXe+Y                    d]d_ ee-          g`           ee          fdWe0dede@fda            ZZe+T                    db ee-          gT           ee          fdceCdWe1dede@fdd            Z[e+\                    db ee-          gT           ee          fdceCdede@fde            Z]e+R                    df ee-          gT           ee          fdede@fdg            Z^e+Y                    dfd_ ee-          g`           ee          fdWe2dede@fdh            Z_e+T                    di ee-          gT           ee          fdjeCdWe3dede@fdk            Z`e+\                    di ee-          gT           ee          fdjeCdede@fdl            Zae+R                    dm ee-          gT           ee          fd=eCdede@fdn            Zbe+Y                    do ee-          gT           ee          fdWe4dede@fdp            Zce+Y                    dq ee-          gT           ee          fdMeCdWe5dede@fdr            Zde+Y                    ds ee-          gT           ee          fdWe6dede@fdt            Zee+\                    du ee-          gT           ee          fdWe7dede@fdv            Zfe+Y                    dw ee-          gT           ee          fd=eCdWe8dede@fdx            Zge+R                    dy ee-          gT           ee          fdede@fdz            Zhe+Y                    dyd_ ee-          g`           ee          fdWe9dede@fd{            Zie+T                    d| ee-          gT           ee          fd}eCdWe:dede@fd~            Zje+\                    d| ee-          gT           ee          fd}eCdede@fd            Zkdede,deCdeCfdZldede,de,de,fdZme+R                    d           ee          fdede@fd            Zne+R                    d ee-          gT           ee          fdede@fd            Zoe+T                    d ee-          gT           ee          fde,dWe;dede@fd            Zpe+R                    d ee-          gT           ee          fdede@fd            Zqe+r                    d ee-          gT           ee          fdWe?dede@fd            Zse+R                    d ee-          gT           ee          fdede@fd            Zte+r                    d ee-          gT           ee          fdWe<dede@fd            Zue+R                    d ee-          gT           ee          fdede@fd            Zve+Y                    dd_ ee-          g`           ee          fdWe=dede@fd            Zwe+T                    d ee-          gT           ee          fdeCdWe>dede@fd            Zxe+\                    d ee-          gT           ee          fdeCdede@fd            ZydS )    )datetime)	APIRouterDependsHeaderHTTPException)	BaseModelFieldmodel_validator)Sessionselect)get_session)
AppSettingBenefitBenefitRedemptionChildChildSettingsCoinTransactionCoinTransactionTypeRoutineDaySettingScheduleBlockScheduleDay
SpecialDaySpecialDayTypeTaskInstanceTaskKind
TaskStatusTaskTemplateget_admin_sessionserialize_benefit)serialize_routine_setting)deactivate_task_templateledger_for_childz/adminz
admin-crud)prefixtagsNzX-Admin-Session)defaultaliasx_admin_sessionsessionreturnc                 &    t          ||            d S Nr   )r*   r+   s     B/home/agent/projects/FamilyDashboard/backend/app/api/admin_crud.pyrequire_adminr0   "   s     g/////    c                       e Zd ZU  eddd          Zedz  ed<    eddd          Zedz  ed<    eddd          Zedz  ed	<   dZ	e
dz  ed
<   dS )ChildUpdateN   P   r(   
min_length
max_lengthname    color   avatar
sort_order)__name__
__module____qualname__r
   r9   str__annotations__r;   r=   r>   int r1   r/   r3   r3   )   s         uTaBGGGD#*GGGdqRHHHE3:HHHtbIIIFC$JIII!Jd
!!!!!r1   r3   c                       e Zd ZU  eddd          Zedz  ed<    eddd          Zedz  ed	<    eddd
          Z	edz  ed<    eddd          Z
edz  ed<   dS )ChildSettingsUpdateN      r6   language_quiz_languager4      r(   gelelanguage_quiz_level   math_quiz_levelknowledge_quiz_level)r?   r@   rA   r
   rJ   rB   rC   rO   rD   rQ   rR   rE   r1   r/   rG   rG   0   s         ).tVW)X)X)XC$JXXX&+eDQ1&E&E&EtEEE"'%q"A"A"AOS4ZAAA',uTaA'F'F'F#*FFFFFr1   rG   c                       e Zd ZU dZedz  ed<    edd          Zeed<    edd          Z	eed<   d	Z
eed
<   ej        Zeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dS )TaskTemplateCreateNchild_idr4   x   r7   r8   slug   title descriptionkindr   
coin_valuepenalty_valueTactivez	0,1,2,3,4applies_weekdaysr>   )r?   r@   rA   rU   rD   rC   r
   rX   rB   rZ   r\   r   requiredr]   r^   r_   r`   boolra   r>   rE   r1   r/   rT   rT   7   s         HcDjs333D#333!444E3444K&D(&&&JM3FD'c'''Jr1   rT   c                       e Zd ZU  eddd          Zedz  ed<    eddd          Zedz  ed<   dZedz  ed<   dZ	e
dz  ed	<   dZedz  ed
<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dS )TaskTemplateUpdateNr4   rV   r6   rX   rY   rZ   r\   r]   r^   r_   r`   ra   r>   )r?   r@   rA   r
   rX   rB   rC   rZ   r\   r]   r   r^   rD   r_   r`   rc   ra   r>   rE   r1   r/   re   re   D   s         uTaCHHHD#*HHHdqSIIIE3:III"Kt""" D(T/   !Jd
!!! $M3:$$$FD4K#'cDj'''!Jd
!!!!!r1   re   c                       e Zd ZU  edd          Zeed<    edd          Zeed<   dZeed<    ed	
          Z	e
ed<   dZe
dz  ed<   dZeed<   d	Ze
ed<   dS )BenefitCreater4   rV   rW   rX   rY   rZ   r[   r\   r   )rM   priceNrU   Tr`   r>   r?   r@   rA   r
   rX   rB   rC   rZ   r\   rh   rD   rU   r`   rc   r>   rE   r1   r/   rg   rg   P   s         s333D#333!444E3444K!E3HcDjFDJr1   rg   c                       e Zd ZU  eddd          Zedz  ed<    eddd          Zedz  ed<   dZedz  ed<    edd	
          Z	e
dz  ed<   dZe
dz  ed<   dZedz  ed<   dZe
dz  ed<   dS )BenefitUpdateNr4   rV   r6   rX   rY   rZ   r\   r   )r(   rM   rh   rU   r`   r>   ri   rE   r1   r/   rk   rk   Z   s         uTaCHHHD#*HHHdqSIIIE3:III"Kt"""dq111E3:111HcDjFD4K!Jd
!!!!!r1   rk   c                       e Zd ZU eed<   eed<    edd          Zeed<   dZedz  ed<   dZ	edz  ed	<    e
d
          d             ZdS )ManualCoinRequestrU   amountr4      rW   commentNreference_transaction_ididempotency_keyafter)modec                     | j                                         st          d          | j        dk    rt          d          | S )NzKommentar ist Pflichtr   zBetrag darf nicht 0 sein)rp   strip
ValueErrorrn   )selfs    r/   validate_manual_coinz&ManualCoinRequest.validate_manual_coink   sH    |!!## 	64555;!7888r1   )r?   r@   rA   rD   rC   r
   rp   rB   rq   rr   r   ry   rE   r1   r/   rm   rm   d   s         MMMKKK5A#666GS666+/cDj///"&OS4Z&&&_'"""  #"  r1   rm   c                   H    e Zd ZU  edd          Zeed<   dZedz  ed<   dS )VoidCoinRequestr[   ro   r(   r8   rp   Nrr   )r?   r@   rA   r
   rp   rB   rC   rr   rE   r1   r/   r{   r{   t   sE         5444GS444"&OS4Z&&&&&r1   r{   c                   x    e Zd ZU  edd          Zee         ed<    edd          Ze	ed<   d	Z
e	d	z  ed
<   d	S )BulkVoidCoinRequestr4   d   rW   transaction_idsr[   ro   r|   rp   Nrr   )r?   r@   rA   r
   r   listrD   rC   rp   rB   rr   rE   r1   r/   r~   r~   y   sh         !&!!D!D!DOT#YDDD5444GS444"&OS4Z&&&&&r1   r~   c                   T    e Zd ZU eed<    edd          Zee         ed<   eed<   dS )BulkDeleteCoinRequestrU   r4      rW   r   confirmN)	r?   r@   rA   rD   rC   r
   r   r   rB   rE   r1   r/   r   r      sE         MMM!&!!D!D!DOT#YDDDLLLLLr1   r   c                   (    e Zd ZU eed<   dZeed<   dS )ResetCoinHistoryRequestr   Tdelete_redemptionsN)r?   r@   rA   rB   rC   r   rc   rE   r1   r/   r   r      s,         LLL######r1   r   c                   j    e Zd ZU dZedz  ed<   eed<   eed<    edd          Z	e
ed<   d	Ze
ed
<   dS )SpecialDayCreateNrU   dayday_typer4   rY   rW   rZ   r[   notes)r?   r@   rA   rU   rD   rC   r   r   r
   rZ   rB   r   rE   r1   r/   r   r      se         HcDj	III!444E3444E3OOOOOr1   r   c                       e Zd ZU dZedz  ed<   dZedz  ed<   dZe	dz  ed<    e
ddd          Zedz  ed<   dZedz  ed	<   dS )
SpecialDayUpdateNrU   r   r   r4   rY   r6   rZ   r   )r?   r@   rA   rU   rD   rC   r   r   r   r   r
   rZ   rB   r   rE   r1   r/   r   r      s         HcDjC&*Hnt#***dqSIIIE3:IIIE3:r1   r   c                   H    e Zd ZU  edd          Zeed<   dZedz  ed<   dS )SettingUpdater4     rW   valueNr\   )r?   r@   rA   r
   r   rB   rC   r\   rE   r1   r/   r   r      sE         !444E3444"Kt"""""r1   r   c                       e Zd ZU eed<    edd          Zeed<   dZedz  ed<   dZ	edz  ed<   d	Z
eed
<   dZeed<   dS )ScheduleDayUpsertrU   r      rM   rN   weekdayNschool_start
school_endTis_school_dayr[   r   )r?   r@   rA   rD   rC   r
   r   r   r   r   r   rc   r   rB   rE   r1   r/   r   r      s}         MMM5A!$$$GS$$$ $L$+$$$"Jt"""M4E3OOOOOr1   r   c                   |    e Zd ZU eed<   eed<   eed<    edd          Zeed<   dZ	eed	<   d
Z
eed<   dZeed<   dS )ScheduleBlockCreateschedule_day_id	starts_atends_atr4   rV   rW   subjectr[   roomFrequires_sports_gearr   r>   N)r?   r@   rA   rD   rC   r   r
   r   rB   r   r   rc   r>   rE   r1   r/   r   r      s}         OOOMMM5A#666GS666D#NNN!&$&&&Jr1   r   c                       e Zd ZU dZedz  ed<   dZedz  ed<    eddd          Ze	dz  ed<   dZ
e	dz  ed<   dZedz  ed	<   dZedz  ed
<   dS )ScheduleBlockUpdateNr   r   r4   rV   r6   r   r   r   r>   )r?   r@   rA   r   r   rC   r   r
   r   rB   r   r   rc   r>   rD   rE   r1   r/   r   r      s         !Itd{!!!GTD[%sKKKGS4ZKKKD#*(,$+,,,!Jd
!!!!!r1   r   c                       e Zd ZU eed<    edd          Zeed<   dZedz  ed<   dZ	edz  ed<    ed	dd
          Z
eed<    edd          Zeed<    edd          Zeed<   dZeed<   dS )RoutineDaySettingUpsertrU   r4      r   r   N	wake_timeteeth_start
   <   rL   leave_countdown_minutes10,3r5   r|   timer_hooksr[   r   r   Tr`   )r?   r@   rA   rD   rC   r
   r   r   r   r   r   r   rB   r   r`   rc   rE   r1   r/   r   r      s         MMM5A!$$$GS$$$!Itd{!!!#K####(5b#A#A#ASAAAuV;;;K;;;rc222E3222FDr1   r   datac                 \    |                                 D ]\  }}t          | ||           d S r.   )itemssetattr)modelr   keyr   s       r/   _applyr      s<    jjll # #
UsE""""# #r1   itemc                     | j         | j        | j        dnd| j        | j        | j        t          | j        d          r| j        j        n| j        | j        | j	        | j
        | j        | j        dS )Nsharedchildr   )idrU   scoperX   rZ   r\   r]   r^   r_   r`   ra   r>   )r   rU   rX   rZ   r\   hasattrr]   r   r^   r_   r`   ra   r>   r   s    r/   _serialize_templater      sr    gM!]2	'#*49g#>#>M	DIo++ 1o  r1   rU   rX   c                     d| pd d| S )Nzdeleted_task_template:r   :rE   )rU   rX   s     r/   _task_tombstone_keyr      s    AH$8AA4AAAr1   c                 l    |                      t          t          |j        |j                            d uS r.   )getr   r   rU   rX   )r+   r   s     r/   _is_task_template_deletedr      s+    ;;z#6t}di#P#PQQY]]]r1   c                 
   t          |j        |j                  }|                     t          |          }|/|                     t	          |dd|j                              d S d|_        |                     |           d S )Ntrueu   Gelöschte Aufgabenvorlage: r   r   r\   )r   rU   rX   r   r   addrZ   r   )r+   r   r   existings       r/   _mark_task_template_deletedr      s    
dmTY
7
7C{{:s++HJ3fBmaeakBmBmnnnoooooHr1   templatetodayc                    t          | ||          }t          | |           |                     t          t                                        t          j        |j        k    t          j        |k    t          j	        t          j        k                                                        }|D ]}|                     |           d|_        |                     |           |d         t!          |          dS )NFcancelled_instances)r   deleted_instances)r$   r   execr   r   wheretask_template_idr   	task_datestatusr   donealldeleter`   r   len)r+   r   r   result	instancesinstances         r/   _delete_task_templater      s    %gx??F222|"")X[8"e+:?2	
 	
  
cee   ! !x    HOKK#)*?#@WZ[dWeWefffr1   c                     | j         | j        | j                                        t	          | j        d          r| j        j        n| j        | j        | j        dS )Nr   )r   rU   r   r   rZ   r   )	r   rU   r   	isoformatr   r   r   rZ   r   r   s    r/   _serialize_special_dayr      sX    gMx!!##+24='+J+J]DM''PTP]  r1   c                     | j         | j        | j        | j        r| j                                        nd | j        r| j                                        nd | j        | j        dS )N)r   rU   r   r   r   r   r   )r   rU   r   r   r   r   r   r   r   s    r/   _serialize_schedule_dayr   
  sh    gM<9=9JT)33555PT59_Ndo//111$+  r1   c           	          | j         | j        | j                                        | j                                        | j        | j        | j        | j        dS )N)r   r   r   r   r   r   r   r>   )	r   r   r   r   r   r   r   r   r>   r   s    r/   _serialize_schedule_blockr     sS    g/^--//<))++<	 $ 9o	 	 	r1   r   c                 0   |                      t          t                                        t          j        |j        k                                                        }|                                }|d n|j        |j	        |j
        |j        d|d<   |S )N)rJ   rO   rQ   rR   settings)r   r   r   r   rU   r   first
model_dumprJ   rO   rQ   rR   )r+   r   r   payloads       r/   _serialize_child_with_settingsr   #  s    ||F=11778NRWRZ8Z[[\\bbddH  G"*"2$$"*"A';#3 ( =	9 9GJ Nr1   txc                 D    | j         | j        | j        | j        | j        dS )Nr   rn   reserved_amountrp   rq   r   )r   s    r/   _coin_tx_payloadr   /  s,    e)-:$&$?  r1   r[   transaction_idrp   rr   c           
         |                      t          |          }|t          ddd| dd          |pd| }|                     t	          t                                        t          j        |k                                                        }||S |                     t	          t                                        t          j        |k    t          j        d| k                                                        }||S |	                                pd| }t          |j
        t          j        |j         |j         | d	| d
||          }	|                     |	           |                                  |	S )N  transaction_not_foundz	Buchung #z nicht gefundencodemessagestatus_codedetailzvoid:zStorno zu Buchung #z (Storno zu Buchung #)rU   transaction_typern   r   rp   rq   rr   )r   r   r   r   r   r   rr   r   rq   rv   rU   r   manualrn   r   r   flush)
r+   r   rp   rr   originalr   r   already_voidedreasonr   s
             r/   _void_coin_transactionr  9  s   {{?N;;H=T  bMm{  bM  bM  bM  5N  5N  O  O  O  	O

55^55C||F?3399/:Y]`:`aabbhhjjH\\%%4F+/G~/G/GG	
 	
 
 egg  !]]__F Fn F FF	",3!11AAAAA!/
 
 
B KKOOOMMOOOIr1   r   c                    t          |          }t                      }|r||z
  }|sn|                    |           |                     t          t          j                                      t          j        |k    t          j        	                    |                              
                                }|                    d |D                        ||S )Nc              3   8   K   | ]}|t          |          V  d S r.   )rD   ).0r   s     r/   	<genexpr>z2_dependent_coin_transaction_ids.<locals>.<genexpr>f  s-      LLT4;Ks4yy;K;K;K;KLLr1   )setupdater   r   r   r   r   rU   rq   in_r   )r+   rU   r   pending	collectedcurrent
dependentss          r/   _dependent_coin_transaction_idsr  X  s    /""G%%I
 MI% 	!!!\\?%&&,,(H48<<WEE 
 

 #%% 	 	LLZLLLLLL  M r1   z	/children)dependenciesc                                            t          t                                        t          j                                                            }d fd|D             iS )Nchildrenc                 0    g | ]}t          |          S rE   )r   )r  r   r+   s     r/   
<listcomp>z"admin_children.<locals>.<listcomp>m  s$    ^^^E7GG^^^r1   )r   r   r   order_byr>   r   )r+   r  s   ` r/   admin_childrenr  j  sX    ||F5MM2253CDDEEIIKKH^^^^U]^^^__r1   z/children/{child_id}r   c                 L   |                     t          |           }|t          dddd          t          ||                    d                     |                    |           |                                 |                    |           dt          ||          iS )	Nr   child_not_foundKind nicht gefundenr   r   Texclude_unsetr   )	r   r   r   r   r   r   commitrefreshr   )rU   r   r+   r   s       r/   update_childr  p  s    KKx((E}=N[p4q4qrrrr
5'$$4$88999KKNNOOE3GUCCDDr1   z/children/{child_id}/settingsc                 $   |                     t          |           }|t          dddd          |                    t	          t
                                        t
          j        | k                                                        }|t          |           }t          ||
                    d                     |                    |           |                                 |                    |           d	t          ||          iS )
Nr   r  r  r   r   rU   Tr  r   )r   r   r   r   r   r   r   rU   r   r   r   r   r  r  r   )rU   r   r+   r   r   s        r/   update_child_settingsr   |  s    KKx((E}=N[p4q4qrrrr||F=11778NRZ8Z[[\\bbddH (333
8W''d';;<<<KKNNOOH3GUCCDDr1   
start_datec                    |                      t          t                                        t          j        |j        k    t          j        |k    t          j        t          j	        k                        
                                }|D ]G}|j        |_        |j        |_        |j        |_        |j        |_        |                     |           Ht!          |          S r.   )r   r   r   r   r   r   r   r   r   openr   rZ   r]   r^   r_   r   r   )r+   r   r!  r   r   s        r/   "_sync_open_instances_from_templater$    s    |"")X[8"j0:?2	
 	
  
cee    ! &1!)!7Hy>>r1   z/task-templatesc                                            t          t                                        t          j        t          j                                                            } fd|D             }dd |D             iS )Nc                 4    g | ]}t          |          |S rE   )r   )r  rowr+   s     r/   r  z'list_task_templates.<locals>.<listcomp>  s*    WWWC/HRU/V/VWCWWWr1   task_templatesc                 ,    g | ]}t          |          S rE   )r   r  r'  s     r/   r  z'list_task_templates.<locals>.<listcomp>  s!    PPPC2377PPPr1   )r   r   r   r  rU   r>   r   )r+   rowsvisible_rowss   `  r/   list_task_templatesr-    sq    <<|,,55l6K\MdeeffjjllDWWWW4WWWLPP<PPPQQr1      )r   r  c                 R   | j         4|                    t          | j                   t          dddd          t	          di |                                 }|                    |           |                                 |                    |           dt          |          iS )Nr   r  r  r   r   task_templaterE   )
rU   r   r   r   r   r   r   r  r  r   r   r+   r'  s      r/   create_task_templater2    s    #E7;K(L(L(T=N[p4q4qrrrr

.
.++--
.
.CKKNNOOC05566r1   z/task-templates/{template_id}template_idc                 n   |                     t          |           }|t          dddd          |                    d          |j        }t          |           d}d}|rB                     d	          d
u r+t          ||t          j                              }|d         }nR|	                    |           t          fddD                       r"t          ||t          j                              }|                                 |                    |           dt          |          ||dS )Nr   task_template_not_foundAufgabenvorlage nicht gefundenr   r   Tr  r   r`   Fr   c              3       K   | ]}|v V  	d S r.   rE   )r  r   r   s     r/   r  z'update_task_template.<locals>.<genexpr>  s'      WWssd{WWWWWWr1   )rZ   r]   r^   r_   )okr0  r   synced_instances)r   r   r   r   r`   r   r$   r   r   r   anyr$  r  r  r   )	r3  r   r+   r'  
was_activer   r9  r   r   s	           @r/   update_task_templater<    sm   
++lK
0
0C
{=V  dD  5E  5E  F  F  F  	FD11DJ
3 ^dhhx((E11)'3
EE$%:;CWWWW&VWWWWW 	^A'3PTPZP\P\]]NNOOC)<S)A)AZm  DT  U  U  Ur1   c                 <   |                     t          |           }|t          dddd          t          ||t	          j                              }|                                 |                    |           ddt          |          |d         |d         d	S )
Nr   r5  r6  r   r   Tr   r   )r8  deletedr0  r   r   )	r   r   r   r   r   r   r  r  r   )r3  r+   r'  r   s       r/   delete_task_templater?    s    
++lK
0
0C
{=V  dD  5E  5E  F  F  F  	F"7C>>FNNOOC,S11%&;<#$78  r1   z	/benefitsc                     |                      t          t                                        t          j        t          j                                                            }dd |D             iS )Nbenefitsc                 ,    g | ]}t          |          S rE   r!   r*  s     r/   r  z'admin_list_benefits.<locals>.<listcomp>  s!    @@@C*3//@@@r1   )r   r   r   r  r>   rZ   r   r+   r+  s     r/   admin_list_benefitsrD    sT    <<w001CW]SSTTXXZZD@@4@@@AAr1   c                     t          di |                                 }|                    |           |                                 |                    |           dt          |          iS )NbenefitrE   )r   r   r   r  r  r"   r1  s      r/   admin_create_benefitrG    si    

)
)G&&((
)
)CKKNNOOC(--..r1   z/benefits/{benefit_id}
benefit_idc                 J   |                     t          |           }|t          dddd          t          ||                    d                     |                    |           |                                 |                    |           dt          |          iS )	Nr   benefit_not_foundBelohnung nicht gefundenr   r   Tr  rF  )	r   r   r   r   r   r   r  r  r"   )rH  r   r+   r'  s       r/   admin_update_benefitrL    s    
++gz
*
*C
{=P]w4x4xyyyy
3"""66777KKNNOOC(--..r1   c                     |                     t          |           }|t          dddd          d|_        |                    |           |                                 ddiS )	Nr   rJ  rK  r   r   Fr8  T)r   r   r   r`   r   r  )rH  r+   r'  s      r/   admin_delete_benefitrN    sj    
++gz
*
*C
{=P]w4x4xyyyyCJKKNN$<r1   z/coins/{child_id}/ledgerc                     |                     t          |           }|t          dddd          t          ||           }|                                |d<   |S )Nr   r  r  r   r   r   )r   r   r   r%   r   )rU   r+   r   ledgers       r/   admin_coin_ledgerrQ    s`    KKx((E}=N[p4q4qrrrrgx00F&&((F7OMr1   z/coins/manualc           	         |                     t          | j                  t          dddd          | j        p#d| j         d| j         d| j         d| j        pd }|                    t          t                                        t          j        |k                                                        }|| j                                        }| j        rS|                     t          | j                  }||j        | j        k    rt          dd	d
d          | d| j         d}t          | j        t          j        | j        d|| j        |          }|                    |           |                                 |                    |           |j        |j        |j        dt)          || j                  dS )Nr   r  r  r   r   zmanual:r   nonereference_transaction_not_foundzReferenzbuchung nicht gefundenz (Korrektur zu Buchung #r   r   r   )r   rn   rp   transactionrP  )r   r   rU   r   rr   rn   rp   rq   r   r   r   r   r   rv   r   r   r   r  r  r   r%   )r   r+   r   r   rp   	references         r/   manual_coinrX    s5   {{5'*++3=N[p4q4qrrrr

!  R  &Rw/?  &R  &R'.  &R  &RSZSb  &R  &Rel  fF  fP  JP  &R  &RC||F?3399/:Y]`:`aabbhhjjH/''))+ 	^OW5UVVI I$6':J$J$J#Ef  tT  =U  =U  V  V  V  V ]]':Z]]]G"%07>%,%E
 
 
 	H!!!"*+U]Ueff  sC  DK  MT  M]  s^  s^  _  _  _r1   z/coins/{transaction_id}/voidc                 8   |                     t          |           }|t          dddd          t          || |j        |j                  }|                                 |                    |           t          |          t          ||j
                  dS )Nr   r   zBuchung nicht gefundenr   r   rU  )r   r   r   r  rp   rr   r  r  r   r%   rU   )r   r   r+   r   r   s        r/   void_coin_transactionrZ  !  s    {{?N;;H=Tay4z4z{{{{	'Ja	b	bBNNOOB+B//;KGU]Uf;g;ghhhr1   z/coins/bulk-voidc                    t          t                              | j                            }|                    t          t                                        t          j        	                    |                              
                                }d |D             fd|D             }|rt          ddd|d          d          t          d	 |D                       d
k    rt          dddd          g }|D ]8}|                    t          ||| j        | j        pd d|                      9|d         j        }|                                 d |D             t'          ||          dS )Nc                     h | ]	}|j         
S rE   r   r  r   s     r/   	<setcomp>z.bulk_void_coin_transactions.<locals>.<setcomp>0  s    +++2+++r1   c                     g | ]}|v|	S rE   rE   r  tx_id	found_idss     r/   r  z/bulk_void_coin_transactions.<locals>.<listcomp>1  s#    @@@i)?)?u)?)?)?r1   r   r   Buchung nicht gefunden: r   r   r   c                     h | ]	}|j         
S rE   r  r^  s     r/   r_  z.bulk_void_coin_transactions.<locals>.<setcomp>4  s    ,,,BBK,,,r1   r4     mixed_childrenz1Bitte Buchungen nur pro Kind gemeinsam stornierenz	bulk-voidr   c                 ,    g | ]}t          |          S rE   )r   r^  s     r/   r  z/bulk_void_coin_transactions.<locals>.<listcomp>;  s!    DDDb-b11DDDr1   )transactionsrP  )r   dictfromkeysr   r   r   r   r   r   r	  r   r   r   appendr  rp   rr   rU   r  r%   )	r   r+   ids	originalsmissingcreatedrb  rU   rc  s	           @r/   bulk_void_coin_transactionsrq  ,  s   
t}}W455
6
6CVO44::?;M;Q;QRU;V;VWWXX\\^^I+++++I@@@@#@@@G K=T  bI  }D  EF  }G  bI  bI  5J  5J  K  K  K  	K
,,),,,--11=M  [N  5O  5O  P  P  P  	PG E E-gugoRYRiRxmx  PC  PC  |A  PC  PC  D  D  	E  	E  	E  	E|$HNNDDGDDDP`ahjrPsPstttr1   z/coins/bulkc                    | j         dk    rt          dddd          |                    t          | j                  t          ddd	d          t          || j        | j                  }|                    t          t                    
                    t          j        | j        k    t          j                            |                                                              }d
 |D             fd| j        D             }|rt          ddd|d          d          |D ]}|                    |           |                                 dt!          |          t#          || j                  dS )NDELETE_COIN_BUCHUNGENrf  confirmation_requiredu(   Bestätigung DELETE_COIN_BUCHUNGEN fehltr   r   r   r  r  c                     h | ]	}|j         
S rE   r]  r^  s     r/   r_  z+delete_coin_transactions.<locals>.<setcomp>K  s    &&&2&&&r1   c                     g | ]}|v|	S rE   rE   ra  s     r/   r  z,delete_coin_transactions.<locals>.<listcomp>L  s#    TTTU)=S=Su=S=S=Sr1   r   rd  r   T)r8  r>  rP  )r   r   r   r   rU   r  r   r   r   r   r   r   r	  r   r   r  r   r%   )r   r+   ids_to_deleter+  ro  r   rc  s         @r/   delete_coin_transactionsrx  >  s   111=T  bL  5M  5M  N  N  N  	N{{5'*++3=N[p4q4qrrrr3GW=MwOfggM<<%%$(88""=11	
 	
 
 
cee 	 '&&&&ITTTT'"9TTTG K=T  bI  }D  EF  }G  bI  bI  5J  5J  K  K  K  	K  rNN3t998HRYRb8c8cdddr1   z/coins/{child_id}/resetc                 
   |j         dk    rt          dddd          |                    t          |           t          ddd	d          |                    t          t                                        t          j        | k                        	                                }|D ]}|
                    |           d
}|j        r|                    t          t                                        t          j        | k                        	                                }t          |          }|D ]}|
                    |           |                                 dt          |          |t          ||           dS )NCOINS_AUF_NULLrf  rt  u!   Bestätigung COINS_AUF_NULL fehltr   r   r   r  r  r   T)r8  r>  redemptions_deletedrP  )r   r   r   r   r   r   r   r   rU   r   r   r   r   r   r  r%   )rU   r   r+   ri  r   r{  redemptions
redemptions           r/   reset_coin_historyr~  U  s   ***=T  bE  5F  5F  G  G  G  	G{{5(##+=N[p4q4qrrrr<< 7 7 = =o>VZb>b c cddhhjjL  r! 'll6*;#<#<#B#BCTC]aiCi#j#jkkooqq!+..% 	' 	'JNN:&&&&NN3|#4#4M`l|  ~E  GO  mP  mP  Q  Q  Qr1   z/special-daysc                     |                      t          t                                        t          j                                                            }dd |D             iS )Nspecial_daysc                 ,    g | ]}t          |          S rE   )r   r*  s     r/   r  z%list_special_days.<locals>.<listcomp>k  s!    IIIS3C88IIIr1   )r   r   r   r  r   r   rC  s     r/   list_special_daysr  h  sQ    <<z**33JNCCDDHHJJDIIDIIIJJr1   c                     t          di |                                 }|                    |           |                                 |                    |           dt          |          iS )Nspecial_dayrE   )r   r   r   r  r  r   r1  s      r/   create_special_dayr  n  si    

,
,w))++
,
,CKKNNOOC1#6677r1   z/special-days/{special_day_id}special_day_idc                 J   |                     t          |           }|t          dddd          t          ||                    d                     |                    |           |                                 |                    |           dt          |          iS )	Nr   special_day_not_foundSpezialtag nicht gefundenr   r   Tr  r  )	r   r   r   r   r   r   r  r  r   )r  r   r+   r'  s       r/   update_special_dayr  w  s    
++j.
1
1C
{=Ta|4}4}~~~~
3"""66777KKNNOOC1#6677r1   c                     |                     t          |           }|t          dddd          |                    |           |                                 ddiS )Nr   r  r  r   r   r8  T)r   r   r   r   r  )r  r+   r'  s      r/   delete_special_dayr    sc    
++j.
1
1C
{=Ta|4}4}~~~~NN3NN$<r1   r   r(   c                     |                      t          |          }||S 	 t          dt          |j                            S # t
          $ r |cY S w xY w)Nr   )r   r   maxrD   r   rw   r+   r   r(   r'  s       r/   _int_settingr    s`    
++j#
&
&C
{1c#)nn%%%   s   !A AAc                 N    |                      t          |          }|r|j        n|S r.   )r   r   r   r  s       r/   _str_settingr    s&    
++j#
&
&C(399(r1   z/settings/publicc                 ^   |                      t          d          }|r|j                                        dk    ndt	          | dd          t	          | dd          t	          | dd          t	          | dd	          t	          | d
d          t	          | dd          t          | dd          dS )Ndeparture_warning_sound_enabledr   Tlanguage_quiz_coin_valuer4   math_quiz_coin_valueknowledge_quiz_coin_value!screen_time_default_daily_minutes(   screen_time_exchange_coin_costrK   screen_time_exchange_minutesr   screen_time_alarm_soundclassic)r  r  r  r  r  r  r  r  )r   r   r   lowerr  r  )r+   warnings     r/   public_settingsr    s    kk*&GHHGPW+aGM,?,?,A,AV,K,K]a$0:TVW$X$X ,W6La P P%1';VXY%Z%Z-9'Cfhj-k-k*6w@`bc*d*d(4W>\^`(a(a#/9RT]#^#^	 	 	r1   z	/settingsc                     |                      t          t                                        t          j                                                            }dd |D             iS )Nr   c                 6    g | ]}|                                 S rE   )r   r*  s     r/   r  z!list_settings.<locals>.<listcomp>  s"    :::c)):::r1   )r   r   r   r  r   r   rC  s     r/   list_settingsr    sQ    <<z**33JNCCDDHHJJD::T:::;;r1   z/settings/{key}c                 `   |                     t          |           }|t          | |j        |j        pd          }n|j        |_        |j        |j        |_        |                    |           |                                 |                    |           d|                                iS )Nr[   r   setting)r   r   r   r\   r   r  r  r   )r   r   r+   r'  s       r/   update_settingr    s    
++j#
&
&C
{S7CVC\Z\]]]M	*%1COKKNNOOCs~~''((r1   z/schedule-routinesc                    |                      t          t                                        t          j                                                            }d |D             |                      t          t                                        t          j        t          j                                                            }dfd|D             iS )Nc                     i | ]
}|j         |S rE   r]  )r  r   s     r/   
<dictcomp>z-list_routine_day_settings.<locals>.<dictcomp>  s    :::EHe:::r1   routine_settingsc                 `    g | ]*}t          |                    |j                            +S rE   )r#   r   rU   )r  r'  child_lookups     r/   r  z-list_routine_day_settings.<locals>.<listcomp>  s7     p p pdg!:3@P@PQTQ]@^@^!_!_ p p pr1   )	r   r   r   r  r>   r   r   rU   r   )r+   r  r+  r  s      @r/   list_routine_day_settingsr    s    ||F5MM2253CDDEEIIKKH:::::L<<011::;L;UWhWpqqrrvvxxD p p p pko p p pqqr1   c                    |                     t          | j                  }|t          dddd          d                    d | j                            d          D                       pd}|                    t          t                    
                    t          j        | j        k    t          j        | j        k                                                        }|                                 }||d	<   |t          di |}nt          ||           |                    |           |                                 |                    |           d
t%          ||          iS )Nr   r  r  r   r   ,c              3   f   K   | ],}|                                 |                                 V  -d S r.   )rv   )r  parts     r/   r  z-upsert_routine_day_setting.<locals>.<genexpr>  s<      ]]dPTPZPZP\P\]TZZ\\]]]]]]r1   r   r   routine_settingrE   )r   r   rU   r   joinr   splitr   r   r   r   r   r   r   r   r   r  r  r#   )r   r+   r   hooksr'  r   s         r/   upsert_routine_day_settingr    sx   KKw/00E}=N[p4q4qrrrrHH]]g.A.G.G.L.L]]]]]gagE
,,v/00667H7QU\Ue7egx  hA  EL  ET  hT  U  U  V  V  \  \  ^  ^CDD
{''$''sDKKNNOOC8eDDEEr1   z/schedule-daysc                     |                      t          t                                        t          j        t          j                                                            }dd |D             iS )Nschedule_daysc                 ,    g | ]}t          |          S rE   )r   r*  s     r/   r  z&list_schedule_days.<locals>.<listcomp>  s!    KKKs5c::KKKr1   )r   r   r   r  rU   r   r   rC  s     r/   list_schedule_daysr    sW    <<{++44[5I;K^__``ddffDKKdKKKLLr1   c                    |                     t          t                                        t          j        | j        k    t          j        | j        k                                                        }|t          di |                                 }n"t          ||                                            |	                    |           |
                                 |                    |           dt          |          iS )Nschedule_dayrE   )r   r   r   r   rU   r   r   r   r   r   r  r  r   r1  s      r/   upsert_schedule_dayr    s    
,,vk**001EIY1Y[f[nry  sB  \B  C  C  D  D  J  J  L  LC
{11G..0011sG&&(()))KKNNOOC3C8899r1   z/schedule-blocksc                     |                      t          t                                        t          j        t          j                                                            }dd |D             iS )Nschedule_blocksc                 ,    g | ]}t          |          S rE   )r   r*  s     r/   r  z(list_schedule_blocks.<locals>.<listcomp>  s!    OOO3 9# > >OOOr1   )r   r   r   r  r   r>   r   rC  s     r/   list_schedule_blocksr    sX    <<}--66}7TVcVnooppttvvDOO$OOOPPr1   c                    |                     t          | j                  }|t          dddd          t	          di |                                 }|j        |_        |j        |_        | j        |_	        | j        |_        d|_
        |                    |           |                                 |                    |           dt          |          iS )	Nr   schedule_day_not_foundzStundenplantag nicht gefundenr   r   Tschedule_blockrE   )r   r   r   r   r   r   rU   r   r   rZ   r`   r   r  r  r   )r   r+   r   r'  s       r/   create_schedule_blockr    s    
++k7#:
;
;C
{=U  cB  5C  5C  D  D  D  	D

/
/',,..
/
/C<CL+CKCI/CKCJKKNNOOC7<<==r1   z/schedule-blocks/{block_id}block_idc                 r   |                     t          |           }|t          dddd          |                    d          }t	          ||           d|v r|j        pd	|_        |                    |           |                                 |	                    |           d
t          |          iS )Nr   schedule_block_not_foundStundenplanblock nicht gefundenr   r   Tr  r   r[   r  )r   r   r   r   r   r   rZ   r   r  r  r   )r  r   r+   r'  r   s        r/   update_schedule_blockr    s    
++mX
.
.C
{=W  eF  5G  5G  H  H  H  	HD11D
3DK%2	KKNNOOC7<<==r1   c                     |                     t          |           }|t          dddd          |                    |           |                                 ddiS )Nr   r  r  r   r   r8  T)r   r   r   r   r  )r  r+   r'  s      r/   delete_schedule_blockr    sy    
++mX
.
.C
{=W  eF  5G  5G  H  H  H  	HNN3NN$<r1   )r[   N)zdatetimer   r   fastapir   r   r   r   pydanticr	   r
   r   sqlmodelr   r   app.db.sessionr   
app.modelsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   app.services.admin_authr    app.services.benefitsr"   app.services.scheduler#   app.services.tasksr$   r%   routerrB   r0   r3   rG   rT   re   rg   rk   rm   r{   r~   r   r   r   r   r   r   r   r   r   rj  r   r   rD   r   rc   r   r   r   r   r   r   r   r   r  r   r  r  r   r  patchr  r   r$  r-  postr2  r<  r   r?  rD  rG  rL  rN  rQ  rX  rZ  rq  rx  r~  r  r  r  r  r  r  r  r  r  r  putr  r  r  r  r  r  r  rE   r1   r/   <module>r     sc           = = = = = = = = = = = = 6 6 6 6 6 6 6 6 6 6 $ $ $ $ $ $ $ $ & & & & & &                                   $ 6 5 5 5 5 5 3 3 3 3 3 3 ; ; ; ; ; ; I I I I I I I I	(,	8	8	8 #)&=N"O"O"Ow{++0 04Z00 
0 0 0 0" " " " ") " " "G G G G G) G G G
 
 
 
 
 
 
 
	" 	" 	" 	" 	" 	" 	" 	"    I   " " " " "I " " "    	    ' ' ' ' 'i ' ' '
' ' ' ' ') ' ' '    I   $ $ $ $ $i $ $ $
    y       y   # # # # #I # # #
    	       )   " " " " ") " " "    i   # # # # # #
l t    "B#* BC BC B B B B^w ^l ^t ^ ^ ^ ^      g7 gl g4 gTX g g g g"     	+ 	$ 	 	 	 	
M 
d 
 
 
 
	G 	E 	d 	 	 	 	 T     G S 3 filpfp   }L    >W  VZ[^V_ dghkdl    $ Kww}'='=&>??&-gk&:&: ` `G `t ` ` ` @?`
 $GGM4J4J3KLLIPQ\I]I] E E3 E Ew Ebf E E E MLE -WW]=S=S<TUUZaZabmZnZn E EC E2E EPW Esw E E E VUE < ]a fi    " WW]-C-C,DEE+27;+?+? R R RD R R R FER Cww}?U?U>VWWIPQ\I]I] 7 7"4 7w 7bf 7 7 7 XW7 -WW]=S=S<TUU[b[bcn[o[o U Uc U4F UQX Utx U U U VUU* .ggm>T>T=UVV>Egk>R>R  c G W[    WV  Kww}'='=&>??+27;+?+? B B BD B B B @?B
 [c9O9O8PQQDKGKDXDX / /- /' /]a / / / RQ/ &ggm6L6L5MNNU\U\]hUiUi / /S /= /7 /nr / / / ON/ 'ww}7M7M6NOO=DW[=Q=Q  S 7 VZ    PO &ggm6L6L5MNN8?8L8L   g QU    ON _GGM,B,B+CDD?Fw{?S?S _ _* _W _X\ _ _ _ ED_6 +77=;Q;Q:RSS\c\cdo\p\p i i# i iRY iuy i i i TSi ww}/E/E.FGGQXQXYdQeQe u u)< uw ujn u u u HGu" }GGM,B,B+CDDPWPWXcPdPd e e&; eg eim e e e EDe, &ggm6L6L5MNN[b[bcn[o[o Q Q Q/F QQX Qtx Q Q Q ONQ$ O77=+A+A*BCC)0)=)= K Kw K$ K K K DCK
 _#WW]=S=S<TUUELW[EYEY 8 8 0 87 8^b 8 8 8 VU8 .ggm>T>T=UVVZaZabmZnZn 8 8s 85E 8PW 8sw 8 8 8 WV8 /ww}?U?U>VWW?Fw{?S?S  s W X\    XW'  c c    )' ) )c )c ) ) ) )
 '.w{';';  W       Kww}'='=&>??%,W[%9%9 < <7 <d < < < @?<
 ww}/E/E.FGGHOP[H\H\ ) ) )m )g )ae ) ) ) HG)  0F0F/GHH181E1E r rw r$ r r r IHr  0F0F/GHHT[T[\gThTh F F(? F' Fmq F F F IHF$ GGM,B,B+CDD*1'+*>*> M M M4 M M M EDM
 GGM,B,B+CDDGNw{G[G[ 	: 	:!2 	:W 	:`d 	: 	: 	: ED	: ggm.D.D-EFF,3GK,@,@ Q Q' QT Q Q Q GFQ
 S@V@V?WXXKR7S^K_K_ > >#6 > >dh > > > YX>  +77=;Q;Q:RSSZaZabmZnZn > >C >2E >PW >sw > > > TS> ,GGM<R<R;STT<CGK<P<P  C ' UY    UT  r1   