B
    b3                 @   s  d dl Z d dlZd dlmZ d dlmZ d dlmZ d dl	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
lmZmZ dedfdedfdedfdedfdedfdedfdedfdedfdedfdedff
Zdedfdedfdedfdedfdedfd edfgZdDd"d#Zd$d% Zd&d' Zg fd(d)Zg dfd*d+ZdEd-d.Zd/d0 ZdFd2d3Zd4d5d6gdfd7d8Z e!d9\Z"Z#Z$Z%Z&Z'e!d:\Z(Z)Z*Z+e#d;fd<d=Z,d>d? Z-d@dA Z.dBdC Z/dS )G    N)Q)gettext_lazy)STATUS_RESIGN)
Department)p_queryget_sql)settings)
C_ATT_RULE)Employee)ROUND_HALF_UPDecimalZemp_codeZreport_column_empCodeZ
first_nameZreport_column_firstName	last_nameZreport_column_lastNameZ	nick_nameZreport_column_nickNameZgenderZreport_column_genderZ	dept_codeZreport_column_departmentCodeZ	dept_nameZreport_column_departmentNameZposition_codeZreport_column_positionCodeZposition_nameZreport_column_positionNameZatt_dateZreport_column_attendanceDateZ
departmentZbasic_salarypk__inc             C   s   t |dkrtg }x0|r@|tf ||dd i |dd }qW |d }x|dd D ]}||O }qXW | |} n(|r| jf ||i} n| jf |dgi} | S )u!   超过一千个组织后的问题i  Ni  r      )lenappendr   filter)qsidsZ
field_nameZqueryZcombine_queryZqq r   ,G:\easytimepro\master/mysite/report_utils.py
get_max_in0   s    r   c       
      C   s   d}d}d}t | }|| dkr(|| p2|| d }xdt|D ]X}|d7 }| || |d |  }d|ddd |D f }	||	7 }||k r>|d	7 }q>W d
| d S )N i  r   r   z
%s in (%s),c             S   s   g | ]}t |qS r   )str).0ir   r   r   
<listcomp>M   s    z"contruct_where.<locals>.<listcomp>z or ())r   rangejoin)
ZempidsZcol_nameZs_wZcnttZlenstimesr   ZeulZo_wr   r   r   contruct_whereD   s     r$   c             C   sf   g }g }| | xNt|dkr`| }||kr:| | x"| D ]}|j|kr@| |j q@W qW |S )uP   堆栈方式递归，从depts中得到当前组织current_dept的所有父组织r   )r   r   popZ	parent_idpk)deptsZ
current_pkstorestackZpop_pkelemr   r   r   
get_childsT   s    



r+   c             C   s   g }xp|D ]h}|r
y0t |ts&t|}|| |t| | W q
 tk
rp } ztt| W dd}~X Y q
X q
W tt	|}|S )u#   从qs中查找pks的所有子记录N)

isinstanceintr   extendr+   	Exceptionprintr   listset)r   Zpksretr&   er   r   r   get_list_childrenc   s    


"r5   c             C   s   t j }t|| }|S )u0   从所有组织中得到depts_ids的子集组织)r   objectsallr5   )Z	depts_idsrequestZqs_allr3   r   r   r   get_all_dept_from_alls   s    

r9   Fc             C   s"  t |jj tt |jjd}tjdkrtj	
 }g }t| dkrT| d}|r|rt||}t||d}dd |D }nt||d}dd |D }|rd	d |D S d
gS nhd| i}	i }
|rddi}
nddi}
tddd|	|
}|dkr|dt 7 }t|}|rdd |D S d
gS d S )N
filter_empZmysqlr   r   Zdepartment__inc             S   s   g | ]
}|j qS r   )r&   )r   r4   r   r   r   r      s    z*get_emps_by_deptidlist.<locals>.<listcomp>c             S   s   g | ]
}|j qS r   )r&   )r   r4   r   r   r   r      s    c             S   s   g | ]}|d krt |qS )r   )r   )r   r4   r   r   r   r      s    z-1deptlistchildZhaschildZnochildsqlget_emps_by_deptidlistZatt1z and userinfo.status != %sc             S   s   g | ]}d |d  qS )z%dr   r   )r   rr   r   r   r      s    )r	   action_initusercurrent_companyr   getr   ZDATABASE_ENGINEr
   r6   r7   r   splitr9   r   r   r   r   )r;   r<   r8   r:   empsdept_idr'   Z	user_listresZparamsZid_partr=   r   r   r   r>   |   s8    




r>   c             C   s   | j dd}| j dd}| j dd}g }|dkr:d}|dkrFd}|rNd}|rp|d	kr^d
p`d}t||| }nt|d}dd |D }|S )u   
            用来返回报表查询中选人控件选中了包含下级时的人员列表
    request 请求上下文
    return  返回所选择的对象id列表
    	employeesz-1departmentsr   
