B
    IÌÚbÑ  ã               @   sp   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZ d dlmZ dZdZG dd„ deƒZdS )	é    N)Ú
itemgetter)Ú
C_ATT_RULEÚC_ATT_SHIFTÚC_DEPT_ATT_RULEÚC_TIME_INTERVALÚ	C_HOLIDAY)ÚEmployeeé   é   c               @   sð   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zedd„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9S ):ÚAttendanceCalculatec             C   s¬  d| _ || _|| _|| _g | _g | _g | _g | _i | _|| _	|
| _
|| _|  ¡ | _|| _|  ¡ | _|  ¡ | _d | j dd¡¡| _d | j dd¡¡| _d | j dd¡¡| _d | j d	d
¡¡| _d | j dd¡¡| _d | j dd¡¡| _t| j dd¡ƒ| _|  |¡| _|  |¡| _yt j!j|dj"| _"W n t#k
rH   Y nX t$ƒ | _%|  &¡ | _'dd„ t( )|t*dƒ¡D ƒ| _+|| _,|  -¡ | _.|	| _/|  0¡ | _1|  2¡ | _3|| _4dS )zpublic dataNz{0}Úcheck_inÚ0Ú	check_outÚ1Ú	break_outÚ2Úbreak_inÚ3Zovertime_inÚ4Zovertime_outÚ5Úpunch_periodé   )Úpkc             S   s   i | ]\}}t |ƒ|“qS © )Úlist)Ú.0ÚkeyÚitemsr   r   ú2G:\easytimepro\master/mysite/att\calc\calculate.pyú
<dictcomp>;   s    z0AttendanceCalculate.__init__.<locals>.<dictcomp>Úatt_date)5ÚpreÚ
company_idÚ
start_dateÚend_dateÚtransactionsZtransactions_indexÚcalculate_resultZcalculate_result_with_indexÚshift_weekendZoriginal_transactionsÚall_shift_detailÚemployeeÚget_employee_resign_dateÚresign_dateÚ
departmentÚget_att_ruleÚatt_ruleÚget_company_idÚformatÚgetÚcheck_in_typeÚcheck_out_typeÚbreak_out_typeÚbreak_in_typeZovertime_in_typeZovertime_out_typeÚintÚrule_periodÚget_period_leavesÚemployee_leavesÚget_period_otsÚemployee_otsr   Úall_objectsÚenable_holidayÚ	ExceptionÚsetÚholiday_dateÚget_employee_holidaysÚemployee_holidaysÚ	itertoolsÚgroupbyr   ÚpayloadÚ	schedulesÚget_timeintervalsÚtimeintervalsÚtemporary_schedulesÚget_temporary_timeintervalsÚtemporary_timeintervalsÚget_employee_timeintervalsÚemployee_timeintervalsZemployee_trainings)Úselfr)   r"   r#   r$   r,   ÚleavesZ	trainingsrF   Ztemp_schedulesr(   r%   Úotsr   r   r   Ú__init__   sN    







zAttendanceCalculate.__init__c             C   s,   t jj| jd}t|dƒr"|jjS | j ¡ S )N)r   Úresign)	r   r<   r1   r)   ÚhasattrrR   r+   r$   Údate)rN   Zemployee_infor   r   r   r*   D   s    
z,AttendanceCalculate.get_employee_resign_datec             C   s:   t  | j¡}t | j¡}| | j|¡}d|kr6d|d< |S )NZhalf_day_worki  )r   r1   r"   r   r,   )rN   Zglobal_ruleZ
dept_rulesr.   r   r   r   r-   J   s    z AttendanceCalculate.get_att_rulec             C   s&   ddl m} |jj| jdj}t|ƒS )u›   
        æš‚æ—¶å…ˆé€šè¿‡ormèŽ·å–ï¼ŒåŽç»­å¯ä»¥æ›´æ”¹ä¸ºåƒdepartmentä¸€æ ·ï¼Œåœ¨å®žä¾‹åŒ–å‰ç”¨sqlèŽ·å–company_id å†ä¼ è¿›æ¥
        :return:
        r   )Ú
