TIF_E41253310/Backend/app/parsers/mappings.py

706 lines
22 KiB
Python

"""
Mapping kolom untuk setiap tahun tracer study.
Ini adalah sumber kebenaran untuk mapping CSV -> database field.
"""
from typing import Optional
# ============================================
# YEAR CONFIGURATION
# Setiap tahun punya format kolom yang berbeda
# ============================================
YEAR_CONFIG = {
'2019': {
'description': 'Format lama - kode angka',
'skip_jumlah_perusahaan': True, # F1102 bukan jumlah_perusahaan
'has_email': True,
'email_col': 'Email',
'nama_col': 'Nama',
'tahun_col': 'Tahun Lulus',
'is_text_format': False, # Data dalam bentuk kode angka
},
'2020': {
'description': 'Format 2020',
'skip_jumlah_perusahaan': False,
'has_email': True,
'email_col': 'Email',
'nama_col': 'Nama',
'tahun_col': 'Tahun Lulus',
'is_text_format': False,
},
'2021': {
'description': 'Format 2021 - tidak ada kolom email',
'skip_jumlah_perusahaan': False,
'has_email': False,
'email_col': None,
'nama_col': 'Nama',
'tahun_col': 'Tahun Lulus',
'is_text_format': False,
},
'2022': {
'description': 'Format 2022 - ada emailmsmh',
'skip_jumlah_perusahaan': False,
'has_email': True,
'email_col': 'emailmsmh',
'nama_col': 'nmmhsmsmh',
'tahun_col': 'tahun_lulus',
'is_text_format': False,
},
'2023': {
'description': 'Format 2023 - ada emailmsmh',
'skip_jumlah_perusahaan': False,
'has_email': True,
'email_col': 'emailmsmh',
'nama_col': 'nmmhsmsmh',
'tahun_col': 'tahun_lulus',
'is_text_format': False,
},
'2024': {
'description': 'Format 2024 - data dalam format teks lengkap "KODE - TEKS"',
'skip_jumlah_perusahaan': False,
'has_email': True,
'email_col': '6. Alamat Email / emailmsmh',
'nama_col': '4. Nama Lengkap / nmmhsmsmh (Gunakan Huruf Besar)',
'tahun_col': '7. Tahun Lulus / tahun_lulus',
'nim_col': '3. NIM / nimhsmsmh (Gunakan Huruf Besar)',
'is_text_format': True, # Data SUDAH dalam format teks lengkap
},
'2025': {
'description': 'Format 2025 - sama dengan 2024',
'skip_jumlah_perusahaan': False,
'has_email': True,
'email_col': '6. Alamat Email / emailmsmh',
'nama_col': '4. Nama Lengkap / nmmhsmsmh (Gunakan Huruf Besar)',
'tahun_col': '7. Tahun Lulus / tahun_lulus',
'nim_col': '3. NIM / nimhsmsmh (Gunakan Huruf Besar)',
'is_text_format': True,
},
}
# ============================================
# COLUMN MAPPING - IDENTITAS
# ============================================
IDENTITAS_MAPPING = {
# Field database: [list kemungkinan nama kolom di CSV]
'nim': [
'NIM/Nomor Mahasiswa',
'NIM',
'nimhsmsmh',
'3. NIM / nimhsmsmh',
'3. NIM / nimhsmsmh (Gunakan Huruf Besar)',
'3. NIM / nimhsmsmh (Gunakan Huruf Besar) ',
],
'nama': [
'Nama',
'nmmhsmsmh',
'4. Nama Lengkap / nmmhsmsmh',
'4. Nama Lengkap / nmmhsmsmh (Gunakan Huruf Besar)',
],
'kode_prodi': [
'Kode Prodi',
'kdpstmsmh',
'2. Kode Program Studi / kdpstmsmh',
],
'kode_pt': [
'Kode PT',
'kdptimsmh',
'1. Kode Perguruan Tinggi / kdptimsmh',
],
'email': [
'Email',
'emailmsmh',
'6. Alamat Email / emailmsmh',
],
'tahun_lulus': [
'Tahun Lulus',
'tahun_lulus',
'7. Tahun Lulus / tahun_lulus',
],
}
# ============================================
# COLUMN MAPPING - PEKERJAAN
# ============================================
PEKERJAAN_MAPPING = {
'status_saat_ini': [
'F8',
'f8',
'1. Jelaskan status Anda saat ini? f8',
],
'bulan_dapat_kerja': [
'F502',
'f502',
'2. Berapa bulan anda mendapatkan pekerjaan SEBELUM LULUS? f502',
'2. Dalam berapa bulan Anda mendapatkan pekerjaan pertama ? (f502)',
],
'dapet_kerja_6_bulan': [
'F504',
'f504',
'3. Apakah Anda telah mendapatkan pekerjaan <= 6 bulan / termasuk bekerja sebelum lulus? f504',
'3. Apakah Anda telah mendapatkan pekerjaan <= 6 bulan / termasuk bekerja sebelum lulus? f504',
],
'rata_pendapatan': [
'F505',
'f505',
'4. Berapa rata-rata pendapatan Anda per bulan ? f505',
'4. Berapa rata-rata pendapatan Anda per bulan? f505',
],
'bulan_dapat_kerja_setelah': [
'F506',
'f506',
'5. Berapa bulan Anda MENDAPATKAN PEKERJAAN SETELAH LULUS? f506',
],
'provinsi_kerja': [
'F5a1',
'f5a1',
'6. Dimana lokasi provinsi tempat Anda bekerja? f5a1',
'6. Ditahui lokasi provinsi tempat Anda bekerja? f5a1',
'6. Lokasi provinsi tempat Anda bekerja? f5a1',
],
'kab_kota_kerja': [
'F5a2',
'f5a2',
'7. Dimana lokasi kabupaten/kota tempat Anda bekerja? f5a2',
'7. Ditahui lokasi kabupaten/kota tempat Anda bekerja? f5a2',
'7. Lokasi kabupaten/kota tempat Anda bekerja? f5a2',
],
'jenis_perusahaan_full': [
'F1101',
'f1101',
'8. Apa jenis perusahaan/instansi/institusi tempat anda bekerja sekarang? f1101',
'8. Ditahui jenis perusahaan/instansi/institusi tempat anda bekerja sekarang? f1101',
'8. Jenis perusahaan/instansi tempat anda bekerja sekarang? f1101',
],
'jumlah_perusahaan': [
'F1102',
'f1102',
],
'nama_perusahaan': [
'F5b',
'f5b',
'9. Apa nama perusahaan/kantor tempat Anda bekerja? f5b',
'9. Ditahui nama perusahaan/kantor tempat Anda bekerja? f5b',
'9. Nama perusahaan/kantor tempat Anda bekerja? f5b',
],
'jabatan': [
'F5c',
'f5c',
'10. Bila Anda berwiraswasta, apa posisi/jabatan Anda saat ini ? f5c',
'10. Bilamana Anda berwiraswasta, apa posisi/jabatan Anda saat ini ? f5c',
],
'tingkatan_tempat_kerja': [
'F5d',
'f5d',
'11. Apa tingkatan tempat kerja Anda? f5d',
'11. Ditahui tingkatan tempat kerja Anda? f5d',
'11. Tingkatan tempat kerja Anda? f5d',
],
}
# ============================================
# COLUMN MAPPING - STUDI LANJUT
# ============================================
STUDI_LANJUT_MAPPING = {
'sumber_biaya_studi': [
'F18a',
'f18a',
'12. Sumber biaya Studi Lanjut Anda? f18a',
],
'pt_studi_lanjut': [
'F18b',
'f18b',
'13. Nama Perguruan Tinggi Studi Lanjut Anda? f18b',
],
'prodi_studi_lanjut': [
'F18c',
'f18c',
'14. Nama Program Studi Studi Lanjut Anda? f18c',
],
'tanggal_masuk_studi': [
'F18d',
'f18d',
'15. Tanggal Masuk Awal Studi Lanjut Anda? f18d',
],
}
# ============================================
# COLUMN MAPPING - KESESUAIAN
# ============================================
KESESUAIAN_MAPPING = {
'sumber_biaya_kuliah': [
'F1201',
'f1201',
'16. Sebutkan sumberdana dalam pembiayaan kuliah? (bukan ketika Studi Lanjut) f1201',
],
'keeratan_bidang_studi': [
'F14',
'f14',
'17. Seberapa erat hubungan bidang studi dengan pekerjaan Anda? f14',
],
'tingkat_pendidikan_tepat': [
'F15',
'f15',
'18. Tingkat pendidikan apa yang paling tepat/sesuai untuk pekerjaan anda saat ini? f15',
],
}
# ============================================
# COLUMN MAPPING - KOMPETENSI (SAAT LULUS)
# ============================================
KOMPETENSI_LULUS_MAPPING = {
'etika_lulus_full': [
'F1761',
'f1761',
'19. Pada tingkat mana kompetensi ETIKA anda pada SAAT LULUS? f1761',
'19. Padatingkat mana kompetensi ETIKA anda pada SAAT LULUS? f1761',
'19. Kompetensi ETIKA SAAT LULUS? f1761',
],
'keahlian_lulus_full': [
'F1763',
'f1763',
'21. Pada tingkat mana kompetensi KEAHLIAN BERDASARKAN BIDANG ILMU anda kuasai pada SAAT LULUS? f1763',
'21. Padatingkat mana kompetensi KEAHLIAN BERDASARKAN BIDANG ILMU anda kuasai pada SAAT LULUS? f1763',
'21. Kompetensi KEAHLIAN BERDASARKAN BIDANG ILMU SAAT LULUS? f1763',
],
'bahasa_inggris_lulus_full': [
'F1765',
'f1765',
'23. Pada tingkat mana kompetensi BAHASA INGGRIS anda kuasai pada SAAT LULUS? f1765',
'23. Padatingkat mana kompetensi BAHASA INGGRIS anda kuasai pada SAAT LULUS? f1765',
'23. Kompetensi BAHASA INGGRIS SAAT LULUS? f1765',
],
'teknologi_informasi_lulus_full': [
'F1767',
'f1767',
'25. Pada tingkat mana kompetensi TEKNOLOGI INFORMASI anda kuasai pada SAAT LULUS? f1767',
'25. Padatingkat mana kompetensi TEKNOLOGI INFORMASI anda kuasai pada SAAT LULUS? f1767',
'25. Kompetensi TEKNOLOGI INFORMASI SAAT LULUS? f1767',
],
'komunikasi_lulus_full': [
'F1769',
'f1769',
'27. Pada tingkat mana kompetensi KOMUNIKASI anda kuasai pada SAAT LULUS? f1769',
'27. Padatingkat mana kompetensi KOMUNIKASI anda kuasai pada SAAT LULUS? f1769',
'27. Kompetensi KOMUNIKASI SAAT LULUS? f1769',
],
'kerja_sama_lulus_full': [
'F1771',
'f1771',
'29. Pada tingkat mana kompetensi KERJA SAMA TIM anda pada SAAT LULUS? f1771',
'29. Padatingkat mana kompetensi KERJA SAMA TIM anda pada SAAT LULUS? f1771',
'29. Kompetensi KERJA SAMA TIM SAAT LULUS? f1771',
],
'pengembangan_diri_lulus_full': [
'F1773',
'f1773',
'31. Pada tingkat mana kompetensi PENGEMBANGAN DIRI anda pada SAAT LULUS? f1773',
'31. Padatingkat mana kompetensi PENGEMBANGAN DIRI anda pada SAAT LULUS? f1773',
'31. Kompetensi PENGEMBANGAN DIRI SAAT LULUS? f1773',
],
}
# ============================================
# COLUMN MAPPING - KOMPETENSI (SAAT INI)
# ============================================
KOMPETENSI_SAAT_INI_MAPPING = {
'etika_saat_ini': [
'F1762',
'f1762',
'20. Pada tingkat mana kompetensi ETIKA anda pada SAAT INI? f1762',
'20. Padatingkat mana kompetensi ETIKA anda pada SAAT INI? f1762',
'20. Kompetensi ETIKA SAAT INI? f1762',
],
'keahlian_saat_ini': [
'F1764',
'f1764',
'22. Pada tingkat mana kompetensi KEAHLIAN BERDASARKAN BIDANG ILMU anda kuasai pada SAAT INI? f1764',
'22. Padatingkat mana kompetensi KEAHLIAN BERDASARKAN BIDANG ILMU anda kuasai pada SAAT INI? f1764',
'22. Kompetensi KEAHLIAN BERDASARKAN BIDANG ILMU SAAT INI? f1764',
],
'bahasa_inggris_saat_ini': [
'F1766',
'f1766',
'24. Pada tingkat mana kompetensi BAHASA INGGRIS anda kuasai pada SAAT INI? f1766',
'24. Padatingkat mana kompetensi BAHASA INGGRIS anda kuasai pada SAAT INI? f1766',
'24. Kompetensi BAHASA INGGRIS SAAT INI? f1766',
],
'teknologi_informasi_saat_ini': [
'F1768',
'f1768',
'26. Pada tingkat mana kompetensi TEKNOLOGI INFORMASI anda kuasai pada SAAT INI? f1768',
'26. Padatingkat mana kompetensi TEKNOLOGI INFORMASI anda kuasai pada SAAT INI? f1768',
'26. Kompetensi TEKNOLOGI INFORMASI SAAT INI? f1768',
],
'komunikasi_saat_ini': [
'F1770',
'f1770',
'28. Pada tingkat mana kompetensi KOMUNIKASI anda kuasai pada SAAT INI? f1770',
'28. Padatingkat mana kompetensi KOMUNIKASI anda kuasai pada SAAT INI? f1769',
'28. Kompetensi KOMUNIKASI SAAT INI? f1770',
],
'kerja_sama_saat_ini': [
'F1772',
'f1772',
'30. Pada tingkat mana kompetensi KERJA SAMA TIM anda pada SAAT INI? f1772',
'30. Padatingkat mana kompetensi KERJA SAMA TIM anda pada SAAT INI? f1772',
'30. Kompetensi KERJA SAMA TIM SAAT INI? f1772',
],
'pengembangan_diri_saat_ini': [
'F1774',
'f1774',
'32. Pada tingkat mana kompetensi PENGEMBANGAN DIRI anda pada SAAT INI? f1774',
'32. Padatingkat mana kompetensi PENGEMBANGAN DIRI anda pada SAAT INI? f1774',
'32. Kompetensi PENGEMBANGAN DIRI SAAT INI? f1774',
],
}
# ============================================
# COLUMN MAPPING - METODE PEMBELAJARAN
# ============================================
METODE_PEMBELAJARAN_MAPPING = {
'metode_perkuliahan': [
'F21',
'f21',
'33. Perkuliahan (f21)',
'33. Perkuliahan f21',
],
'metode_demonstrasi': [
'F22',
'f22',
'34. Demonstrasi (f22)',
'34. Demonstrasi f22',
],
'metode_proyek_riset': [
'F23',
'f23',
'35. Partisipasi dalam proyek riset (f23)',
'35. Partisipasi dalam proyek riset f23',
],
'metode_magang': [
'F24',
'f24',
'36. Magang (f24)',
'36. Magang f24',
],
'metode_praktikum': [
'F25',
'f25',
'37. Praktikum (f25)',
'37. Praktikum f25',
],
'metode_kerja_lapangan': [
'F26',
'f26',
'38. Kerja Lapangan (f26)',
'38. Kerja Lapangan f26',
],
'metode_diskusi': [
'F27',
'f27',
'39. Diskusi (f27)',
'39. Diskusi f27',
],
}
# ============================================
# COLUMN MAPPING - WAKTU CARI KERJA
# ============================================
WAKTU_CARI_KERJA_MAPPING = {
'mulai_cari_kerja': [
'F301',
'f301',
'40. Kapan anda mulai mencari pekerjaan? f301',
],
'bulan_cari_sebelum_lulus': [
'F302',
'f302',
'41. Saya mencari pekerjaan, Kira-kira ....... bulan SEBELUM lulus (f302)',
],
'bulan_cari_setelah_wisuda': [
'F303',
'f303',
'42. Saya mencari pekerjaan, Kira-kira ....... bulan SETELAH wisuda (f303)',
],
}
# ============================================
# COLUMN MAPPING - CARA CARI KERJA (Ya/Tidak)
# ============================================
CARA_CARI_KERJA_MAPPING = {
'cari_iklan': [
'F401',
'f401',
'43. Melalui iklan di koran/majalah, brosur ? (f401)',
],
'cari_melamar_tanpa_lowongan': [
'F402',
'f402',
'44. Melamar ke perusahaan tanpa mengetahui lowongan yang ada (f402)',
],
'cari_bursa_pameran': [
'F403',
'f403',
'45. Pergi ke bursa/pameran kerja (f403)',
],
'cari_internet': [
'F404',
'f404',
'46. Mencari lewat internet/iklan online/milis (f404)',
],
'cari_dihubungi_perusahaan': [
'F405',
'f405',
'47. Dihubungi oleh perusahaan (f405)',
],
'cari_kemenakertrans': [
'F406',
'f406',
'48. Menghubungi Kemenakertrans (f406)',
],
'cari_agen_tenaga_kerja': [
'F407',
'f407',
'49. Menghubungi agen tenaga kerja komersial/swasta (f407)',
],
'cari_pusat_karir': [
'F408',
'f408',
'50. Memperoleh informasi dari pusat/kantor pengembangan karir fakultas/universitas (f408)',
],
'cari_kantor_mahasiswa': [
'F409',
'f409',
'51. Menghubungi kantor kemahasiswaan/hubungan alumni (f409)',
],
'cari_jejaring': [
'F410',
'f410',
'52. Membangun jejaring (network) sejak masih kuliah (f410)',
],
'cari_relasi': [
'F411',
'f411',
'53. Melalui relasi (misalnya dosen, orang tua, saudara, teman, Ikatan Alumni dll.) (f411)',
],
'cari_bangun_usaha': [
'F412',
'f412',
'54. Membangun bisnis sendiri (f412)',
],
'cari_magang': [
'F413',
'f413',
'55. Melalui penempatan kerja atau magang (f413)',
],
'cari_tempat_kuliah': [
'F414',
'f414',
'56. Bekerja di tempat yang sama dengan tempat kerja semasa kuliah (f414)',
],
'cari_lainnya': [
'F415',
'f415',
'57. Lainnya (f415)',
],
}
# ============================================
# COLUMN MAPPING - LAMARAN & KEAKTIFAN
# ============================================
LAMARAN_KEAKTIFAN_MAPPING = {
'jumlah_perusahaan_dilamar': [
'F6',
'f6',
'58. Berapa perusahaan/instansi/institusi yang sudah anda lamar (lewat surat atau e-mail) sebelum anda memperoleh pekerjaan pertama? f6',
],
'jumlah_perusahaan_merespons': [
'F7',
'f7',
'59. Berapa banyak perusahaan/instansi/institusi yang merespons lamaran Anda? f7',
],
'jumlah_perusahaan_wawancara': [
'F7a',
'f7a',
'60. Berapa banyak perusahaan/instansi/institusi yang mengundang anda untuk wawancara? f7a',
],
'aktif_cari_kerja_4_minggu': [
'F1001',
'f1001',
'61. Apakah Anda aktif mencari pekerjaan dalam 4 minggu terakhir? Pilihlah satu jawaban (f1001)',
],
}
# ============================================
# COLUMN MAPPING - KESESUAIAN PEKERJAAN
# ============================================
KESESUAIAN_PEKERJAAN_MAPPING = {
'kerja_tidak_sesuai_1': [
'F1601',
'f1601',
'62. Apakah pekerjaan anda saat ini tidak sesuai dengan pendidikan anda ? f1601',
],
'kerja_tidak_sesuai_2': [
'F1602',
'f1602',
'63. Apakah pekerjaan anda saat ini tidak sesuai dengan pendidikan anda ? f1602',
],
'alasan_tidak_sesuai_1': [
'F1603',
'f1603',
'64. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1603',
],
'alasan_tidak_sesuai_2': [
'F1604',
'f1604',
'65. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1604',
],
'alasan_tidak_sesuai_3': [
'F1605',
'f1605',
'66. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1605',
],
'alasan_tidak_sesuai_4': [
'F1606',
'f1606',
'67. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1606',
],
'alasan_tidak_sesuai_5': [
'F1607',
'f1607',
'68. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1607',
],
'alasan_tidak_sesuai_6': [
'F1608',
'f1608',
'69. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1608',
],
'alasan_tidak_sesuai_7': [
'F1609',
'f1609',
'70. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1609',
],
'alasan_tidak_sesuai_8': [
'F1610',
'f1610',
'71. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1610',
],
'alasan_tidak_sesuai_9': [
'F1611',
'f1611',
'72. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1611',
],
'alasan_tidak_sesuai_10': [
'F1612',
'f1612',
'73. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? f1612',
],
'alasan_tidak_sesuai_11': [
'F1613',
'f1613',
'74. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? Selain pilihan dijawaban soal diatas (f1613)',
],
'alasan_tidak_sesuai_lainnya': [
'F1614',
'f1614',
'75. Jika pekerjaan anda saat ini tidak sesuai dengan pendidikan anda, mengapa anda mengambilnya? Selain pilihan dijawaban soal diatas, Tuliskan (f1614)',
],
}
# ============================================
# ALL MAPPINGS COMBINED (untuk import)
# ============================================
# Combine all tracer response mappings
TRACER_MAPPING = {}
TRACER_MAPPING.update(PEKERJAAN_MAPPING)
TRACER_MAPPING.update(STUDI_LANJUT_MAPPING)
TRACER_MAPPING.update(KESESUAIAN_MAPPING)
TRACER_MAPPING.update(KOMPETENSI_LULUS_MAPPING)
TRACER_MAPPING.update(KOMPETENSI_SAAT_INI_MAPPING)
TRACER_MAPPING.update(METODE_PEMBELAJARAN_MAPPING)
TRACER_MAPPING.update(WAKTU_CARI_KERJA_MAPPING)
TRACER_MAPPING.update(CARA_CARI_KERJA_MAPPING)
TRACER_MAPPING.update(LAMARAN_KEAKTIFAN_MAPPING)
TRACER_MAPPING.update(KESESUAIAN_PEKERJAAN_MAPPING)
# ============================================
# NUMERIC FIELDS (harus jadi integer)
# ============================================
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',
]
# ============================================
# HELPER FUNCTIONS
# ============================================
def get_all_mappings():
"""Return semua mapping dalam satu dict"""
return {
'identitas': IDENTITAS_MAPPING,
'pekerjaan': PEKERJAAN_MAPPING,
'studi_lanjut': STUDI_LANJUT_MAPPING,
'kesesuaian': KESESUAIAN_MAPPING,
'kompetensi_lulus': KOMPETENSI_LULUS_MAPPING,
'kompetensi_saat_ini': KOMPETENSI_SAAT_INI_MAPPING,
'metode_pembelajaran': METODE_PEMBELAJARAN_MAPPING,
'waktu_cari_kerja': WAKTU_CARI_KERJA_MAPPING,
'cara_cari_kerja': CARA_CARI_KERJA_MAPPING,
'lamaran_keaktifan': LAMARAN_KEAKTIFAN_MAPPING,
'kesesuaian_pekerjaan': KESESUAIAN_PEKERJAAN_MAPPING,
'tracer': TRACER_MAPPING,
}
def get_field_code(db_field: str, mapping_dict: dict) -> Optional[str]:
"""
Extract kode field (misal 'F14') dari mapping.
Args:
db_field: Nama field di database (misal 'keeratan_bidang_studi')
mapping_dict: Dict mapping yang sesuai
Returns:
Kode field (misal 'F14') atau None
"""
cols = mapping_dict.get(db_field, [])
for col in cols:
if str(col).upper().startswith('F'):
return str(col).upper()
return None