Giriş
VMMS’yi geliştirirken gördüğüm en yaygın sorunlardan biri şuydu: belgeler oluşturuluyor, sonraki departmana e-posta ile gönderiliyor, birinin gelen kutusunda günlerce bekliyor ve yönetim “bu fiş nerede?” diye sorduğunda — kimse bilmiyor.
Bu makalede, bu sorunu çözen esnek bir çok departman onay iş akışını Laravel kullanarak nasıl oluşturduğumu anlatacağım.
Temel Konsept
Onay adımlarını sabit kodlamak yerine, her belgenin bir güncel aşaması olan ve bir sonraki aşamanın veritabanında depolanan departman yapılandırmasına göre belirlendiği bir işlem hattı oluşturdum — kodda değil.
Bu, departmanları bir satır PHP kodu dokunmadan ekleyip çıkarabileceğiniz veya yeniden sıralayabileceğiniz anlamına geliyor.
Veritabanı Yapısı
İşte ana tablolar:
// vouchers table
Schema::create(, function (Blueprint $table) {
$table->id();
$table->string();
$table->foreignId()->constrained();
$table->enum(, [, , ]);
$table->timestamps();
});
// departments table
Schema::create(, function (Blueprint $table) {
$table->id();
$table->string();
$table->integer(); // yönlendirme sırasını belirler
$table->timestamps();
});
Routing Mantığı
Bir personel fişi onayladığında, otomatik olarak sipariş sütununa dayalı olarak bir sonraki departmana geçer:
public function approve(Voucher $voucher)
{
$currentOrder = $voucher->department->order;
$nextDepartment = Department::where(, , $currentOrder)
->orderBy()
->first();
if ($nextDepartment) {
$voucher->update([
=> $nextDepartment->id,
=> ]);
} else {
// Artık departman yok — fiş tamamlandı
$voucher->update([=> ]);
}
// E-posta bildirimleri için olay tetikleyin
event(new VoucherAdvanced($voucher));
}
E-posta Bildirimleri
Her seferinde fiş bir sonraki aşamaya geçtiğinde e-posta bildirimlerini tetiklemek için Laravel Olayları ve Dinleyicileri kullandım:
// VoucherAdvanced Event
class VoucherAdvanced
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct(public Voucher $voucher) {}
}
// Dinleyici
class SendVoucherNotification implements ShouldQueue
{
public function handle(VoucherAdvanced $event): void
{
$voucher = $event->voucher;
$staff = $voucher->department->staff;
foreach ($staff as $member) {
Mail::to($member->email)->send(new VoucherNotification($voucher));
}
}
}
Rol Tabanlı Erişim
Her departman yalnızca kendilerine atanan fişleri görür ve bu işlem Laravel Politikalıları kullanarak yapılır:
public function view(User $user, Voucher $voucher): bool
{
return $user->department_id === $voucher->current_department_id
|| $user->role === ;
}
Gerçek Zamanlı İşlem Hattı İzleyici
Kullanıcılara bir fişin nerede olduğunu gerçek zamanlı olarak göstermek için Vue 3 ön yüzünde güncel departmanı okuyan ve bunu bir ilerleme göstergesi olarak render eden basit bir durum izleyici oluşturdum — websocket kullanmaya gerek yok, yalnızca bir eylem üzerinde temiz bir Inertia.js sayfa yenilemesi yeterli.
Öğrendiklerim
Routing mantığını veritabanında tutun, kodda değil — bu, sistemi çok daha esnek hale getiriyor
Laravel Olayları bildirimler için mükemmel — temiz, kuyruğa alınabilir ve genişletmesi kolay
Middleware yerine politikalar kullanarak satır bazında erişim — karmaşık rol kurallarınız olduğunda çok daha temiz bir yöntem
Sonuç
Bu model, yalnızca fişler için değil, her türlü çok adımlı onay sistemi için çalışır. İzin talepleri, satın alma siparişleri veya birden fazla departmandan geçmesi gereken herhangi bir belge için kullanılabilir.
Tam sistemi görmek isterseniz, VMMS’in canlı demosuna göz atın: https://vmms-app-production.up.railway.app/login
Herhangi bir sorunuz varsa, yorumlarda memnuniyetle yanıtlarım!
Kaynak: Orijinal Makale


