This commit is contained in:
Randa Firman Putra
2025-09-16 14:22:37 +07:00
parent f2d15b38e3
commit 886fc59d28
17 changed files with 2386 additions and 30 deletions

View File

@@ -13,7 +13,9 @@ export async function GET(request: NextRequest) {
.from('mahasiswa')
.select(`
*,
kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok)
kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok),
dosen_pembimbing_1:dosen!pembimbing_1(id_dosen, nama_dosen),
dosen_pembimbing_2:dosen!pembimbing_2(id_dosen, nama_dosen)
`)
.eq('nim', nim)
.single();
@@ -25,9 +27,13 @@ export async function GET(request: NextRequest) {
// Transformasi data untuk meratakan field yang di-join
const transformedData = {
...data,
nama_kelompok_keahlian: data.kelompok_keahlian?.nama_kelompok || null
nama_kelompok_keahlian: data.kelompok_keahlian?.nama_kelompok || null,
nama_pembimbing_1: data.dosen_pembimbing_1?.nama_dosen || null,
nama_pembimbing_2: data.dosen_pembimbing_2?.nama_dosen || null
};
delete transformedData.kelompok_keahlian;
delete transformedData.dosen_pembimbing_1;
delete transformedData.dosen_pembimbing_2;
return NextResponse.json(transformedData);
} else {
@@ -36,7 +42,9 @@ export async function GET(request: NextRequest) {
.from('mahasiswa')
.select(`
*,
kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok)
kelompok_keahlian!id_kelompok_keahlian(id_kk, nama_kelompok),
dosen_pembimbing_1:dosen!pembimbing_1(id_dosen, nama_dosen),
dosen_pembimbing_2:dosen!pembimbing_2(id_dosen, nama_dosen)
`)
.order('nim');
@@ -48,8 +56,10 @@ export async function GET(request: NextRequest) {
// Transformasi data untuk meratakan field yang di-join
const transformedData = data.map(item => ({
...item,
nama_kelompok_keahlian: item.kelompok_keahlian?.nama_kelompok || null
})).map(({ kelompok_keahlian, ...rest }) => rest);
nama_kelompok_keahlian: item.kelompok_keahlian?.nama_kelompok || null,
nama_pembimbing_1: item.dosen_pembimbing_1?.nama_dosen || null,
nama_pembimbing_2: item.dosen_pembimbing_2?.nama_dosen || null
})).map(({ kelompok_keahlian, dosen_pembimbing_1, dosen_pembimbing_2, ...rest }) => rest);
return NextResponse.json(transformedData);
}
@@ -75,7 +85,10 @@ export async function POST(request: NextRequest) {
ipk,
id_kelompok_keahlian,
status_kuliah,
semester
semester,
pembimbing_1,
pembimbing_2,
status_bimbingan
} = body;
// Validasi field yang wajib diisi
@@ -115,7 +128,10 @@ export async function POST(request: NextRequest) {
ipk: ipk || null,
id_kelompok_keahlian: id_kelompok_keahlian || null,
status_kuliah: status_kuliah || "Aktif",
semester: semester || 1
semester: semester || 1,
pembimbing_1: pembimbing_1 || null,
pembimbing_2: pembimbing_2 || null,
status_bimbingan: status_bimbingan || "Belum Selesai"
})
.select()
.single();
@@ -157,7 +173,10 @@ export async function PUT(request: NextRequest) {
ipk,
id_kelompok_keahlian,
status_kuliah,
semester
semester,
pembimbing_1,
pembimbing_2,
status_bimbingan
} = body;
// Cek apakah mahasiswa ada
@@ -185,7 +204,10 @@ export async function PUT(request: NextRequest) {
ipk: ipk || existing.ipk,
id_kelompok_keahlian: id_kelompok_keahlian || existing.id_kelompok_keahlian,
status_kuliah: status_kuliah || existing.status_kuliah,
semester: semester || existing.semester
semester: semester || existing.semester,
pembimbing_1: pembimbing_1 !== undefined ? pembimbing_1 : existing.pembimbing_1,
pembimbing_2: pembimbing_2 !== undefined ? pembimbing_2 : existing.pembimbing_2,
status_bimbingan: status_bimbingan || existing.status_bimbingan
})
.eq('nim', nim);

View File

