o
    9\ÖhˆI  ã                   @   sÖ   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	 d dl
mZ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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! G dd„ dƒZ"dS )é    )ÚAsyncSession)ÚMember)ÚModule)ÚProject)ÚHrmsEmployeeProfile)ÚTaskÚTaskAssignedMember)ÚTaskCreateRequestÚTaskUpdateRequestÚProjectModelMemeberTaskResponseÚ
TaskStatus)ÚHTTPExceptionÚstatus)ÚOptional)ÚselectÚupdateÚfuncÚcaseÚand_)ÚdatetimeÚtimezone)Ú
joinedload)Úselectinloadc                
   @   sæ   e Zd Zdeddfdd„Zdededefdd	„Zd
ede	e fdd„Z
d
edededefdd„Zd
ededB fdd„Zdee fdd„Zdd„ Zdd„ Zdd„ Zdedee fdd„Zd de	e de	e de	e dee fdd„ZdS )!ÚTaskRepoÚsessionÚreturnNc                 C   s
   || _ d S ©N)r   )Úselfr   © r   ú6/var/www/html/pro-man-master/src/repo/task/TaskRepo.pyÚ__init__   s   
zTaskRepo.__init__Ú	task_dataÚuser_idc           
   
   Ã   s
  z_|j dhdd}td	i |¤Ž}||_| j |¡ | j ¡ I d H  |jD ]}t|j|j	||d}| j |¡ q%| j 
¡ I d H  | j ttƒ ttjƒ¡ tj|jk¡¡I d H }| ¡  ¡ }|W S  ty„ }	 z| j ¡ I d H  td|	› ƒ tdd|	› d‚d }	~	ww )
NÚassigned_membersT©ÚexcludeÚexclude_unset)Útask_idÚhrms_user_idÚ
created_byÚ
updated_byzError during task creation: iô  z(An error occurred during task creation: ©Ústatus_codeÚdetailr   )Ú
model_dumpr   r)   r   ÚaddÚflushr#   r   Úidr(   ÚcommitÚexecuter   Úoptionsr   ÚwhereÚscalarsÚfirstÚ	ExceptionÚrollbackÚprintr   )
r   r!   r"   Ú	task_dictÚrecordÚmember_dataÚmember_recordÚeagerly_loaded_recordÚfinal_recordÚer   r   r   Úcreate   s@   €
ü
ýþ€üzTaskRepo.creater1   c                 Ã   ó@   t tƒ ttjƒ¡ tj|k¡}| j |¡I d H }| 	¡  
¡ S r   ©r   r   r4   r   r#   r5   r1   r   r3   r6   r7   ©r   r1   ÚstmtÚresultr   r   r   Úfind_with_members>   ó   €ýzTaskRepo.find_with_membersÚupdate_datac              
   Ã   sª  z®|   |¡I d H }|d u rtdd|› d‚|jdhdd}||d< t tj¡|d< | ¡ D ]
\}}t|||ƒ q/|j	d urzt
tƒ tj|k¡ tjdk¡jd	t tj¡|d
}| j |¡I d H  |j	D ]}	t|j|	j|	j||d}
| j |
¡ qe| j ¡ I d H  | j ttƒ ttj	ƒ¡ tj|k¡¡I d H }| ¡  ¡ }|r­|j	r­dd„ |j	D ƒ|_	|W S  tyÔ } z| j ¡ I d H  td|› ƒ ttj d|› d‚d }~ww )Ni”  zRecord not found for id r+   r#   Tr$   r*   Ú
updated_atF)Ú	is_activerK   r*   )r'   r(   rL   r)   r*   c                 S   s   g | ]}|j r|‘qS r   )rL   )Ú.0Úmemberr   r   r   Ú
<listcomp>y   s
    ÿÿz#TaskRepo.update.<locals>.<listcomp>zError during task update: z&An error occurred during task update: )!rH   r   r.   r   Únowr   ÚutcÚitemsÚsetattrr#   r   r   r5   r'   rL   Úvaluesr   r3   r1   r(   r/   r2   r   r   r4   r   r6   r7   r8   r9   r:   r   ÚHTTP_500_INTERNAL_SERVER_ERROR)r   r1   rJ   r"   r<   Útask_updatesÚkeyÚvaluerF   r=   r>   r@   rA   r   r   r   r   G   s`   €
