""" Debug script untuk simulasi import tracer_responses (standalone) """ import pandas as pd import json # Baca CSV df = pd.read_csv(r'c:\Users\syifa\TA-PROJEK\Data_Tracerstudy\Data_2019_Tracer_study.csv', sep=';', encoding='utf-8-sig') source_cols = list(df.columns) # YEAR_CONFIG YEAR_CONFIG = { '2019': { 'skip_jumlah_perusahaan': True, 'has_email': True, 'email_col': 'Email', 'nama_col': 'Nama', 'tahun_col': 'Tahun Lulus', }, } # Base mapping tracer_mapping = { 'email': ['emailmsmh', 'Email', '6. Alamat Email / emailmsmh'], 'kode_pt': ['kdptimsmh', 'Kode PT', '1. Kode Perguruan Tinggi / kdptimsmh'], 'nik': ['NIK'], 'npwp': ['NPWP'], 'telepon': ['Telepon', 'No. Telepon'], 'status_saat_ini': ['F8', 'f8'], 'bulan_dapat_kerja': ['F502', 'f502'], 'dapet_kerja_6_bulan': ['F504', 'f504'], 'rata_pendapatan': ['F505', 'f505'], 'bulan_dapat_kerja_setelah': ['F506', 'f506'], 'provinsi_kerja': ['F5a1', 'f5a1'], 'kab_kota_kerja': ['F5a2', 'f5a2'], 'jenis_perusahaan_full': ['F1101', 'f1101'], 'jumlah_perusahaan': ['F1102', 'f1102'], 'nama_perusahaan': ['F5b', 'f5b'], 'jabatan': ['F5c', 'f5c'], 'tingkatan_tempat_kerja': ['F5d', 'f5d'], # ... fields truncated for brevity } # Apply year-specific overrides tahun = '2019' year_config = YEAR_CONFIG.get(tahun, {}) if year_config.get('skip_jumlah_perusahaan', False): if 'jumlah_perusahaan' in tracer_mapping: del tracer_mapping['jumlah_perusahaan'] print('[DEBUG] jumlah_perusahaan dihapus dari mapping (2019)') def normalize(col_name): if pd.isna(col_name): return "" return str(col_name).strip().lower() def find_column(source_cols, possible_names): source_cols_lower = {normalize(c): c for c in source_cols} for name in possible_names: if normalize(name) in source_cols_lower: return source_cols_lower[normalize(name)] return None JAWABAN_MAPPING = {} KOMPETENSI_LEVEL = { 1: 'Sangat Rendah', 2: 'Rendah', 3: 'Netral', 4: 'Tinggi', 5: 'Sangat Tinggi' } METODE_LEVEL = { 1: 'Sangat Besar', 2: 'Besar', 3: 'Cukup Besar', 4: 'Kurang', 5: 'Tidak Sama Sekali' } YA_TIDAK = {0: 'Tidak', 1: 'Ya'} def konversi_jawaban(field_code, nilai): if pd.isna(nilai) or nilai == 0 or nilai == '': return None if isinstance(nilai, float): if nilai != int(nilai): return None nilai = int(nilai) nilai_key = int(nilai) if isinstance(nilai, (int, float)) else nilai if field_code in ['F1761', 'F1762', 'F1763', 'F1764', 'F1765', 'F1766', 'F1767', 'F1768', 'F1769', 'F1770', 'F1771', 'F1772', 'F1773', 'F1774']: return KOMPETENSI_LEVEL.get(nilai_key) if field_code in ['F21', 'F22', 'F23', 'F24', 'F25', 'F26', 'F27']: return METODE_LEVEL.get(nilai_key) if field_code in ['F401', 'F402', 'F403', 'F404', 'F405', 'F406', 'F407', 'F408', 'F409', 'F410', 'F411', 'F412', 'F413', 'F414', 'F415', 'F416']: return YA_TIDAK.get(nilai_key) if field_code in ['F1603', 'F1604', 'F1605', 'F1606', 'F1607', 'F1608', 'F1609', 'F1610', 'F1611', 'F1612', 'F1613']: return YA_TIDAK.get(nilai_key) if field_code in JAWABAN_MAPPING: return JAWABAN_MAPPING[field_code].get(nilai_key) return nilai # Return as-is print('='*70) print(f'DEBUG IMPORT TAHUN {tahun}') print('='*70) # Print tracer_mapping print('\nTRACER MAPPING fields:') for key in ['email', 'nama_perusahaan', 'jumlah_perusahaan', 'jabatan']: if key in tracer_mapping: print(f" {key}: {tracer_mapping[key]}") else: print(f" {key}: NOT IN MAPPING") print() # Process baris pertama row = df.iloc[0] print(f'NIM: {row["NIM/Nomor Mahasiswa"]}') print(f'Nama: {row["Nama"]}') print() def get_val(mapping_dict, key, default=None): cols = mapping_dict.get(key, []) col = find_column(source_cols, cols) if col and pd.notna(row.get(col)): val = row[col] if isinstance(val, (int, float)): return int(val) if val == int(val) else val return str(val).strip() return default print('='*70) print('SIMULASI BUILD TRACER_DATA') print('='*70) tracer_data = {} numeric_fields = ['bulan_dapat_kerja', 'dapet_kerja_6_bulan', 'bulan_dapat_kerja_setelah', 'jumlah_perusahaan', 'bulan_cari_sebelum_lulus', 'bulan_cari_setelah_wisuda', 'jumlah_perusahaan_dilamar', 'jumlah_perusahaan_merespons', 'jumlah_perusahaan_wawancara'] for field, cols in tracer_mapping.items(): val = get_val(tracer_mapping, field) if val is None: print(f'SKIP {field}: val is None') continue if isinstance(val, str) and val.strip() in ['', 'nan', 'None', '-', '_']: print(f'SKIP {field}: invalid string "{val}"') continue field_code = None if cols: for col in cols: if str(col).upper().startswith('F'): field_code = str(col).upper() break converted_val = konversi_jawaban(field_code, val) if field in numeric_fields: try: tracer_data[field] = int(val) print(f'OK {field} (numeric): {val} -> {int(val)}') except (ValueError, TypeError) as e: print(f'SKIP {field}: cannot convert to int "{val}" - {e}') elif converted_val is not None: tracer_data[field] = converted_val print(f'OK {field}: {repr(val)} -> {repr(converted_val)}') else: print(f'SKIP {field}: converted_val is None') print() print('='*70) print('HASIL TRACER_DATA (field penting)') print('='*70) for key in ['email', 'nama_perusahaan', 'jumlah_perusahaan', 'jabatan']: if key in tracer_data: print(f'{key}: {repr(tracer_data[key])}') else: print(f'{key}: NOT SAVED')