o
    Dj?                     @   s   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d Zdd ZG dd dejZG dd dejZG dd dejZdS )    )modelstransaction
connection)Http404)date	timedelta)Lower)CountSumMinMax   )Note
array2tree)Classe)Semaine)BDDc                 C   s@   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)arg r   2/home/reyt/e-colle-new/accueil/models/ramassage.py	totalMois   s
    

r   c                  C   s   zPt jtd} t jtd}t| d j| d jd  | d jd d dtdd } |d tdd }t|j|jd  |jd d dtdd }W | |fS  t	yx   t
 }t|j|jd  |jd d dtdd  } }Y | |fS w )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huir   r   r   mois   s   8.2r-   c                   @   s&   e Zd Zdd Zd
ddZdd Zd	S )RamassageManagerc                 C   s$  | j |d r
t| j |d r| j|d}nt|d}dtdtdkr)dnd}t	 X}|
||f t 4 |  tjj |jd  | D ]}tjj|d	 |d |d
 |j|d |d d qOW d   n1 ssw   Y  W d   dS W d   dS 1 sw   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_idr-   tempsN)filterexistsr   get	Ramassager   r   r   r   cursorexecuter   atomicsaveDecompter$   r3   deletefetchallcreate)selfr1   	ramassagerequeter@   rowr   r   r   createOrUpdate#   s(   


0"zRamassageManager.createOrUpdateTFc              
      s,  t jj|jd r&|s&t jj|jdtdd }t jj|d}	|	j}
nd}
d	|s.dnd|s3dnd}|rK|r@d		|}nd
	||rGdnd}n|rSd	|}n
d	||rZdnd}t
 &}|||so|
|j|j|
fn|
|j|j|j|
|jf | }W d   n1 sw   Y  g d |s&tjjtdd}dgd |D ]#}dtd|j  kodkn  dtd|jk   d|j  d < qtdd D }d}tdD ]}| r||< |d7 }qهfdd|D }g }|r|rl|d d |d d |d d }}}||d dd  dg| f  |D ]J}|d |kr:|d |kr:|r:|d |ksW|d |d |d }}}||dd  dg| f  |d  d  ||d    |d  7  < q n_|d d |d d }}||d dd  dg| f  |D ]>}|d |kr|d |kr|s|d |d }}||dd  dg| f  |d  d  ||d    |d  7  < qttdgd dgd  g d!d }d"d t|D }|r||fS |r
g d#}d$d% d$d%  fd&d%d'd% d$d% g}ng d(}d)d% d)d%  fd*d%d+d% g}t||||fS |r+|S |ra|rFg d,} fd-d%d.d% d/d% d.d% g}nJg d0}d1d% d2d% d2d%  fd3d%d4d% d2d% g}n/|rvg d5} fd6d%d7d% d8d% g}ng d9}d:d% d;d% d;d%  fd<d%d=d% d>d% g}t|||S )?u   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__ltr1   moisFin__maxr0   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 = %sa(  SELECT req.nom, req.prenom, req.colleur_id, req.etab, req.grade, req.matiere_nom, req.classe_id, req.classe_nom, req.annee, req.mois, req.heures FROM ({}) as req                ORDER BY req.nom, req.prenom, req.annee, req.matiere_nom, req.classe_nom, req.etab, req.grade, req.mois, req.colleur_idzwSELECT * 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.nom, req.prenom, req.colleur_id, req.etab, req.grade, req.matiere_nom, req.classe_id, req.classe_nom, req.annee, SUM(req.heures) heures FROM ({}) as req                GROUP BY req.nom, req.prenom, req.annee, req.matiere_nom, req.classe_nom, req.classe_id, req.etab, req.grade, req.colleur_id                ORDER BY req.nom, req.prenom, req.annee, req.matiere_nom, req.classe_nom, req.etab, req.grade, req.colleur_ida  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#   r4   r5   c                 S      g | ]}t |qS r   int.0valuer   r   r   
<listcomp>       z6RamassageManager.decompteRamassage.<locals>.<listcomp>r   c              	      R   i | ]%}|j  td |j  kodkn  dtd|jk   d|j  d  qS rU   r#   r4   r5   r3   rX   rS   anneerZ   classeeffectif_classer   r   
<dictcomp>      R z6RamassageManager.decompteRamassage.<locals>.<dictcomp>   	   zeff<20u   20≤eff≤35zeff>35c                 S      g | ]
\}}|d ur|qS Fr   rZ   xbooleanr   r   r   r\          )r   r   r   r5   r4   c                 S      | S Nr   tr   r   r   <lambda>       z4RamassageManager.decompteRamassage.<locals>.<lambda>c                        | d  fS Nr   r   ro   LISTE_GRADESr   r   rv          c                 S      d | d  | d  fS N{} {}r   r   r   titleupperrz   r   r   r   rv          )r   r   r   r6   c                 S   rr   rs   r   rt   r   r   r   rv      rw   c                    rx   ry   r   rz   r{   r   r   rv      r}   c                 S   $   d | d  | d  | d fS Nr   r   r   r5   r   rz   r   r   r   rv         $ )   r   r5   r4   c                    .   d | d  | d  | d  | d  fS Nr   r   r   r5   r6   r   rz   r{   r   r   rv         . c                 S   rr   rs   r   rt   r   r   r   rv      rw   c                 S   
   | d fS Nr   r   rz   r   r   r   rv         
 )r5   r   r   r   r5   r4   c                 S   r   r   r   rz   r   r   r   rv      r   c                 S   rr   rs   r   rt   r   r   r   rv      rw   c                    rx   ry   r   rz   r{   r   r   rv      r}   c                 S   r~   r   r   rz   r   r   r   rv      r   )r   r   r6   c                    r   r   r   rz   r{   r   r   rv      r   c                 S   rr   rs   r   rt   r   r   r   rv      rw   c                 S   s   | d | d fS )Nr   r5   r   rz   r   r   r   rv      s    )r5   r   r   r   r6   c                 S   r   r   r   rz   r   r   r   rv      r   c                 S   rr   rs   r   rt   r   r   r   rv      rw   c                    rx   ry   r   rz   r{   r   r   rv      r}   c                 S   r   r   r   rz   r   r   r   rv      r   c                 S   s   | d S ry   r   rt   r   r   r   rv      s    )r?   r$   r<   r1   r=   r%   r   r>   r3   r   r   r@   rA   rF   r   annotater	   rX   rS   ra   sumrangeappendlistzipr   )rH   rI   csv	parClasseparMoisfullcolleur