dept_child0	undefinedNr?   TFr   c             S   s   g | ]}|d krd| qS )r   z%sr   )r   usr   r   r   r      s    z#get_emps_by_req.<locals>.<listcomp>)datarD   r>   r   rE   )r8   ZuseridsZdeptidsrK   Zuid_listchZu_lr   r   r   get_emps_by_req   s     	rQ   Tc             C   s   yg }|rt | }n\|rl| jdd}|d}|dkr<d}|rp| jdd}|dkrf|rft|| }qp|}ng }| jd	d}| jd
d}d }	}
|rtj|d}	|r|d7 }tj|d}
||	|
fS  tk
r   t	  g ddfS X dS )u~   
    考勤计算报表请求数据处理
    @param re_uid: 是否返回用户id
    @param re_did: 是否返回部门id
    rJ   r   r   rM   NrK   rL   r?   Z
start_dateZend_datez%Y-%m-%dz	 23:59:59z%Y-%m-%d %H:%M:%S)
rQ   rO   rD   rE   r9   datetimestrptimer/   	traceback	print_exc)r8   re_uidre_didr   r'   rG   r<   stZetd1d2r   r   r   parse_grid_arg   s6    


r[   zu.idzu.department_idzu.statusc             C   sf  t | jj tt | jjd}t| ds>t| d| j | j	dd}|dkrXd}|rbd}n| j	dd}|dkr|d}d}|rt
| ddd	\}}}	|rt||d
 }n t
| \}}}	|rt||d }|r|dkrt|dkr|d|d tf 7 }|r$| r$| jjr$d|d | jj}n8|r\| r\| jjs\d}
|
r\|d|d | jj7 }|||	fS )u/   
        构造sql语句用于考勤报表
    r:   rO   rI   N)rM   z-1rJ   FT)rV   rW   r   r   r?      z and %s != %s z {0}={1}ak  
                and {0} in (
                    select personnel_employee_area.employee_id from personnel_employee_area
                    where personnel_employee_area.area_id in (
                        select auth_user_auth_area.area_id from auth_user_auth_area where auth_user_auth_area.myuser_id = {1}
                    )
                )
            )r	   rA   rB   rC   r   rD   hasattrsetattrZPOSTrO   r[   r$   r   r   Zis_employeeformatr&   Zis_superuser)r8   Z	conditionZis_attr:   rF   r'   Z	and_wherer   rY   rZ   Zauthorize_arear   r   r   construct_sql   s<    
r`         i  c       
      C   sz  d}| dkr| S | dkr| S | dkr(| S |dk r4d}|t kr@t}| dkrX|tkrXd}|S |tkrhd}|S |tkrvd}n6|tkr|tkr|}q|}n|tkrd}n|tkrd}t| } t|}|dkrt|}|tkr| | } |tkrt| | }nD|t	kr t| | }| || kr6|d7 }n|t
kr6t| | }|tkrJ|| }nt| d	 d	 }tt|}	t|	td
tS )u   
    请假值的处理
    MinUnit    最小值
    AttUnit    单位
    RemaindProc    舍入控制类型
    WorkdayFlag 是否为工作日
    minsworkday    时段分钟数之和
    r   nullr   g{Gz?r   iQ i  <   d   z0.0)auHMauMinuteauTimesauDay	auWorkDayauHourfloatrmTruncr-   rmUpTormRoundroundrmCountr   r   quantizer   )
ZValueZMinUnitZAttUnitZRemaindProcZWorkdayFlagZminsworkdayZResultZMinsUnitcr@   r   r   r   NormalAttValue*  s\    	




rt   c             C   sP   | rL|dkrLt tt| d d}t tt| d d}d||f } | S )Nrb   rd   r\   z%s:%s)r   r-   rl   zfill)valZunitZhoursZminutesr   r   r   leave_format_valuej  s
    rw   c             C   sp   |dkrd}| dkrd} t |tr,t|}nt|}t| } | | }|dkrPdS ttt|tdtS dS )u   
    汇总数据
    )Nr   rc   r   z0.0N)r,   r-   rl   r   r   rr   r   )Zdictvvalueresultr   r   r   	SaveValues  s    

rz   c             C   s<   | dks| dkr| S dt t| d t t| d f }|S )Nr   r   z%s:%.2drd   )r-   rl   )rx   r"   r   r   r   formatdTime  s    $r{   )r   )FN)TF)0rT   rR   Zdjango.db.modelsr   Zdjango.utils.translationr   _Zmysite.admin.modelsr   Zmysite.personnel.modelsr   Zmysite.sql_utilsr   r   mysiter   Zmysite.att.global_cacher	   r
   Zdecimalr   r   Zfixed_columnsZpayroll_fixed_columnsr   r$   r+   r5   r9   r>   rQ   r[   r`   r    ri   rk   rg   rj   rf   rh   rm   ro   rn   rq   rt   rw   rz   r{   r   r   r   r   <module>   sR   














	
- 
&7@	