ýÿ
û
ý
ÿþ€ýzTaskRepo.updatec                 Ã   rC   r   rD   rE   r   r   r   Úfind‡   rI   zTaskRepo.findc                 Ã   s8   t tƒ ttjƒ¡}| j |¡I d H }| ¡  ¡  	¡ S r   )
r   r   r4   r   r#   r   r3   r6   ÚuniqueÚall)r   rF   rG   r   r   r   ÚreadAll   s   €zTaskRepo.readAllc           
      Ã   sª   t t ¡ ƒ tjdk¡}|}| tjtjk¡}| tjtj	k¡}| tjtj
k¡}| j |¡I d H }| j |¡I d H }| j |¡I d H }| j |¡I d H }	||||	dœS )NT)Ú
Total_TaskÚ	CompletedÚ
InProgressÚNew)r   r   ÚcountÚfilterr   rL   r   r   Ú	COMPLETEDÚ
INPROGRESSÚNEWr   Úscalar)
r   Ú
base_queryÚtotal_queryÚcompleted_queryÚinprogress_queryÚ	new_queryÚtotalÚ	completedÚ
inprogressÚnewr   r   r   Úget_task_counts•   s   €üzTaskRepo.get_task_countsc                 Ã   s$  t tj d¡t t tjd¡d t tj	d¡ ¡ d¡t 
ttjdkdfƒ¡ d¡t 
ttjtjkdfƒ¡ d¡t 
ttjtjkdfƒ¡ d	¡t 
ttjtjkdfƒ¡ d
¡ƒ ttjtjk¡ ttjtjk¡ tjdktjdk@ ¡ tjtjtj	¡}| j |¡I d H }| ¡  ¡ }dd„ |D ƒS )Nr(   Ú Ú Ú	full_nameTé   rl   rm   rn   ro   c              	   S   ó6   g | ]}|d  |d |d |d |d |d dœ‘qS )r(   rs   rl   rm   rn   ro   )r(   rs   r]   r^   r_   r`   r   ©rM   Úrowr   r   r   rO   Ä   ó    	ùúÿz6TaskRepo.get_user_wise_task_counts.<locals>.<listcomp>)r   r   r(   Úlabelr   ÚtrimÚcoalescer   Ú
first_nameÚ	last_namera   r   r   rL   r   r   rc   rd   re   Újoinr'   r1   r"   r5   Úgroup_byr   r3   Úmappingsr[   ©r   Ú	statementÚresult_simplerG   r   r   r   Úget_user_wise_task_counts«   s4   €
ÿþ÷
ÿð	÷z"TaskRepo.get_user_wise_task_countsc                 Ã   s  t tj d¡tj d¡t ttj	dkdfƒ¡ d¡t ttj
tjkdfƒ¡ d¡t ttj
tjkdfƒ¡ d¡t ttj
tjkdfƒ¡ d¡ƒ ttjtjk¡ ttjtjk¡ ttjtjk¡ tj	dktj	dk@ ¡ tjtj¡}| j |¡I d H }| ¡  ¡ }d	d
„ |D ƒS )NÚ
project_idÚproject_nameTrt   rl   rm   rn   ro   c              	   S   ru   )r…   r†   rl   rm   rn   ro   )r…   r†   r]   r^   r_   r`   r   rv   r   r   r   rO   æ   rx   z9TaskRepo.get_project_wise_task_counts.<locals>.<listcomp>)r   r   r1   ry   Únamer   ra   r   r   rL   r   r   rc   rd   re   r~   r   Ú	module_idr…   r   r'   r5   r   r   r3   r€   r[   r   r   r   r   Úget_project_wise_task_countsÐ   s,   €

ú
ÿò	÷z%TaskRepo.get_project_wise_task_countsr…   c                 Ã   sd  t tj d¡tj d¡tj d¡tj d¡tj d¡tj d¡tj d¡tj	 d¡tj
 d	¡tj d
