#pragma once // İş Takip Query/Filter Engine (Dalga 2, plan §11) — MVP kapsamı: tek seviye // koşul listesi + grup mantığı (VE/VEYA), iç içe alt-grup YOK (plan §11.3'teki // tam ağaç V2'ye bırakıldı — kayıt sayısı/gerçek kullanım bu MVP'de karşılanır). // Motor bunu bilmez/yorumlamaz: FiltreGrup salt UI/servis katmanında yaşar, // _gorunum kaydına JSON olarak gömülür (istakip_sema.cpp'deki alan_semasi // deseniyle aynı: simdjson ile parse, elle string ile serialize). #include #include namespace fiko::istakip { struct IsKayit; } // namespace fiko::istakip namespace fiko { enum class FiltreOp { Esit, // = Esitsiz, // != Buyuk, // > Kucuk, // < BuyukEsit, // >= KucukEsit, // <= Icerir, // içerir Icermez, // içermez IleBaslar, // ile başlar IleBiter, // ile biter Bos, // boş BosDegil, // boş değil }; // UI dropdown'ları için: operatör listesi + görünen etiket + kod (JSON'a yazılan). const std::vector& filtreOperatorleri(); const char* filtreOpEtiket(FiltreOp op); const char* filtreOpKod(FiltreOp op); // serialize FiltreOp filtreOpCoz(const std::string& kod); // deserialize (bilinmezse Esit) bool filtreOpDegerGerekir(FiltreOp op); // Bos/BosDegil değer alanı istemez struct FiltreKosul { std::string alan; // IsKayit alan anahtarı ("durum" dahil) FiltreOp op = FiltreOp::Esit; std::string deger; }; struct FiltreGrup { std::string mantik = "VE"; // "VE" | "VEYA" — koşullar arası std::vector kosullar; bool bosMu() const { return kosullar.empty(); } }; // Tek koşulu bir kayıda uygular. bool kosulGecer(const FiltreKosul& k, const istakip::IsKayit& kayit); // Grubu bir kayıda uygular (VE: hepsi geçmeli, VEYA: biri geçmeli). Boş grup // her zaman geçer (filtre yok = hepsi görünür). bool filtreGecerMi(const FiltreGrup& g, const istakip::IsKayit& kayit); // _gorunum kaydında saklamak için JSON <-> FiltreGrup dönüşümü. std::string filtreSerialize(const FiltreGrup& g); FiltreGrup filtreCoz(const std::string& json); } // namespace fiko