
    Jj%              
          d Z ddlZdZdZdZg dZg dZd Zd3d	Zd
 Z	d Z
efdZd3dZd Zd Zd Zd3dZd Zd Zd ZefdZd3dZd Zedk    rej        Z ed            e e
d                                                    D ]D\  ZZ ede                                dee                                          dde           E ed            eddd           eddd          d d!f eddd"           eddd          d#d$f eddd%           eddd&          d#d'f eddd(           eddd&          d"d)f eddd*           eddd+          d d,fgZ!e!D ]-\  Z"Z#Z$Z% ee"e#          Z& ed-e%e$e&e&e$k    rd.nd/fz             . ed0           d1D ]=Z' ede'          Z( ed2e'e(                                 ede'          fz             <dS dS )4u5  
PLANNING TEAM - calendrier reel.

Fait le pont entre le cycle abstrait (S1 / S2) et les vraies semaines datees.
Regle d'ancrage : S1 = semaines ISO impaires, S2 = semaines paires. Elle vient du
desiderata de Gwendoline, qui travaille « les samedis des semaines impaires ».

Les jours feries sont calcules, jamais saisis : onze jours, dont trois dependent de
Paques. Ils comptent dans le decompte des conges payes (un CP pose sur un ferie ne se
decompte pas) - verifie sur août 2026, ou « du 10 au 15/08 » vaut 5 jours et non 6,
le samedi 15 aout etant ferie.
    N)  i  r   $   )lundimardimercredijeudivendredisamedidimanche))	Toussaintz
2026-10-18z
2026-11-01)   Noëlz
2026-12-20z
2027-01-03)Hiverz
2027-02-14z
2027-02-28)	Printempsz
2027-04-11z
2027-04-25)u   Pont de l’Ascensionz
2027-05-06z
2027-05-09)u   Étéz
2027-07-04z
2027-08-31c                  $    d t           D             S )z8Les periodes de vacances scolaires, sous forme de dates.c                     g | ]F\  }}}|t           j                            |          t           j                            |          d GS ))nomdebutfin)datetimedatefromisoformat).0r   r   r   s       (/opt/planning-team/travail/calendrier.py
<listcomp>z&vacances_scolaires.<locals>.<listcomp>/   s`     4 4 4  UC m11%88M//446 6 4 4 4    )VACANCES_ZONE_A r   r   vacances_scolairesr   -   s%    4 4 $34 4 4 4r   c                 x    |pt                      D ](}|d         | cxk    r|d         k    rn |d         c S )dS )zELe nom de la periode de vacances scolaires couvrant ce jour, ou None.r   r   r   N)r   )jourperiodesps      r   vacances_ler#   5   s^    .,..  W:))))5)))))U8OOO *4r   c                    | dz  }t          | d          \  }}t          |d          \  }}|dz   dz  }||z
  dz   dz  }d|z  |z   |z
  |z
  dz   d	z  }t          |d          \  }	}
d
d|z  z   d|	z  z   |z
  |
z
  dz  }|d|z  z   d|z  z   dz  }t          ||z   d|z  z
  dz   d          \  }}t          j        | ||dz             S )zMDimanche de Paques (algorithme de Meeus/Jones/Butcher, calendrier gregorien).   d                                        i  r      )divmodr   r   )anneeabcdefghiklmmoisr    s                  r   paquesrD   =   s    
A%DAq!Q<<DAq	
Q2A	
QqA	a!a!	b	 B&A!Q<<DAq	a!ea!e	a	!	#q(A	
R!Vb1f	$AAA+R00JD$=dQh///r   c                    t          |           }t          j        | dd          d|t          j        d          z   dt          j        | dd          dt          j        | dd          d|t          j        d          z   d	|t          j        d
          z   dt          j        | dd          dt          j        | dd          dt          j        | dd          dt          j        | dd          dt          j        | dd          di}|S )zD{ date : nom } des onze jours feries francais (hors Alsace-Moselle).r*   u   Jour de l’anu   Lundi de Pâques   u   Fête du Travailr(   zVictoire 1945'   	Ascension2   u   Lundi de Pentecôter0      u   Fête nationaler,   
Assomptionr1   r   zArmistice 1918   r)   r   )rD   r   r   	timedelta)r6   r"   jourss      r   feriesrO   L   s    uAeQ""&7	Hq!!!&;eQ""&;eQ""&6	Hr"""l	Hr"""&>eQ##&:eQ##meR##leR$$&7eR$$jE Lr   c                 X    i }| D ]$}|                     t          |                     %|S N)updaterO   )anneesresultatr6   s      r   tous_les_feriesrU   _   s6    H ' 'u&&&&Or   c                 .    |t                      n|}| |v S rQ   )rU   )r    caches     r   	est_ferierX   f   s     !&OEE5=r   c                     |dz  rdndS )z6S1 pour les semaines ISO impaires, S2 pour les paires.r/   r*   r   	annee_iso
numero_isos     r   semaine_cycler]   k   s    Q%11A%r   c                 D    t           j                            | |d          S )z"Le lundi de la semaine ISO donnee.r*   )r   r   fromisocalendarrZ   s     r   lundi_der`   p   s    =((JBBBr   c                 *    | |ft           t          fk     S )z7Cette semaine precede-t-elle le demarrage du planning ?)DEBUT_ANNEEDEBUT_SEMAINErZ   s     r   avant_le_debutrd   u   s    z"k=%AAAr   c                     | pt           j                                        }t          |          \  }}t	          ||          rt
          t          fS ||fS )z
    La semaine a ouvrir quand on arrive sur l'outil : la semaine en cours, sans jamais
    remonter avant le demarrage du planning.
    )r   r   today