@@ -120,7 +120,10 @@ function processData(headers: string[], rows: any[][]) {
ipk: ['ipk', 'gpa'],
kelompok_keahlian: ['kelompok_keahlian', 'kk', 'keahlian', 'id_kk'],
status_kuliah: ['status_kuliah', 'status', 'status_mahasiswa'],
semester: ['semester', 'sem']
semester: ['semester', 'sem'],
pembimbing_1_nip: ['pembimbing_1_nip', 'nip_pembimbing_1', 'pembimbing1_nip', 'dosen_pembimbing_1'],
pembimbing_2_nip: ['pembimbing_2_nip', 'nip_pembimbing_2', 'pembimbing2_nip', 'dosen_pembimbing_2'],
status_bimbingan: ['status_bimbingan', 'status_guidance', 'bimbingan_status']
};
// Map actual headers to expected headers
@@ -205,6 +208,22 @@ function processData(headers: string[], rows: any[][]) {
}
}
// Handle pembimbing NIP
const pembimbing_1_nip = headerMap.pembimbing_1_nip !== undefined ? String(values[headerMap.pembimbing_1_nip] || '') || null : null;
const pembimbing_2_nip = headerMap.pembimbing_2_nip !== undefined ? String(values[headerMap.pembimbing_2_nip] || '') || null : null;
// Handle status bimbingan
let status_bimbingan = 'Belum Selesai'; // Default value
if (headerMap.status_bimbingan !== undefined && values[headerMap.status_bimbingan] !== undefined) {
const statusValue = String(values[headerMap.status_bimbingan] || '').trim();
if (statusValue) {
const mappedStatus = mapStatusBimbingan(statusValue);
if (mappedStatus) {
status_bimbingan = mappedStatus;
}
}
}
// Validate required fields
if (!nim || !nama || !jenis_kelamin || !tahun_angkatan) {
errors.push(`Row ${i+1}: Missing required fields`);
@@ -241,14 +260,17 @@ function processData(headers: string[], rows: any[][]) {
nama,
jk: jenis_kelamin,
agama,
kabupaten,
kabupaten,
provinsi,
jenis_pendaftaran,
tahun_angkatan,
ipk,
kelompok_keahlian_id,
status_kuliah,
semester
semester,
pembimbing_1_nip,
pembimbing_2_nip,
status_bimbingan
});
} catch (error) {
@@ -301,6 +323,23 @@ function mapStatus(value: string): 'Aktif' | 'Cuti' | 'Lulus' | 'Non-Aktif' | nu
return null;
}
// Function to map status bimbingan values to standardized format
function mapStatusBimbingan(value: string): 'Selesai' | 'Belum Selesai' | null {
if (!value) return null;
const lowerValue = value.toLowerCase();
if (['selesai', 'completed', 'done', 'finished', 's', '1'].includes(lowerValue)) {
return 'Selesai';
}
if (['belum selesai', 'belum_selesai', 'not completed', 'incomplete', 'ongoing', 'in progress', 'b', '0'].includes(lowerValue)) {
return 'Belum Selesai';
}
return null;
}
// Fungsi untuk insert data ke database
async function insertDataToDatabase(data: any[]) {
let insertedCount = 0;
@@ -315,6 +354,28 @@ async function insertDataToDatabase(data: any[]) {
.eq('nim', item.nim)
.single();
// Lookup pembimbing berdasarkan NIP
let pembimbing_1_id = null;
let pembimbing_2_id = null;
if (item.pembimbing_1_nip) {
const { data: dosen1 } = await supabase
.from('dosen')
.select('id_dosen')
.eq('nip', item.pembimbing_1_nip)
.single();
pembimbing_1_id = dosen1?.id_dosen || null;
}
if (item.pembimbing_2_nip) {
const { data: dosen2 } = await supabase
.from('dosen')
.select('id_dosen')
.eq('nip', item.pembimbing_2_nip)
.single();
pembimbing_2_id = dosen2?.id_dosen || null;
}
const mahasiswaData = {
nama: item.nama,
jk: item.jk,
@@ -326,7 +387,10 @@ async function insertDataToDatabase(data: any[]) {
ipk: item.ipk,
id_kelompok_keahlian: item.kelompok_keahlian_id,
status_kuliah: item.status_kuliah,
semester: item.semester
semester: item.semester,
pembimbing_1: pembimbing_1_id,
pembimbing_2: pembimbing_2_id,
status_bimbingan: item.status_bimbingan
};
if (existingData) {