Department)Úid)Úmysite.personnel.modelsrU   Úobjectsr1   r,   r"   Ústr)rN   rU   r"   r   r   r   r/   S   s    z"AttendanceCalculate.get_company_idc             C   s   g }|| j kr| j | }|S )N)r(   )rN   Úshift_idÚshift_detailr   r   r   Úget_shift_detail\   s    

z$AttendanceCalculate.get_shift_detailc       	      C   s°   t ||  jdƒ}d\}}|dkr>d}d}||d | d  }nN|dkr`| ¡ }|d d }d}n,|dkrŒ|jd }d}t |j| j | dƒ}|| }||| | |  }||fS )Nr   )r   r   r   é   r	   é   )ÚmaxÚdaysÚweekdayZdayÚmonth)	Zschedule_startr#   ÚcycleÚunitr`   ZbeginZ	unit_daysra   Z
cycle_daysr   r   r   Úget_start_and_intervalb   s"    
z*AttendanceCalculate.get_start_and_intervalc       
      C   sV   d}|rRxH|D ]@}|d |d  }}t ||ƒt||ƒ  ¡ }	t ||	ƒ}	||	7 }qW |S )Nr   Ú
start_timeÚend_time)Úminr_   Útotal_seconds)
rN   rO   r   r   ÚdurationÚ	sum_leaveÚlÚstartÚendZ	_durationr   r   r   Úleave_interval_handlerv   s    

z*AttendanceCalculate.leave_interval_handlerc          
   C   s  t |ƒdk r|S g }xÊ|D ]À}t |¡}|d r<|d n| j}t | j¡}x2| ¡ D ]&\}}	d| _tt|  	|¡|	ƒƒ||< qXW ||d< |d }
t
j
 ||d ¡}|t
