Birlikte çalıştığım her BES operatörü aynı sorgu düzenini uyguluyor: birisi bir katılımcının emekli olmaya hak kazanıp kazanmadığını sorduğu anda pipeline bunu hesaplıyor. Güncel doğum tarihini, güncel katkı başlangıç tarihini, ödenmiş dönemlerin güncel toplamını okuyor ve bir boolean değer döndürüyor. Temiz. Deterministik. Yeniden çalıştırıp aynı cevabı alabileceğiniz anlamda denetlenebilir.
Ancak önemli hiçbir anlamda denetlenebilir değil. Çünkü bugün aldığınız cevap, aynı sorgunun on sekiz ay önce ürettiği cevap değil ve ikiniz de nedenini bilmiyorsunuz.
Hak Kazanma Bir Hesaplama Değil, Yasal Bir Olaydır
Türkiye'de BES emeklilik hakkı iki iç içe geçmiş koşula dayanır: katılımcının sistemde en az on yıl katkı ödemiş olması ve kayıt olduğu tarihte yürürlükte olan mevzuatın tanımladığı yaş eşiğine ulaşmış olması gerekir. Her iki girdi de warehouse'unuzun yukarı akışında yer alır. Her ikisi de değişir.
- Katılımcı nüfus kaydını güncellediğinde doğum tarihleri düzeltilir
- Başka bir emeklilik şirketinden aktarılan bir fon yeniden sınıflandırıldığında katkı başlangıç tarihleri kayar
- Askıya alınmış bir katkı geriye dönük olarak geçerli işaretlendiğinde ödenen dönem sayıları yeniden hesaplanır
- SGK verileri mutabık kılındığında mevzuatın kendisi "katkı yılı" olarak neyin sayılacağını yeniden yorumlar
Bunların her biri meşru bir yukarı akış düzeltmesidir. Hiçbiri hata değildir. Ve her biri, geçmişte bir tarihte kimin hak sahibi olduğunu sessizce yeniden yazar.
Pipeline'ınız hak kazanmayı sorgu anında hesaplıyorsa, 14 Mart 2021'de katılımcı X'in o zamanki kurallara göre, o zaman kayıtlı olan doğum tarihi kullanılarak hak sahibi olduğuna dair hiçbir kaydınız yoktur. Yalnızca bugüne ait cevabınız vardır. Ve bir katılımcı 2021'den kalma, hak kazandığını gösteren bir çıktıyla gelirse, o çıktıyı yeniden üretemezsiniz. Onu üreten sistem artık sorgulanabilir bir biçimde mevcut değildir.
Bunun Gişede Görünümü
Bir katılımcı şubeye gelir. Altmış yaşında, 2013'te kayıt olmuş, on yıl kuralıyla emekli olmayı bekliyor. Operatör sorguyu çalıştırır. Sistem der ki: hak kazanamamış. Katkı süresi yetersiz.
Ne oldu? İki yıl önce, bir veri düzeltmesi, satın alınan bir portföyden gelen on sekiz aylık bir katkı dönemini yeniden sınıflandırdı. O aylar başlangıçta BES katkısı olarak yazılmıştı. Migration temizliği sırasında transfer bakiyesi olarak yeniden sınıflandırıldılar; bu bakiye birikmiş sermayeye sayılır ancak on yıllık hak kazanma saatine sayılmaz. Kimse katılımcıyı uyarmadı. Kimse mektup göndermedi. Pipeline sadece farklı bir cevap döndürmeye başladı.
Katılımcı haksız değil. Pipeline bugün haksız değil. Ancak 2013 ile yeniden sınıflandırma arasında sistemin bu katılımcıya — her yıllık ekstre, her mobil uygulama sorgusu, her şube sorgusu üzerinden — yolunda olduğunu söylediği gerçeğini yeniden inşa etmenin bir yolu yok.
Standart Pipeline'lar Burada Neden Başarısız Olur
Denetlediğim BES veri pipeline'larının çoğu aynı mimariyi paylaşıyor: gecelik ETL güncel durum tablolarını yükler, hak kazanma fonksiyonları güncel durumdan okur, mevzuat raporları çıktıları toplar. Hak kazanma fonksiyonu, güncel durum girdilerinin saf bir fonksiyonudur.
Yapısal sorun şudur: bu, yasal bir soruyu matematiksel bir soru olarak ele alır. Birinin BES kuralları altında emekliliğe hak kazanıp kazanmadığı, bir tablodaki sayılara ilişkin bir gerçek değildir. Kayıtlarınıza göre, zaman içinde her anda dünyanın durumunun ne olduğuna dair bir gerçektir. Bu bitemporal bir problemdir ve neredeyse hiç kimse bunu bitemporal olarak modellemez.
Eksik olanlar:
- Hak kazanmayla ilgili her alan için valid-time (bu doğum tarihi gerçek dünyada ne zaman geçerliydi?)
- Her düzeltme için transaction-time (sistemimiz buna ne zaman inanmaya başladı?)
- Türetilmiş değil, kaydedilmiş hak kazanma olayları — bir katılımcı bir eşiği geçtiğinde, bu geçiş yazılır, zaman damgası atılır ve asla yeniden hesaplanmaz
- Geriye dönük bir değişikliğin geçmişteki bir hak kazanma durumunu değiştirmiş olacağı zaman tetiklenen bildirim hook'ları
Bunlar olmadan, EGM'ye gönderdiğiniz mevzuat raporları snapshot tarihi için kendi içinde tutarlıdır, ancak geçen çeyrekte gönderdiğiniz raporlarla tutarlı değildir ve farkı açıklayamazsınız.
Çözüm Sıkıcı ve Yapısaldır
Hak kazanmayı hesapladığınız bir şey olarak ele almayı bırakın. Onu gerçekleşen bir şey olarak ele almaya başlayın.
Bir katılımcının durumu, şu anda kayıtlı olan doğum tarihi ve katkı geçmişi altında bir hak kazanma eşiğini geçecek şekilde değiştiğinde — bir olay yazın. Zaman damgalı. Değiştirilemez. Sebep kodlu. Geriye dönük bir düzeltme geçmişteki bir geçişi değiştirmiş olacağında, telafi edici bir olay yazın ve incelenmek üzere işaretleyin. Güncel durum görünümü hâlâ türetilebilir kalır, ancak artık bir tablodan değil, bir logdan türetilebilir.
Bu size üç şeye mal olur:
- Depolama, ki bu ihmal edilebilir
- Hak kazanma servisinin yeniden yazılması, ki kapsam konusunda dürüst olursanız iki çeyreklik bir projedir
- Politik sermaye, çünkü bu işletmeyi geçmişteki bir hak kazanmanın geriye dönük olarak geri alınması durumunda ne olacağını tanımlamaya zorlar — herkesin tanımsız bırakmaya memnun olduğu bir soru
Üçüncüsü, bunun neden asla inşa edilmediğidir. Mühendislik zor olduğu için değil, event-sourced hak kazanmanın operasyon ekibinin on yıldır sessizce ertelediği kararları açığa çıkarması yüzünden. Pipeline birinin geçmişi hakkında fikrini değiştirdiğinde, kim kime ne borçlu?
Pazartesi Ekibinize Sormanız Gerekenler
BES veri operasyonlarını yönetiyorsanız, üç soru:
- Herhangi bir katılımcının son beş yıl içinde herhangi bir tarihte aldığı hak kazanma cevabını tam olarak yeniden üretebiliyor musunuz?
- Yukarı akıştaki bir düzeltme geçmişteki bir hak kazanma durumunu değiştirdiğinde, katılımcıdan önce bunu öğrenen biri oluyor mu?
- Hak kazanma mantığınız bir fonksiyon mu, yoksa bir log mu?
Cevaplar hayır, hayır ve fonksiyon ise — bir hak kazanma sisteminiz yok. Hak kazanma sorularını yanıtlamak durumunda kalan bir rapor üretecine sahipsiniz ve altındaki veri her kaydığında sorulara farklı cevaplar vermeye devam edecek. Gişede duran katılımcı bir hata raporu değil. Fark eden ilk kişi.