65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
from fastapi import (
|
|
APIRouter,
|
|
Depends,
|
|
Security,
|
|
)
|
|
from sqlalchemy import distinct, func, over, desc
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ..models import Attendance
|
|
from ..schemas.auth import UserToken
|
|
from ..core.security import get_current_active_user as get_user
|
|
from ..db.session import SessionLocal
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
# Dependency
|
|
def get_db() -> Session:
|
|
try:
|
|
db = SessionLocal()
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
@router.post("")
|
|
def post_check_db(db: Session = Depends(get_db), user: UserToken = Security(get_user)):
|
|
info = {}
|
|
|
|
duplicate_attendances = get_duplicate_attendances(db)
|
|
if duplicate_attendances > 0:
|
|
fix_duplicate_attendances(db)
|
|
info["Duplicate Attendances Fixed"] = duplicate_attendances
|
|
db.commit()
|
|
return info
|
|
|
|
|
|
def get_duplicate_attendances(db):
|
|
sub_query = (
|
|
db.query(
|
|
over(distinct(func.first_value(Attendance.id)), partition_by=[Attendance.employee_id, Attendance.date],)
|
|
)
|
|
.filter(Attendance.is_valid == True)
|
|
.subquery()
|
|
)
|
|
query = (
|
|
db.query(func.count(Attendance.id)).filter(~Attendance.id.in_(sub_query)).filter(Attendance.is_valid == True)
|
|
)
|
|
return query.scalar()
|
|
|
|
|
|
def fix_duplicate_attendances(db):
|
|
sub = (
|
|
db.query(
|
|
over(
|
|
distinct(func.first_value(Attendance.id)),
|
|
partition_by=[Attendance.employee_id, Attendance.date],
|
|
order_by=desc(Attendance.creation_date),
|
|
)
|
|
)
|
|
.filter(Attendance.is_valid == True)
|
|
.subquery()
|
|
)
|
|
db.query(Attendance).filter(~Attendance.id.in_(sub)).filter(Attendance.is_valid == True).delete(False)
|