semaine_derd   rb   rc   )
aujourdhuir    r[   numeros       r   semaine_par_defautrj   z   sV    
 .,,..D"4((Ivi(( *M))fr   c                 :    |                                  \  }}}||fS )z#(annee ISO, numero ISO) d'une date.)isocalendar)r    r7   n_s       r   rg   rg      s"      GAq!a4Kr   c                    t          | |          }t          t          |j        dz
  |j        dz                       }t	                      }g }t          d          D ]u}|t          j        |          z   }|                    |                                |dz   t          |         |
                    |          t          ||          d           v|S )z
    Les six jours ouvrables (lundi -> samedi) d'une semaine ISO, avec leur statut.
    Le dimanche est ignore : l'officine n'ouvre pas.
    r*   r/      )r   r    r   ferievacances)r`   rU   rangeyearr   r   rM   append	isoformatJOURSgetr#   )r[   r\   r   rW   r!   rT   r?   r    s           r   jours_de_la_semainery      s    
 Y
++EE%*q.%*q.AABBE!##HH1XX  x)!,,,NN$$E8YYt__#D(33
 
 	 	 	 	 Or   c                 ~   t          j        | |d          }|dk    rt          j        | dd          }n.t          j        | |dz   d          t          j        d          z
  }t          t	          | dz
  | dz                       }t                      }|t          j        |                                          z
  }g }||k    rt          |          \  }}	g }
t	          d          D ]}|t          j        |          z   }|
                    |	                                |j
        |j        |k    |                                dk    |                    |          t          ||          d           |                    ||	t          ||	          |
d           |t          j        d          z  }||k    | ||d	S )
z
    Un mois pour la vue calendrier : toutes ses semaines ISO, chaque jour avec son
    statut (ferie, vacances scolaires) et le rang du cycle.
    r*   rL   r4   r/   r0   rp   )r   ri   dans_le_moisr   rq   rr   )r6   ri   cyclerN   )r6   rC   semaines)r   r   rM   rU   rs   r   weekdayrg   ru   rv   daymonthrx   r#   r]   )r6   numero_moispremierdernierrW   r!   r   semaines_moisr[   ri   rN   r?   r    s                r   rC   rC      s   
 mE;22Gb-r2..-{Q::X=OPQ=R=RRE%!)UQY7788E!##Hh():):;;;EM
7

&u--	6q 		 		A8-a000DLL((( $
k 9 LLNNa/4'h77      	yF'4Y'G'G',. . 	/ 	/ 	/ 	#A&&&! 7

" K]KKKr   c                 .   g }| D ]}d}	 	 t          ||          }n# t          $ r Y nlw xY w|                    ||t          ||          |                                |t          j        d          z                                   d           |dz  }|S )z;Toutes les semaines ISO des annees couvertes, dans l'ordre.r*   TrF   )r6   ri   r|   r   r
   )r`   
ValueErrorru   r]   rv   r   rM   )rS   rT   r6   ri   r   s        r   r}   r}      s    H  	 //   OO &uf55** 8#5a#8#88CCEE     aKF	  Os   
))c                    |-t          t          | j        dz
  |j        dz                       n|}g | }}||k    rN|                                dk     r||vr|                    |           |t          j        d          z  }||k    N|S )z
    Les jours ouvrables d'une periode, au sens du decompte des conges payes :
    du lundi au samedi, jours feries exclus. Renvoie la liste des dates.
    Nr*   r/   rp   )rU   rs   rt   r~   ru   r   rM   )r   r   rW   rT   r    s        r   jours_ouvrablesr      s    
 EJMOE%*q.#(Q,??@@@W\EdH
#++<<>>A$e"3"3OOD!!!"1%%% #++ Or   c                 <    t          t          | |                    S rQ   )lenr   )r   r   s     r   compter_ouvrablesr      s    uc**+++r   __main__u   Jours fériés 2026z  10 uM   
Décompte des congés payés, contrôlé sur la fiche navette d’août 2026r(   r+   rp   u   Élodie, du 03 au 08/08r'   rF   zSariaka, du 04 au 08/08
   r,   u*   Élodie, du 10 au 15/08 (15 août férié)r1   u   Marie-Cécile, du 11 au 15/08   r2   zdu 17 au 22/08u#     %-45s attendu %d, calculé %d  %sokECHECz
Ancrage du cycle)r   %   &   rG   z  semaine %d : lundi %s -> S%drQ   ))__doc__r   ANNEESrb   rc   rw   r   r   r#   rD   rO   rU   rX   r]   r`   rd   rj   rg   ry   rC   r}   r   r   __name__r   r:   printsorteditemsr    r   rv   r~   	controlesr   r   attendulibelleobtenuri   r   r   r   r   <module>r      s    	 QQQ  4 4 4   0 0 0  & "       
& & &
C C C
B B B
	 	 	 	    *!L !L !LH     *   , , , zA 
E
$%%%VFF4LL..0011 R R	c4>>#3#3#3#3U4<<>>5J5J5J5JCCPQQQQ 
E
ghhh	
4A4A,HI	
4A4A,FG	
4B4B,ab	
4B4B,NO	
4B4B,=>I )2 V V$sGW""5#..6'6Fg4E4E558TU 	V 	V 	V 	V 
E
   " J Jv&&/**MM$,G,GHI 	J 	J 	J 	J5 0J Jr   