
    X@	g:                        d dl mZmZmZ d dl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 ddlmZmZ ddlmZ dd	lmZ d d
lmZ d Zd Z G d dej                  Z G d dej                  Z G d dej                  ZdS )    )modelstransaction
connection)Http404)date	timedelta)Lower)CountSumMinMax   )Note
array2tree)Classe)Semaine)BDDc                     t           dk    s!t           dk    st           dk    st           dk    rd                    |           S t           dk    rd                    |           S dS )	N
postgresqlpostgresql_psycopg2mysqloraclez6EXTRACT(YEAR FROM {0})*12 + EXTRACT(MONTH FROM {0}) -1sqlite3z,strftime('%%Y',{0})*12+strftime('%%m',{0})-1 )r   format)args    (/opt/e-colle/accueil/models/ramassage.py	totalMoisr      sd    
lc%:::cWnnPSW_P_P_GNNsSSS				=DDSIIIr    c                     	 t           j                            t          d                    } t           j                            t	          d                    }t          | d         j        | d         j        dz  z   | d         j        dz  dz   d          t          d          z
  } |d         t          d          z   }t          |j        |j        dz  z   |j        dz  dz   d          t          d          z
  }nb# t          $ rU t          j
                    }t          |j        |j        dz  z   |j        dz  dz   d          t          d          z
  x} }Y nw xY w| |fS )u   Renvoie les mois min et max (+1 mois) des semaines de colle. Renvoie le mois courant en double si aucune semaine n'est définielundi
lundi__min   r   )days
lundi__max#   )r   objects	aggregater   r   r   yearmonthr   	Exceptiontoday)moisMinmoisMaxhuis      r   moisr0      su   X))#g,,77))#g,,77W\*/0E0KR0OOPWXdPePklnPnopPpqrsst}  DE  uF  uF  uF  F%iR&8&8&88W\'-"33GM"4DQ4FqII)YZJ[J[J[[ X X XJLLSXcim3CIbLN1EEiUVFWFWFWWWX 7?s   C=D   AEEc                   "    e Zd Zd ZddZd ZdS )RamassageManagerc                    |                      |                                          rt          |                      |                                          r|                     |          }nt	          |          }d                    t          d          t          dk    rdnd          }t          j	                    5 }|
                    ||f           t          j                    5  |                                 t          j                             |j                                                   |                                D ]J}t          j                            |d	         |d         |d
         |j        |d         |d                    K	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )ub   crée ou met à jour le ramassage dont le mois de fin est moisFin puis crée le décompte associé)moisFin__gtmoisFinaW  SELECT co.id id_colleur, ma.id id_matiere, cl.id id_classe, {} moisTotal, SUM(ma.temps)         FROM accueil_colleur co        INNER JOIN accueil_user u        ON u.colleur_id = co.id        INNER JOIN accueil_colleur_classes cocl        ON co.id = cocl.colleur_id        INNER JOIN accueil_classe cl        ON cocl.classe_id = cl.id        LEFT OUTER JOIN accueil_note no        ON no.colleur_id = co.id AND no.classe_id = cl.id        INNER JOIN accueil_matiere ma        ON no.matiere_id = ma.id        WHERE u.is_active = {} AND no.date_colle <= %s        GROUP BY co.id, ma.id, cl.id, moisTotalzno.date_coller   r   TRUE)pkr            )
