TIF_E41253310/Backend/app/routers/import_data.py

100 lines
3.2 KiB
Python

"""
Router untuk Import Data Alumni dari CSV/Excel
Mendukung semua kolom tracer study 2019-2025
File ini adalah router utama yang mendelegasikan ke import_service.py
"""
from fastapi import APIRouter, UploadFile, File, HTTPException, Depends, Form
from sqlalchemy.orm import Session
from sqlalchemy import func
from app.config.database import get_db
from app.services.import_service import import_data
from app.models.alumni import Alumni
from app.models.models import TracerResponse, Kompetensi, Pekerjaan
router = APIRouter(prefix="", tags=["Import Data"])
@router.post("/import-full")
async def import_full(
tahun: str = Form(...),
file: UploadFile = File(...),
db: Session = Depends(get_db)
):
"""
Import CSV dengan SEMUA kolom tracer study.
Data akan disimpan ke tabel: alumni, pekerjaan, kompetensi, tracer_responses
"""
try:
content = await file.read()
result = import_data(tahun, content, file.filename, db)
if result["status"] == "error":
raise HTTPException(status_code=400, detail=result["message"])
return result
except HTTPException:
raise
except Exception as e:
db.rollback()
import traceback
print(f"Import error: {traceback.format_exc()}")
raise HTTPException(status_code=400, detail=f"Error: {str(e)}")
@router.get("/stats")
async def get_import_stats(db: Session = Depends(get_db)):
"""Ambil statistik data alumni di database"""
total_alumni = db.query(Alumni).count()
total_pekerjaan = db.query(Pekerjaan).count()
total_kompetensi = db.query(Kompetensi).count()
total_tracer = db.query(TracerResponse).count()
prodi_stats = db.query(
Alumni.kode_prodi,
func.count(Alumni.id).label('count')
).group_by(Alumni.kode_prodi).all()
tahun_stats = db.query(
Alumni.tahun_lulus,
func.count(Alumni.id).label('count')
).group_by(Alumni.tahun_lulus).order_by(Alumni.tahun_lulus.desc()).all()
return {
"total_alumni": total_alumni,
"total_pekerjaan": total_pekerjaan,
"total_kompetensi": total_kompetensi,
"total_tracer_responses": total_tracer,
"by_prodi": [{"prodi": p, "count": c} for p, c in prodi_stats],
"by_tahun": [{"tahun": t, "count": c} for t, c in tahun_stats]
}
@router.get("/template")
async def download_template():
"""Download template CSV untuk import data"""
import csv
from fastapi.responses import StreamingResponse
import io
template_data = [
["nimhsmsmh", "nmmhsmsmh", "kdpstmsmh", "tahun_lulus", "F8", "F5b", "F5c", "F1101", "F5a1", "F5a2", "F1761", "F1763", "F1765", "F1767", "F1769", "F1771", "F1773"],
["A001", "Nama Alumni 1", "57401", "2024", "1", "PT ABC", "Software Engineer", "3", "Jawa Timur", "Jember", "4", "4", "3", "4", "4", "4", "3"],
["A002", "Nama Alumni 2", "56401", "2024", "2", "", "", "", "", "", "3", "3", "3", "3", "3", "3", "3"]
]
output = io.StringIO()
writer = csv.writer(output, delimiter=';')
for row in template_data:
writer.writerow(row)
output.seek(0)
return StreamingResponse(
output,
media_type='text/csv',
headers={'Content-Disposition': 'attachment; filename=template_import_alumni.csv'}
)