Çözmeye Çalıştığım Problem
Çözmeye Çalıştığım Problem
VMMS – bir voucher yönetim sistemi inşa etmeye başladığımda, en zor kısımlardan biri UI veya veritabanı şemasından ziyade workflow yönlendirmesiydi.
Bir voucher talebi sadece bir ofise gitmez. Belirli bir sırayla birden fazla departmana gider; her biri, bir sonraki aşamaya geçmeden önce süreci tamamlamak zorundadır.
Ve herhangi bir aşamada, bir departman:
- Adımını tamamlayabilir ve ileriye geçirebilir
- Tüm talebi reddedebilir
- Belgelerin eksik olduğu konusunda flag koyabilir ve süreci durdurabilir
Bunu düzgün bir şekilde yönetebilecek bir sistem gerekiyordu.
Nasıl Modelledim
Nasıl Modelledim
Her voucher türü, transaction_flows tablosunda saklanan yapılandırılabilir bir işlem akışına sahiptir:
Schema::create('transaction_flows', function (Blueprint $table) {
$table->id();
$table->foreignId('voucher_id')->constrained()->cascadeOnDelete();
$table->string('department');
$table->integer();
$table->timestamps();
});
Bir müşteri talep gönderdiğinde, sistem o voucher türü için akışı okur ve onu otomatik olarak ilk departmana yönlendirir.
İlerlemeyi İzleme
İlerlemeyi İzleme
Her seferinde bir departman bir talebi işlediğinde, bir denetim kaydı oluşturulur:
Schema::create(, function (Blueprint $table) {
$table->id();
$table->foreignId()->constrained()->cascadeOnDelete();
$table->string();
$table->timestamp()->nullable();
$table->timestamp()->nullable();
$table->date()->nullable();
$table->timestamps();
});
process_initiate bir departman sürece başladığında ayarlanır. process_accomplished ise bitirdiğinde ayarlanır. Eğer sadece process_initiate ayarlanmışsa, bu o anki aktif departmandır.
Aktif Departmanı Bulma
Aktif Departmanı Bulma
Bu beklediğimden daha karmaşıktı. İşte mantık:
$activeAudit = $auditTrails->first(
fn($a) => $a->process_initiate && !$a->process_accomplished
);
if ($activeAudit) {
return $activeAudit->processing_offices;
}
// Aktif denetim yoksa, bir sonraki adımı bul
$doneOrders = $auditTrails->filter(fn($a) => $a->process_accomplished)
->map(fn($a) => $flow->firstWhere(, $a->processing_offices)?->order_number ?? 0);
$lastDone = $doneOrders->max() ?? 0;
$nextStep = $flow->firstWhere(, $lastDone + 1);
return $nextStep?->department ?? ;
Zor olan kısım uç durumları yönetmekti:
- Bir departman atlanırsa ne yapılacak?
- Eksik belgeler için talep geri dönerse ne olur?
- Son departman yeni bitirdiyse ne olur?
Her biri için ayrı bir yönetim gerekiyordu.
Ön Yüzdeki Pipeline Stepper
Ön Yüzdeki Pipeline Stepper
Vue 3 tarafında, her departmanı bir adım olarak gösteren bir stepper bileşeni oluşturdum — yeşil tamamlanmış, puls eden aktif, gri ise beklemedeki.
const stepStatus = (req, step, stepIndex) => {
const audits = req.audit_trails ?? const accomplishedCount = auditsfiltera => aprocess_accomplished !== null
lengthif stepIndex accomplishedCountreturn done;
if stepIndex === accomplishedCountreturn active;
return pending;
Eksik Belgeler — Akışı Durdurma
Bir personel eksik belgeler için bir talebi flagladığında, akış durur. Müşteri bilgilendirilir ve belgeleri yüklemesi gerekir. İşlemlerin devam edebilmesi için gerekli belgeleri yüklemesi gerekir.
Bunu, hangi işlemlerin hangi kullanıcıdan belge beklediğini takip eden ayrı bir requirement_validations tablosuyla yönettim.
$missingDocIds = RequirementValidation::where(, )
->whereNull'resume_transaction'->pluck'transaction_id'->();
Bu resume_transaction doldurulduğunda, akış yeniden başlar ve talep işlemenin devamı için ilgili personele geri döner.
Öğrendiklerim
1. Akışları işlemden ayrı modellemek
transaction_flows‘u voucher_transactions‘dan ayırmak, bir voucher türü için işlem sırasını değiştirmeyi kolaylaştırdı.
2. Denetim kayıtları en iyi dostunuzdur
Her işlemi zaman damgaları ile saklamak, işleme sürelerini hesaplamayı, performansı izlemeyi ve ayrıca analizler oluşturmayı kolaylaştırdı.
3. Uç durumlar size yakalanacak
“mutlu yol” kolaydı; eksik belgeler, atlanan departmanlar ve reddedilen talepler ayrı bir işlem gerektiriyordu.
Sonuç
Pipeline izleyici artık VMMS’deki en kullanışlı özelliklerden biri. Müşteriler taleplerinin nerede olduğunu gerçek zamanlı olarak görebiliyor – artık yüz yüze takip etmek zorunda değiller.
İşleyişini görmek isterseniz:
🔴 Canlı demo: https://vmms-app-production.up.railway.app/login
VMMS, kullanmak veya onun üzerine inşa etmek için Gumroad’da mevcuttur:
👉 https://getvmms.gumroad.com/l/zeroqz
Herhangi bir sorunuz varsa yorumlarda cevaplamaktan mutluluk duyarım!
Kaynak: Orijinal Makale