¡tj d¡tj d¡tj d¡t t tjd¡d t tjd¡ ¡ d¡ƒ ttjtjk¡ ttjtjk¡ ttjtjk¡ ttjtjk¡ tj|ktjdk@ tjdk@ ¡ tjtj¡}| j |¡I d H }| ¡   ¡ }|s¥ddiS ||d d g dœ}i }|D ]b}|d }||vrÇ||d i dœ||< |d d u rÎq³|d }	|	|| d vr÷|	|d |d |d |d	 |d
 |d g dœ|| d |	< |d d ur|| d |	 d  !|d |d |d dœ¡ q³| "¡ D ]}
t#|
d  "¡ ƒ|
d< qt#| "¡ ƒ|d< |S )Nr…   r†   rˆ   Úmodule_namer'   Ú	task_nameÚtask_descriptionÚtask_priorityÚtask_statusÚtask_start_dateÚtask_end_dateÚam_idÚ
am_user_idrq   rr   Úam_nameTÚmessagez'No data found for the given project ID.r   ©r…   r†   Úmodules©rˆ   rŠ   Útasksr˜   ©r'   r‹   rŒ   r   rŽ   r   r   r#   r#   ©r‘   r’   r“   r–   )$r   r   r1   ry   r‡   r   Útitler   ÚdescriptionÚpriorityr   Ú
start_dateÚend_dater   r(   r   rz   r{   r   r|   r}   r~   r…   rˆ   r'   r"   r5   rL   Úorder_byr   r3   r€   r[   ÚappendrT   Úlist)r   r…   rF   rG   ÚrowsÚproject_datar–   ÚrÚm_idÚt_idÚmodr   r   r   Útask_list_by_projectò   s’   €












ÿþï
ÿþã 
ý
ýøý€zTaskRepo.task_list_by_projectrŽ   c                 Ã   sì  t tj d¡tj d¡tj d¡tj d¡tj d¡tj d¡tj d¡tj	 d¡tj
 d	¡tj d
¡tj d¡tj d¡tj d¡t t tjd¡d t tjd¡ ¡ d¡ƒ ttjtjk¡ ttjtjk¡ ttjtjk¡ ttjtjk¡ tj d¡tj d¡¡ tjtjtj¡}|d urš| tj|k¡}|d ur¦| tj|k¡}|d ur²| tj
|k¡}| j |¡I d H }|  ¡  !¡ }|sÅg S ||d d g dœ}i }|D ]v}	|	d }
|
|vrç|
|	d i dœ||
< |	d }||
 d }||vrÿ||	d i dœ||< |	d d u rqÓ|	d }|| d }||vr/||	d |	d |	d |	d	 |	d
 |	d g dœ||< |	d d urI|| d  "|	d |	d |	d dœ¡ qÓ| #¡ D ]!}|d  #¡ D ]}t$|d  #¡ ƒ|d< qVt$|d  #¡ ƒ|d< qNt$| #¡ ƒS )Nr…   r†   rˆ   rŠ   r'   r‹   rŒ   r   rŽ   r   r   r‘   r’   rq   rr   r“   Tr   r•   r–   r—   r˜   r™   r#   rš   )%r   r   r1   ry   r‡   r   r›   r   rœ   r   r   rž   rŸ   r   r(   r   rz   r{   r   r|   r}   r~   r…   rˆ   r'   r"   r5   rL   Úis_r    r   r3   r€   r[   r¡   rT   r¢   )r   r…   r"   rŽ   rF   rG   r£   r¤   Úprojectsr¥   Úp_idr¦   r–   r§   r˜   Úprojr¨   r   r   r   Útask_status_genericN  s®   €












ÿþï

þã!
ý
ý
ý

øý€zTaskRepo.task_status_generic)NNN)Ú__name__Ú
__module__Ú__qualname__r   r    r	   Úintr   rB   r   rH   r
   r   rY   r¢   r\   rp   r„   r‰   r   r©   Ústrr®   r   r   r   r   r      s    +	@	%"0\r   N)#Úsqlalchemy.ext.asyncior   Úsrc.models.member.modelsr   Úsrc.models.module.modelsr   Úsrc.models.project.modelsr   Úsrc.models.users.modelsr   Úsrc.models.task.modelsr   r   Úsrc.request.task.TaskRequestr	   r
   r   r   Úfastapir   r   Útypingr   Ú
sqlalchemyr   r   r   r   r   r   r   Úsqlalchemy.ormr   r   r   r   r   r   r   Ú<module>   s    