Modül Planlama v5 - Final

Career Modülü

Mini İş İlanı & CV Yönetim Sistemi

Basit, ücretsiz, tenant-aware

OLACAKLAR

  • İş ilanı oluşturma ve listeleme
  • CV oluşturma (fotoğraf + PDF yükleme)
  • İlana başvuru yapma
  • Başvuru durumu takibi (pending → hired/rejected)
  • Durum değişikliğinde e-posta bildirimi
  • Kategori/sektör görselleri (Media)
  • İlan süresi (yayın süresi + son başvuru tarihi)
  • Öne çıkan/premium ilanlar (admin tarafından)
  • Gizlilik: Telefon sadece başvurulan firmaya görünür
  • Bağımsız "career" teması

OLMAYACAKLAR (Bu Aşamada)

  • Mesajlaşma sistemi - İletişim site dışında (telefon/e-posta)
  • Ödeme/fiyatlandırma - Sistem tamamen ücretsiz
  • İş veren öne çıkarma seçimi - Admin yapar
  • Mülakat takvimi/randevu sistemi - Firma direkt arar
  • Takvime ekle butonu - Yok
  • Video mülakat - Yok
  • CV havuzu tarama - Sonraki aşama
  • Otomatik eşleştirme/skor - Sonraki aşama

Kullanıcı Akışları

İş Arayan

Kayıt/Giriş CV Oluştur İlan Bul Başvur Mail: "Başvurunuz alındı" Bekle Mail: "Mülakata davet" Firma arar

İş Veren

Kayıt/Giriş İlan Oluştur Yayınla Mail: "Yeni başvuru geldi" CV İncele Durum Değiştir Adayı ara

Başvuru Durumları & Aksiyonlar

Buton Durum Adaya Mail Sonra Ne Olur?
Kısa Listeye Al shortlisted Gönderilmez Sadece iç takip için
Mülakata Davet interview ✓ "Firma sizinle görüşmek istiyor" Firma adayı telefon/e-posta ile arar
İşe Al hired ✓ "Tebrikler! İşe alındınız" Süreç tamamlandı
Reddet rejected ✓ "Başvurunuz değerlendirildi" Süreç tamamlandı

Veritabanı Şeması

Tüm tablolar career_ prefix'i ile başlar

career_categories

career_category_id (PK)
title, slug, description (json)
parent_id, order_column
is_active, timestamps
Media: 'icon' (sektör görseli)

career_jobs

career_job_id (PK)
career_category_id (FK)
user_id (FK - ilan sahibi)
title, slug, body (json)
company_name, location (json)
work_type ENUM(full_time, part_time, contract, freelance, intern)
experience_level ENUM(entry, mid, senior, any)
salary_min, salary_max, show_salary
contact_email, contact_phone
expires_at DATE (ilan bitiş)
deadline DATE (son başvuru)
is_featured (admin set)
is_premium (admin set)
is_active, views_count
timestamps, soft_deletes

career_resumes

career_resume_id (PK)
user_id (FK)
title
summary (json)
experience (json) - [{company, position, dates, desc}]
education (json) - [{school, dept, year}]
skills (json) - ["PHP", "Laravel"]
languages (json) - [{lang, level}]
phone (GİZLİ - sadece başvurulan firmaya)
visibility ENUM(private, applied_only, public)
is_primary, is_active
timestamps, soft_deletes
Media: 'photo', 'cv_file' (PDF)

career_applications

career_application_id (PK)
career_job_id (FK)
user_id (FK - başvuran)
career_resume_id (FK)
cover_letter TEXT
status ENUM:
pending, viewed, shortlisted,
interview, rejected, hired
employer_notes TEXT (gizli - aday görmez)
viewed_at, responded_at
timestamps
UNIQUE: user_id + career_job_id

E-posta Bildirimleri

Adaya Giden

1
ApplicationSubmittedMail
Başvurunuz alındı
2
ApplicationInterviewMail
Firma sizinle görüşmek istiyor
3
ApplicationHiredMail
Tebrikler! İşe alındınız
4
ApplicationRejectedMail
Başvurunuz değerlendirildi

İş Verene Giden

1
NewApplicationMail
Yeni başvuru geldi

Tetikleme

CareerApplicationObserver::created()
→ ApplicationSubmittedMail + NewApplicationMail
CareerApplicationObserver::updated()
→ status değişirse ilgili mail

Dosya Yapısı

Modules/Career/

App/
├── Models/
│   ├── CareerJob.php
│   ├── CareerCategory.php     ← HasMedia
│   ├── CareerResume.php       ← HasMedia
│   └── CareerApplication.php
├── Http/Controllers/Front/
│   ├── CareerJobController.php
│   ├── CareerResumeController.php
│   ├── CareerApplicationController.php
│   └── EmployerController.php
├── Http/Livewire/Admin/
│   ├── CareerJobComponent.php
│   ├── CareerCategoryComponent.php
│   ├── CareerResumeComponent.php
│   └── CareerApplicationComponent.php
├── Mail/
│   ├── ApplicationSubmittedMail.php
│   ├── ApplicationInterviewMail.php
│   ├── ApplicationHiredMail.php
│   ├── ApplicationRejectedMail.php
│   └── NewApplicationMail.php
├── Services/
│   └── CareerMailService.php
└── Observers/
    └── CareerApplicationObserver.php

