import '../models/personel.dart'; /// Kart okuyunca yapılacak mantığı yönetir. /// /// Bir kart okunduğunda: /// - Bugün bu kişi için daha önce giriş yapıldıysa → Çıkış /// - Yapılmadıysa → Giriş class OkumaMantigi { Personel? _personel; GunDurumu _bugunDurum = GunDurumu(personelId: '', uid: '', girisYapti: false); /// Kart okutma beklenirken doldurulacak (personel ekleme ekranı için). void Function(String)? onPendingUid; Personel? get personel => _personel; GunDurumu get bugunDurum => _bugunDurum; /// Kart id ile kişiyi bulur. Personel? personelBul(String uid) { if (uid.isEmpty) return null; // Personel listesi servis tarafından doldurulur; burada eşleştirme yapılır. return _personelListesi.firstWhereOrNull((p) => p.id == uid); } List _personelListesi = []; set personelListesi(List list) => _personelListesi = list; /// Kart oku: bugünkü duruma göre giriş/çıkış belirle. /// Dönüş: {tip, personel, mesaj} OkumaSonuc kartOku(String uid) { final personel = personelBul(uid); final bugun = _bugunDurum; String tip; String mesaj; bool cikis = false; if (personel == null) { tip = 'bilinmiyor'; mesaj = 'Tanınıkart değil: $uid'; } else if (bugun.cikisYapilabilirMi()) { tip = 'cikis'; cikis = true; mesaj = '${personel.isim} — Çıkış'; } else { tip = 'giris'; mesaj = '${personel.isim} — Giriş'; } return OkumaSonuc( tip: tip, personel: personel, mesaj: mesaj, cikis: cikis, ); } /// Bugünkü durumu günceller (okuma sonucu doğrultusunda). void bugunDurumuGuncelle(String uid, String tip) { _bugunDurum = GunDurumu( personelId: uid, uid: uid, girisYapti: true, sonTip: tip, ); } } class OkumaSonuc { final String tip; // 'giris' | 'cikis' | 'bilinmiyor' final Personel? personel; final String mesaj; final bool cikis; OkumaSonuc({ required this.tip, required this.personel, required this.mesaj, required this.cikis, }); bool get basarili => tip != 'bilinmiyor'; } extension _ListX on List { Personel? firstWhereOrNull(bool Function(Personel) test) { for (final e in this) { if (test(e)) return e; } return null; } }