
    }i"                        d dl mZmZmZmZ d dlmZ d dl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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 d dlm Z m!Z! de	e"   dedefdZ# eddg      Z$dedefdZ% G d de      Z& G d de      Z'e$jQ                  d       edd       ee       ee       fde	e"   ded efd!       Z)e$jQ                  d"       ee       ee       fd#e*ded efd$       Z+e$jY                  d"       ee       ee       fd#e*d%e'ded efd&       Z-e$jQ                  d'       ed(       ed(       ed       ee       ee!      fd)e*d*e*d+e	e*   ded,ef
d-       Z.y).    )	APIRouterDependsHTTPExceptionQuery)Session)ListOptional)date	timedelta)	BaseModel)get_db)
Attendance)
Assignment)MassSchedule)MassTemplate)Asim)User)SystemSetting)get_current_userrequire_pengurus	test_datedbreturnc                     | ri|j                  t              j                  t        j                  dk(        j	                         }|r$|j
                  dk(  rt        j                  |       S t        j                         S )zCIn development mode, allow test_date override. Otherwise use today.development_modetrue)	queryr   filterkeyfirstvaluer
   fromisoformattoday)r   r   devs      7/var/www/html/asim.com/backend/app/routes/attendance.py_resolve_todayr&      s^    hh}%,,]->->BT-TU[[]399&%%i00::<    z/api/attendancer   )prefixtagsdc                 H    | t        | j                         dz
  dz        z
  S )zWeek starts on Saturday.      days)r   weekday)r*   s    r%   get_week_startr1      s!    yqyy{Q!3444r'   c                   "    e Zd ZU eed<   eed<   y)AttendanceRecordasim_idstatusN)__name__
__module____qualname__int__annotations__str r'   r%   r3   r3   !   s    LKr'   r3   c                       e Zd ZU ee   ed<   y)AttendanceSubmitrecordsN)r6   r7   r8   r   r3   r:   r<   r'   r%   r>   r>   &   s    "##r'   r>   z/my-schedulesNz%Dev only: override today (YYYY-MM-DD))descriptioncurrent_userc                 b   |j                   st        dd      |j                   j                  }t        | |      }t	        |      }|t        d      z   }|j                  t              j                  t              j                  t        j                  |k(  t        j                  dk(  t        j                  |k\  t        j                  |k  t        j                  dk(        j                         }g }|D ]  }	|	j                   }
|j                  t"              j                  t"        j                  |
j$                  k(        j'                         }|j                  t              j                  t        j(                  |
j                  k(  t        j                  j+                  d            j                         }|D cg c]  }|j                   }}|j                  t,              j                  t,        j                  j/                  |            j                         D 	ci c]  }	|	j                  |	 }}	|j                  t0              j                  t0        j(                  |
j                  k(        j                         }|D ci c]  }|j                  |j2                   }}g }|D ]  }|j5                  |j                        }|s!|j7                  |j                  |j8                  |j:                  |j                  |j<                  |j5                  |j                        d	        |j7                  |
j                  |
j                  j?                         |r|j@                  nd
|r|jB                  nd
|tE        |      dkD  d        |S c c}w c c}	w c c}w )z9Get this week's schedules where the logged-in ASIM is PJ.  !Akun tidak terhubung ke data ASIMstatus_codedetail   r.   PJTN)r4   no_asim	full_nameposition_type_codeposition_numberr5   -r   )schedule_idr
   timelabelmembers	submitted)#asimr   idr&   r1   r   r   r   joinr   r   r4   rL   r
   is_publishedallscheduler   template_idr    rO   isnotr   in_r   r5   getappendrJ   rK   rM   	isoformatrP   namelen)r   r   rA   r4   r#   
week_startweek_endpj_assignmentsresultarY   templateall_assignmentsxasim_idsasimsexistingrattendance_maprR   assignasim_objs                         r%   get_my_pj_schedulesrq   *   s    4WXX""G9b)E&JI1--H 		l		')))T1+)%%-

 
  F::88L)00HDXDX1XY__a HHZ V&&(++5""((. SU 	 (77!AII7"$((4."7"7H8M"N"R"R"TU"TQq"TU 88J'..z/E/E/TUYY[7?@x!!))QXX-x@%Fyy0HNN#;;#++%//&,&?&?#)#9#9(,,X[[9 	 & 	#;;MM++-%-HMM3&.X]]C^,q0
 	I Z M= 8U As   N"*N'N,z/{schedule_id}rO   c           
         |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  t              j                  t        j                  | k(        j                         }|D cg c]  }|j                   }}|j                  t              j                  t        j                  j                  |            j                         D ci c]  }|j                  | }}|D cg c]  }|j                  |j                  |j                  |v r||j                     j                  nd|j                  |v r||j                     j                  nd|j                  |j                  r|j                  j!                         ndd c}S c c}w c c}w c c}w )z/Get attendance records for a specific schedule.i  zJadwal tidak ditemukanrE   NrN   )rU   r4   rJ   rK   r5   recorded_at)r   r   r   rU   r    r   r   rO   rX   r4   r   r\   rJ   rK   r5   rs   r_   )	rO   r   rA   rY   r?   rm   rj   rf   rk   s	            r%   get_attendancert   x   sl    xx%,,\__-KLRRTH4LMMhhz"))**@*@K*OPTTVG#*+7a		7H+ hhtn33DGGKK4IJNNPQPQTT1WPEQ 
 A $$yy34993EuQYY'//478yyE7Iqyy)33shh891==2244	
 
 
 ,Q