resources/views/themes/career/

layouts/
├── app.blade.php
├── header.blade.php
└── footer.blade.php
homepage.blade.php
jobs/
├── index.blade.php      ← Liste + filtre
├── show.blade.php       ← Detay + başvur
└── category.blade.php   ← Kategoriye göre
resume/
├── index.blade.php      ← CV'lerim
├── create.blade.php
├── edit.blade.php
└── preview.blade.php
applications/
├── index.blade.php      ← Başvurularım
└── show.blade.php
employer/
├── jobs.blade.php       ← İlanlarım
├── job-create.blade.php
├── applications.blade.php
└── application-show.blade.php
components/
├── job-card.blade.php
├── category-card.blade.php
└── status-badge.blade.php

Route Yapısı

Tüm route'lar /career prefix'i ile başlar

Herkese Açık (Guest)

GET /career → homepage
GET /career/jobs → job list
GET /career/jobs/{slug} → job detail
GET /career/category/{slug} → category jobs

İş Arayan (Auth)

POST /career/jobs/{id}/apply → başvur
GET /career/my/resumes → CV listesi
GET /career/my/resumes/create → CV oluştur
POST /career/my/resumes → CV kaydet
GET /career/my/resumes/{id}/edit → CV düzenle
PUT /career/my/resumes/{id} → CV güncelle
DEL /career/my/resumes/{id} → CV sil
GET /career/my/applications → başvurularım
GET /career/my/applications/{id} → başvuru detay
DEL /career/my/applications/{id} → başvuru geri çek

İş Veren (Employer Role)

GET /career/employer/jobs → ilanlarım
GET /career/employer/jobs/create → ilan oluştur
POST /career/employer/jobs → ilan kaydet
GET /career/employer/jobs/{id}/edit → ilan düzenle
PUT /career/employer/jobs/{id} → ilan güncelle
DEL /career/employer/jobs/{id} → ilan sil
GET /career/employer/applications → gelen başvurular
GET /career/employer/applications/{id} → başvuru detay
PUT /career/employer/applications/{id}/status → durum değiştir

Admin Panel

GET /admin/career/categories → kategoriler
GET /admin/career/jobs → tüm ilanlar
GET /admin/career/applications → tüm başvurular
GET /admin/career/resumes → tüm CV'ler
PUT /admin/career/jobs/{id}/feature → öne çıkar toggle
PUT /admin/career/jobs/{id}/premium → premium toggle

Route İsimlendirme Örneği

career.home
career.jobs.index
career.jobs.show
career.jobs.category
career.my.resumes.index
career.my.resumes.create
career.my.resumes.store
career.my.applications.index
career.employer.jobs.index
career.employer.applications.update-status

Gizlilik Kuralları

Telefon Numarası

  • CV'de telefon var ama gizli
  • Sadece başvuru yapılan firma görür
  • Model accessor ile kontrol
// CareerResume.php
public function getPhoneAttribute($value) {
    // Başvuru yapıldıysa göster
    // Yoksa mask'le veya gizle
}

CV Görünürlüğü

  • private Sadece sahibi görür
  • applied_only Başvurulan firmalar görür
  • public CV havuzunda görünür (sonraki aşama)

Uygulama Adımları (TODO)

FAZ 1 Modül Oluşturma
☐ module.sh ile Career modülü oluştur
☐ Tablo/model isimlerini career_ prefix'e çevir
☐ CareerCategory, CareerResume'e HasMedia ekle
FAZ 2 Migration (Onay Gerekli)
☐ career_categories migration
☐ career_jobs migration (tüm alanlar)
☐ career_resumes migration
☐ career_applications migration
FAZ 3 Mail Sistemi
☐ 5 Mail sınıfı oluştur
☐ Mail template'leri
☐ CareerApplicationObserver
FAZ 4 Admin Panel
☐ Livewire componentler (CRUD)
☐ Admin menü & route
☐ Öne çıkarma/premium toggle (admin)
FAZ 5 Frontend (Career Teması)
☐ Layout (header, footer)
☐ İlan sayfaları (liste, detay, kategori)
☐ CV sayfaları (oluştur, düzenle, önizle)
☐ Başvuru sayfaları
☐ İş veren sayfaları
FAZ 6 Test & Tamamlama
☐ Gizlilik testleri
☐ Mail testleri
☐ Responsive kontrol

Sonraki Aşamada Eklenebilecekler

CV Havuzu Tarama
Otomatik Eşleştirme
Ücretli Öne Çıkarma
İstatistikler/Raporlar
İş Alarmları
Mesajlaşma Sistemi

Versiyon Geçmişi

v5 - Olacak/olmayacak netleştirildi, fiyatlandırma kaldırıldı, mülakat sistemi sadeleştirildi
v4 - Tema yapısı, mail entegrasyonu, TODO listesi
v3 - Mesajlaşma kaldırıldı
v2 - career_ prefix standardı
v1 - İlk plan
Sayfa Taslaklarını Gör (Drafts)