j|
d }||d< ||d	< |  |¡}|  ||||
¡}|t
j| d
¡d }|t
j| d¡d }|t
j| d¡d }|t
j| d¡d }g }| ¡ }x6|| ¡ krx| | |g ¡¡ |t
jdd7 }qDW |  ||d |||| jdf¡}|r°|d }d|d< nd}g }| ¡ }x6|| ¡ krö| | |g ¡¡ |t
jdd7 }qÂW |  ||d |||| jdf¡}|r&|d }nd}d}|rV|rVt|d |d   ¡ dƒ}nF|rz|szt||d   ¡ dƒ}n"|sœ|rœt|d |  ¡ dƒ}tt|o¨|ƒƒ}t || ƒ}| |rÌ||
 nd||||dœ¡ qW t|tddddƒd}|d gS )zŠ
        Leave > Total time > Time cards
        :param current_day:
        :param daily_tbs: Daily time tables
        :return:
        r	   Úperiod_typeÚperiodNr    rj   r   )Úminutesr   Úin_aheadÚin_aboveÚ	out_aheadÚ	out_abover   )r`   Úfunc_keyÚIr   ÚusedÚOéÿÿÿÿÚ
punch_time)ÚleaveÚ	work_timeÚ
pair_matchÚmatch_countÚtbr}   r   r€   r~   )r   r   )ÚlenÚcopyÚdeepcopyr7   rE   r   r!   r   ÚfilterÚtransaction_only_period_filterÚdatetimeÚcombineÚ	timedeltaÚget_daily_leavesro   r1   rT   ÚextendÚtransaction_filtersr2   r3   r_   ri   r6   ÚboolÚappendr   )rN   Úcurrent_dayÚ	daily_tbsZcompare_itemsr   Ú_tbr   rE   r   Úvaluerj   r   r   rO   rk   Úin_startÚin_endÚ	out_startÚout_endÚin_transactionsrm   Úclock_inÚout_transactionsÚ	clock_outr~   r   r€   Úitemr   r   r   Úauto_shift_filter€   sr    



z%AttendanceCalculate.auto_shift_filterc          !   C   sô   g }d}|r|| j  di ¡pi }t|ƒdkr:|d | j|< ndddddœ| j|< yd|d  ¡ krddnd}W n   d}Y nX |sŠ|| jks’|dkrìd |d d dt dd¡ddddddddt dd¡ddddddddddddddddd d	œ g}n|}|S )
NFÚweekendr   r   )ZpolicyZlv1Zlv2Zlv3Útime_interval_idTr   ) rZ   Ú	day_indexrž   Ztime_interval__aliasZtime_interval__work_dayr   rj   Úcategoryrs   rt   ru   rv   Zduty_durationÚday_offÚchange_timeZ
allow_lateZallow_earlyZrequires_inZrequires_outZearly_inZmin_early_inZlate_outZmin_late_outZot_lvZot_lv1Zot_lv2Zot_lv3Úmultiple_punchrw   rp   rq   Z
break_time)r.   r1   r‚   r'   Úkeysr@   r‡   Útime)rN   r   r   Ú	cur_indexZunschedule_tbZtime_table_checkr   r   r   r   Úunscheduled_days_tbsÄ   s0    



z(AttendanceCalculate.unscheduled_days_tbsc             C   s–  ddl m} ddlm} g }xr| jD ]f}t|d | j ¡ gƒ}|  |d ||d |d ¡\}}|  	|d ¡}t
|d | j ¡ gƒ}	|d	 }
d
d„ |||dƒdD ƒ}xâ||	krŒ| |g ¡}|
rÒ|  ||¡}|rè|rö|d  d¡rö|  |||¡}x|D ]}t |¡}tj ||d ¡}|tj|d d }|tj| d¡d }|tj| d¡d }|tj| d¡d }|tj| d¡d }|| j}|}| ¡ |d   krÄt ddd¡krØn n|tjdd7 }| |dd|||||||dœ
¡ | |¡ qþW |j}|tjdd7 }|d dkr~|j|kr~|d | dkr~|d|d d  k r~|dkrv|d|  }n|d }|d | }q¬W q&W |S )zGet time intervalsr   )rD   )r   r#   rc   rd   rZ   r$   Ú
auto_shiftc             S   s   i | ]\}}t |ƒ|“qS r   )r   )r   r   r   r   r   r   r   í   s    z9AttendanceCalculate.get_timeintervals.<locals>.<dictcomp>rŸ   )r   Zweekend_dayr   rj   )rr   rs   rt   ru   rv   r¢   r   )r`   r	   )
r    Úsch_typeÚpriorityr   r   Ú
cross_daysr“   r”   r•   r–   é   )rC   rD   Úoperatorr   rF   r_   r#   rT   re   r\   rh   r$   r1   rœ   r§   rƒ   r„   r‡   rˆ   r‰   Úpopr`   r¥   ÚupdaterŽ   rb   )rN   rD   r   ÚtbsZscheduler   r¦   Z	cycle_lenr[   r$   r¨   Zdaily_shiftr   r   r‘   r   r   r“   r”   r•   r–   r«   r    Zcurrent_monthr   r   r   rG   á   sX    

.(
z%AttendanceCalculate.get_timeintervalsc             C   sX  g }xL| j D ]@}|d }|d }| ¡ | jkr4q||krL|tjdd7 }| ¡ }| ¡ |d   krzt ddd¡krŽn n|tjdd7 }|| j}t |¡}| 	||||ddœ¡ |d	 dkr$| 	|tj| 
d
¡d |tj| 
d¡d |tj| 
d¡d |tj| 
d¡d dœ¡ n"|d	 dkrF| 	||||dœ¡ | |¡ qW |S )zGet temporary timeintervalsrf   rg   r   )r`   r¢   r   r	   )r    r   r   r«   r©   r    rs   )rr   rt   ru   rv   )r“   r”   r•   r–   )rI   rT   r+   r‡   r‰   r¥   r`   rƒ   r„   r¯   r®   rŽ   )rN   r°   r   r   r   r    r«   r‘   r   r   r   rJ     s<    *



