Rekrutmen
Ringkasan
Rekrutmen menangani siklus kandidat penuh — dari konfigurasi pipeline hingga pelacakan applicant, assessment, interview, verifikasi dokumen, dan perekrutan otomatis.
Modul ini menggunakan Eloquent Observers yang bereaksi terhadap event model untuk mengotomatiskan snapshot stage, duplikasi konfigurasi pipeline, inisialisasi deposit, pengiriman notifikasi, dan pembuatan record perekrutan.
Entitas Kunci
| Entitas | Deskripsi |
|---|---|
| Pipeline | Kumpulan stage terurut yang mendefinisikan alur rekrutmen |
| Stage | Langkah dalam pipeline (Screening, Interview, dll) |
| Applicant | Kandidat yang dilacak melalui stage pipeline |
| Candidate | Orang dalam talent pool |
Diagram Alir
Pipeline Configuration Flow
Berikut adalah diagram alir yang menggambarkan bagaimana admin mengkonfigurasi pipeline dan stage untuk rekrutmen:
Applicant Review Flow
Berikut adalah diagram alir yang menunjukkan bagaimana admin mereview dan memproses applicant:
Assessment Scoring Flow
Berikut adalah diagram alir yang menunjukkan proses input dan review nilai assessment:
Alur Observer
ApplicantObserver — Otomatisasi Siklus Hidup Penuh
ApplicantObserver adalah observer paling kompleks — menangani kode unik, snapshot pipeline, kemajuan stage, logika perekrutan, dan sinkronisasi status vacancy di 6 event Eloquent.
Penjelasan per event:
creating — Sebelum applicant disimpan pertama kali:
- Generate kode unik applicant (prefix
APP-) viaApplicant::generateUniqueCode(). - Snapshot stage pipeline saat ini ke kolom JSON
pipeline_stages— membekukan konfigurasi stage pada saat aplikasi.
created — Setelah applicant disimpan:
- Panggil
InitializeApplicantDepositsuntuk membuat record deposit/fee berdasarkan konfigurasi pipeline.
saving — Sebelum setiap penyimpanan:
- Jika terhubung ke candidate, sinkron
name,email,phone,social_mediadari candidate. - Jika
stage_idberubah:- Update snapshot
pipeline_stages— tandai stage selesai, set stage current, sisanya pending. - Jika stage terakhir → jalankan Hiring Logic: buat User, Employee, Teacher (jika judul vacancy mengandung "teacher"), assign role default, kirim
HiringNotification. - Set status applicant ke
done(final) atauprogress(menengah).
- Update snapshot
- Selalu panggil
StageOrchestrator::enter()setelah logika stage.
saved — Setelah setiap penyimpanan:
- Panggil
SyncVacancyStateuntuk update status vacancy.
updated — Setelah update:
- Jika
stage_idberubah, dispatchSendStageChangedNotificationdengan nama stage asal/tujuan.
deleted — Setelah hapus:
- Panggil
SyncVacancyStateuntuk kalkulasi ulang status vacancy.
ApplicantDocumentObserver — Versi Dokumen
ApplicantDocumentObserver mengelola deduplikasi dokumen dengan hash SHA1:
Penjelasan:
- Dokumen dengan
is_current = truemendapat hash SHA1 deterministik berdasarkanowner_type|owner_id|document_type_id. - Hash ini memastikan setiap pemilik hanya punya satu dokumen "current" per tipe — upload versi baru menggantikan yang lama.
- Dokumen dengan
is_current = falsemendapatcurrent_key = null(diarsipkan).
VacancyObserver — Setup Pipeline Otomatis
VacancyObserver mengotomatiskan konfigurasi vacancy saat dibuat atau pipeline-nya berubah:
Penjelasan:
created — Saat vacancy baru dibuat:
- Membuat
VacancyStatedengan statuspending. - Memanggil
duplicatePipelineSettings()— menyalin semua stage, dokumen, dan deposit dari master pipeline kePipelineRequiredItemper-vacancy.
updated — Saat vacancy diupdate:
- Jika
pipeline_idberubah, hapus semua stage dan required items lama, lalu duplikasi dari pipeline baru. - Mencatat log untuk notifikasi ke applicant terpilih.
DFD — Data Flow Diagram
Level 0 — Context Diagram
Level 1 — Pemrosesan Applicant
Activity Diagram — Siklus Applicant
Database
Tabel Kunci
| Tabel | Deskripsi |
|---|---|
applicants | Melacak kandidat melalui stage — stage_id, status, score, pipeline_stages (JSON snapshot) |
candidates | Talent pool — user_id, first_name, last_name, email |
talent_interviews | Jadwal interview — scheduled_at, interviewer_id, status |
talent_assessments | Nilai tes — type (WRITTEN/INTERVIEW/MICRO), score |
applicant_documents | Upload file per stage — asset_id, current_key, status |
applicant_deposits | Pelacakan fee per stage — amount, status |
vacancy_states | Status vacancy — status, stage_id |
pipeline_required_items | Persyaratan polimorfik (dokumen, deposit) per stage/vacancy |
File Penting
| File | Tujuan |
|---|---|
app/Observers/Recruitment/ApplicantObserver.php | Siklus hidup penuh — generate kode, snapshot stage, hiring logic, notifikasi |
app/Observers/Recruitment/ApplicantDocumentObserver.php | Versi dokumen — deduplikasi hash SHA1 |
app/Observers/Recruitment/VacancyObserver.php | Setup pipeline — duplikasi otomatis stage, dokumen, deposit ke vacancy |
app/Jobs/Recruitment/SendStageChangedNotification.php | Job: notifikasi perubahan stage applicant |
app/Services/Recruitment/Deposits/InitializeApplicantDeposits.php | Buat record deposit saat applicant dibuat |
app/Services/Recruitment/VacancyState/SyncVacancyState.php | Sinkron status vacancy berdasarkan applicant |
app/Services/Platform/Pipeline/StageOrchestrator.php | Trigger entry stage dan auto-create contract |
app/Models/Recruitment/Applicant/Applicant.php | Model applicant — stage, status, scoring |
app/Models/Recruitment/Candidate/Candidate.php | Talent pool |
app/Models/Recruitment/TalentAssessment/TalentAssessment.php | Scoring assessment |
app/Models/Recruitment/TalentInterview/TalentInterview.php | Jadwal interview |
app/Models/Platform/Pipeline/Pipeline.php | Definisi pipeline |
app/Models/Platform/Stage/Stage.php | Definisi stage dengan konfigurasi |
app/Filament/Resources/Applicants/ | CRUD applicant + actions (advance, approve) |