2020-10-07 15:18:43 +00:00
|
|
|
from fastapi import APIRouter, Depends, Security
|
|
|
|
from sqlalchemy import desc, distinct, func, over
|
2020-05-22 04:40:45 +00:00
|
|
|
from sqlalchemy.orm import Session
|
2015-01-09 07:01:08 +00:00
|
|
|
|
2020-05-22 04:40:45 +00:00
|
|
|
from ..core.security import get_current_active_user as get_user
|
|
|
|
from ..db.session import SessionLocal
|
2020-10-07 15:18:43 +00:00
|
|
|
from ..models import Attendance
|
|
|
|
from ..schemas.auth import UserToken
|
|
|
|
|
2015-01-09 07:01:08 +00:00
|
|
|
|
2020-05-22 04:40:45 +00:00
|
|
|
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)):
|
2015-01-09 07:01:08 +00:00
|
|
|
info = {}
|
|
|
|
|
2020-05-22 04:40:45 +00:00
|
|
|
duplicate_attendances = get_duplicate_attendances(db)
|
2015-01-09 07:01:08 +00:00
|
|
|
if duplicate_attendances > 0:
|
2020-05-22 04:40:45 +00:00
|
|
|
fix_duplicate_attendances(db)
|
2019-04-06 04:13:12 +00:00
|
|
|
info["Duplicate Attendances Fixed"] = duplicate_attendances
|
2020-05-22 04:40:45 +00:00
|
|
|
db.commit()
|
2015-01-09 07:01:08 +00:00
|
|
|
return info
|
|
|
|
|
|
|
|
|
2020-05-22 04:40:45 +00:00
|
|
|
def get_duplicate_attendances(db):
|
2019-04-06 04:13:12 +00:00
|
|
|
sub_query = (
|
2020-05-22 04:40:45 +00:00
|
|
|
db.query(
|
2020-10-07 15:18:43 +00:00
|
|
|
over(
|
|
|
|
distinct(func.first_value(Attendance.id)),
|
|
|
|
partition_by=[Attendance.employee_id, Attendance.date],
|
|
|
|
)
|
2019-04-06 04:13:12 +00:00
|
|
|
)
|
|
|
|
.filter(Attendance.is_valid == True)
|
|
|
|
.subquery()
|
|
|
|
)
|
|
|
|
query = (
|
2020-10-07 16:59:24 +00:00
|
|
|
db.query(func.count(Attendance.id))
|
|
|
|
.filter(~Attendance.id.in_(sub_query))
|
|
|
|
.filter(Attendance.is_valid == True)
|
2019-04-06 04:13:12 +00:00
|
|
|
)
|
2015-01-09 07:01:08 +00:00
|
|
|
return query.scalar()
|
|
|
|
|
|
|
|
|
2020-05-22 04:40:45 +00:00
|
|
|
def fix_duplicate_attendances(db):
|
2019-04-06 04:13:12 +00:00
|
|
|
sub = (
|
2020-05-22 04:40:45 +00:00
|
|
|
db.query(
|
2019-04-06 04:13:12 +00:00
|
|
|
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()
|
|
|
|
)
|
2020-10-07 16:59:24 +00:00
|
|
|
db.query(Attendance).filter(~Attendance.id.in_(sub)).filter(
|
|
|
|
Attendance.is_valid == True
|
|
|
|
).delete(False)
|