colleur_id
matiere_id	classe_idramassage_idr0   tempsN)filterexistsr   get	Ramassager   r   r   r   cursorexecuter   atomicsaveDecompter'   r8   deletefetchallcreate)selfr6   	ramassagerequeterE   rows         r   createOrUpdatezRamassageManager.createOrUpdate#   s{   ;;7;++2244 	;;w;''..00 	5733II!G444I1 28	/8R8RX[_hXhXhSTSTnt1u1u 	    	WFNN7G:...#%% W W    ''9<'88??AAA!??,, W WC$++s1vQZ]^_Z`nwnz  BE  FG  BH  PS  TU  PV+  W  W  W  WWW W W W W W W W W W W W W W W	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	Ws7   +F=-B+F%F=%F)	)F=,F)	-F==GGTFc           
      	   t           j                            |j                                                  ru|sst           j                            |j                                      t          d                    d         }t           j                            |          }|j        }	nd}	d	                    |sdnd|sdnd          }
|rd		                    |
|rd
nd          }
nd	                    |
|rd
nd          }
t          j                    5 }|                    |
|s|	|j        |j        |	fn|	|j        |j        |j        |	|j        f           |                                }ddd           n# 1 swxY w Y   g d|st          j                            t!          d                    }dgdz  |D ]Q}dt#          d|j        cxk    odk    nc           dt#          d|j        k               z  z   d|j        z  z   dz
  <   Rt)          d D                       }d}t+          d          D ]}|         r
||<   |dz  }fd|D             }g }|r|r|d         d         |d         d         |d         d         }}}|                    |d         dd         dg|z  fz              |D ]}|d         |k    r|d         |k    r|r|d         |k    s=|d         |d         |d         }}}|                    |dd         dg|z  fz              |d         d         ||d                  xx         |d         z  cc<   n|d         d         |d         d         }}|                    |d         dd         dg|z  fz              |D ]}|d         |k    r|d         |k    r|s5|d         |d         }}|                    |dd         dg|z  fz              |d         d         ||d                  xx         |d         z  cc<   t/          t1          dgdz  dgdz  z   g ddz                      }d t1          |          D             }|r||fS |rg d}d  d! fd"d# d$ g}ng d%}d& d' fd(d) g}t3          |||          |fS |r|S |rg d*}d+ d, d- fd.d/ d0 g}ng d1}d2 d3 d4 fd5d6 d7 g}t3          |||          S )8u   Renvoie, pour chaque classe, la liste des colleurs avec leur nombre d'heures de colle ramassées au ramassage 'ramassage', s'ils en ont effectué
        Si colleur ne vaut pas False, on ne ramasse que les colles du colleur en question)moisFin__ltr6   moisFin__maxr5   r   a  SELECT cl.id classe_id, cl.nom classe_nom, cl.annee, ma.nom matiere_nom, COALESCE(et.nom, 'Inconnu') etab, col.grade, u.last_name nom, u.first_name prenom, col.id colleur_id,        dec2.mois mois, SUM(dec2.temps) - COALESCE(SUM(dec1.temps),0) heures        FROM accueil_decompte dec2        LEFT OUTER JOIN accueil_decompte dec1        ON dec1.colleur_id = dec2.colleur_id AND dec1.classe_id = dec2.classe_id AND dec1.matiere_id = dec2.matiere_id        AND dec1.mois = dec2.mois AND dec1.ramassage_id = %s        INNER JOIN accueil_colleur col        ON dec2.colleur_id = col.id        INNER JOIN accueil_classe cl        ON dec2.classe_id = cl.id        INNER JOIN accueil_matiere ma        ON dec2.matiere_id = ma.id        INNER JOIN accueil_user u        ON u.colleur_id = col.id        LEFT OUTER JOIN accueil_etablissement et        ON col.etablissement_id = et.id        WHERE dec2.ramassage_id=%s AND dec2.temps - COALESCE(dec1.temps,0) != 0{}        GROUP BY ma.nom, u.last_name, u.first_name, col.id, cl.id, et.nom, dec2.mois        UNION ALL SELECT cl.id classe_id, cl.nom classe_nom, cl.annee, ma.nom matiere_nom, COALESCE(et.nom, 'Inconnu') etab, col.grade, u.last_name nom, u.first_name prenom, col.id colleur_id,        dec1.mois mois, - SUM(dec1.temps) heures        FROM accueil_decompte dec1        LEFT OUTER JOIN accueil_decompte dec2        ON dec1.colleur_id = dec2.colleur_id AND dec1.classe_id = dec2.classe_id AND dec1.matiere_id = dec2.matiere_id        AND dec1.mois = dec2.mois AND dec2.ramassage_id=%s        INNER JOIN accueil_colleur col        ON dec1.colleur_id = col.id        INNER JOIN accueil_classe cl        ON dec1.classe_id = cl.id        INNER JOIN accueil_matiere ma        ON dec1.matiere_id = ma.id        INNER JOIN accueil_user u        ON u.colleur_id = col.id        LEFT OUTER JOIN accueil_etablissement et        ON col.etablissement_id = et.id        WHERE dec2.id IS NULL AND dec1.ramassage_id = %s{}        GROUP BY ma.nom, u.last_name, u.first_name, col.id, cl.id, et.nom, dec1.moisr   z AND col.id = %sztSELECT * FROM ({}) as req            ORDER BY {} req.matiere_nom, req.etab, req.grade, req.nom, req.prenom, req.moiszreq.annee, req.classe_nom, a  SELECT  req.classe_id, req.classe_nom, req.annee, req.matiere_nom, req.etab, req.grade, req.nom, req.prenom, req.colleur_id,             SUM(req.heures) heures FROM ({}) as req            GROUP BY req.classe_id, req.classe_nom, req.annee, req.matiere_nom, req.etab, req.grade, req.nom, req.prenom, req.colleur_id            ORDER BY {}req.matiere_nom, req.etab, req.grade, req.nom, req.prenomNinconnuu	   certifiézbi-admissibleu   agrégéz
chaire supclasseeleveeleve_compteF   T   r&   r9   r:   c                 ,    g | ]}t          |          S  int.0values     r   
<listcomp>z6RamassageManager.decompteRamassage.<locals>.<listcomp>   s    GGGes5zzGGGr   r   c           
          i | ]Z}|j         t          d |j        cxk    odk    nc           dt          d|j        k               z  z   d|j        z  z   dz
           [S r[   r&   r9   r:   r8   r_   rY   anneera   classeeffectif_classes     r   
<dictcomp>z6RamassageManager.decompteRamassage.<locals>.<dictcomp>   s       b   b   b  PV	/#b&BU>Y>Y>Y>YWY>Y>Y>Y>Y:Z:Z[\]`acdjdwaw]x]x[x:xyz  |B  |H  zH  ;H  IJ  ;J  +K   b   b   br      	   zeff<20u   20≤eff≤35zeff>35c                      g | ]\  }}|d u	|S Fr]   ra   xbooleans      r   rc   z6RamassageManager.decompteRamassage.<locals>.<listcomp>   s'    cccyqg]bNbNbNbNbNbr   )r   r   r   r:   r9   c                     | S Nr]   ts    r   <lambda>z4RamassageManager.decompteRamassage.<locals>.<lambda>       ! r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>       a r   c                 "    | d                  fS Nr   r]   rs   LISTE_GRADESs    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>       ,qt:L9N r   c                     d                     | d                                         | d                                                   fS N{} {}r   r   r   titleupperrs   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   sT    Y`YgYghijkhlhrhrhthtuvwxuyuu  vB  vB  ZC  ZC  YE r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   s      OP r   )r   r   r   r;   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   rz   r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   r|   r   c                 "    | d                  fS r~   r]   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   r   r   c                     d                     | d                                         | d                                                   | d         fS Nr   r   r   r:   r   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   si    Y`YgYghijkhlhrhrhthtuvwxuyuu  vB  vB  ZC  ZC  DE  FG  DH  YI r   )r:   r   r   r   r:   r9   c                     | d         fS Nr   r]   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>       1Q4' r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>       A r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>        r   c                 "    | d                  fS r~   r]   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>       LYZ[\Y]L^K` r   c                     d                     | d                                         | d                                                   fS r   r   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   sx    krkykyz{|}z~  {E  {E  {G  {G  HI  JK  HL  HR  HR  HT  HT  lU  lU  kW r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   s      bc r   )r:   r   r   r   r;   c                     | d         fS r   r]   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   r   r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   r   r   c                     | S rv   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   r   r   c                 "    | d                  fS r~   r]   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   r   r   c                     d                     | d                                         | d                                                   | d         fS r   r   r   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   s    krkykyz{|}z~  {E  {E  {G  {G  HI  JK  HL  HR  HR  HT  HT  lU  lU  VW  XY  VZ  k[ r   c                     | d         S r~   r]   rw   s    r   ry   z4RamassageManager.decompteRamassage.<locals>.<lambda>   s      fg  hi  fj r   )rD   r'   rA   r6   rB   r(   r   rC   r8   r   r   rE   rF   rK   r   annotater
   r_   rY   rg   sumrangeappendlistzipr   )rM   rN   csv	parClasseparMoisfullcolleurr0   ramassage_precedentramassage_precedent_pkrO   rE   	decomptesclassesri   nb_decomptejieffectifs_classe
decomptes2lastMatierelastColleurlastMoisligne	effectifsprofondeursfuncsr   rj   s                              @@r   decompteRamassagez"RamassageManager.decompteRamassageA   s    ##	0A#BBIIKK 	'TX 	'$++	8I+JJTTUXYbUcUcddestD"+"3"7"7$"7"G"G%8%;""%&"#VF W]V\gn  ^G]_]_  uG  SZ  Ir  IK  IK  `r  Ws  WsG 	H  	V]]c]cdk  OX  n`  nK  nK  ^`  ^a  ^a GR SYRXY`  DM  cUbb  SU  SV  SV     	*FNN7t{  $b$:9<	Uk#l#l  DZ  [d  [g  ho  hr  s|  s  @V  W^  Wa  Cb  c  c  c))I	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* UTT 3	;n--5;O;O-PPG$gaiO! v vquB(;$?$?$?$?R$?$?$?$? @ @3r&J]G]C^C^A^ ^_`agam_m mno oppGGGGGHHKA1XX  "1% '(OA&qDA  b   b   b   b  Za   b   b   bJ T T9B1a)TU,WX/[def[ghi[jhK%%il1R4&8QCO;M&MNNN!* T T$Qx;6658{;R;RW\;RafghaimuauauAFq5QR8UZ[\U]hK&--eAbDkaS_<N.NOOO"2r*+;E!H+EFFF%PR)SFFFF	T 09|A	!QK%%il1R4&8QCO;M&MNNN!* T T$Qx;6658{;R;RW\;R7<QxqK&--eAbDkaS_<N.NOOO"2r*+;E!H+EFFF%PR)SFFFFCAqc!e,O,O,OPQ,QRRSSIccC	/,J,JcccI -!9,, J)kk#ZZ0N0N0N0N  PE  PE  FP  FP  Q'ii#ZZ0N0N0N0N  PI  PI  JjU;;YFF !   k+mm))::zzB`B`B`B`  bW  bW  Yc  Yc  d)kk))::zzB`B`B`B`  b[  b[  ]j  ]j  kiE:::s   AE<<F F c                 j   g dt          t          j                            ||f                              t          d                                        ddddd	d
d                              ddddd	                              t          d                              }t          j                            t          d                    }dgdz  |D ]Q}dt          d|j        cxk    odk    nc           dt          d|j        k               z  z   d|j        z  z   dz
  <   Rt          d D                       }d}t          d          D ]}|         r
