Gece Vardiyası Hangi Güne Yazılır? Otel Personel Takibinden Bir Tartışma ve Çözüm
Bir otelde 23:00'te başlayıp ertesi sabah biten vardiyanın hangi güne yazılacağı sorusunun neden göründüğünden zor olduğunu, hangi seçeneklerin denendiğini ve hangi kuralda karar kılındığını anlatan proje notu.
Personel takip sisteminin en çok tartışılan konusu algoritma ya da arayüz değildi; bir cümleydi: "Cuma gecesi 23:00'te başlayıp Cumartesi 07:00'de biten vardiya hangi güne yazılır?" Bu yazı, o sorunun neden bu kadar ağır olduğunu, hangi çözümleri denediğimizi ve neden bugünkü kuralda karar kıldığımızı anlatıyor. Çalışma süresini hesaplama mantığının genelini çalışma süresi hesaplama yazısında bulabilirsiniz; burada yalnızca gece vardiyasına odaklanıyoruz.
Sorunun gerçek yüzü
Kart okuyucudan şu iki olay geliyor:
- Cuma 23:02 — GİRİŞ
- Cumartesi 07:05 — ÇIKIŞ
Takvime göre bu iki olay iki farklı güne düşüyor. Basit bir sistem günleri takvim gününe göre gruplar ve şunu görür: Cuma'da girişi var çıkışı yok, Cumartesi'de çıkışı var girişi yok. Sonuç: iki günün ikisi de "eksik kayıt" olur, çalışma süresi sıfır çıkar ve personel hem Cuma hem Cumartesi devamsız görünür. Üstelik yöneticiye "eksik çıkış" uyarısı gider. İlk sürümümüzde tam olarak bu oldu.
Denenen çözümler
1. Takvim günü, gece yarısında bölmek
Vardiyayı gece yarısında kesip 23:02–24:00'ı Cuma'ya (58 dakika), 00:00–07:05'i Cumartesi'ye (7 saat 5 dakika) yazmak. Muhasebe açısından mantıklı görünür: her takvim gününün gerçek çalışma süresi bellidir. Fakat sorunları var: günlük "en fazla 11 saat" ve "gece çalışması 7,5 saat" gibi sınırlar bir vardiya üzerinden değerlendirilir, parçalar üzerinden değil. Ayrıca bir çalışana "Cuma 1 saat çalıştın" demek doğru değil; kişi Cuma gecesi işe geldi. Bölme yaklaşımı raporu okunmaz hale getirdi.
2. Vardiyayı bittiği güne yazmak
Vardiya Cumartesi sabahı bittiği için Cumartesi'ye yazılır. Bu da savunulabilir; bazı işletmeler "hangi gün bitiyorsa o gün" der. Sorun: ay sonuna denk gelen vardiyalarda ortaya çıktı. Ayın son gecesi (ör. 31'i gecesi) başlayıp ertesi ayın 1'inde biten vardiya bir sonraki aya yazılıyor; oysa personel o gece ay içinde çalışmaya başladı. Ay kapanışında "bu kişi bu ay şu kadar çalıştı" raporu, kişiye yapılan ödeme ile uyuşmadı.
3. Vardiyayı başladığı güne yazmak (seçtiğimiz)
Vardiya, girişin yapıldığı güne yazılır. Cuma 23:02 → Cumartesi 07:05 vardiyası tamamı Cuma'nın vardiyasıdır; süresi 8 saat 3 dakika olarak Cuma'ya işlenir. Bu kuralın bizim için avantajları:
- Personelin "bu gece Cuma vardiyam" sezgisiyle uyuşur; bir vardiya bir kayıt demektir.
- Ay sonu raporlarında vardiya hangi ayda başladıysa orada kalır; aylık toplam ile ödeme tutarlıdır.
- Haftalık 45 saat, günlük 11 saat, gece 7,5 saat gibi sınırlar tek bir vardiya üzerinden değerlendirilebilir.
- Aynı mantık tek bir yerde yazıldığı için tüm raporlar (puantaj, analiz, Excel) aynı sonucu verir.
Bedeli de var: Cumartesi günü takvim görünümünde "bu kişi Cumartesi çalıştı mı?" sorusuna cevap vermek için önceki günün açık vardiyasına bakmak gerekir. Bunu "vardiya listesi" ile "takvim doluluğu" ekranlarını ayırarak çözdük: ilki başladığı güne göre, ikincisi saat bazında gerçekten kimin içeride olduğuna göre çalışır.
Algoritma: kişi bazında, sıralı eşleştirme
Eşleştirme, her kişinin olaylarını zaman sırasına dizip GİRİŞ'i bir sonraki ÇIKIŞ'la eşleştirmekten ibarettir. Kritik nokta, bunu günlere bölünmüş veri üzerinde yapmamak. Olaylar gün bazında gruplanırsa Cuma'nın girişi ile Cumartesi'nin çıkışı birbirini hiç bulamaz. Bu yüzden eşleştirme tüm olay akışında yapılır, vardiyanın gün etiketi ise girişin tarihinden türetilir:
def vardiyalari_esle(hareketler):
"""hareketler: bir kişiye ait, zaman sırasına dizili (zaman, yon) listesi."""
vardiyalar, acik = [], None
for zaman, yon in hareketler:
if yon == "GIRIS":
if acik is not None:
# önceki giriş kapanmadan yeni giriş: önceki eksik çıkış
vardiyalar.append({"gun": acik.date(), "giris": acik, "cikis": None})
acik = zaman
elif yon == "CIKIS" and acik is not None:
vardiyalar.append({"gun": acik.date(), "giris": acik, "cikis": zaman})
acik = None
# açık giriş olmadan gelen çıkış: yetim çıkış, ayrı raporlanır
if acik is not None:
vardiyalar.append({"gun": acik.date(), "giris": acik, "cikis": None})
return vardiyalar
Burada iki güvenlik önlemi var. Bir giriş açıkken ikinci bir giriş gelirse önceki vardiya "eksik çıkış" olarak işaretlenir; sessizce üstüne yazılmaz. Giriş olmadan gelen çıkış da ayrı bir "yetim çıkış" olarak raporlanır. Ayrıca makul bir üst süre kontrolü eklemek gerekir: örneğin açık kalan bir girişten 16 saat sonra gelen çıkış büyük olasılıkla aynı vardiyanın çıkışı değildir.
Sınır durumları
- Çift okutma: Aynı kartın birkaç saniye arayla iki kez okutulması tek olay sayılır; aksi halde sahte "eksik çıkış" çıkar.
- Uzun açık vardiya: Çıkışı unutan kişinin girişi ertesi günün sabahına kadar açık kalır ve ertesi gün yeni giriş yapınca eşleşmeyi bozar. Üst süre sınırı bu yüzden gerekli.
- Vardiya ortasında gece yarısı: Kural bunu zaten çözer; çünkü gün etiketi girişten gelir.
- Yaz/kış saati: Türkiye sabit saat kullandığı için sorun yok; ancak sunucu saat dilimini yanlış ayarlarsanız tüm vardiyalar kayar.
timedatectlile kontrol edin. - Giriş-çıkışın aynı dakikada olması: Süre sıfır olan vardiyalar şüpheli sayılıp ayrı listelenir.
Yan etki: raporun diğer sayfaları
Kuralı yalnızca bir raporda değiştirmek yetmedi. Aylık puantaj, devamsızlık analizi ve Excel çıktıları ayrı kodlarla hesaplandığında Cuma'nın gece vardiyası bir yerde Cuma, başka yerde Cumartesi görünüyordu. Aynı vardiya iki sayfada farklı gün göstermek, güveni zedeleyen bir şeydir. Bu yüzden tüm raporların aynı eşleştirme fonksiyonunu çağırmasını sağladık; kural değişirse tek yerde değişiyor. Bu, yazılımda "tek doğruluk kaynağı" ilkesinin küçük bir örneği.
Bu kuralı kendi işletmenize uygularken
Hangi kuralı seçerseniz seçin, yazılı hale getirin ve personele duyurun. Bordro, izin ve fazla mesai hesabı bu kurala bağlı olduğu için sonradan değiştirmek geçmiş kayıtları etkiler. Kuralı yazarken kendinize şu üç soruyu sorun: Ay sonunda toplamlar ödemeyle uyuşuyor mu? Günlük ve gece sınırları bir vardiya üzerinden mi değerlendiriliyor? Personel raporu görünce "bu doğru" diyebiliyor mu? Kendi vardiyanızı hesaplamak için vardiya ve fazla mesai hesaplayıcıyı kullanabilirsiniz; ancak hesapların hukuki yorumunu bir uzmana danışmayı unutmayın.