parColleurr-   ramassage_precedentramassage_precedent_pkrJ   r@   	decomptesclassesrc   nb_decomptejieffectifs_classe
decomptes2lastMatierelastColleurlastMoisligne	effectifsprofondeursfuncsr   r|   re   r   decompteRamassageA   s   #$
4

D("0(""(&( ".,z"RamassageManager.decompteRamassagec              
      s@  g d t tjj||fdjtddddddd	d
dddddd	jtdd}t	jjt
dd}dgd |D ]#}dtd|j  koJdkn  dtd|jk   d|j  d < q;tdd D }d}tdD ]}| r|||< |d7 }qnfdd|D }	g }
|r|d d |d d }}|
|d dd dg| f  |D ]:}|d |kr|d |kr|s|d |d }}|
|dd dg| f  |
d d |	|d    |d 7  < qg d }d!d" d#d"  fd$d"d%d" g}t|
||}t tdgd dgd  g d&d }d'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 classerO   )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;   rQ   rR   FrT   TrU   r#   r4   r5   c                 S   rV   r   rW   rY   r   r   r   r\      r]   z-RamassageManager.decompte.<locals>.<listcomp>r   r   c              	      r^   r_   r`   rb   rd   r   r   rf      rg   z-RamassageManager.decompte.<locals>.<dictcomp>Nrj   r   )r   r   r   r   c                 S   rr   rs   r   rt   r   r   r   rv      rw   z+RamassageManager.decompte.<locals>.<lambda>c                 S   s   | d d u r	dgS | S )Nr   Inconnur   rt   r   r   r   rv      s    c                    s    | d  gS ry   r   rt   r{   r   r   rv      r}   c                 S   r   )Nr   r   r   r6   r   rt   r   r   r   rv      r   rk   c                 S   rl   rm   r   rn   r   r   r   r\      rq   )r   r   r$   r<   r   r   values_listorder_byr
   r   r	   rX   rS   ra   r   r   r   r   r   )rH   r*   r+   r   r   rc   r   r   r   r   r   r   r   r   r   r   listeDecompter   r   r   r   decompte   s:   N
D"& &zRamassageManager.decompteN)TTFFFF)__name__
__module____qualname__rL   r   r   r   r   r   r   r.   "   s
    
 r.   c                   @   s<   e Zd ZejddddZejddZe Z	G dd dZ
dS )	r?   u   Jusqu'à (inclus)TF)verbose_nameuniqueblank)auto_nowc                   @   s   e Zd ZdgZdS )zRamassage.Metar1   N)r   r   r   orderingr   r   r   r   Meta   s    
r   N)r   r   r   r   	DateFieldr1   DateTimeFieldr   r.   r$   r   r   r   r   r   r?      s
    r?   c                   @   sz   e Zd ZejdejddZejdejddZejdejddZ	eje
ejddZejddZejddZG dd	 d	Zd
S )rD   ColleurF)	on_deletenullMatierer   r   )defaultc                   @   s   e Zd ZdZdS )zDecompte.Meta)r   rc   matiererI   r-   N)r   r   r   unique_togetherr   r   r   r   r      s    r   N)r   r   r   r   
ForeignKeyCASCADEr   PROTECTr   rc   r?   rI   IntegerFieldr;   PositiveSmallIntegerFieldr-   r   r   r   r   r   rD      s    rD   N) 	django.dbr   r   r   django.httpr   datetimer   r   django.db.models.functionsr   django.db.modelsr	   r
   r   r   noter   r   rc   r   semainer   ecolle.settingsr   r   r-   Managerr.   Modelr?   rD   r   r   r   r   <module>   s    	 ?