z/AttendanceCalculate.get_temporary_timeintervalsc             C   s>   t ƒ }| jr| | j¡ | jr*| | j¡ |jtdƒd |S )Nr   )r   )r   rH   r‹   rK   Úsortr   )rN   rM   r   r   r   rL   9  s    z.AttendanceCalculate.get_employee_timeintervalsc             C   s²   | j rªt | j¡}| di ¡}tjj| jdj}|rL| |ji ¡}| 	|¡ xX| 
¡ D ]L\}}| dd¡}| d¡}x,t|ƒD ] }	|tj|	d }
| j |
¡ q~W qVW |S i S d S )Nr   )rV   Zduration_dayr#   )r`   )r=   r   r1   r"   r   rX   r)   ÚlocationrV   r¯   r   Úranger‡   r‰   r@   Úadd)rN   Zall_holidaysÚholidaysr²   Zlocation_holidaysÚkÚvZduration_daysr#   Úir@   r   r   r   rA   B  s    

z)AttendanceCalculate.get_employee_holidaysc             C   sž   |si S g }xr|D ]j}|d   ¡ }xX||d   ¡ krzt |¡}| ||d |d   ¡ dœ¡ | |¡ |tjdd7 }q$W qW dd„ t 	|t
dƒ¡D ƒ}|S )	Nrf   rg   )rT   rj   r   )r`   c             S   s   i | ]\}}t |ƒ|“qS r   )r   )r   r   r   r   r   r   r   b  s    z9AttendanceCalculate.get_period_leaves.<locals>.<dictcomp>rT   )rT   rƒ   r„   r¯   ri   rŽ   r‡   r‰   rC   rD   r   )rN   rO   Údaily_leavesr›   Z_startZ_itemZperiod_leavesr   r   r   r8   W  s    

 
z%AttendanceCalculate.get_period_leavesc             C   s&   |si S dd„ t  |tdƒ¡D ƒ}|S )Nc             S   s   i | ]\}}t |ƒ|“qS r   )r   )r   r   r   r   r   r   r   h  s    z6AttendanceCalculate.get_period_ots.<locals>.<dictcomp>rT   )rC   rD   r   )rN   rP   Ú	daily_otsr   r   r   r:   e  s    z"AttendanceCalculate.get_period_otsc             C   sˆ   |r„t tdd„ |ƒƒ}xb|D ]Z}tj |d |d ¡}||d k rR|tjdd }|tj|d d	 }| ||d
œ¡ qW t |¡S d S )Nc             S   s   | d d k	S )NZdeduct_ruler   )Úbr   r   r   Ú<lambda>m  ó    z9AttendanceCalculate.get_break_intervals.<locals>.<lambda>r    Zbreak_startr   r   )r`   Zmargin)rr   )r   r   )r   r…   r‡   rˆ   r‰   r¯   rƒ   r„   )rN   r   Úbreak_intervalsÚintervalr   r   r   r   r   Úget_break_intervalsk  s    