||<   |dz  }fd|D             }	g }
|r|d         d         |d         d         }}|
                    |d         dd         dg|z  fz              |D ]}|d         |k    r|d         |k    r|s5|d         |d         }}|
                    |dd         dg|z  fz              |
d         d         |	|d                  xx         |d         z  cc<   g d}d d  fd!d" g}t#          |
||          }t          t%          dgdz  dgdz  z   g d#dz                      }d$ t%          |          D             }||fS )%u   Renvoie la liste des colleurs avec leur nombre d'heures de colle entre les mois moisMin et moisMax, trié par année/effectif de classerU   )date_colle__rangematiere__nom)nom_matierer   colleur__etablissement__nomcolleur__gradecolleur__user__last_namecolleur__user__first_name
classe__idcolleur__idmatiere__temps)r@   rW   rX   FrZ   Tr[   r&   r9   r:   c                 ,    g | ]}t          |          S r]   r^   r`   s     r   rc   z-RamassageManager.decompte.<locals>.<listcomp>   s    CCC%3u::CCCr   r   r   c           
          i | ]Z}|j         t          d |j        cxk    odk    nc           dt          d|j        k               z  z   d|j        z  z   dz
           [S re   rf   rh   s     r   rk   z-RamassageManager.decompte.<locals>.<dictcomp>   s      ^  ^  ^  LRFIoc"f>Q:U:U:U:USU:U:U:U:U6V6VWXY\]_`f`s]sYtYtWt6tuvw}  xD  vD  7D  EF  7F  'G  ^  ^  ^r   Nrn      )r   r   r   r   c                     | S rv   r]   rw   s    r   ry   z+RamassageManager.decompte.<locals>.<lambda>   s    ! r   c                     | d         dgn| S )Nr   Inconnur]   rw   s    r   ry   z+RamassageManager.decompte.<locals>.<lambda>   s    adl	{{ r   c                 "    | d                  gS r~   r]   )rx   r   s    r   ry   z+RamassageManager.decompte.<locals>.<lambda>   s    UabcdebfUgTh r   c                     d                     | d                                         | d                                                   | d         fS )Nr   r   r   r;   r   rw   s    r   ry   z+RamassageManager.decompte.<locals>.<lambda>   s    t{  uC  uC  DE  FG  DH  DN  DN  DP  DP  QR  ST  QU  Q[  Q[  Q]  Q]  u^  u^  _`  ab  _c  td r   ro   c                      g | ]\  }}|d u	|S rq   r]   rr   s      r   rc   z-RamassageManager.decompte.<locals>.<listcomp>   s'    ___91W'Y^J^J^QJ^J^J^r   )r   r   r'   rA   r   r	   values_listorder_byr   r   r
   r_   rY   rg   r   r   r   r   r   )rM   r-   r.   r   r   ri   r   r   r   r   r   r   r   r   r   r   listeDecompter   r   rj   s                     @@r   decomptezRamassageManager.decompte   s   TTT,,?P,QQZZglm{g|g|Z}}  J  J  KX  Yv  wG  Hb  c~  K  LY  Z  Z  c  c  dq  rO  P`  a{  |W  X  X  a  a  hk  l|  h}  h}  a  ~  ~    	.))u]7K7K)LL '!) 	r 	rFmqOCF$7 ; ; ; ; ; ; ; ;<<Qs2fFYCY?Z?Z=ZZ[\]c]i[iijkkllCC?CCCDD
q 	 	Aq! #$"1 ^  ^  ^  ^  V]  ^  ^  ^
 	L'0|A	!QKil3B3/A3{?2DDEEE" L LQx;..58{3J3Ju3J/4QxqK%%eAbDkaS_4F&FGGG2r"#3E!H#=>>>%)K>>>>iiIIKhKhKhKh  kd  kd  e":{EBBQCE1#a%K(K(K(KA(MNNOO	__Io(F(F___	Y&&r   N)TTFFF)__name__
__module____qualname__rQ   r   r   r]   r   r   r2   r2   "   sN        W W W<m; m; m; m;^' ' ' ' 'r   r2   c                       e Zd Z ej        ddd          Z ej        d          Z e            Z	 G d d          Z
dS )	rD   u   Jusqu'à (inclus)TF)verbose_nameuniqueblank)auto_nowc                       e Zd ZdgZdS )Ramassage.Metar6   N)r   r   r   orderingr]   r   r   Metar      s        r   r   N)r   r   r   r   	DateFieldr6   DateTimeFieldr   r2   r'   r   r]   r   r   rD   rD      sz        f,?$X]^^^G64000D  G         r   rD   c                   ,   e Zd Z ej        dej        d          Z ej        dej        d          Z ej        dej        d          Z	 ej        e
ej        d          Z ej        d          Z ej        d          Z G d d	          Zd
S )rI   ColleurF)	on_deletenullMatierer   r   )defaultc                       e Zd ZdZdS )Decompte.Meta)r   ri   matiererN   r0   N)r   r   r   unique_togetherr]   r   r   r   r      s        Ir   r   N)r   r   r   r   
ForeignKeyCASCADEr   PROTECTr   ri   rD   rN   IntegerFieldr@   PositiveSmallIntegerFieldr0   r   r]   r   r   rI   rI      s        f	v~eTTTGf	v~eTTTGVxV^ERRRF!!)PUVVVIF!,,,E+6+a888DJ J J J J J J J J Jr   rI   N) 	django.dbr   r   r   django.httpr   datetimer   r   django.db.models.functionsr	   django.db.modelsr
   r   r   r   noter   r   ri   r   semainer   ecolle.settingsr   r   r0   Managerr2   ModelrD   rI   r]   r   r   <module>r      s   5 5 5 5 5 5 5 5 5 5       $ $ $ $ $ $ $ $ , , , , , , 1 1 1 1 1 1 1 1 1 1 1 1 " " " " " " " "                      k' k' k' k' k'v~ k' k' k'Z       	J 	J 	J 	J 	Jv| 	J 	J 	J 	J 	Jr   