s   F? GB"G	bodyc                    |j                   st        dd      |j                  t              j	                  t        j
                  | k(  t        j                  |j                   j                  k(  t        j                  dk(        j                         }|s|j                  dvrt        dd      |j                  D ]*  }|j                  dvst        dd	|j                          |j                  D ]  }|j                  t              j	                  t        j
                  | k(  t        j                  |j                  k(        j                         }|r#|j                  |_        |j                  |_        t        | |j                  |j                  |j                  
      }|j                  |        	 |j!                          ddiS # t"        $ r |j%                          t        dd      w xY w)zPSubmit or update attendance for a schedule. Only PJ of that schedule can submit.rC   rD   rE   rI   )pengurussuper_adminz"Hanya PJ yang bisa mengisi absensi)hadirtidak_hadiri  zStatus tidak valid: )rO   r4   r5   recorded_by_idi  zGagal menyimpan absensimessagezAbsensi berhasil disimpan)rT   r   r   r   r   rO   r4   rU   rL   r    roler?   r5   r   r{   addcommit	Exceptionrollback)rO   ru   r   rA   pj_checkrecrl   new_recs           r%   submit_attendancer      s    4WXX 		""k1,"3"3"6"66))T1


 
  ))1LL4XYY ||::55C:Nszzl8[\\ 
 ||HHZ V&&+5""ckk1 UW 	 !jjHO&2ooH# 'zz+	G FF7O' *O
		
 233	  O
4MNNOs   ?G 'G:z/report/list.monthyearr4   _c                 x   ddl m} |j                  t              j	                  t
        t        j                  t
        j                  k(        j                   |dt
        j                        | k(   |dt
        j                        |k(        }|r"|j                  t        j                  |k(        }|j                         }t        |D ch c]  }|j                   c}      }	t        |D ch c]  }|j                   c}      }
|j                  t
              j                  t
        j                  j                  |	            j                         D ci c]  }|j                  | }}|j                  t              j                  t        j                  j                  |
            j                         D ci c]  }|j                  | }}|j                         D cg c]  }|j                   s|j                    }}|j                  t"              j                  t"        j                  j                  |            j                         D ci c]  }|j                  | }}g }|D ]"  }|j%                  |j                        }|j%                  |j                        }|r'|j                   r|j%                  |j                         nd}|j'                  |j                  |j                  |r|j                  j)                         nd|r|j*                  nd|r|j,                  nd|j                  |r|j.                  nd|r|j0                  nd|j2                  |j4                  r|j4                  j)                         ndd
       % |S c c}w c c}w c c}w c c}w c c}w c c}w )zDAdmin report: attendance by month/year, optionally filtered by ASIM.r   )extractr   r   NrN   )
rU   rO   r
   rP   rQ   r4   rJ   rK   r5   rs   )
sqlalchemyr   r   r   rV   r   rO   rU   r   r
   r4   rX   listr\   r   valuesrZ   r   r]   r^   r_   rP   r`   rJ   rK   r5   rs   )r   r   r4   r   r   r   r   r?   rm   schedule_idsrj   s	schedulesrf   rk   template_idst	templatesre   rT   tmpls                        r%   get_attendance_reportr      s    # 		lJ22looE	F	G\../58FL--.$6

 
 Z//7:;iikG 8189L01QYY01H"$((<"8"?"?@S@ST`@a"b"f"f"hi"hQq"hIi hhtn33DGGKK4IJNNPQPQTT1WPEQ+4+;+;+=O+=aAMM+=LO"$((<"8"?"?@S@ST`@a"b"f"f"hi"hQq"hIiFMM!--(yy#/0Q]]y}}Q]]+$$==*+AFF$$&!%DII3"&TYYCyy'+t||+/Shh891==2244
 		 " M5 90iQOis*   N/N#N(N-)N2;N2N7)/fastapir   r   r   r   sqlalchemy.ormr   typingr   r	   datetimer
   r   pydanticr   app.databaser   app.models.attendancer   app.models.assignmentr   app.models.mass_scheduler   app.models.mass_templater   app.models.asimr   app.models.userr   app.models.system_settingr   app.core.securityr   r   r;   r&   routerr1   r3   r>   r]   rq   r9   rt   postr   r   r<   r'   r%   <module>r      s   < < " ! $   , , 1 1     3 @hsm  T  
+<.	A5d 5t 5
y 
$y $ O$T7^_&/ !12J}JJ J JZ  &/ !12  6  &/ !12	8484
84 	84 	84 84v Nsc
"4[&/&'33
3 c]3 		3
 3 3r'   