z'AttendanceCalculate.get_break_intervalsc                s®   g }x†| j  ¡ D ]x}ˆ d  ¡ |  kr8ˆ d  ¡ krn qxJ| j | D ]<}d}x"|D ]}|d |d krVd}P qVW |rzqH| |¡ qHW qW |rªtt‡ fdd„|ƒƒ}|S d S )Nr   r   FrV   Tc                s$   t ˆ d | d ƒtˆ d | d ƒk S )Nr   rf   r   rg   )r_   rh   )rl   )r   r   r   r¼   …  r½   z6AttendanceCalculate.get_daily_leaves.<locals>.<lambda>)r9   r¤   rT   rŽ   r   r…   )rN   r   r¹   r¶   rl   Zleave_existr}   Z_leavesr   )r   r   rŠ   w  s"    (
z$AttendanceCalculate.get_daily_leavesc                s®   g }x†| j  ¡ D ]x}ˆ d  ¡ |  kr8ˆ d  ¡ krn qxJ| j | D ]<}d}x"|D ]}|d |d krVd}P qVW |rzqH| |¡ qHW qW |rªtt‡ fdd„|ƒƒ}|S d S )Nr   r   FrV   Tc                s$   t ˆ d | d ƒtˆ d | d ƒk S )Nr“   rf   r–   rg   )r_   rh   )rl   )r   r   r   r¼   ™  r½   z3AttendanceCalculate.get_daily_ots.<locals>.<lambda>)r;   r¤   rT   rŽ   r   r…   )rN   r   rº   r¶   ÚoZot_existZotZ_otsr   )r   r   Úget_daily_otsŠ  s"    (
z!AttendanceCalculate.get_daily_otsc                s^  ddl m} | j}| j}d}g }| j}i }| |¡ || jƒ}xtj|t	dƒdD ]ú\}	}
dd„ |
D ƒ}|j
t	dd	ƒd |d d ‰ tt‡ fd
d„|ƒƒ}d}x¨|D ]ž}|rÜt|d	 |d	 ƒt|d |d ƒk rÜq¬|r"t|d	 |d	 ƒt|d |d ƒk r"|d dksq¬| |¡ | |d d¡}|  ||¡|d< |  |¡|d< |  |¡|d< |d dkr|d dkrˆ|d dks| |d d¡|d< |r¼| t|d  ¡ ƒd¡p¾d|d< |d sî|ræ| |d d¡pèd|d< |d rd|d< n|d r.d|d< nd|d< d|d< d|d< | |¡ |}|d dkr¬|}q¬W qTW || _dS )zTimeintervals Filterr   )Úget_timetable_breakNr    )r   c             S   s   g | ]}|‘qS r   r   )r   Úxr   r   r   ú
<listcomp>ª  s    z<AttendanceCalculate.timeintervals_filter.<locals>.<listcomp>rª   r   c                s   | d ˆ kS )Nrª   r   )Úy)rª   r   r   r¼   ­  r½   z:AttendanceCalculate.timeintervals_filter.<locals>.<lambda>r   r©   r   rž   Úbreak_intervalrO   rP   r	   Zholidayr   r
   r¡   r«   )Zmysite.att.calc.utilsrÃ   rM   rB   r'   r¯   r"   rC   rD   r   r±   r   r…   r_   rh   Úremover1   rÀ   rŠ   rÂ   rY   ra   rŽ   )rN   rÃ   Zall_timeintervalsrµ   r!   Z	valid_tbsr'   r   Ztime_table_break_intervalsr   r   Z
_daily_tbsZpre_tbr   r¾   r   )rª   r   Útimeintervals_filterž  sV    

 (,
*(
 




z(AttendanceCalculate.timeintervals_filterc                s   ‡ ‡fdd„}|S )Nc                s2   ˆj r$| d ˆj   ¡ ˆ d k r$dS | d ˆ_ dS )Nr|   é<   FT)r!   ri   )rÄ   )rq   rN   r   r   ÚwarpÑ  s     
z@AttendanceCalculate.transaction_only_period_filter.<locals>.warpr   )rN   rq   rË   r   )rq   rN   r   r†   Ð  s    z2AttendanceCalculate.transaction_only_period_filterc                s    d‰ ‡ ‡‡‡‡‡‡fdd„}|S )N)r   r   c                s~   | d rdS ˆr | d ˆkr dS | d ˆ kr0dS | d ˆk sH| d ˆkrLdS ˆj rp| d ˆj   ¡ ˆd k rpdS | d ˆ_ dS )Nry   FÚpunch_stateTr|   rÊ   )r!   ri   )rÄ   )Úbreak_time_statesrn   Úfuncrq   rN   rm   Ústater   r   rË   Ü  s     
z4AttendanceCalculate.transaction_filter.<locals>.warpr   )rN   rÎ   rm   rn   rq   rÏ   rË   r   )rÍ   rn   rÎ   rq   rN   rm   rÏ   r   Útransaction_filterÙ  s    z&AttendanceCalculate.transaction_filterc          	   C   s&   d | _ tt|  |||||¡|ƒƒ}|S )N)r!   r   r…   rÐ   )rN   r%   rÎ   rm   rn   rq   rÏ   r   r   r   rŒ   í  s    z'AttendanceCalculate.transaction_filtersc                s   ‡ ‡‡‡‡‡fdd„}|S )Nc                sn   | d rdS ˆr | d ˆkr dS | d ˆk s8| d ˆ kr<dS ˆj r`| d ˆj   ¡ ˆd k r`dS | d ˆ_ dS )Nry   FrÌ   r|   rÊ   T)r!   ri   )rÄ   )rn   rÎ   rq   rN   rm   rÏ   r   r   rË   ô  s     
z=AttendanceCalculate.flexible_transaction_filter.<locals>.warpr   )rN   rÎ   rm   rn   rq   rÏ   rË   r   )rn   rÎ   rq   rN   rm   rÏ   r   Úflexible_transaction_filterò  s    z/AttendanceCalculate.flexible_transaction_filterc          	   C   s&   d | _ tt|  |||||¡|ƒƒ}|S )N)r!   r   r…   rÑ   )rN   r%   rÎ   rm   rn   rq   rÏ   r   r   r   Úflexible_transaction_filters  s    z0AttendanceCalculate.flexible_transaction_filtersc          	   C   s  |d r|d n| j }|d  ¡ }g }| j ¡ }x2| ¡ D ]&\}}d | _tt|  |¡|ƒƒ||< q:W x6||d  ¡ krš| 	| 
|g ¡¡ |tjdd7 }qfW |  ||d |d |d || jdf¡}|rØ|d	 }d|d
< nd }|d r:xP|d D ]B}	|	d r
|	d n| j }
| j ¡ }x0| ¡ D ]$\}}d | _t|  |
¡|ƒ||< q$W |	d  ¡ }g }x:||	d  ¡ kr–| 	| 
|g ¡¡ |tjdd7 }q^W |  |d|	d |	d |
d ¡}g }|	d |	d  }}|rTd  }}|rÂxÈ|D ]À}|d | jfkr>|r| ||d	dœ¡ n|r0| ||d	dœ¡ d }|}d|d
< nd|d | jfkrä|r„| ||d	dœ¡ d  }}| ||d	dœ¡ n| ||d	dœ¡ d }d|d
< qäW |rR| |d d	dœ¡ nxR|D ]J}|d | jfkrò|sò|}d|d
< n|d | jfkrÈ|}d|d
< qÈW d	}|r@|r@t|d |d   ¡ d	ƒ}| |||dœ¡ nÔd  }}|r¶x8|D ]0}|sx|}n| ||d	dœ¡ d }d|d
< qhW |r(| |d d	dœ¡ nrx4|D ],}|d dkr¼|sÚ|}n|}d|d
< q¼W d	}|r|rt|d |d   ¡ d	ƒ}| |||dœ¡ |	 d|i¡ qòW |d  ¡ }g }x:||d  ¡ kr„| 	| 
|g ¡¡ |tjdd7 }qLW |  ||d |d |d || jdf¡}|rÄ|d }d|d
< nd }d	}|rò|ròt|d |d   ¡ d	ƒ}|||dœ|d< |S )Nrp   rq   r“   r”   r   )r`   rw   rx   r   ry   rÇ   r   r   FZ
break_funcZ	mul_punchrÌ   )rš   r˜   rj   r|   )r   r   Ú
time_cardsr•   r–   rz   r{   )r˜   rš   rj   )r7   rT   rE   rƒ   r   r!   r   r…   r†   r‹   r1   r‡   r‰   rŒ   r2   r4   rŽ   r5   r_   ri   r¯   r3   )rN   r‘   r   r“   r—   rE   r   r’   r˜   ZbiZbreak_punch_periodZbreak_payloadr   Zbreak_transactionsrÓ   Úfunc_key_basedr£   Z
_break_outZ	_break_inÚpunchrj   r•   r™   rš   r   r   r   Ú)normal_time_table_transactions_collection  sÌ    










z=AttendanceCalculate.normal_time_table_transactions_collectionc             C   s  |d r|d n| j }| j ¡ }x2| ¡ D ]&\}}d | _tt|  |¡|ƒƒ||< q*W |d  ¡ }g }x6||d  ¡ krš| 	| 
|g ¡¡ |tjdd7 }qfW |  |d|d |d |d ¡}|d |d	  }}	|rg }
|rBd  }}|	r¼x¸|D ]°}|d
 | jdfkrB|r |
 ||ddœ¡ n|r<|
 ||ddœ¡ d }|}qî|d
 | jdfkrî|rˆ|
 ||ddœ¡ d  }}|
 ||ddœ¡ qî|
 ||ddœ¡ d }qîW |r@|
 |d ddœ¡ n„xF|D ]>}|d
 | jdfkræ|sþ|}n|d
 | jdfkrÂ|}qÂW d}|r.|r.t|d |d   ¡ dƒ}|
 |||dœ¡ n¶d  }}|	rœx0|D ](}|sf|}n|
 ||ddœ¡ d }qVW |rø|
 |d ddœ¡ n\x|D ]}|s²|}n|}q¢W d}|ræ|ræt|d |d   ¡ dƒ}|
 |||dœ¡ |
|d< nd |d< |S )Nrp   rq   r“   r”   r   )r`   Frw   r£   rÌ   rx   r   )r˜   rš   rj   rz   r|   rÓ   )r7   rE   rƒ   r   r!   r   r…   r†   rT   r‹   r1   r‡   r‰   rÒ   r2   rŽ   r3   r_   ri   )rN   r   r   rE   r   r’   r“   r%   rÔ   r£   rÓ   r˜   rš   rÕ   rj   r   r   r   Ú+flexible_time_table_transactions_collection|  s‚    








z?AttendanceCalculate.flexible_time_table_transactions_collectionc             C   sh   g }xXt | jƒD ]J\}}t |¡}|d dkr:|  |¡}n|d dkrP|  |¡}| |¡ qW || _d S )Nr    r   r   )Ú	enumeraterM   rƒ   r„   rÖ   r×   rŽ   r&   )rN   ÚresultÚindexr   r‘   r   r   r   Úattendance_calculateÇ  s    

z(AttendanceCalculate.attendance_calculatec             C   s   |   ¡  |  ¡  | jS )z	
        )rÉ   rÛ   r&   )rN   r   r   r   Ú	calculateÒ  s    zAttendanceCalculate.calculateN) Ú__name__Ú
__module__Ú__qualname__rQ   r*   r-   r/   r\   Ústaticmethodre   ro   rœ   r§   rG   rJ   rL   rA   r8   r:   rÀ   rŠ   rÂ   rÉ   r†   rÐ   rŒ   rÑ   rÒ   rÖ   r×   rÛ   rÜ   r   r   r   r   r      s8   ,		
D2&	2	tKr   )r¥   r‡   rƒ   rC   r­   r   Zmysite.att.global_cacher   r   r   r   r   rW   r   ZWEEKENDZHOLIDAYÚobjectr   r   r   r   r   Ú<module>   s   