{
  "urun": "NetEsnaf Cloud ERP",
  "aciklama": "NetEsnaf ERP kullanim kilavuzu - makine-okunur surum. Tum moduller, ekranlar, butonlar, islemler ve neden-sonuc iliskileri. Bir yapay zeka asistanina verildiginde sistemi uctan uca ogretmek/entegre etmek icin kullanilir.",
  "surum": "1.0",
  "olusturma": "2026-07-11",
  "domain_notu": "Alan adi sabit degildir: demo=netesnaf.com, urun=netesnaf.net. Ornek adreslerde kendi alan adinizi kullanin.",
  "istatistik": {
    "modul": 26,
    "ekran": 304,
    "buton": 1059,
    "event": 576
  },
  "moduller": [
    {
      "slug": "musteri-tedarikci",
      "title": "Müşteri & Tedarikçi (Cari)",
      "icon": "👥",
      "modul": "musteritedarikci",
      "ad": "Müşteri ve Tedarikçi (Cari Yönetimi)",
      "ozet": "Bu modül işletmenin tüm müşteri ve tedarikçi (cari) kartlarını, bunların grup/alt-grup hiyerarşisini, yetkili kişi ve teslimat adreslerini yönetir; cari bazında tahsilat, ödeme, virman (cariler arası bakiye aktarımı) ve tahakkuk (faturasız borç/alacak fişi) işlemlerini kaydeder. Ayrıca cari hareketlerini raporlar ve risk/sadakat/disiplin/yaşlandırma gibi karar destek analizleriyle vadeli satış kararlarına yön verir. Kaydedilen tahsilat/ödeme işlemleri kasaya ve cari hareket defterine yansır; yeni cari, tahsilat ve ödeme olaylarında otomasyon (n8n) tetikleyicileri devreye girer. Ayrıca cari hesaplar çok para birimli (çok dövizli) çalışır: bir cari ile TL + N döviz (USD, EURO...) çalışıldığında her para birimi cinsinden bakiye AYRI takip edilir (saf döviz takibi, kur farkı yok). Bakiye ekranlarında 'Görünüm: Genel / Döviz Bazlı' seçimi vardır (varsayılan Genel, mevcut davranış korunur). Ayrıca cari işlemleri taksitlendirilip vade vade takip edilir: bir fatura peşinat + eşit/serbest taksit olarak bölünebilir veya faturadan bağımsız taksit planı kurulabilir; her taksit ayrı vade kaydı (EVRAK_TIP=104) olarak cariye işlenir, cari kartındaki Taksitler sekmesinde geciken/yaklaşan/kalan gösterilir, vade yaklaşınca/geçince otomatik SMS/e-posta hatırlatma tetiklenir ve tahsilat girildikçe taksit otomatik kapanır (tahsilat iptalinde ters kayıtla geri açılır).",
      "modul_iliskiler": [
        "kasa",
        "fatura",
        "irsaliye",
        "masraf",
        "proje/crm",
        "e-belge (e-fatura/e-irsaliye)",
        "otomasyon (n8n)",
        "b2b musteri portali"
      ],
      "ekranlar": [
        {
          "id": "gruplar",
          "baslik": "Gruplar",
          "yol": "/ekran/musteritedarikci/tanim/gruplar",
          "sub": "tanim",
          "amac": "Müşteri ve tedarikçi kartlarını kategorilere ayırmak için grup ve alt grup (ağaç yapısı) tanımlarsınız. Örnek: 'Bayiler', 'Perakende Müşteriler', 'Hammadde Tedarikçileri'.",
          "neden": "Cariler gruplandığında listeleme, filtreleme ve raporlarda cariyi gruba göre süzebilir, satış/tahsilat analizini kategori bazında yapabilirsiniz. Modülü kullanmaya başlamadan önce kurulması önerilen temel tanım ekranıdır.",
          "nasil": [
            "Formda 'Üst Grup' seçin (ana grup açıyorsanız boş bırakın), bir alt grup açıyorsanız üst grubunu seçin.",
            "'Grup Adı' yazın ve durumunu Aktif/Pasif seçin.",
            "KAYDET'e basın; yeni grup alttaki ağaç listesinde görünür.",
            "Var olan bir grubu düzenlemek için satırdaki İŞLEMLER > Düzenle'yi kullanın.",
            "Bir gruba alt grup eklemek için İŞLEMLER > Alt Grup'a tıklayın.",
            "Kullanılmayan grubu İŞLEMLER > Sil ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Formdaki grup bilgisini kaydeder veya günceller",
              "sonuc": "cari_grup tablosuna yeni kayıt eklenir ya da mevcut kayıt güncellenir, liste yenilenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu temizler / iptal eder",
              "sonuc": "Değişiklik yapılmadan formdan çıkılır",
              "renk": "ghost"
            },
            {
              "ad": "Alt Grup",
              "islev": "Seçili grubun altına yeni alt grup ekleme moduna geçer",
              "sonuc": "Form üst grup seçili gelir, kaydedilince alt grup oluşur",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Grubu düzenlemek için formu doldurur",
              "sonuc": "Grup bilgileri forma yüklenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Grubu siler (onay ister)",
              "sonuc": "cari_grup kaydı DURUM=-1 yapılarak pasifleştirilir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "grupekle",
              "tetik": "KAYDET butonu",
              "etki": "cari_grup tablosuna insert (yeni) veya update (recid varsa); AD, PARENT_ID, DURUM alanları yazılır",
              "neden_sonuc": "Grup oluşturunca carileri o gruba atayabilirsiniz; grup adını boş bırakırsanız kayıt olmaz, üst grubu yanlış seçerseniz cari hiyerarşisi karışır."
            },
            {
              "ad": "grupsil",
              "tetik": "Sil butonu (onaylı)",
              "etki": "cari_grup kaydı DURUM=-1 (soft delete) yapılır",
              "neden_sonuc": "Kullanılmayan grubu temizler; ancak gruba bağlı cariler varsa onların grup bağı boşa düşer, silmeden önce carileri başka gruba taşımak güvenlidir."
            }
          ],
          "iliskiler": [
            "cari (kartliste)"
          ],
          "ipuclari": [
            "Grupları alt gruplara bölerek (ağaç yapısı) sınıflandırabilirsiniz, ama çok derin hiyerarşi filtrelemeyi zorlaştırır.",
            "Silme işlemi kaydı fiziksel silmez (DURUM=-1), yanlışlıkla silinen grup teknik olarak geri getirilebilir.",
            "Pasif yapılan grup yeni cari atamasında görünmez ama eski cariler bağlı kalır."
          ]
        },
        {
          "id": "kartliste",
          "baslik": "Müşteri & Tedarikçi",
          "yol": "/ekran/musteritedarikci/islem/kartliste",
          "sub": "islem",
          "amac": "Tüm müşteri ve tedarikçi kartlarınızın ana listesidir. Buradan yeni cari kartı ekler, mevcut kartı düzenler, detayına girer, ekstre alır ve silersiniz.",
          "neden": "Cari kartı sistemin çekirdeğidir: fatura, irsaliye, tahsilat, ödeme hepsi bir cariye bağlanır. Doğru VKN, ünvan ve iletişim bilgisi girilmiş cari, e-fatura ve mutabakat süreçlerinin temelidir.",
          "nasil": [
            "Sağ üstteki 'Kart Ekle' ile yeni müşteri/tedarikçi kartı açın.",
            "Kart formunda ünvan, VKN, vergi dairesi, adres, telefon ve e-posta bilgilerini girin; VKN 10+ hane ise sistem aynı VKN'li mevcut cariyi kontrol eder ve e-dönüşüm aktifse ünvan/adres bilgisini sorgulayabilir.",
            "Aramak için sağ üstteki Filtrele ile kod, ünvan, grup, kayıt tarihi veya anahtar kelimeye göre süzün.",
            "Bir carinin işlem geçmişi, bakiyesi, fatura/irsaliye/not/adres bilgileri için satırdaki İŞLEMLER > Detay'a girin.",
            "Bilgi değişikliği için İŞLEMLER > Düzenle kullanın.",
            "Belirli bir müşteriye e-fatura/e-arşiv/e-irsaliye yerine kağıt belge kesmek için o carinin kartında 'Bu cariye e-belge kesme' seçeneğini işaretleyin; firmanız e-dönüşüme geçmiş olsa bile yalnız o cariye kesilen fatura ve irsaliyeler kağıt olarak düzenlenir.",
            "Listeyi EXCEL veya YAZDIR ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Kart Ekle",
              "islev": "Yeni cari kartı ekleme ekranını açar",
              "sonuc": "Boş cari kart formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Kod, ünvan, grup, tarih ve anahtar kelimeye göre listeyi süzer",
              "sonuc": "Kriterlere uyan cariler listelenir",
              "renk": "accent"
            },
            {
              "ad": "Detay",
              "islev": "Carinin kart detay ekranını açar (bakiye, hareket, fatura, not, adres, yetkili)",
              "sonuc": "kartdetay ekranına gidilir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Cari kart bilgilerini düzenler",
              "sonuc": "kart formu dolu açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Cari kartı siler (onay ister)",
              "sonuc": "cari_kart DURUM=-1 yapılır",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel'e aktarır",
              "sonuc": "Filtrelenmiş cari listesi indirilir",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Listeyi yazdırılabilir formatta hazırlar",
              "sonuc": "Yazdırma sayfası açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "kartekle",
              "tetik": "Kart formunda KAYDET",
              "etki": "cari_kart tablosuna insert (yeni, otomatik KOD üretilir) veya update; il/ilçe adları, e-fatura/e-irsaliye durumu, vade/iskonto ve varsa B2B kullanıcı/şifre alanları yazılır",
              "neden_sonuc": "Cari kaydedilince ona fatura kesip tahsilat işleyebilirsiniz. Yeni kayıtta 'CARI_OLUSTURULDU' otomasyonu tetiklenir; VKN duplikasyon kontrolü açıksa aynı VKN'li kayıt sizi mevcut karta yönlendirerek mükerrer cariyi önler."
            },
            {
              "ad": "vknkontrol",
              "tetik": "Yeni kartta VKN 10+ hane girilince (kaydetmeden önce)",
              "etki": "Ayar kapalıysa cari_kart içinde aynı VKN'yi arar (DURUM>=0), bulunan ID/KOD/UNVAN'ı ve düzenleme linkini döner",
              "neden_sonuc": "Aynı vergi numaralı cari zaten varsa uyarı verip mevcut kayda yönlendirir; 'aynı VKN ile kayda izin ver' ayarı (vkn_tekrar_kayit=1) açıksa kontrol yapılmaz. Bu kontrol mükerrer cari ve karışık bakiye oluşmasını engeller."
            },
            {
              "ad": "kartsil",
              "tetik": "Sil butonu (onaylı)",
              "etki": "cari_kart DURUM=-1 (soft delete)",
              "neden_sonuc": "Kartı listeden kaldırır; geçmiş hareketleri korunur ama yeni işlem yapılamaz, hatalı silmede kayıt teknik olarak geri getirilebilir."
            },
            {
              "ad": "kartyetkiliekle",
              "tetik": "Kart detayında yetkili ekle/kaydet",
              "etki": "cari_kart_yetkililer tablosuna insert/update (görev, ad soyad, telefon, e-posta)",
              "neden_sonuc": "Cariye ait irtibat kişilerini kaydeder; doğru yetkili bilgisi tahsilat ve iletişimi hızlandırır."
            },
            {
              "ad": "kartadresekle",
              "tetik": "Kart detayında teslimat adresi ekle/kaydet",
              "etki": "cari_teslimat_adres tablosuna insert/update; varsayılan işaretlenirse diğer adresler sıralamada geri atılır",
              "neden_sonuc": "Çok şubeli müşteride farklı sevk adresleri tanımlanır; irsaliye/fatura sevk adresini buradan seçersiniz."
            },
            {
              "ad": "notekle",
              "tetik": "Kart detayı Notlar sekmesinde not ekle",
              "etki": "notlar tablosuna insert (REL_TYPE=2, REL_ID=cari); başlık zorunlu, SIRA otomatik artırılır",
              "neden_sonuc": "Cariyle ilgili görüşme/uyarı notları tutulur; kurumsal hafıza oluşur, personel değişse de bilgi kaybolmaz."
            }
          ],
          "iliskiler": [
            "cari",
            "kasa",
            "fatura",
            "irsaliye",
            "e-belge",
            "proje/crm",
            "b2b musteri portali",
            "notlar"
          ],
          "ipuclari": [
            "VKN'yi 10 haneden fazla girip beklerseniz sistem aynı VKN'li mevcut cariyi kontrol eder; e-dönüşüm aktifse ünvan/vergi dairesi/adres de otomatik dolabilir.",
            "Aynı VKN ile ikinci kez kayıt açmaya çalışırsanız (ayar kapalıysa) sistem sizi eski karta yönlendirir; mükerrer cari açmayın.",
            "Kod alanını boş bırakırsanız sistem otomatik sıra numarası verir.",
            "Detay ekranı bakiye, son hareketler, fatura, irsaliye, ödeme/tahsilat, not ve teslimat adreslerini tek yerde toplar.",
            "Cari kart detayında, cari birden fazla para biriminde hareket görmüşse Toplam bakiyenin altında 'Döviz Bazlı Bakiye' kırılımı (her para birimi için net borç/alacak) gösterilir. Aynı kırılım Cari 360 penceresinde (masaüstü ve saha) de vardır.",
            "Cari kartındaki 'Bu cariye e-belge kesme' seçeneğiyle, firmanız e-dönüşüme (e-fatura/e-arşiv/e-irsaliye) geçmiş olsa bile belirli bir müşteriye kağıt fatura/irsaliye kesebilirsiniz; ayar cari kartındadır ve yalnız o cariyi etkiler, diğer carilerde e-belge akışı aynen sürer.",
            "Cari kodu: Kod alanını boş bırakabilirsiniz — kaydettiğinizde sıradaki numara otomatik verilir. Numara ekranı açtığınızda değil, kaydettiğinizde üretilir; vazgeçtiğiniz kayıtlar numara harcamaz. Kendi kodunuzu yazarsanız o kullanılır, ancak başka bir carinin kodunu yazamazsınız; sistem uyarır. Mevcut bir kartı düzenlerken kodu silerseniz kart kodsuz kalmaz, yeni bir kod üretilir."
          ]
        },
        {
          "id": "tahsilatliste",
          "baslik": "Tahsilat",
          "yol": "/ekran/musteritedarikci/islem/tahsilatliste",
          "sub": "islem",
          "amac": "Müşterilerden alınan (tahsil edilen) paraların listesidir. Buradan yeni tahsilat fişi oluşturur, mevcut tahsilatları listeler, yazdırır, düzenler ve silersiniz.",
          "neden": "Bir müşteriden para aldığınızda tahsilat fişi keserek hem kasanıza/bankanıza girişi işler hem de müşterinin borcunu düşürürsünüz. Doğru tahsilat kaydı cari bakiyenin ve nakit durumunun doğru olmasını sağlar.",
          "nasil": [
            "Sağ üstteki 'Tahsilat Ekle' ile yeni tahsilat fişi açın.",
            "Kasa/banka hesabını, müşteriyi, tutarı, tarihi ve açıklamayı girin.",
            "Kaydettiğinizde para seçilen kasaya girer, müşterinin borcu azalır.",
            "Geçmiş tahsilatları görmek için listeyi kullanın, gerekiyorsa Filtrele ile cari/kasa/tarih/evrak no'ya göre süzün.",
            "Fişi 'Fiş Yazdır' veya 'Şablon Yazdır' ile bastırın.",
            "Hatalı fişi Düzenle ya da Sil ile yönetin, listeyi EXCEL'e aktarın."
          ],
          "butonlar": [
            {
              "ad": "Tahsilat Ekle",
              "islev": "Yeni tahsilat fişi ekranını açar",
              "sonuc": "Tahsilat giriş formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, işlem yeri (kasa), evrak no, tarih, etiket ve projeye göre süzer",
              "sonuc": "Kriterlere uyan tahsilatlar listelenir",
              "renk": "accent"
            },
            {
              "ad": "Fiş Yazdır",
              "islev": "Tahsilat makbuzunu yazdırır",
              "sonuc": "Tahsilat fişi çıktısı açılır",
              "renk": "ghost"
            },
            {
              "ad": "Şablon Yazdır",
              "islev": "Tanımlı şablonla çıktı alır",
              "sonuc": "Şablon yazdırma penceresi açılır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Tahsilat fişini düzenler",
              "sonuc": "Fiş düzenleme ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Tahsilat fişini siler (onay ister)",
              "sonuc": "Fiş, kasa hareketi ve cari hareketi geri alınır",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel'e aktarır",
              "sonuc": "Tahsilat listesi indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "tahsilatekle",
              "tetik": "Tahsilat formunda KAYDET",
              "etki": "kasa_fis (EVRAK_TIP=201) + kasa_hareket girişi ve cari_hareket (müşteriyi alacaklandırma, ISLEM_TIP=0) oluşur; aracı ödeme kuruluşu (kasa TIP=5) ise komisyon hesaplanır, aracı cariye borç hareketi ve tahmini ödeme tarihi (bekleme günü) üretilir",
              "neden_sonuc": "Müşteriden alınan para kasaya/bankaya girer ve müşterinin borcu azalır; fişi kesmezseniz para sistemde görünmez ve cari bakiye şişik kalır. Yeni tahsilatta 'TAHSILAT_YAPILDI' otomasyonu tetiklenir."
            },
            {
              "ad": "caribilgi",
              "tetik": "Fişte müşteri seçilince (ekstre/bakiye önizleme)",
              "etki": "Okuma amaçlı; carinin borç/alacak özeti ve son hareketleri getirilir",
              "neden_sonuc": "İşlem yaparken müşterinin güncel bakiyesini görürsünüz; yanlış cariye tahsilat işlemeyi önler."
            },
            {
              "ad": "tahsilatsil",
              "tetik": "Sil butonu (onaylı)",
              "etki": "İlgili kasa_fis, kasa_hareket ve cari_hareket kayıtları DURUM=-1 yapılır",
              "neden_sonuc": "Yanlış tahsilatı tümüyle geri alır (kasa ve cari eş zamanlı düzelir); silmezseniz kasa fazlası ve hatalı düşük cari bakiye oluşur."
            }
          ],
          "iliskiler": [
            "kasa",
            "cari",
            "proje/crm",
            "masraf (aracı ödeme komisyonu)"
          ],
          "ipuclari": [
            "Aracı ödeme kuruluşu (POS/pazaryeri) tipi kasa seçerseniz komisyon otomatik hesaplanır ve bekleme gününe göre tahmini ödeme tarihi belirlenir.",
            "Tahsilatı sildiğinizde kasa girişi de otomatik geri alınır, ayrıca kasa fişini elle silmenize gerek yoktur.",
            "Filtrede tarih aralığını daraltmak büyük listelerde performansı artırır."
          ]
        },
        {
          "id": "odemeliste",
          "baslik": "Ödeme",
          "yol": "/ekran/musteritedarikci/islem/odemeliste",
          "sub": "islem",
          "amac": "Tedarikçilere/carilere yapılan (çıkan) ödemelerin listesidir. Yeni ödeme fişi oluşturur, ödemeleri listeler, yazdırır, düzenler ve silersiniz.",
          "neden": "Bir tedarikçiye para ödediğinizde ödeme fişi keserek kasanızdan/bankanızdan çıkışı işler ve tedarikçiye olan borcunuzu düşürürsünüz. Ayrıca işlem ücreti (havale/EFT masrafı) ayrı olarak kaydedilebilir.",
          "nasil": [
            "Sağ üstteki 'Ödeme Ekle' ile yeni ödeme fişi açın.",
            "Kasa/banka hesabını, cariyi, tutarı, tarihi ve açıklamayı girin.",
            "Varsa işlem ücreti (masraf) tutarını girin; ödeme tipine göre bu alan açılır.",
            "Kaydedince para kasadan çıkar, tedarikçiye olan borcunuz azalır.",
            "Geçmiş ödemeleri Filtrele ile cari/kasa/tarih/evrak no bazında süzün.",
            "Fişi Yazdır, gerekirse Düzenle veya Sil, listeyi EXCEL'e aktarın."
          ],
          "butonlar": [
            {
              "ad": "Ödeme Ekle",
              "islev": "Yeni ödeme fişi ekranını açar",
              "sonuc": "Ödeme giriş formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, işlem yeri, evrak no, tarih, etiket, projeye göre süzer",
              "sonuc": "Kriterlere uyan ödemeler listelenir",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Ödeme fişini/şablonu yazdırır",
              "sonuc": "Yazdırma penceresi açılır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Ödeme fişini düzenler",
              "sonuc": "Fiş düzenleme ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Ödeme fişini siler (onay ister)",
              "sonuc": "Fiş, kasa hareketi ve cari hareketi geri alınır",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel'e aktarır",
              "sonuc": "Ödeme listesi indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "odemeekle",
              "tetik": "Ödeme formunda KAYDET",
              "etki": "kasa_fis (EVRAK_TIP=202) + kasa_hareket çıkışı ve cari_hareket (borçlandırma) oluşur; işlem ücreti varsa ayrı kasa_hareket satırı eklenir",
              "neden_sonuc": "Tedarikçiye ödenen para kasadan düşer ve borcunuz azalır; fişi kesmezseniz kasa şişik ve borç yüksek görünür. Yeni ödemede 'ODEME_YAPILDI' otomasyonu tetiklenir."
            },
            {
              "ad": "caribilgi",
              "tetik": "Fişte cari seçilince",
              "etki": "Okuma amaçlı; carinin borç/alacak özeti ve son hareketleri getirilir",
              "neden_sonuc": "Ödeme öncesi tedarikçiye ne kadar borçlu olduğunuzu görürsünüz, fazla ödemeyi önler."
            },
            {
              "ad": "odemesil",
              "tetik": "Sil butonu (onaylı)",
              "etki": "İlgili kasa_fis, kasa_hareket ve cari_hareket DURUM=-1 yapılır",
              "neden_sonuc": "Yanlış ödemeyi kasa ve cari birlikte düzelterek geri alır; silmezseniz kasa eksiği ve şişik borç azalması oluşur."
            }
          ],
          "iliskiler": [
            "kasa",
            "cari",
            "proje/crm"
          ],
          "ipuclari": [
            "Havale/EFT masrafını 'işlem ücreti' olarak girerseniz cari borcuna karışmadan ayrı kasa hareketi olarak işlenir.",
            "Ödeme silindiğinde kasa çıkışı da otomatik geri alınır.",
            "İşlem tipine göre (banka/nakit) işlem ücreti alanı otomatik açılıp kapanır."
          ]
        },
        {
          "id": "virmanliste",
          "baslik": "Virman",
          "yol": "/ekran/musteritedarikci/islem/virmanliste",
          "sub": "islem",
          "amac": "İki cari hesap arasında bakiye aktarımı (virman) yapılan işlemlerin listesidir. Bir carinin borç/alacağını başka bir cariye taşımak için virman fişi oluşturursunuz.",
          "neden": "Aynı kişinin/firmanın birden çok cari kaydı olduğunda, ya da bir borcun başka bir cariye devredilmesi gerektiğinde, para hareketi olmadan iki cari arasında bakiye aktarımı yaparsınız. Kasa etkilenmez, sadece cari defterleri düzeltilir.",
          "nasil": [
            "Sağ üstteki 'Virman İşlemi Yap' ile yeni virman fişi açın.",
            "Kaynak cariyi (bakiyenin çıkacağı) ve hedef cariyi (bakiyenin gideceği) seçin.",
            "Tutar, tarih ve açıklamayı girin.",
            "Kaydedince kaynak cariye çıkış, hedef cariye giriş hareketi işlenir.",
            "Geçmiş virmanları listeden görün, Filtrele ile cari/evrak/tarih bazında süzün.",
            "Gerekirse Düzenle veya Sil ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "Virman İşlemi Yap",
              "islev": "Yeni virman fişi ekranını açar",
              "sonuc": "Virman giriş formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, evrak no ve tarihe göre süzer",
              "sonuc": "Kriterlere uyan virmanlar listelenir",
              "renk": "accent"
            },
            {
              "ad": "Ekstre",
              "islev": "Seçili carinin bakiye/ekstre önizlemesini açar",
              "sonuc": "Cari bilgi modalı açılır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Virman fişini düzenler",
              "sonuc": "Kaynak ve hedef hareketleri güncellenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Virman fişini siler (onay ister)",
              "sonuc": "Kaynak ve hedef hareketleri birlikte geri alınır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "virmanekle",
              "tetik": "Virman formunda KAYDET",
              "etki": "cari_hareket'e EVRAK_TIP=103 ile iki satır oluşur: kaynak cariye çıkış (ISLEM_TIP=0), hedef cariye giriş (ISLEM_TIP=1, REF_ID kaynak satırı); düzenlemede iki satır da güncellenir",
              "neden_sonuc": "Para hareketi olmadan bakiyeyi bir cariden diğerine taşır; kaynak/hedef cariyi ters seçerseniz bakiyeler yanlış yöne aktarılır, dikkatli seçin."
            },
            {
              "ad": "virmansil",
              "tetik": "Sil butonu (onaylı)",
              "etki": "Virmanın hem giriş (hedef) hem çıkış (kaynak, REF_ID üzerinden) cari_hareket satırları DURUM=-1 yapılır",
              "neden_sonuc": "Yanlış virmanı her iki cariden birlikte geri alır; tek satır silinmez, çift kayıt bütünlüğü korunur."
            }
          ],
          "iliskiler": [
            "cari",
            "proje/crm"
          ],
          "ipuclari": [
            "Virman kasayı etkilemez, yalnızca cari bakiyelerini değiştirir; nakit hareketi için tahsilat/ödeme kullanın.",
            "Kaynak = borcun/bakiyenin çıktığı cari, Hedef = aktarıldığı cari — karıştırmayın.",
            "Silme her zaman çift kaydı (kaynak+hedef) birlikte iptal eder."
          ]
        },
        {
          "id": "tahakkukliste",
          "baslik": "Tahakkuk",
          "yol": "/ekran/musteritedarikci/islem/tahakkukliste",
          "sub": "islem",
          "amac": "Faturasız borç/alacak kaydı (tahakkuk) fişlerinin listesidir. Bir cariye fatura kesmeden borç veya alacak açmak (örneğin açılış bakiyesi, ceza, düzeltme) için kullanılır.",
          "neden": "Devir bakiyesi girmek, elle bir borç/alacak tanımlamak veya faturaya bağlı olmayan bir tutarı cariye işlemek gerektiğinde tahakkuk fişi kullanılır. Tekli (tek cariye) ya da toplu (birden çok cariye) giriş yapılabilir.",
          "nasil": [
            "Tekli giriş için 'Tahakkuk Girişi' butonunu kullanın; cariyi arayıp seçin, işlem tipini (borç/alacak), tutarı, tarihi ve açıklamayı girin.",
            "Birden çok cariye aynı anda kayıt için 'Toplu Giriş' butonunu kullanın; her satıra cari, tip ve tutar ekleyin.",
            "Kaydedince cari hesap defterine borç veya alacak hareketi işlenir.",
            "Geçmiş tahakkukları listeden izleyin, Filtrele ile cari/evrak/tarih bazında süzün.",
            "Yanlış kaydı Düzenle veya Sil ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "Tahakkuk Girişi",
              "islev": "Tek cariye tahakkuk giriş ekranını açar",
              "sonuc": "Tekli tahakkuk formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Toplu Giriş",
              "islev": "Birden çok cariye tahakkuk giriş ekranını açar",
              "sonuc": "Çok satırlı tahakkuk formu açılır",
              "renk": "accent"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, evrak no ve tarihe göre süzer",
              "sonuc": "Kriterlere uyan tahakkuklar listelenir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Tahakkuk kaydını düzenler",
              "sonuc": "Kayıt forma yüklenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Tahakkuk fişini siler (onay ister)",
              "sonuc": "cari_hareket DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "tahakkuktekekle",
              "tetik": "Tahakkuk Girişi formunda KAYDET",
              "etki": "cari_hareket'e EVRAK_TIP=100 ile tek borç/alacak satırı eklenir (yerel para biriminde, ISLEM_TIP seçime göre)",
              "neden_sonuc": "Faturasız bir borç/alacağı cariye işler; açılış/devir bakiyesi için idealdir. Tip (borç/alacak) yanlış seçilirse bakiye ters yönde değişir."
            },
            {
              "ad": "tahakkuktekduzenle",
              "tetik": "Düzenle sonrası KAYDET",
              "etki": "İlgili cari_hareket (EVRAK_TIP=100) güncellenir ve carinin borç yaşlandırması (borcYaslandirmaHesapla) yeniden hesaplanır",
              "neden_sonuc": "Yanlış tutar/tip/tarihi düzeltir; düzeltme sonrası yaşlandırma otomatik güncellenir, elle hesap gerekmez."
            },
            {
              "ad": "tahakkukfisekle",
              "tetik": "Toplu Giriş formunda KAYDET",
              "etki": "Her satır için ayrı cari_hareket (EVRAK_TIP=100) oluşturulur",
              "neden_sonuc": "Birden çok cariye tek seferde borç/alacak açar (örn. toplu açılış bakiyesi); satır eksik doldurulursa o cari için kayıt oluşmaz."
            },
            {
              "ad": "tahakkukfissil",
              "tetik": "Sil butonu (onaylı)",
              "etki": "cari_hareket DURUM=-1 yapılır",
              "neden_sonuc": "Hatalı tahakkuku geri alır; silmezseniz cari bakiye yanlış kalır."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Tahakkuk kasayı etkilemez, yalnızca cari defterine borç/alacak yazar — nakit için tahsilat/ödeme kullanın.",
            "Yeni müşteriye eski bakiyesini taşımak (açılış/devir) için tahakkuk en pratik yoldur.",
            "Tek tahakkuk düzenlemesi otomatik olarak borç yaşlandırmayı da yeniler."
          ]
        },
        {
          "id": "hareketrapor",
          "baslik": "Hareket Raporu",
          "yol": "/ekran/musteritedarikci/rapor/hareketrapor",
          "sub": "rapor",
          "amac": "Seçili bir carinin (veya tüm carilerin) belirli tarih aralığındaki tüm borç-alacak hareketlerinin dökümünü verir. Cari seçilince devir bakiye ve her satırda yürüyen bakiye gösterir.",
          "neden": "Müşteri/tedarikçi ile dönem sonu mutabakatı, bakiye takibi ve belge incelemesi için kullanılır. Performans nedeniyle önce filtre yapmanız gerekir.",
          "nasil": [
            "Sağ üstteki Filtrele butonuna basın.",
            "İsterseniz bir cari seçin (seçmezseniz tüm cariler gelir), tarih aralığı ve gerekirse evrak no / grup girin.",
            "Arama yapın; hareketler tarih sırasıyla listelenir.",
            "Cari seçtiyseniz üstte devir bakiye, satırlarda yürüyen bakiye görürsünüz.",
            "İhtiyaca göre Excel veya Yazdır ile dışa aktarın (mutabakat formu)."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, tarih, evrak no ve gruba göre raporu çalıştırır",
              "sonuc": "Filtreye uyan hareketler listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Hareket dökümü indirilir",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Raporu yazdırılabilir formata çevirir",
              "sonuc": "Mutabakat/döküm çıktısı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "cari_hareket üzerinden okuma yapılır, veri değiştirmez",
              "neden_sonuc": "Sadece görüntüleme/döküm amaçlıdır; yanlış tarih aralığı seçerseniz eksik/fazla hareket görünür, mutabakat için doğru dönem seçin."
            }
          ],
          "iliskiler": [
            "cari",
            "kasa",
            "fatura"
          ],
          "ipuclari": [
            "Çok hareketli carilerde tarih aralığını daraltmak raporu hızlandırır.",
            "Devir bakiye yalnızca tek cari seçildiğinde hesaplanır.",
            "Yazdır çıktısı müşteriye gönderilecek mutabakat formu olarak kullanılabilir.",
            "'Görünüm: Döviz Bazlı' modda her hareket kendi para biriminde listelenir ve altta para birimi başına DÖNEM toplamı verilir; yürüyen bakiye ve devir yalnız 'Genel' (TL) modda gösterilir. Saf döviz takibi (kur farkı yok)."
          ]
        },
        {
          "id": "hareketrapordetay",
          "baslik": "Detaylı Hareket Raporu",
          "yol": "/ekran/musteritedarikci/rapor/hareketrapordetay",
          "sub": "rapor",
          "amac": "Hareket raporunun genişletilmiş halidir; evrak tipi, açıklama, vade, devir bakiye ve borç/alacak KPI özetleriyle tek cari için detaylı döküm verir.",
          "neden": "Ay sonu detaylı mutabakat, vade analizi ve belge bazlı inceleme için kullanılır. Tek cari seçimi zorunludur.",
          "nasil": [
            "Filtrele butonuna basın ve bir cari seçin (zorunlu), tarih aralığı belirleyin.",
            "Arama yapın; hareketler evrak tipi, açıklama ve vade kolonlarıyla listelenir.",
            "Üstte devir bakiye ve borç/alacak KPI özetlerini inceleyin.",
            "Vade kolonundan hangi borcun ne zaman dolduğunu kontrol edin.",
            "Yazdır ile ıslak imzalı mutabakat formu alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, tarih ve evrak no'ya göre detaylı raporu çalıştırır",
              "sonuc": "Seçili carinin detaylı hareketleri listelenir",
              "renk": "primary"
            },
            {
              "ad": "YAZDIR",
              "islev": "Detaylı mutabakat formu olarak yazdırır",
              "sonuc": "Yazdırma çıktısı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "cari_hareket okunur, veri değiştirmez",
              "neden_sonuc": "Detaylı görüntüleme amaçlıdır; cari seçmeden rapor çalışmaz, doğru dönem seçmezseniz mutabakat rakamları tutmaz."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Cari seçimi bu raporda zorunludur (tüm cari seçeneği yoktur).",
            "Vade kolonu, gecikmiş borçları erken görmeye yarar.",
            "Devir + yürüyen bakiye sayesinde tek bakışta cari denkliği görülür."
          ]
        },
        {
          "id": "bakiyedurumrapor",
          "baslik": "Bakiye Durum Raporu",
          "yol": "/ekran/musteritedarikci/rapor/bakiyedurumrapor",
          "sub": "rapor",
          "amac": "Sistemdeki tüm cari hesapların anlık bakiye durumunu tek ekranda gösterir: müşterilerden alacaklar, tedarikçilere borçlar, net bakiye ve cari tipi.",
          "neden": "İşletmenin nakit akışının röntgenidir. Kimden ne kadar alacağınız, kime ne kadar borçlu olduğunuz özetlenir; tahsilat ve ödeme önceliklerini belirlemede kullanılır.",
          "nasil": [
            "Filtrele butonuyla kriter belirleyin (performans için filtre zorunludur).",
            "Rapor toplam borç, toplam alacak ve net bakiyeyi cari bazında listeler.",
            "Borçlu carilere göre tahsilat sırası, alacaklı carilere göre ödeme planı yapın.",
            "Genel borç/alacak toplamlarını mizanla karşılaştırın.",
            "Gerekirse Excel/Yazdır ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Kriterlere göre bakiye raporunu çalıştırır",
              "sonuc": "Cari bakiyeleri listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Bakiye dökümü indirilir",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Raporu yazdırır",
              "sonuc": "Yazdırma çıktısı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "cari bakiyeleri okunur, veri değiştirmez",
              "neden_sonuc": "Nakit durumunu özetler; filtre yapmadan çalışmaz. Yanlış yorumlama tahsilat/ödeme önceliğini şaşırtabilir."
            }
          ],
          "iliskiler": [
            "cari",
            "kasa"
          ],
          "ipuclari": [
            "Borçlu cariler tahsilat hatırlatma sırasını, alacaklı cariler ödeme planınızı belirler.",
            "Hareketsiz/sıfır bakiyeli carileri tespit edip arşivleyebilirsiniz.",
            "Aylık olarak mizan ile karşılaştırıp fark varsa düzeltin.",
            "Filtredeki 'Görünüm: Döviz Bazlı' seçilirse liste, tanımlı her para birimi için ayrı sütun gösterir (TL, USD, EURO...); hareketi olmayan para biriminin hücresi boş bırakılır. 'Genel' seçilirse tek TL bakiye (varsayılan). Excel ve A4 çıktısı da döviz sütunludur."
          ]
        },
        {
          "id": "acikbakiyeyas",
          "baslik": "Açık Bakiye Yaşı",
          "yol": "/ekran/musteritedarikci/rapor/acikbakiyeyas",
          "sub": "rapor",
          "amac": "Müşterilerin vadesi geçmiş açık borçlarının kaç gündür açık olduğunu (yaşını) ve yaş bantlarını (0-30, 31-60, 61-90, 90+ gün) gösterir.",
          "neden": "Eskiyen borç tahsil edilmesi giderek zorlaşan paradır. Bu rapor 'tehlikedeki nakdi' görünür kılar ve gecikme yaşına göre hangi aksiyonu (hatırlatma, telefon, ihtar, hukuki süreç) alacağınızı belirler.",
          "nasil": [
            "Filtrele ile kriter seçin (filtre zorunlu).",
            "Rapor her müşterinin açık borcunu ve borç yaşını gün cinsinden listeler.",
            "Yaş bandına göre önceliklendirin: 0-30g hatırlatma, 31-60g telefon, 61-90g ihtar, 90+g hukuki.",
            "Toplam riski (yaşlı borçların toplamını) izleyin.",
            "Gerekirse dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Açık bakiye yaşı raporunu çalıştırır",
              "sonuc": "Yaşlı açık borçlar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Yeniden Hesapla",
              "islev": "Tüm carilerin bakiye yaşını yeniden hesaplar (onay ister)",
              "sonuc": "cari_kart borç yaşı/borç tutarı güncellenir",
              "renk": "accent"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Rapor indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "bakiyeyashesapla",
              "tetik": "'Yeniden Hesapla' butonu (onaylı)",
              "etki": "Tüm cari hareketleri FIFO ile yaşlandırılıp cari_kart'a BORC_TUTAR, BORC_YASI ve hesap zamanı yazılır",
              "neden_sonuc": "Rapordaki yaş verisini günceller; hesaplamazsanız yaş bilgileri eski kalır ve gecikme kararlarını yanlış tarihle verirsiniz."
            },
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "Açık bakiye ve yaş okunur",
              "neden_sonuc": "Görüntüleme amaçlıdır; en güncel veriler için önce 'Yeniden Hesapla' çalıştırmak faydalıdır."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "90+ gün bandındaki borçlar için vergide şüpheli alacak ayrılabilir (mali müşavirinize danışın).",
            "Yeni gecikmelerde (0-30g) hızlı hatırlatma toparlanma oranını yükseltir.",
            "'Yeniden Hesapla' tüm carileri gezdiği için yoğun saatlerde çalıştırmayın."
          ]
        },
        {
          "id": "yaslandirma",
          "baslik": "Cari Yaşlandırma",
          "yol": "/ekran/musteritedarikci/rapor/yaslandirma",
          "sub": "rapor",
          "amac": "Cari hesapların FIFO ile netleştirilmiş açık bakiyelerini vade yaşına göre bantlara ayırır (Vadesi Gelmemiş, 0-30, 31-60, 61-90, 90+). Tamamı kapanmış evraklar rapora girmez.",
          "neden": "Alacak (müşteri) veya borç (tedarikçi) yönünde gerçekten açık kalan tutarları vade yaşıyla görüp tahsilat/ödeme aksiyonlarını planlarsınız. Avans ve net bakiye de ayrıca gösterilir.",
          "nasil": [
            "Filtrele ile yön (Alacak/Borç yaşlandırma) ve kriter seçin (filtre zorunlu).",
            "Rapor her carinin açık kalemlerini vade bantlarına dağıtır.",
            "Bant bazında aksiyon alın: 0-30g hatırlatma, 31-60/61-90g telefon+ihtar, 90+g hukuki.",
            "Avans (tahsis edilemeyen fazla ödeme) ve net bakiyeyi kontrol edin.",
            "Dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Yön ve kriterlere göre yaşlandırma raporunu çalıştırır",
              "sonuc": "Açık bakiyeler vade bantlarında listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Yaşlandırma dökümü indirilir",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Raporu yazdırır",
              "sonuc": "Yazdırma çıktısı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "cari_hareket FIFO ile netleştirilerek okunur, veri değiştirmez",
              "neden_sonuc": "Gerçekten açık kalan tutarları gösterir; yön seçimi (alacak/borç) yanlışsa müşteri riski yerine tedarikçi borcunu görürsünüz."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "FIFO nedeniyle tahsilatlar en eski açık kalemden düşülür; kapanan evraklar hiç görünmez, ekrandaki her tutar gerçekten açıktır.",
            "Alacak yaşlandırma müşteri riskinizi, Borç yaşlandırma tedarikçilere borcunuzu gösterir.",
            "Avans sütunu, hiçbir borca tahsis edilememiş fazla ödemeleri işaret eder."
          ]
        },
        {
          "id": "disiplinskor",
          "baslik": "Disiplin Skoru",
          "yol": "/ekran/musteritedarikci/rapor/disiplinskor",
          "sub": "rapor",
          "amac": "Her carinin borçlarını vadesinde ödeyip ödemediğini ölçen 0-100 arası bir disiplin skoru hesaplar (açık borç yaşı, tahsilat/borç oranı, tekrar eden gecikme sayısı).",
          "neden": "Sürekli geç ödeyen carileri erken tespit edip vadeli satış politikanızı buna göre ayarlamak ve nakit akışınızı korumak için kullanılır.",
          "nasil": [
            "Filtrele ile kriter seçin (filtre zorunlu).",
            "Rapor her cari için disiplin skorunu ve alt metrikleri gösterir.",
            "Skora göre karar verin: 85+ serbest, 70-84 takip, 50-69 vadeyi azalt, <50 satışı durdur.",
            "Düşük skorlu cariler için önce mevcut tahsilata odaklanın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Disiplin skoru raporunu çalıştırır",
              "sonuc": "Cari disiplin skorları listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Rapor indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "cari hareket ve ödeme geçmişi okunarak skor hesaplanır, veri değiştirmez",
              "neden_sonuc": "Ödeme disiplinini sayısallaştırır; skoru dikkate almadan vadeli satış yaparsanız geç ödeyen carilerde nakit sıkışması yaşarsınız."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Yüksek skorlu (disiplinli) carileri esnek vade/özel teklifle ödüllendirebilirsiniz.",
            "Skor tek başına değil; risk ve limit raporlarıyla birlikte değerlendirin (Karar Destek ekranı bunu birleştirir).",
            "Skor düştükçe peşin/erken tahsilata kayın."
          ]
        },
        {
          "id": "riskskor",
          "baslik": "Risk Skoru",
          "yol": "/ekran/musteritedarikci/rapor/riskskor",
          "sub": "rapor",
          "amac": "Her cari için bugün itibariyle ne kadar riskli olduğunu 0-100 arası bir skorla gösterir (borç tutarı, borç yaşı ve risk oranının ağırlıklı birleşimi).",
          "neden": "Anlık risk fotoğrafı verir; hangi carilere yeni satışta dikkatli olunacağını, hangilerinde tahsilatın öne alınacağını belirler.",
          "nasil": [
            "Filtrele ile kriter seçin (filtre zorunlu).",
            "Rapor her cariyi risk skoruyla listeler.",
            "Skora göre aksiyon alın: 0-29 güvenli, 30-59 dikkat/hatırlatma, 60-79 tahsilatı öncele, 80+ yeni satışı durdur.",
            "Kritik carilerde ödeme planı talep edin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Risk skoru raporunu çalıştırır",
              "sonuc": "Cari risk skorları listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Rapor indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "cari borç verileri okunarak skor hesaplanır, veri değiştirmez",
              "neden_sonuc": "Riskin bugünkü halini gösterir; skoru izlemezseniz kritik carilere farkında olmadan yeni satış yapıp riski büyütebilirsiniz."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Risk skoru borç tutarı + yaşı + risk oranından oluşur; tek başına yüksek borç değil, eskiyen borç da skoru yükseltir.",
            "80+ kritik carilerde yeni satış yerine tahsilat/ödeme planına yönelin.",
            "Karar Destek ekranı bu skoru diğer analizlerle birleştirir."
          ]
        },
        {
          "id": "risklimit",
          "baslik": "Risk Limitini Aşanlar",
          "yol": "/ekran/musteritedarikci/rapor/risklimit",
          "sub": "rapor",
          "amac": "Sistemin her cari için son 90 gün işlem hacmi ve borç yaşına bakarak otomatik hesapladığı kredi kapasitesini aşan carileri gösterir (Risk Oranı = Borç ÷ Kapasite × 100).",
          "neden": "'Sınırsız vadeli satış' yerine veriye dayalı bir kredi limiti uygulamanızı sağlar. Limiti aşan carilerde yeni satışı frenleyerek batık riskini azaltırsınız.",
          "nasil": [
            "Filtrele ile kriter seçin (filtre zorunlu).",
            "Rapor net borç, 90 gün işlem hacmi, hesaplı kapasite ve risk oranını gösterir.",
            "Risk oranına göre aksiyon alın: ≤%70 serbest, %71-100 dikkat, %101-150 satışı durdur, %150+ hesabı kilitle.",
            "Aşan carilerde mevcut tahsilatı zorlayın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Risk limiti raporunu çalıştırır",
              "sonuc": "Limiti aşan cariler listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Rapor indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "cari işlem hacmi ve borç okunarak kapasite/oran hesaplanır, veri değiştirmez",
              "neden_sonuc": "Kredi limiti aşımını gösterir; dikkate almazsanız kapasitesinin üzerinde borçlanan cariye satmaya devam edip tahsil edilemeyen alacak biriktirirsiniz."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Kapasite otomatik hesaplanır (90 gün hacim ÷ 3 × yaş katsayısı); manuel limit girmeye gerek yoktur.",
            "%150+ kritik carilerde hesabı kilitleyip hukuki süreci değerlendirin.",
            "İşlem hacmi arttıkça carinin kapasitesi de artar; büyüyen müşteride limit kendiliğinden yükselir."
          ]
        },
        {
          "id": "sadakat",
          "baslik": "Müşteri Sadakati",
          "yol": "/ekran/musteritedarikci/rapor/sadakat",
          "sub": "rapor",
          "amac": "RFM (Recency-Frequency-Monetary) yöntemiyle her müşterinin işletmeyle ilişki gücünü 0-100 sadakat skoruyla ölçer (son işlem tarihi, işlem sıklığı, toplam ciro).",
          "neden": "Düzenli alan VIP müşterileri elde tutmaya, zayıflayan/kaybolan müşterileri geri kazanmaya odaklanmak için kullanılır. Pazarlama ve iletişim önceliklerini belirler.",
          "nasil": [
            "Filtrele ile kriter seçin (filtre zorunlu).",
            "Rapor müşterileri sadakat skoru ve R/F/M metrikleriyle listeler.",
            "Skora göre aksiyon: 80+ VIP koru, 60-79 düzenli iletişim, 40-59 geri kazanma, <40 reaktivasyon/pasife alma."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Sadakat raporunu çalıştırır",
              "sonuc": "Müşteri sadakat skorları listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Rapor indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "satış/işlem geçmişi okunarak RFM skoru hesaplanır, veri değiştirmez",
              "neden_sonuc": "Müşteri ilişki gücünü ölçer; izlemezseniz sadık müşteriyi ihmal edip kaybedebilir, kayıp müşteriyi zamanında geri kazanamayabilirsiniz."
            }
          ],
          "iliskiler": [
            "cari",
            "fatura"
          ],
          "ipuclari": [
            "Skor R(%35)+F(%35)+M(%30) ağırlığıyla hesaplanır; sadece çok alan değil, sık ve yakın zamanda alan da yükselir.",
            "80+ müşterilere özel teklif sunarak elde tutma maliyetini düşürürsünüz.",
            "<40 kayıp segmentine reaktivasyon kampanyası deneyin, dönüş yoksa pasife alın."
          ]
        },
        {
          "id": "tahsilattahmin",
          "baslik": "Tahsilat Tahmin",
          "yol": "/ekran/musteritedarikci/rapor/tahsilattahmin",
          "sub": "rapor",
          "amac": "Her carinin geçmiş ödeme alışkanlığına (fatura→ödeme arası ortalama gün) bakarak mevcut borcunun tahmini tahsilat tarihini hesaplar ve durumunu (Normal/Yaklaşıyor/Gecikmiş) gösterir.",
          "neden": "Nakit akışını önceden planlamak için kullanılır: hangi cariden yaklaşık ne zaman para geleceğini görüp ödemelerinizi buna göre zamanlarsınız.",
          "nasil": [
            "Filtrele ile kriter seçin (filtre zorunlu).",
            "Rapor ortalama tahsilat günü, mevcut borç yaşı ve tahmini tahsilat tarihini listeler.",
            "Duruma göre aksiyon: Normal bekle, Yaklaşıyor (≤3g) hatırlatma, Gecikmiş hemen telefon.",
            "Raporu haftalık inceleyerek nakit planı yapın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tahsilat tahmin raporunu çalıştırır",
              "sonuc": "Tahmini tahsilat tarihleri listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Rapor indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "geçmiş ödeme süreleri okunarak tahmin hesaplanır, veri değiştirmez",
              "neden_sonuc": "Para giriş takvimi çıkarır; izlemezseniz nakit akışını körlemesine planlar, yaklaşan/geciken tahsilatları kaçırırsınız."
            }
          ],
          "iliskiler": [
            "cari",
            "kasa"
          ],
          "ipuclari": [
            "Tahmin geçmiş davranışa dayanır; yeni/az işlemli caride tahmin zayıf olabilir.",
            "'Yaklaşıyor' durumundaki carilere hatırlatma göndererek tahsilatı öne çekebilirsiniz.",
            "Haftalık düzenli inceleme nakit planlamasında en yüksek faydayı verir."
          ]
        },
        {
          "id": "karardestek",
          "baslik": "Karar Destek",
          "yol": "/ekran/musteritedarikci/rapor/karardestek",
          "sub": "rapor",
          "amac": "Risk Skoru, Sadakat, Disiplin ve Risk Limiti analizlerini tek ekranda birleştirip her cari için tek bir tavsiye verir: STOP / Kontrollü Risk / Takip / Güvenli. Vadeli satış kararını özetler.",
          "neden": "Dört ayrı raporu tek tek incelemek yerine, 'bu cariye satış yapayım mı?' sorusuna veriye dayalı tek cevap almak için kullanılır. Veto kuralları (borç yaşı 180+ veya disiplin <50) otomatik STOP verir.",
          "nasil": [
            "Filtrele ile kriter seçin (filtre zorunlu; bu rapor cari başına ağır hesap yapar).",
            "Rapor her cari için genel verdict, 4 alt skor (0-100) ve pratik öneriyi gösterir.",
            "Verdict'e göre karar verin: STOP satma+ödeme planı iste, Kontrollü Risk küçük/peşin sat, Takip düzenli hatırlat, Güvenli serbest.",
            "Veto işaretli carilerde otomatik STOP'a uyun."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Karar destek raporunu çalıştırır",
              "sonuc": "Cari bazında satış tavsiyeleri listelenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Rapor indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "(salt okunur rapor)",
              "tetik": "Filtrele",
              "etki": "risk/sadakat/disiplin/limit metrikleri birlikte okunarak verdict üretilir, veri değiştirmez",
              "neden_sonuc": "Vadeli satış kararını tek ekranda özetler; verdict'i göz ardı edip STOP caride satış yaparsanız yüksek batık riski alırsınız."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Bu rapor cari başına 4 analizi birden çalıştırdığından yavaştır; tarih/cari filtresini dar tutun.",
            "Veto kuralları (borç yaşı 180+ veya disiplin <50) her koşulda STOP verir, diğer skorlar iyi olsa bile.",
            "Kontrollü Risk = sadık ama riskli cari; satışı küçük tutup peşin tercih edin."
          ]
        },
        {
          "id": "caridetayrapor",
          "baslik": "Cari Detaylı Rapor (Excel)",
          "yol": "/ekran/musteritedarikci/islem/caridetayrapor",
          "sub": "islem",
          "amac": "Tek bir cariye ait tam hesap ekstresini (tüm hareketler, satır bazında yürüyen TL bakiye, para birimi bazlı borç/alacak kırılımı ve iki net hesap) tek ekranda görüp Excel'e aktarmak veya yazdırmak. Cari kart detayındaki 'Detaylı Rapor (Excel)' butonuyla yeni sekmede açılır.",
          "neden": "Müşteri/tedarikçi mutabakatında ve çok dövizli carilerde 'net ne kadar borçlu' sorusuna tek dökümle profesyonel yanıt vermek için.",
          "nasil": [
            "Cari kart detayını açın; bakiye kutusunun altındaki 'Detaylı Rapor (Excel)' butonuna basın (rapor yeni sekmede açılır).",
            "Üstte cari kimliği, para birimi bazlı borç/alacak/bakiye kırılımı ve iki net (Hesaplanan Net + Güncel Kur ile Net) görünür.",
            "Altta tüm hareketler tarih sıralı listelenir; her satırda döviz ve TL borç/alacak ile yürüyen TL bakiye bulunur.",
            "EXCEL butonuyla tablo .xls olarak indirilir; YAZDIR ile çıktı/pdf alınır."
          ],
          "butonlar": [
            {
              "ad": "Detaylı Rapor (Excel)",
              "islev": "Cari kart detayında bu raporu yeni sekmede açar.",
              "sonuc": "Tek cariye ait tam ekstre + net ekranı gelir.",
              "renk": "mavi (outline)"
            },
            {
              "ad": "EXCEL",
              "islev": "Ekrandaki tabloyu Excel (.xls) dosyası olarak indirir.",
              "sonuc": "Cari detay dökümü Excel'de açılır.",
              "renk": "yeşil"
            },
            {
              "ad": "YAZDIR",
              "islev": "Raporu yazıcıya/PDF'e gönderir.",
              "sonuc": "Baskı önizlemesi açılır.",
              "renk": "lacivert"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa-banka",
            "fatura",
            "irsaliye"
          ],
          "ipuclari": [
            "'Hesaplanan Net' farklı dövizleri her hareketin KENDİ (tarihsel) kuruyla mahsuplaştırıp tek TL açık borca indirger (muhasebe gerçeği).",
            "'Güncel Kur ile Net' tüm bakiyeyi sistemde KAYITLI güncel kurla TL'ye çevirip toplar (anlık değerleme; kur güncellendikçe değişir).",
            "Bir dövizin kuru tanımlı değilse rapor uyarır; Kur Güncelle ile kuru tazeleyin.",
            "Aynı iki net, cari kart detayında bakiyelerin hemen altında da görünür."
          ]
        },
        {
          "id": "taksittakibi",
          "baslik": "Taksit Takibi",
          "yol": "/ekran/musteritedarikci/islem/taksitler",
          "sub": "islem",
          "amac": "Cari işlemlerini taksitlendirip vade vade takip ettiğiniz ekran. Bir faturayı peşinat + eşit/serbest taksitlere bölebilir veya faturadan bağımsız bir taksit planı kurabilirsiniz. Her taksit ayrı vade kaydı olarak cariye işlenir; geciken/yaklaşan/kalan taksitler tek yerden izlenir.",
          "neden": "Vadeli/taksitli satışta hangi taksitin ne zaman dolduğu, hangisinin geciktiği ve kalan borç elle (Excel/defter) takip edilince vade kaçar, müşteriyle 'kaç taksit kaldı' tartışması çıkar. Taksit planı sistemde tutulunca vadeler otomatik hatırlatılır, tahsilat–taksit eşleşmesi kendiliğinden yürür ve nakit akışı öngörülebilir olur.",
          "nasil": [
            "Bir faturayı taksitlendirmek için fatura üzerindeki 'Taksitlendir' işlemini kullanın; peşinatı (varsa), taksit sayısını ve ilk vade tarihini girin. Eşit taksitte tutar otomatik bölünür, serbest taksitte her taksitin tutar/tarihi elle girilir.",
            "Faturadan bağımsız plan için Taksitler ekranından 'Taksit Planı Ekle' ile cari, toplam tutar, peşinat, taksit sayısı ve ilk vadeyi girin.",
            "Kaydedince her taksit ayrı vade (taksit borç) kaydı olarak cariye işlenir ve vadesiyle listelenir.",
            "Cari kart detayındaki 'Taksitler' sekmesinden geciken (kırmızı), yaklaşan (sarı) ve kalan taksitleri renk koduyla izleyin.",
            "Müşteriden tahsilat girince ilgili taksit otomatik kapanır; tahsilatı silerseniz taksit ters kayıtla yeniden açılır.",
            "Müşteriye 'Taksit Mutabakat' raporuyla döküm verin; tüm carilerin vadelerini raporlardaki 'Taksit Listesi' ile tek ekranda süzün."
          ],
          "butonlar": [
            {
              "ad": "Taksit Planı Ekle",
              "islev": "Faturadan bağımsız yeni taksit planı oluşturur",
              "sonuc": "Cari, tutar, peşinat, taksit sayısı ve vade alanlarıyla plan formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Taksitlendir",
              "islev": "Bir faturayı peşinat + eşit/serbest taksitlere böler",
              "sonuc": "Faturaya bağlı taksit vadeleri oluşur ve cariye işlenir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, vade tarihi ve duruma (geciken/yaklaşan/kalan) göre süzer",
              "sonuc": "Kriterlere uyan taksitler listelenir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Kapanmamış taksitin tutar/vadesini değiştirir",
              "sonuc": "Taksit vadesi güncellenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Taksit planını/taksiti siler (onay ister)",
              "sonuc": "İlgili taksit vade kaydı geri alınır, cari bakiyesi düzelir",
              "renk": "danger"
            },
            {
              "ad": "Taksit Mutabakat",
              "islev": "Müşteriye verilecek taksit dökümünü yazdırır",
              "sonuc": "Taksit mutabakat çıktısı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "taksitplanekle",
              "tetik": "'Taksit Planı Ekle' / fatura 'Taksitlendir' formunda KAYDET",
              "etki": "Her taksit için cari_hareket'e EVRAK_TIP=104 (taksit borç) ile ayrı vade satırı oluşturulur; peşinat + eşit taksitte tutar otomatik bölünür, serbest taksitte satır tutar/tarihi elle girilir",
              "neden_sonuc": "Vadeli satış taksit taksit cariye işlenir ve takip edilir hale gelir; taksit sayısı/tutarı yanlış girilirse vade planı hatalı kurulur."
            },
            {
              "ad": "taksithatirlatma",
              "tetik": "Taksit vadesi yaklaşınca/geçince (otomasyon)",
              "etki": "Ayarlı n8n akışına göre müşteriye SMS/e-posta hatırlatma tetiklenir",
              "neden_sonuc": "Vade kaçırma riski azalır; otomasyon kapalıysa hatırlatma gönderilmez, taksit yalnız ekranda izlenir."
            },
            {
              "ad": "taksitkapanma",
              "tetik": "Müşteriden tahsilat kaydı (tahsilatekle)",
              "etki": "En yakın açık taksit(ler) kapatılır; tahsilat silinirse (tahsilatsil) taksit ters kayıtla yeniden açılır",
              "neden_sonuc": "Taksit–tahsilat eşleşmesi otomatik yürür; elle eşleştirme gerekmez, tahsilat iptalinde taksit tutarlı biçimde geri açılır."
            },
            {
              "ad": "taksitsil",
              "tetik": "Sil butonu (onaylı)",
              "etki": "İlgili taksit cari_hareket (EVRAK_TIP=104) DURUM=-1 yapılır",
              "neden_sonuc": "Hatalı taksiti/planı geri alır; silmezseniz cari bakiye ve vade planı yanlış kalır."
            }
          ],
          "iliskiler": [
            "cari",
            "fatura",
            "kasa",
            "otomasyon (n8n)"
          ],
          "ipuclari": [
            "Peşinat + eşit taksitte sistem kalan tutarı otomatik böler; serbest taksitte her satırın tutar/tarihini kendiniz belirleyip düzensiz vadeler kurabilirsiniz.",
            "Cari kart detayındaki 'Taksitler' sekmesi o müşterinin geciken/yaklaşan/kalan taksitlerini renkli gösterir.",
            "Gecikme faizi yalnızca bilgi amaçlı hesaplanıp gösterilir; cari bakiyeye otomatik yansımaz, müşteriye yansıtmak için ayrı tahakkuk/fatura gerekir.",
            "Taksit kaydı kasayı etkilemez; gerçek para girişi için Tahsilat kullanın (tahsilat girince taksit otomatik kapanır)."
          ]
        }
      ]
    },
    {
      "slug": "fatura",
      "title": "Fatura & E-Belge",
      "icon": "🧾",
      "modul": "fatura",
      "ad": "Fatura Modülü",
      "ozet": "Satış ve alış faturalarınızı kesip yönettiğiniz, e-Fatura/e-Arşiv süreçlerini (gönderim, durum sorgulama, gelen kutusu, ticari kabul/red) yürüttüğünüz ve fatura verinizi analiz eden (satış dökümü, KDV/vergi özeti, stok/cari/grup karlılık, Pareto yoğunluk, yaşlandırma) çekirdek modül. Faturalar cari hareket, stok, kasa, irsaliye, sipariş, servis ve abonelik modülleriyle entegre çalışır; satış/alış kesildiğinde ve iptalde otomasyon (n8n) tetikleyicileri devreye girer.",
      "modul_iliskiler": [
        "cari",
        "stok",
        "kasa",
        "irsaliye",
        "siparis",
        "servis",
        "sahasatis",
        "abonelik",
        "ebelge",
        "otomasyon"
      ],
      "ekranlar": [
        {
          "id": "faturaliste",
          "baslik": "Satış Faturaları",
          "yol": "/ekran/fatura/rapor/faturaliste",
          "sub": "rapor",
          "amac": "Müşterilere kesilen tüm satış faturalarını (EVRAK_TIP 301) liste halinde gösterir; her faturanın e-belge durumunu, tutarını ve işlem menüsünü sunar.",
          "neden": "Aylık ciro takibi, KDV beyannamesi için hesaplanan KDV toplamı, müşteri mutabakatı ve e-fatura yanıtlarının (reddedilen/yanıt gelmeyen) izlenmesi için ana ekrandır. Yeni satış faturası buradan başlatılır.",
          "nasil": [
            "Ekranı açtığınızda üstte KPI kartları (Toplam Fatura, Brüt, Toplam KDV, Net) ve fatura listesi görünür.",
            "Yeni fatura için sağ üstteki 'Yeni Fatura' butonuna basın; satış fatura giriş ekranı açılır.",
            "Belirli bir faturayı bulmak için 'Filtrele' ile cari, stok grubu, evrak no veya tarih aralığı girin.",
            "Bir satırın 'İŞLEMLER' menüsünden Taslak Gör/Yazdır, E-Belge Gönder, Düzenle, B2B Paylaş veya İptal Et seçin.",
            "e-fatura gönderilmiş satırlarda HTML/PDF görüntüleme ve durum rozetleri (BEKLİYOR / onay kodu) görünür.",
            "Alt bardan tüm listeyi Excel'e aktarabilir veya A4 yazdırabilirsiniz.",
            "Belgenin dibindeki Dip İskonto alanına tutar girerek veya Hedef Tutara Getir alanına nihai rakamı yazarak tek alandan indirim uygulayın; indirim satırlara orantılı dağıtılır."
          ],
          "butonlar": [
            {
              "ad": "Yeni Fatura",
              "islev": "Satış faturası giriş ekranını açar",
              "sonuc": "Boş fatura formu açılır, yeni satış faturası kesilebilir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, stok grubu, evrak no ve tarih aralığına göre listeyi daraltır",
              "sonuc": "Sadece kriterlere uyan faturalar listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili faturayı düzenleme modunda açar",
              "sonuc": "Fatura kalemleri/tutarları değiştirilebilir",
              "renk": "primary"
            },
            {
              "ad": "E-Belge Gönder",
              "islev": "Bekleyen (taslak) faturayı entegratör üzerinden GİB'e gönderir",
              "sonuc": "Fatura e-fatura/e-arşiv olarak resmileşir",
              "renk": "accent"
            },
            {
              "ad": "Taslak Gör / Taslak Yazdır",
              "islev": "Faturanın taslak PDF/çıktısını üretir",
              "sonuc": "Yazıcı veya PDF önizleme açılır",
              "renk": "ghost"
            },
            {
              "ad": "HTML / PDF Gör",
              "islev": "Gönderilmiş e-faturanın resmi HTML veya PDF görüntüsünü yeni sekmede açar",
              "sonuc": "Resmi e-belge görüntülenir",
              "renk": "ghost"
            },
            {
              "ad": "B2B Paylaş",
              "islev": "Müşteriye açık, girişsiz görüntülenebilen imzalı (HMAC) fatura linki üretir",
              "sonuc": "Kopyalanabilir paylaşım linki modalı açılır",
              "renk": "ghost"
            },
            {
              "ad": "İptal Et",
              "islev": "Faturayı iptal eder (DURUM=2, İPTAL rozeti)",
              "sonuc": "Fatura İPTAL rozetiyle kalır, cari/stok hareketleri geri alınır",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel dosyası olarak indirir",
              "sonuc": "Fatura listesi .xlsx olarak iner",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Listeyi A4 rapor olarak yazdırır",
              "sonuc": "Yazdırılabilir liste sayfası açılır",
              "renk": "ghost"
            },
            {
              "ad": "İşlemler",
              "islev": "Fatura kaydedildikten sonra sağ üstte açılan toplu menü; yazdır/taslak, E-Belge Gönder, B2B Paylaş ve e-posta gönderme tek yerde toplanır (satış ve alış)",
              "sonuc": "Fatura sonrası tüm işlemler tek menüden yürür",
              "renk": "primary"
            },
            {
              "ad": "Tahsilat Al",
              "islev": "Ayar açıkken satış faturasından hemen tahsilat (EVRAK_TIP 201) girer; faturaya kilitlenmez, cari hesaba esnek işlenir",
              "sonuc": "Kasa/banka hareketi oluşur, müşteri bakiyesinden düşülür",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "faturasil",
              "tetik": "İşlemler menüsü > İptal Et (onay sonrası)",
              "etki": "fatura.DURUM=2 yapılır; cari_hareket ve stok_fis referansları silinir, bağlı irsaliye 'faturalanmadı'ya döner, servis iş emri/sipariş teslim/seri no/abonelik geri alınır",
              "neden_sonuc": "Yanlış kesilen faturayı iptal eder; cari bakiye ve stok doğru değere döner. İptal etmezseniz cari borç/alacak ve stok yanlış kalır, bağlı irsaliye/sipariş tekrar faturalanamaz."
            },
            {
              "ad": "faturakomplesildir",
              "tetik": "Faturayı komple silme aksiyonu (düzenleme ekranı)",
              "etki": "fatura ve fatura_detay kayıtları veritabanından tamamen silinir; hareketler geri alınır",
              "neden_sonuc": "Hiç oluşmamış gibi kalıcı temizlik sağlar. GİB'e iletilmiş e-faturada engellenir (önce iade/iptal gerekir); yanlış kullanılırsa yasal kayıt kaybolur."
            },
            {
              "ad": "efaturagonder",
              "tetik": "İşlemler menüsü > E-Belge Gönder",
              "etki": "Fatura entegratör servisiyle GİB'e iletilir, EFATURA_GONDERILECEK durumu güncellenir",
              "neden_sonuc": "Faturayı resmi e-belgeye dönüştürür. Göndermezseniz fatura taslak/geçersiz kalır, yasal olarak kesilmiş sayılmaz."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "irsaliye",
            "siparis",
            "servis",
            "ebelge",
            "kasa"
          ],
          "ipuclari": [
            "İptal Et faturayı listeden silmez, İPTAL rozetiyle bırakır — kayıt izi korunur.",
            "GİB'e gönderilmiş e-faturayı komple silemezsiniz; iade/iptal faturası kesmeniz gerekir.",
            "B2B Paylaş linki müşteri girişi gerektirmez, imzalı (HMAC) olduğundan yalnız o faturayı açar; yalnızca B2B panel ayarı aktifse görünür.",
            "Seri no takipli üründe seri seçim penceresi açılır; 'Satışta Elle (Girişsiz) Seri Girişi' ayarı açıkken stokta olmayan bir seri no yazıp Enter'a basarak elle (girişsiz) seri ekleyip satabilirsiniz — bu seri Seri No Takibi'nde satılmış olarak görünür.",
            "Dip iskonto ve “Hedef Tutara Getir”: Fatura formunun dibinde tek alandan indirim uygulanabilir — ya bir Dip İskonto tutarı girilir, ya da Hedef Tutara Getir alanına faturanın oturması gereken nihai rakam (ör. 41.000) yazılır ve sistem toplamı tam o rakama getirir. İndirim satırlara orantılı dağıtıldığı için matrah, KDV, maliyet/kârlılık ve e-fatura tutarları otomatik doğru kalır; hedef “KDV Dahil ödenecek” veya “KDV Hariç matrah” modundan verilebilir. Çok KDV oranlı belgede bile KDV alt toplamları tutarlı kalır ve GİB’e sorunsuz gider; belge sonradan açıldığında dip iskonto ile satır iskontoları ayrı geri gelir. Yasal olarak matrahı gerçekten düşüren ticari indirimdir.",
            "Şube filtresi: Birden fazla şubesi olan işletmelerde filtre penceresine eklenen Şube seçiciyle, yalnız erişim yetkiniz olan şubeleri seçerek listeyi o şubeye ait kayıtlarla süzersiniz; tek şubeli işletmelerde bu seçici görünmez.",
            "Dövizli fatura kesen işletmeler için liste üstündeki KPI kartlarına döviz bazlı özet eklenir; her para birimi (USD/EUR vb.) için toplam ayrı gösterilir, TL faturalarla karışmaz (döviz KPI).",
            "Dövizli faturanın yazdırma/PDF çıktısında tutarlar hem belge para biriminde hem de TL karşılığıyla (kur ile) gösterilir.",
            "Faturaya yeni satır eklerken varsayılan KDV oranı otomatik seçili gelir; her satırda oranı elle seçmenize gerek kalmaz, gerekirse değiştirebilirsiniz.",
            "Faturayı kaydettikten sonra sağ üstteki 'İşlemler' menüsü yazdır/taslak, E-Belge Gönder, B2B Paylaş ve e-posta işlemlerini tek yerde toplar; fatura sonrası akışı hızlandırır.",
            "Bir ayar açıldığında satış faturasından hemen Tahsilat (EVRAK_TIP 201) girebilirsiniz; tahsilat faturaya kilitlenmez, doğrudan cari hesaba işlenir (esnek tahsilat) ve genel bakiyeden düşülür. Ayar kapalıyken kullanım değişmez."
          ]
        },
        {
          "id": "alis_faturaliste",
          "baslik": "Alış Faturaları",
          "yol": "/ekran/fatura/rapor/alis_faturaliste",
          "sub": "rapor",
          "amac": "Tedarikçilerden gelen/girilen alış faturalarını (EVRAK_TIP 302) liste halinde gösterir; tutar, cari ve işlem menüsüyle yönetir.",
          "neden": "İndirilecek KDV takibi, tedarikçi mutabakatı ve alış maliyeti analizinin temelidir. Yeni alış faturası buradan girilir.",
          "nasil": [
            "Listeyi açın; alış faturaları KPI kartları ve satırlar halinde görünür.",
            "Yeni alış için 'Yeni Fatura' ile alış fatura giriş ekranını açın.",
            "Aramak için 'Filtrele' ile cari, evrak no veya tarih aralığı girin.",
            "Satır menüsünden Yazdır, Düzenle veya İptal Et işlemlerini yapın.",
            "Alt bardan Excel/Yazdır ile toplu çıktı alın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Fatura",
              "islev": "Alış faturası giriş ekranını açar",
              "sonuc": "Boş alış fatura formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, evrak no ve tarihe göre listeyi daraltır",
              "sonuc": "Kriterlere uyan alış faturaları listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili alış faturasını düzenleme modunda açar",
              "sonuc": "Fatura kalemleri değiştirilebilir",
              "renk": "primary"
            },
            {
              "ad": "Yazdır",
              "islev": "Faturanın taslak çıktısını üretir",
              "sonuc": "Yazıcı/PDF önizleme açılır",
              "renk": "ghost"
            },
            {
              "ad": "İptal Et",
              "islev": "Alış faturasını iptal eder (DURUM=2)",
              "sonuc": "Fatura iptal olur, stok girişi ve cari hareket geri alınır",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel olarak indirir",
              "sonuc": "Alış listesi .xlsx olarak iner",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Listeyi A4 olarak yazdırır",
              "sonuc": "Yazdırılabilir sayfa açılır",
              "renk": "ghost"
            },
            {
              "ad": "İşlemler",
              "islev": "Alış faturası kaydedildikten sonra sağ üstte açılan toplu menü; yazdır/taslak, e-belge (varsa), paylaşım ve e-posta tek yerde",
              "sonuc": "Fatura sonrası tüm işlemler tek menüden yürür",
              "renk": "primary"
            },
            {
              "ad": "Ödeme Yap",
              "islev": "Ayar açıkken alış faturasından hemen ödeme (EVRAK_TIP 202) girer; faturaya kilitlenmez, cari hesaba esnek işlenir",
              "sonuc": "Kasa/banka hareketi oluşur, tedarikçi bakiyesinden düşülür",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "faturasil",
              "tetik": "İşlemler menüsü > İptal Et",
              "etki": "Alış faturası DURUM=2 yapılır; stok girişi, cari hareket ve seri no girişi geri alınır",
              "neden_sonuc": "Hatalı alış faturasını iptal eder; stok miktarı ve tedarikçi bakiyesi doğru değere döner. İptal etmezseniz stok fazla, tedarikçi borcu yanlış görünür."
            },
            {
              "ad": "faturakomplesildir",
              "tetik": "Komple silme aksiyonu (düzenleme ekranı)",
              "etki": "Alış faturası ve detayları kalıcı silinir",
              "neden_sonuc": "Yanlış girilen alış faturasını iz bırakmadan temizler; kalıcı olduğu için dikkatli kullanılmalıdır."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "kasa",
            "ebelge"
          ],
          "ipuclari": [
            "Alış faturaları indirilecek KDV'yi oluşturur; Vergi Özeti raporunu doğrudan besler.",
            "Gelen e-fatura kutusundan gelen faturaları 'Alış Faturası Olarak Al' ile buraya aktarabilirsiniz.",
            "Dip iskonto ve “Hedef Tutara Getir” alış faturasında da vardır: Dip İskonto tutarı girilir ya da Hedef Tutara Getir ile nihai rakam yazılır; indirim satırlara orantılı dağıtılıp matrah, indirilecek KDV ve maliyet otomatik doğru kalır.",
            "Şube filtresi: Birden fazla şubesi olan işletmelerde filtre penceresine eklenen Şube seçiciyle, yalnız erişim yetkiniz olan şubeleri seçerek listeyi o şubeye ait kayıtlarla süzersiniz; tek şubeli işletmelerde bu seçici görünmez.",
            "Faturayı kaydettikten sonra sağ üstteki 'İşlemler' menüsü yazdır/taslak, e-belge, paylaşım ve e-posta işlemlerini tek yerde toplar (satış faturasındaki menünün aynısı).",
            "Bir ayar açıldığında alış faturasından hemen Ödeme (EVRAK_TIP 202) girebilirsiniz; ödeme faturaya kilitlenmez, doğrudan tedarikçi cari hesabına işlenir (esnek ödeme) ve genel bakiyeden düşülür. Ayar kapalıyken kullanım değişmez."
          ]
        },
        {
          "id": "gonderimbekleyenler",
          "baslik": "Gönderim Bekleyenler",
          "yol": "/ekran/fatura/ebelge/gonderimbekleyenler",
          "sub": "ebelge",
          "amac": "Kesilmiş ama henüz GİB'e iletilmemiş e-fatura/e-arşiv faturalarını (EFATURA_GONDERILECEK=1) listeler ve toplu gönderim sağlar.",
          "neden": "Faturaların resmileşmesi için GİB'e gönderilmesi zorunludur. Bu ekran bekleyen tüm belgeleri tek yerde toplayıp toplu göndermeyi sağlar, unutulan fatura kalmamasını temin eder.",
          "nasil": [
            "Ekranı açın; henüz gönderilmemiş tüm e-fatura/e-arşiv kayıtları listelenir.",
            "Göndermek istediklerinizi satır başındaki kutucuklarla seçin veya 'tümünü seç' ile hepsini işaretleyin.",
            "Göndermeden önce gerekiyorsa 'Önizleme' ile taslağı kontrol edin veya 'Düzenle' ile düzeltin.",
            "'SEÇİLİ FATURALARI GÖNDER' butonuna basıp onaylayın; sistem faturaları entegratöre iletir.",
            "Gönderilenler listeden düşer, durum takibi 'Giden Fatura Sorgula' ekranından yapılır."
          ],
          "butonlar": [
            {
              "ad": "Tümünü Seç",
              "islev": "Listedeki tüm faturaları işaretler",
              "sonuc": "Tüm satırlar seçili olur",
              "renk": "ghost"
            },
            {
              "ad": "Önizleme",
              "islev": "Faturanın taslak görüntüsünü modalda açar",
              "sonuc": "Fatura taslağı ekranda görünür",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Faturayı düzenleme ekranında açar",
              "sonuc": "Fatura gönderilmeden düzeltilebilir",
              "renk": "primary"
            },
            {
              "ad": "Sil",
              "islev": "Faturayı iptal eder (faturasil)",
              "sonuc": "Fatura listeden çıkar, cari/stok hareketleri geri alınır",
              "renk": "danger"
            },
            {
              "ad": "Seçili Faturaları Gönder",
              "islev": "İşaretli faturaları GİB'e toplu iletir",
              "sonuc": "Faturalar e-belge olarak resmileşir ve listeden düşer",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "efaturagonder",
              "tetik": "'Seçili Faturaları Gönder' (onay sonrası)",
              "etki": "Seçili faturalar entegratör (EFaturaGonder servisi) ile GİB'e iletilir, durumları güncellenir",
              "neden_sonuc": "Faturalar yasal e-belgeye dönüşür ve müşteriye ulaşır. Göndermezseniz fatura taslak kalır, tahsilat ve yasal geçerlilik gecikir."
            },
            {
              "ad": "faturasil",
              "tetik": "İşlemler menüsü > Sil (onay sonrası)",
              "etki": "fatura.DURUM=2 yapılır; cari hareket ve stok hareketleri geri alınır",
              "neden_sonuc": "Gönderilmeden yanlış bir faturayı iptal edersiniz; cari ve stok doğru değere döner. İptal etmezseniz bekleyen listede kalır ve yanlışlıkla GİB'e gidebilir."
            }
          ],
          "iliskiler": [
            "ebelge",
            "cari",
            "stok"
          ],
          "ipuclari": [
            "EDönüşüm süreci aktif değilse veya entegratör seçili değilse gönderim yapılamaz (Fatura Ayarları'ndan tanımlayın).",
            "Gönderim öncesi Önizleme ile fatura tipini (e-Fatura / e-Arşiv) ve tutarları kontrol edin; gönderim sonrası düzeltme zorlaşır."
          ]
        },
        {
          "id": "gidendurumsorgula",
          "baslik": "Giden Fatura Sorgula",
          "yol": "/ekran/fatura/ebelge/gidendurumsorgula",
          "sub": "ebelge",
          "amac": "GİB'e gönderilmiş (EFATURA_GONDERILECEK=2) faturaların güncel durumunu entegratörden sorgular ve durum kodunu günceller.",
          "neden": "Gönderilen bir faturanın karşı tarafça kabul/red edildiğini veya GİB'de başarıyla işlendiğini öğrenmek için kullanılır. Reddedilen/askıda kalan faturaları yakalamayı sağlar.",
          "nasil": [
            "Ekranı açın; GİB'e iletilmiş, durumu takip edilen faturalar listelenir.",
            "Sorgulamak istediklerinizi kutucuklarla seçin veya 'tümünü seç' kullanın.",
            "'SEÇİLİ FATURALARI SORGULA' butonuna basın.",
            "Sistem entegratörden durumu çeker; başarılı yanıt gelen faturalar güncel duruma geçer ve listeden düşebilir."
          ],
          "butonlar": [
            {
              "ad": "Tümünü Seç",
              "islev": "Tüm faturaları işaretler",
              "sonuc": "Tüm satırlar seçilir",
              "renk": "ghost"
            },
            {
              "ad": "Seçili Faturaları Sorgula",
              "islev": "İşaretli faturaların GİB durumunu entegratörden çeker",
              "sonuc": "Durum kodları güncellenir, yanıtlanan faturalar listeden düşer",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "efaturasorgula",
              "tetik": "'Seçili Faturaları Sorgula'",
              "etki": "Entegratör durumSorgula çağrılır; fatura.EFATURA_STATUS_KOD/TEXT ve SORGU_ZAMAN güncellenir, sonuçlananlar EFATURA_GONDERILECEK=3 olur",
              "neden_sonuc": "Faturanın karşı tarafça alınıp alınmadığını/red durumunu öğrenirsiniz. Sorgulamazsanız reddedilen veya takılan faturayı fark etmez, tahsilat ve mutabakat aksar."
            }
          ],
          "iliskiler": [
            "ebelge",
            "cari"
          ],
          "ipuclari": [
            "Reddedilen faturalar için iade/yeni fatura süreci gerekir; durumu düzenli sorgulamak gecikmeyi önler.",
            "EDönüşüm süreci pasifse sorgu yapılamaz."
          ]
        },
        {
          "id": "gelenfaturalar",
          "baslik": "E-Fatura Gelen Kutusu",
          "yol": "/ekran/fatura/ebelge/gelenfaturalar",
          "sub": "ebelge",
          "amac": "Firmaya kesilmiş e-Fatura/e-Arşiv belgelerini entegratörden çekip listeler; PDF/HTML/XML görüntüleme, okundu işaretleme, ticari kabul/red ve alış/masraf faturasına dönüştürme sağlar.",
          "neden": "Tedarikçilerin size kestiği e-faturaları takip edip sisteme (alış veya masraf faturası olarak) aktarmanın merkezidir. Ticari faturalarda süresinde kabul/red işaretlemek yasal zorunluluktur.",
          "nasil": [
            "İlk/son tarih, fatura no veya gönderen VKN ile filtreleyip 'Ara' deyin.",
            "Üstteki özet kartlardan gelen e-Fatura/e-Arşiv sayısını görün.",
            "Bir satırın işlem menüsünden PDF/HTML/XML olarak belgeyi görüntüleyin.",
            "'Alış Faturası Olarak Al' ya da 'Masraf Faturası Olarak Al' ile belgeyi sisteme aktarın.",
            "Ticari faturalarda 'Kabul Edildi İşaretle' / 'Red Edildi İşaretle' yapın, gerekirse 'Okundu İşaretle' seçin.",
            "Hızlı arama kutusuyla liste içinde anlık filtreleme yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "Ara",
              "islev": "Tarih/fatura no/VKN filtreleriyle gelen faturaları çeker",
              "sonuc": "Kriterlere uyan gelen faturalar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Varsayılan aralık listesine döner",
              "renk": "ghost"
            },
            {
              "ad": "PDF / HTML / XML",
              "islev": "Gelen belgeyi ilgili formatta yeni sekmede açar",
              "sonuc": "Belge görüntülenir/indirilir",
              "renk": "ghost"
            },
            {
              "ad": "Alış Faturası Olarak Al",
              "islev": "Gelen faturayı alış fatura giriş ekranına aktarır",
              "sonuc": "Alış faturası ön dolu olarak oluşturulur",
              "renk": "primary"
            },
            {
              "ad": "Masraf Faturası Olarak Al",
              "islev": "Gelen faturayı kasa masraf fişine aktarır",
              "sonuc": "Masraf fişi ön dolu açılır",
              "renk": "primary"
            },
            {
              "ad": "Okundu İşaretle",
              "islev": "Gelen faturayı entegratörde okundu olarak işaretler",
              "sonuc": "Fatura okundu durumuna geçer",
              "renk": "ghost"
            },
            {
              "ad": "Kabul Edildi İşaretle",
              "islev": "Ticari faturaya kabul yanıtı gönderir",
              "sonuc": "Fatura resmi olarak kabul edilir",
              "renk": "accent"
            },
            {
              "ad": "Red Edildi İşaretle",
              "islev": "Ticari faturaya red yanıtı gönderir",
              "sonuc": "Fatura resmi olarak reddedilir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "efaturaokundu",
              "tetik": "İşlem menüsü > Okundu İşaretle (onay sonrası)",
              "etki": "Entegratörde ilgili fatura okundu olarak işaretlenir",
              "neden_sonuc": "Gelen faturayı işlenmiş/görülmüş olarak takip edersiniz. İşaretlemezseniz gelen kutusu kalabalıklaşır, hangi belgenin işlendiği karışır."
            },
            {
              "ad": "efaturaisaretle",
              "tetik": "İşlem menüsü > Kabul Edildi İşaretle / Red Edildi İşaretle (onay sonrası)",
              "etki": "Entegratör ticariKabulRed çağrılır; faturaya KABUL/RED yanıtı gönderilir",
              "neden_sonuc": "Ticari faturalarda yasal süre içinde kabul/red bildirimi yaparsınız. Yapmazsanız fatura süre sonunda otomatik kabul sayılır; itiraz hakkınız kaybolur."
            }
          ],
          "iliskiler": [
            "ebelge",
            "stok",
            "kasa",
            "cari"
          ],
          "ipuclari": [
            "Gelen faturayı alış/masrafa alırken ürün eşleştirme (efaborneslesme) ile gelen ürün adını kendi stok kartınıza bağlarsınız; sonraki faturalarda otomatik eşleşir.",
            "EDönüşüm/entegratör tanımlı değilse liste boş gelir.",
            "Ticari (kabul/red gerektiren) faturalarda süreyi kaçırmamak için düzenli kontrol edin.",
            "Listede 'İçeri Alma Durumu' sütunu/rozeti her gelen belgenin sisteme alış/masraf olarak aktarılıp aktarılmadığını (Alındı / Alınmadı) tek bakışta gösterir; aynı belgeyi ikinci kez almanızı önler.",
            "Dövizli gelen fatura içeri alınırken para birimi ve kur doğru eşleştirilir; belge kendi para biriminde (TL karşılığıyla) alış/masraf faturasına aktarılır."
          ]
        },
        {
          "id": "gelenearsiv",
          "baslik": "Gelen e-Arşiv",
          "yol": "/ekran/fatura/ebelge/gelenearsiv",
          "sub": "ebelge",
          "amac": "GİB e-Arşiv portalından firmaya kesilmiş e-Arşiv belgelerini tarih aralığına göre listeler (salt görüntüleme).",
          "neden": "Entegratör dışı, doğrudan GİB portalı üzerinden size kesilmiş e-Arşiv belgelerini görmek ve onay durumlarını izlemek için kullanılır.",
          "nasil": [
            "İlk ve son tarihi girip 'Ara' deyin.",
            "Sistem GİB portalına bağlanıp seçilen aralıktaki belgeleri çeker.",
            "Belge no, gönderen ve onay durumunu tablodan inceleyin.",
            "Hızlı arama kutusuyla liste içinde filtreleyin."
          ],
          "butonlar": [
            {
              "ad": "Ara",
              "islev": "Seçilen tarih aralığındaki e-Arşiv belgelerini GİB portalından çeker",
              "sonuc": "Belge listesi görüntülenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Tarih filtrelerini sıfırlar",
              "sonuc": "Varsayılan aralığa döner",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "ebelge"
          ],
          "ipuclari": [
            "Çalışması için Fatura Ayarları'nda GİB e-Arşiv kullanıcı adı ve şifresi tanımlı olmalıdır.",
            "Bu ekran salt görüntülemedir; belgeyi sisteme almak için E-Fatura Gelen Kutusu'nu kullanın."
          ]
        },
        {
          "id": "satisdokum",
          "baslik": "Satış Fatura Analizi",
          "yol": "/ekran/fatura/rapor/satisdokum",
          "sub": "rapor",
          "amac": "Satış faturalarını çoklu boyutta analiz eder: dönemsel ciro trendi, en iyi müşteriler (top 10), en çok satan ürünler ve fatura başına ortalama sepet.",
          "neden": "Yıllık plan, kampanya kararı ve hedef belirleme için cironuzun detaylı görünümünü sağlar. Hangi müşteri ve üründen ne kadar ciro geldiğini gösterir.",
          "nasil": [
            "'Filtrele' ile fatura dönem aralığını (yıl/ay) seçin.",
            "'Arama Yap' deyin; KPI kartları ve analiz tabloları gelir.",
            "Dönemsel toplamları, top müşteri ve ürün listelerini inceleyin.",
            "Sonucu 'Excel' ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Dönem aralığını seçmek için filtre modalını açar",
              "sonuc": "Dönem seçim formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen döneme göre analizi üretir",
              "sonuc": "Analiz tabloları ve KPI'lar yeniden hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Analizi Excel olarak indirir",
              "sonuc": "Satış dökümü .xlsx olarak iner",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Ortalama sepet tutarı düşükse çapraz satış/paket kampanyası fırsatı olabilir.",
            "Top 10 müşteri/ürün listesi, odaklanılacak segmenti hızlıca gösterir.",
            "Düzeltme: Satır iskontolu satışlarda net satış artık doğru hesaplanır; “Brüt” sütunu iskonto düşülmeden önceki gerçek brüt tutarı gösterir (önceden iskonto iki kez düşülüp satış olduğundan düşük çıkabiliyordu). Fatura kayıtları ve KDV değişmedi."
          ]
        },
        {
          "id": "vergiozet",
          "baslik": "Vergi Özeti",
          "yol": "/ekran/fatura/rapor/vergiozet",
          "sub": "rapor",
          "amac": "Seçili dönemin KDV özetini sunar: satışlardan Hesaplanan KDV, alışlardan İndirilecek KDV ve oran bazlı (%1/%10/%20) kırılımla Net KDV (ödenecek/iade).",
          "neden": "KDV beyannamesinin hazır halidir; ödenecek veya iade edilecek KDV'yi dönem bazında gösterir. Mali müşavir mutabakatı ve nakit planlaması için kritiktir.",
          "nasil": [
            "'Filtrele' ile fatura dönem aralığını seçin.",
            "'Arama Yap' deyin; Hesaplanan, İndirilecek ve Net KDV kartları hesaplanır.",
            "Oran bazlı kırılım tablosundan hangi oranda ne kadar KDV olduğunu görün.",
            "Sonucu beyanname/muhasebe için kullanın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Dönem aralığı seçim modalını açar",
              "sonuc": "Dönem seçim formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen dönemin KDV özetini hesaplar",
              "sonuc": "KDV kartları ve oran kırılımı güncellenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Net KDV pozitifse ödenecek, negatifse devreden/iade KDV'niz vardır.",
            "İndirilecek KDV'nin doğru çıkması için alış faturalarının eksiksiz girilmiş olması gerekir."
          ]
        },
        {
          "id": "stokkarlilik",
          "baslik": "Stok Karlılık Analizi",
          "yol": "/ekran/fatura/rapor/stokkarlilik",
          "sub": "rapor",
          "amac": "Her ürünün satış tutarını, satılan miktarın gerçek maliyetini ve net kâr/marj yüzdesini fatura verisine dayalı hesaplar; en karlı ürünleri sıralar.",
          "neden": "Hangi ürünün gerçekten para kazandırdığını görüp stok ve fiyat stratejisini en karlı ürünlere göre kurmak için kullanılır.",
          "nasil": [
            "'Filtrele' ile maliyet tipini (Ağırlıklı Ortalama/FIFO/LIFO/Son Alış) ve fatura tarih aralığını seçin.",
            "'Arama Yap' deyin; ürünler karlılığa göre sıralı listelenir.",
            "Bir ürünün 'Toplam Maliyet' hücresine tıklayıp maliyet dökümünü (detay) inceleyin.",
            "Net kâr ve marj sütunlarından karlı/zararlı ürünleri belirleyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Maliyet tipi ve tarih aralığı seçim modalını açar",
              "sonuc": "Filtre formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen maliyet tipi/döneme göre karlılığı hesaplar",
              "sonuc": "Ürün karlılık listesi güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Toplam Maliyet (Detay)",
              "islev": "Seçili ürünün maliyet dökümünü açar",
              "sonuc": "Maliyet detay penceresi görünür",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "karlilikmaliyetdetay",
              "tetik": "'Toplam Maliyet' hücresine tıklama",
              "etki": "Salt-okuma sorgu; seçili maliyet tipiyle (avg/fifo/lifo/last) ürünün satış anı maliyet dökümü hesaplanır",
              "neden_sonuc": "Karın hangi maliyet kalemlerinden oluştuğunu şeffaf görürsünüz. Maliyet tipini yanlış seçerseniz kâr/marj olduğundan farklı görünür."
            }
          ],
          "iliskiler": [
            "stok",
            "cari"
          ],
          "ipuclari": [
            "Maliyet tipi seçimi (FIFO/LIFO/AVG/Son Alış) kâr sonucunu değiştirir; işletme muhasebe yönteminize uygun olanı seçin.",
            "Yalnızca satış faturaları (EVRAK_TIP 301) baz alınır.",
            "Düzeltme: Satır iskontolu satışlarda net satış ve kâr artık gerçek değeriyle görünür (iskonto tek kez düşülür); önceden iki kez düşülüp kâr olduğundan düşük çıkabiliyordu. Fatura kayıtları ve KDV değişmedi, yalnızca rapor doğruluğu iyileşti."
          ]
        },
        {
          "id": "carikarlilik",
          "baslik": "Cari Karlılık Analizi",
          "yol": "/ekran/fatura/rapor/carikarlilik",
          "sub": "rapor",
          "amac": "Her müşterinin (cari) satış tutarını, satılan malların maliyetini ve net kâr/marjını hesaplar; en karlı müşterileri sıralar.",
          "neden": "Ciro yüksek ama kârı düşük müşterileri ayırt etmek, karlı müşterilerle ilişkiyi güçlendirmek ve iskonto/fiyat politikasını müşteri bazında yönetmek için kullanılır.",
          "nasil": [
            "'Filtrele' ile maliyet tipini, başlangıç ve bitiş tarihini seçin.",
            "'Arama Yap' deyin; müşteriler karlılığa göre sıralanır.",
            "Bir carinin 'Toplam Maliyet' hücresine tıklayıp maliyet dökümünü görün.",
            "Net kâr ve marj oranından karlı/zararlı müşterileri belirleyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Maliyet tipi ve tarih aralığı modalını açar",
              "sonuc": "Filtre formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen ölçütlere göre cari karlılığı hesaplar",
              "sonuc": "Cari karlılık listesi güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Toplam Maliyet (Detay)",
              "islev": "Seçili carinin maliyet dökümünü açar",
              "sonuc": "Maliyet detay penceresi görünür",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "karlilikmaliyetdetay",
              "tetik": "'Toplam Maliyet' hücresine tıklama",
              "etki": "Salt-okuma; seçili carinin satışlarındaki maliyet kalemleri seçili maliyet tipiyle dökülür",
              "neden_sonuc": "Müşteri karının nereden geldiğini görürsünüz. Yanlış maliyet tipiyle bakınca müşteri gerçekte olduğundan karlı/zararlı görünebilir."
            }
          ],
          "iliskiler": [
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Yüksek ciro her zaman yüksek kâr demek değildir; marj sütununu mutlaka kontrol edin.",
            "Marjı düşük büyük müşterilerde fiyat/iskonto revizyonu değerlendirin.",
            "Düzeltme: Satır iskontolu satışlarda net satış ve kâr artık gerçek değeriyle görünür (iskonto tek kez düşülür); önceden iki kez düşülüp kâr olduğundan düşük çıkabiliyordu. Fatura kayıtları ve KDV değişmedi, yalnızca rapor doğruluğu iyileşti."
          ]
        },
        {
          "id": "grupkarlilik",
          "baslik": "Ürün Grubu Karlılık Analizi",
          "yol": "/ekran/fatura/rapor/grupkarlilik",
          "sub": "rapor",
          "amac": "Ürün gruplarının (kategorilerin) satış tutarını, maliyetini ve net kâr marjını analiz eder; en karlı grupları sıralar (grupsuz ürünler ayrı gösterilir).",
          "neden": "Hangi kategoriye yatırım yapılacağını, hangi grubun zarar ettiğini belirlemek için kategori düzeyinde karlılık görünümü sağlar.",
          "nasil": [
            "'Filtrele' ile maliyet tipini, ürün grubunu ve fatura tarih aralığını seçin.",
            "'Arama Yap' deyin; gruplar karlılığa göre sıralanır.",
            "Bir grubun 'Toplam Maliyet' hücresine tıklayıp maliyet dökümünü inceleyin.",
            "Net kâr ve marj yüzdesinden odaklanılacak grupları seçin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Maliyet tipi, grup ve tarih modalını açar",
              "sonuc": "Filtre formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen ölçütlere göre grup karlılığını hesaplar",
              "sonuc": "Grup karlılık listesi güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Toplam Maliyet (Detay)",
              "islev": "Seçili grubun maliyet dökümünü açar",
              "sonuc": "Maliyet detay penceresi görünür",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "karlilikmaliyetdetay",
              "tetik": "'Toplam Maliyet' hücresine tıklama",
              "etki": "Salt-okuma; grup içindeki ürünlerin satış anı maliyeti seçili maliyet tipiyle dökülür (grupsuz için ID=0)",
              "neden_sonuc": "Grup karının hangi ürünlerden geldiğini görürsünüz. Yanlış maliyet tipi grup karlılığını yanıltıcı gösterebilir."
            }
          ],
          "iliskiler": [
            "stok",
            "cari"
          ],
          "ipuclari": [
            "Grupsuz ürünler ayrı satırda toplanır; kârı doğru okumak için ürünleri gruplamak faydalıdır.",
            "Zarar eden grupta fiyat/tedarik maliyeti gözden geçirilmelidir.",
            "Düzeltme: Satır iskontolu satışlarda net satış ve kâr artık gerçek değeriyle görünür (iskonto tek kez düşülür); önceden iki kez düşülüp kâr olduğundan düşük çıkabiliyordu. Fatura kayıtları ve KDV değişmedi, yalnızca rapor doğruluğu iyileşti."
          ]
        },
        {
          "id": "yogunluk",
          "baslik": "Yoğunluk Analizi",
          "yol": "/ekran/fatura/rapor/yogunluk",
          "sub": "rapor",
          "amac": "Satışlara 80/20 Pareto prensibini uygular; ciroya en çok katkı sağlayan müşteri/ürünleri sıralı, pay % ve kümülatif % ile A/B/C sınıflarına ayırarak gösterir.",
          "neden": "Cironuzun büyük kısmının hangi az sayıda müşteri/üründen geldiğini görüp kaynaklarınızı doğru yere odaklamak için kullanılır.",
          "nasil": [
            "'Filtrele' ile dönem aralığını (yıl/ay) seçin.",
            "'Arama Yap' deyin; kayıtlar cirodan aldıkları paya göre sıralanır.",
            "Pay % ve kümülatif % sütunlarından %80'in nerede tamamlandığını görün.",
            "A sınıfı (ilk %80) müşteri/ürünlere önceliği verin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Dönem aralığı seçim modalını açar",
              "sonuc": "Dönem seçim formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen döneme göre Pareto analizini üretir",
              "sonuc": "Sıralı yoğunluk tablosu ve A/B/C sınıfları görünür",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "stok"
          ],
          "ipuclari": [
            "A sınıfı kayıtlar cironuzun ~%80'ini oluşturur; bunları kaybetmek en yüksek risktir.",
            "C sınıfına harcanan çabayı A sınıfına kaydırmak verimliliği artırır.",
            "Düzeltme: Satır iskontolu satışlarda net satış artık gerçek değeriyle sıralamaya girer (iskonto tek kez düşülür); önceden olduğundan düşük çıkabiliyordu. Fatura kayıtları değişmedi, yalnızca rapor doğruluğu iyileşti."
          ]
        },
        {
          "id": "faturayaslandirma",
          "baslik": "Fatura Yaşlandırma",
          "yol": "/ekran/fatura/rapor/faturayaslandirma",
          "sub": "rapor",
          "amac": "Ödemeleri FIFO mantığıyla en eski faturadan düşerek tamamı kapanmamış (açık) faturaları tek tek listeler; her faturanın ödenen/kalan tutarını ve vadesinden bu yana geçen gün sayısını gösterir.",
          "neden": "Hangi faturanın ne kadarının açık kaldığını ve kaç gün geciktiğini fatura bazında görüp tahsilat/ödeme takibi yapmak için kullanılır. Vadesi geçmiş alacakları önceliklendirmeyi sağlar.",
          "nasil": [
            "'Filtrele' ile fatura tipi (satış/alış), cari kod/ünvan, fatura tarih aralığı ve yaş bandını seçin.",
            "'Arama Yap' deyin; açık faturalar gecikme gününe göre listelenir.",
            "Gecikme (gün), ödenen ve kalan sütunlarından riskli faturaları belirleyin.",
            "Bant (Vadesi Gelmemiş / 0-30 / 31-60 / 61-90 / 90+) filtresiyle en geciken alacaklara odaklanın.",
            "Sonucu 'Excel' veya 'Yazdır' ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tip, cari, tarih ve yaş bandı seçim modalını açar",
              "sonuc": "Filtre formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen ölçütlere göre açık faturaları hesaplar",
              "sonuc": "Yaşlandırma listesi güncellenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Yaşlandırmayı Excel olarak indirir",
              "sonuc": "Rapor .xlsx olarak iner",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Yaşlandırmayı A4 olarak yazdırır",
              "sonuc": "Yazdırılabilir sayfa açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "kasa"
          ],
          "ipuclari": [
            "Gecikme günü vade tarihinden, vade yoksa fatura tarihinden hesaplanır.",
            "90+ bandındaki faturalar tahsilat riski en yüksek olanlardır; öncelikle bunları takip edin.",
            "Ödemeler FIFO ile en eski faturaya mahsup edilir; kısmi ödenen faturalar 'kalan' tutarıyla açık görünür."
          ]
        }
      ]
    },
    {
      "slug": "irsaliye",
      "title": "Irsaliye & E-Irsaliye",
      "icon": "📦",
      "modul": "irsaliye",
      "ad": "İrsaliye (Sevkiyat / Mal Kabul Belgesi) Modülü",
      "ozet": "İrsaliye modülü, mal sevkiyatını belgeleyen giden ve gelen irsaliyeleri yönetir. Giden irsaliyeler müşteriye sevk edilen malı (stok çıkışı, EVRAK_TIP=402, ISLEM_TIP=0) ve istenirse GİB e-İrsaliyesini üretir; gelen irsaliyeler tedarikçiden alınan malı (stok girişi, EVRAK_TIP=401, ISLEM_TIP=1) kaydeder. Seri numarası takibi, taşıyıcı/şoför tanımları, tek veya toplu (çok-cari) faturalandırma ve sipariş/servis/saha satış bağlantılarıyla stok, cari ve fatura modüllerine köprü kurar. Her irsaliye kaydında IRSALIYE_KESILDI otomasyon tetikleyicisi çalışır.",
      "modul_iliskiler": [
        "stok (stok_hareket / stok_fis — irsaliye kaydında stok giriş/çıkış fişi oluşur; silmede refSil ile geri alınır)",
        "cari (CARI_ID/UNVAN, adressorgula ile adres ve il/ilçe/semt/mahalle sorgulama)",
        "fatura (irsaliyeden satış/alış faturası üretme — FaturaOlustur::satisIrsaliyeden; giden→satış, gelen→alış)",
        "siparis (sipariş kaynaklı irsaliye silinince teslim/kalan miktar ve sipariş pozisyonu geri alınır)",
        "servis (servis iş emri kapatma irsaliyesi — silinince servis_is_emri IRSALIYE_ID/KAPAMA bağı çözülür)",
        "sahasatis (saha ziyareti SATIS_TUTAR denormalizesi — silmede GREATEST(0,...) ile düşürülür)",
        "ebelge/edonusum (GİB e-İrsaliye entegratör gönderimi, EIRSALIYE_GUID/STATUS)",
        "b2b (müşteri portalına HMAC imzalı paylaşım linki)",
        "otomasyon (IRSALIYE_KESILDI tetikleyici — giden ve gelen kayıtta)",
        "stok_seri_no (seri numarası giriş/çıkış takibi)"
      ],
      "ekranlar": [
        {
          "id": "gidenirsaliyeler",
          "baslik": "Giden İrsaliye",
          "yol": "/ekran/irsaliye/rapor/gidenirsaliyeler",
          "sub": "rapor",
          "amac": "Müşteriye sevk edilen malların irsaliyelerini (giden, EVRAK_TIP=402) listeler; buradan yeni irsaliye girişi, düzenleme, yazdırma, e-İrsaliye gönderme, silme ve B2B link paylaşımı yapılır.",
          "neden": "Mal çıkışlarının kaydını tutmak, sevk edilen malı belgelemek ve müşteriye e-İrsaliye göndermek yasal ve operasyonel zorunluluktur. Mal sevk edildiğinde önce irsaliye kesilir, fatura sonradan (ör. ay sonu) düzenlenebilir.",
          "nasil": [
            "Sağ üstteki 'İrsaliye Girişi' butonuyla yeni giden irsaliye formunu açın (cari, ürün satırları, sevk adresi, taşıyıcı/şoför/plaka girilir).",
            "Kaydedince mal stoktan düşer ve kayıt bu listeye gelir.",
            "Bir kayıttaki İŞLEMLER menüsünden Yazdır / Düzenle / Sil seçeneklerine ulaşın.",
            "E-İrsaliye aktifse gönderim bekleyen kayıtta 'E-İrsaliye Gönder' veya 'Gönder + Yazdır' ile GİB'e iletin.",
            "Gönderilmiş kayıtta 'E-İrsaliye PDF' ile resmi belgeyi görüntüleyin.",
            "Sağ üstteki filtre (huni) ile cari, evrak no veya tarih aralığına göre arayın.",
            "B2B aktifse 'B2B Link' ile müşteriye görüntüleme bağlantısı paylaşın."
          ],
          "butonlar": [
            {
              "ad": "İrsaliye Girişi",
              "islev": "Yeni giden irsaliye giriş formunu (islem/gidenirsaliye) açar",
              "sonuc": "Boş irsaliye formu açılır; cari ve ürün girip kaydedince stok çıkışı oluşur",
              "renk": "primary"
            },
            {
              "ad": "Yazdır",
              "islev": "Seçilen irsaliyenin baskı tasarımını (numaratör seçimli printModal) açar",
              "sonuc": "Yazdırılabilir irsaliye çıktısı gösterilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "İrsaliyeyi düzenleme modunda açar",
              "sonuc": "Mevcut satırlar yüklenir; kaydedince stok fişi yeniden oluşturulur (gönderilmiş EIRSALIYE_GONDERILECEK=2 ve FATURALANDI_MI durumu korunur)",
              "renk": "ghost"
            },
            {
              "ad": "Taslak Gör",
              "islev": "Henüz gönderilmemiş e-İrsaliyenin taslak önizlemesini açar",
              "sonuc": "Entegratör taslağı yeni sekmede açılır",
              "renk": "ghost"
            },
            {
              "ad": "E-İrsaliye Gönder",
              "islev": "İrsaliyeyi GİB'e / entegratöre gönderir (eirsaliyeGonderIslem.gonderTek → eirsaliyegonder)",
              "sonuc": "Başarılıysa EVRAK_NO ve ETTN/GUID döner, kayıt EIRSALIYE_GONDERILECEK=2 'gönderildi' işaretlenir",
              "renk": "accent"
            },
            {
              "ad": "Gönder + Yazdır",
              "islev": "Gönderim sonrası resmi belgeyi otomatik yazdırır (gonderVeYazdir)",
              "sonuc": "E-İrsaliye gönderilir ve baskı penceresi açılır",
              "renk": "accent"
            },
            {
              "ad": "E-İrsaliye PDF",
              "islev": "Gönderilmiş e-İrsaliyenin resmi PDF'ini açar (ebelgePDF, EIRSALIYE_GUID ile)",
              "sonuc": "GİB onaylı belge yeni sekmede gösterilir",
              "renk": "ghost"
            },
            {
              "ad": "B2B Link",
              "islev": "Müşteriye paylaşılabilir görüntüleme linki (HMAC-SHA256 imzalı) üretir",
              "sonuc": "Kopyalanabilir link modalı açılır (b2bLinkGoster)",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "İrsaliyeyi siler (helper.deleteButton → irsaliyefissil)",
              "sonuc": "Onay sonrası kayıt pasifleşir (DURUM=-1), stok hareketi geri alınır, seri no'lar stoğa döner",
              "renk": "danger"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari / evrak no / tarih aralığı ile filtre modalı açar (FArama → aramaBtn)",
              "sonuc": "Kriterlere uyan kayıtlar listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Listeyi Excel'e aktarır (excelExport)",
              "sonuc": "Excel dosyası indirilir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır (Liste)",
              "islev": "Listeyi A4 rapor olarak yazdırır (reportPrint A4)",
              "sonuc": "A4 baskı görünümü yeni sekmede açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "gidenirsaliyefisekle",
              "tetik": "İrsaliye giriş formunda Kaydet",
              "etki": "irsaliye_fis (EVRAK_TIP=402, ISLEM_TIP=0, FATURALANDI_MI=0) + irsaliye_fis_detay yazılır, stok_fis/stok_hareket ile stok çıkışı işlenir, seri no'lar stok_seri_no'da çıkış (CIKIS_EVRAK_TIP=402) yapılır, e-İrsaliye bayrağı (EIRSALIYE_GONDERILECEK) set edilir, IRSALIYE_KESILDI otomasyonu tetiklenir",
              "neden_sonuc": "Bu işlem malı stoktan düşer ve resmi sevk belgesini üretir; yapmazsanız sevk kaydı ve stok azalışı oluşmaz, mal fiilen çıkmış ama sistemde durur. Ayar 'gidenstoktandus=2' ise stok düşülmez (sadece belge). 'otogonder=1' ise kayıt anında e-İrsaliye otomatik gönderilir, 'otoyazdir=1' ise baskı otomatik açılır."
            },
            {
              "ad": "irsaliyefissil",
              "tetik": "İşlemler > Sil",
              "etki": "irsaliye_fis ve detay DURUM=-1, stok hareketi refSil ile geri alınır, seri no'lar stoğa döner (giden 402 stoğa geri, gelen 401 kaydı silinir), bağlı sipariş teslim/kalan miktarı ve sipariş pozisyonu geri alınır, servis_is_emri IRSALIYE_ID/KAPAMA bağı çözülür, saha ziyareti SATIS_TUTAR düşürülür",
              "neden_sonuc": "Yanlış/iptal irsaliyeyi kaldırır ve stok ile bağlı tüm kayıtları (sipariş, servis, saha) tutarlı hale getirir. Faturalanmış irsaliye (FATURALANDI_MI=1) silinemez — önce bağlı fatura iptal edilmeli; aksi halde e-belge/maliyet referansı bozulurdu."
            },
            {
              "ad": "eirsaliyegonder",
              "tetik": "E-İrsaliye Gönder / Gönder + Yazdır",
              "etki": "Entegratöre giriş yapılıp e-İrsaliye modeli gönderilir; başarılıysa irsaliye_fis EIRSALIYE_GONDERILECEK=2, EVRAK_NO, EIRSALIYE_GUID (ETTN) ve status alanları güncellenir, başarısızsa hata metni kayda yazılır",
              "neden_sonuc": "İrsaliyeyi resmi olarak GİB'e iletir; başarısızsa hata mesajı kayda yazılır ve tekrar denenebilir. Cari VKN/TCKN veya zorunlu detay eksikse gönderim reddedilir ve kayıt gönderim bekleyende kalır."
            },
            {
              "ad": "adressorgula",
              "tetik": "Giriş formunda cari seçimi",
              "etki": "cari_kart adres bilgisi ve PTT il/ilçe/semt/mahalle listeleri döner",
              "neden_sonuc": "Sevk adresini carinin kayıtlı adresinden otomatik doldurur; doğru sevk adresi e-İrsaliyede zorunludur."
            }
          ],
          "iliskiler": [
            "stok",
            "cari",
            "ebelge",
            "b2b",
            "siparis",
            "servis",
            "otomasyon"
          ],
          "ipuclari": [
            "Faturalanmış bir irsaliye silinemez; önce bağlı faturayı iptal edin.",
            "E-İrsaliye göndermeden önce carinin geçerli VKN (10 hane) veya TCKN (11 hane, ad+soyad dolu) bilgisi olmalı.",
            "Ayarlarda otogonder=1 ise irsaliye kaydedilir kaydedilmez otomatik GİB'e gider; otoyazdir=1 ise kayıt sonrası otomatik baskı açılır.",
            "Yeşil 'E-İrs' rozeti kaydın gönderildiğini gösterir.",
            "Seri no takipli üründe seri seçim penceresinde, 'Satışta Elle (Girişsiz) Seri Girişi' ayarı açıkken stokta olmayan bir seri no yazıp Enter'a basınca seri elle (girişsiz) seçilir ve giden irsaliyeyle satılmış kaydedilir.",
            "Şube filtresi: Birden fazla şubesi olan işletmelerde filtre penceresine eklenen Şube seçiciyle, yalnız erişim yetkiniz olan şubeleri seçerek listeyi o şubeye ait kayıtlarla süzersiniz; tek şubeli işletmelerde bu seçici görünmez."
          ]
        },
        {
          "id": "gidenirsaliyefatura",
          "baslik": "Giden İrsaliye Faturalandır",
          "yol": "/ekran/irsaliye/islem/gidenirsaliyefatura",
          "sub": "islem",
          "amac": "Faturalanmamış giden irsaliyeleri listeler; seçili irsaliyeleri tek cari için tek satış faturasına veya birden çok cariyi ayrı ayrı toplu satış faturalarına dönüştürür.",
          "neden": "Sevkiyat önce irsaliye ile yapılıp fatura toplu olarak (ör. ay sonu) kesildiğinde, biriken irsaliyeleri hızlıca faturalamak zaman kazandırır ve fatura-irsaliye eşleşmesini garantiler.",
          "nasil": [
            "Faturalanmamış giden irsaliyeler tablo halinde gelir.",
            "Faturalamak istediğiniz irsaliyeleri satır başındaki kutucuklarla seçin.",
            "Tek bir cariye ait seçtiyseniz 'FATURALANDIR > Tek Cari Faturalandır' ile satış faturası formuna geçin (farklı cari seçiliyse sistem uyarır).",
            "Birden çok cari seçtiyseniz 'Tümünü Faturalandır' ile toplu faturalandırma ekranına gidin.",
            "Toplu ekranda cariler gruplanır; her grubu 'Önizle' ile inceleyin, fatura tarihini seçip 'Faturalandır' ile her cariye ayrı fatura üretin.",
            "Filtre ile cari veya tarih aralığına göre daraltın."
          ],
          "butonlar": [
            {
              "ad": "Tek Cari Faturalandır",
              "islev": "Seçili (aynı cari) irsaliyeleri satış faturası formuna aktarır (irsaliye.faturalandir → fatura formuna window.location ile geçiş)",
              "sonuc": "Satış fatura ekranına yönlendirir; birden fazla cari seçiliyse uyarı verir ve 'Tümünü Faturalandır'a yönlendirir",
              "renk": "primary"
            },
            {
              "ad": "Tümünü Faturalandır",
              "islev": "Seçili irsaliyeleri cari bazında gruplayan toplu ekrana geçer (topluFaturalandirGit → tip=cariliste)",
              "sonuc": "Toplu faturalandırma sayfası (gidenirsaliyefatura_cari) açılır",
              "renk": "accent"
            },
            {
              "ad": "Önizle",
              "islev": "Grup için oluşacak fatura kalemlerini önizler (faturaOnizle → irsaliyefaturaonizleme)",
              "sonuc": "Stok/miktar/br.fiyat/KDV/tutar önizleme modalı açılır",
              "renk": "ghost"
            },
            {
              "ad": "Faturalandır (Toplu)",
              "islev": "Seçili cari gruplarını sırayla faturalandırır (topluCarilisteFaturalandir → irsaliyetoplufaturalandir)",
              "sonuc": "Her cari için ayrı fatura no üretilir, hatalı gruplar atlanıp diğerleri yazılır",
              "renk": "primary"
            },
            {
              "ad": "Geri Dön",
              "islev": "Faturalandırma listesine döner (history.back)",
              "sonuc": "Önceki ekrana gider",
              "renk": "ghost"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari/tarih filtre modalı açar (FArama → aramaBtn)",
              "sonuc": "Kriterlere uyan faturalanmamış irsaliyeler listelenir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "irsaliyetoplufaturalandir",
              "tetik": "Toplu ekranda 'Faturalandır'",
              "etki": "Seçili irsaliyeler CARI_ID|PARA_BIRIM bazında gruplanır, her grup için ayrı satış faturası oluşturulur (FaturaOlustur::satisIrsaliyeden), irsaliye_fis FATURALANDI_MI=1 işaretlenir",
              "neden_sonuc": "Çok sayıda irsaliyeyi tek tıkla faturalar; farklı para birimleri karışmaz. Bir grup hata verirse (SAVEPOINT) sadece o grup atlanır, diğerleri yazılır. Faturalanan irsaliye artık silinemez."
            },
            {
              "ad": "irsaliyefaturaonizleme",
              "tetik": "'Önizle' butonu",
              "etki": "irsaliye_fis_detay satırları okunur ve oluşacak fatura kalemleri (stok, miktar, br.fiyat, KDV, tutar) döndürülür",
              "neden_sonuc": "Faturalamadan önce oluşacak kalemleri ve toplamı görmenizi sağlar; yanlış seçimi kesinleşmeden fark etmenizi sağlar."
            }
          ],
          "iliskiler": [
            "fatura",
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Tek fatura için tüm seçili irsaliyeler aynı cariye ait olmalı; değilse sistem 'Tümünü Faturalandır'a yönlendirir.",
            "Toplu faturalandırmada her cari (ve her para birimi) için ayrı fatura kesilir.",
            "'Tek Cari Faturalandır' ve 'FATURALANDIR' butonları 'irsaliyefaturalandir' yetkisiyle gösterilir; faturalandırma asıl olarak fatura modülünde tamamlanır."
          ]
        },
        {
          "id": "gelenirsaliyeler",
          "baslik": "Gelen İrsaliye",
          "yol": "/ekran/irsaliye/rapor/gelenirsaliyeler",
          "sub": "rapor",
          "amac": "Tedarikçiden gelen malların irsaliyelerini (gelen, EVRAK_TIP=401) listeler; yeni gelen irsaliye girişi, düzenleme, yazdırma ve silme buradan yapılır.",
          "neden": "Depoya giren malın kaydını tutmak, stok girişini belgelemek ve gelen faturayla eşleştirmek için gereklidir. Mal geldiğinde önce gelen irsaliye ile stok girişi yapılır.",
          "nasil": [
            "Sağ üstteki 'İrsaliye Girişi' ile gelen irsaliye formunu açın.",
            "Tedarikçi cariyi, ürün satırlarını, miktar ve alış fiyatlarını girin.",
            "Kaydedince mal stoğa girer ve kayıt listeye düşer.",
            "İŞLEMLER menüsünden Yazdır / Düzenle / Sil işlemlerini yapın.",
            "Filtre ile cari, evrak no veya tarihe göre arayın."
          ],
          "butonlar": [
            {
              "ad": "İrsaliye Girişi",
              "islev": "Yeni gelen irsaliye giriş formunu (islem/gelenirsaliye) açar",
              "sonuc": "Boş form açılır; kaydedince stok girişi oluşur",
              "renk": "primary"
            },
            {
              "ad": "Yazdır",
              "islev": "İrsaliye baskı modalını açar (printModal, evraktip=401)",
              "sonuc": "Yazdırılabilir çıktı gösterilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Gelen irsaliyeyi düzenleme modunda açar",
              "sonuc": "Satırlar yüklenir; kaydedince stok girişi yeniden hesaplanır",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Gelen irsaliyeyi siler (helper.deleteButton → irsaliyefissil)",
              "sonuc": "Onay sonrası kayıt pasifleşir (DURUM=-1), stok girişi geri alınır, giren seri no'lar silinir",
              "renk": "danger"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari/evrak tip/evrak no/tarih filtre modalı açar",
              "sonuc": "Kriterlere uyan kayıtlar listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Listeyi Excel'e aktarır (excelExport)",
              "sonuc": "Excel indirilir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır (Liste)",
              "islev": "Listeyi A4 rapor olarak yazdırır (reportPrint A4)",
              "sonuc": "A4 baskı görünümü açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "gelenirsaliyefisekle",
              "tetik": "Gelen irsaliye formunda Kaydet",
              "etki": "irsaliye_fis (EVRAK_TIP=401, ISLEM_TIP=1, FATURALANDI_MI=0) + detay yazılır, stok_fis/stok_hareket ile stok girişi işlenir, seri no'lar stok_seri_no'ya giriş (GIRIS_EVRAK_TIP=401) olarak eklenir, IRSALIYE_KESILDI otomasyonu tetiklenir",
              "neden_sonuc": "Bu işlem malı stoğa ekler ve mal kabul belgesi üretir; yapmazsanız depoya giren mal sistemde görünmez, stok eksik kalır."
            },
            {
              "ad": "irsaliyefissil",
              "tetik": "İşlemler > Sil",
              "etki": "irsaliye_fis/detay DURUM=-1, stok girişi refSil ile geri alınır, giren seri no'lar (GIRIS_EVRAK_TIP=401) stok_seri_no'dan silinir",
              "neden_sonuc": "Hatalı mal kabulünü iptal eder ve stoğu düzeltir; faturalanmışsa (FATURALANDI_MI=1) silinemez, önce fatura iptali gerekir."
            },
            {
              "ad": "adressorgula",
              "tetik": "Formda cari seçimi",
              "etki": "cari_kart adresi ve PTT il/ilçe/semt/mahalle listeleri döner",
              "neden_sonuc": "Adres alanlarını carinin kayıtlı verisinden otomatik doldurur."
            }
          ],
          "iliskiler": [
            "stok",
            "cari",
            "fatura",
            "otomasyon"
          ],
          "ipuclari": [
            "Gelen irsaliyede ürün seçilmeyen (serbest metin) satırlar stok fişine yazılmaz, sadece belgede görünür.",
            "Seri numaralı ürünlerde giren seri no'lar takip için stok_seri_no'ya kaydedilir."
          ]
        },
        {
          "id": "gelenirsaliyefatura",
          "baslik": "Gelen İrsaliye Faturalandır",
          "yol": "/ekran/irsaliye/islem/gelenirsaliyefatura",
          "sub": "islem",
          "amac": "Faturalanmamış gelen irsaliyeleri (FATURALANDI_MI=0) listeler; seçili irsaliyeleri tedarikçi alış faturasına dönüştürmek üzere alış fatura ekranına aktarır.",
          "neden": "Tedarikçiden mal önce irsaliye ile alınıp fatura sonradan geldiğinde, bekleyen gelen irsaliyeleri alış faturasıyla eşleştirmek maliyet ve cari borç takibi için gereklidir.",
          "nasil": [
            "Faturalanmamış gelen irsaliyeler tablo halinde listelenir.",
            "Faturalamak istediğiniz irsaliyeleri kutucuklarla seçin (veya başlıktaki kutucukla tümünü seçin).",
            "Sağ üstteki 'FATURALANDIR' butonuyla seçili irsaliyeleri alış faturası formuna aktarın.",
            "Filtre ile cari veya tarih aralığına göre daraltın."
          ],
          "butonlar": [
            {
              "ad": "FATURALANDIR",
              "islev": "Seçili gelen irsaliyeleri alış faturası ekranına gönderir (irsaliye.faturalandir → fatura/islem/alisfatura formuna window.location ile geçiş)",
              "sonuc": "Alış faturası formu seçili irsaliyelerle açılır; birden fazla cari seçiliyse uyarı verir",
              "renk": "primary"
            },
            {
              "ad": "Tümünü Seç",
              "islev": "Başlıktaki kutucukla tüm satırları işaretler (irsaliyeFaturalandirmaSelectAll)",
              "sonuc": "Tüm irsaliyeler seçili olur",
              "renk": "ghost"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari/tarih filtre modalı açar (FArama → aramaBtn)",
              "sonuc": "Kriterlere uyan kayıtlar listelenir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "fatura",
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Bu ekran yalnızca FATURALANDI_MI=0 olan gelen irsaliyeleri gösterir.",
            "'FATURALANDIR' butonu 'irsaliyefaturalandir' yetkisiyle görünür; faturalandırma alış faturası ekranında tamamlanır, burada sadece seçim yapılır."
          ]
        },
        {
          "id": "tasiyici",
          "baslik": "Taşıyıcılar",
          "yol": "/ekran/irsaliye/tanim/tasiyici",
          "sub": "tanim",
          "amac": "Sevkiyatta kullanılan nakliye/taşıyıcı firmalarını (VKN + ünvan) tanımlar; irsaliye girişinde taşıyıcı seçim listesini besler.",
          "neden": "Sık kullanılan taşıyıcı firmaları önceden tanımlamak, her irsaliyede tekrar veri girmeyi önler ve e-İrsaliyede taşıyıcı bilgilerinin tutarlı olmasını sağlar.",
          "nasil": [
            "Formda taşıyıcının Vergi Kimlik No ve Ünvan bilgisini girin.",
            "Durumu Aktif/Pasif seçin.",
            "KAYDET ile listeye ekleyin.",
            "Alt tablodan mevcut taşıyıcıyı Düzenle veya Sil ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Taşıyıcı tanımını ekler/günceller (tasiyiciekle)",
              "sonuc": "irsaliye_tasiyici tablosuna kayıt yazılır",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu temizler/iptal eder",
              "sonuc": "Giriş sıfırlanır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili taşıyıcıyı düzenleme modunda açar",
              "sonuc": "Form mevcut değerlerle dolar",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Taşıyıcıyı siler (tasiyicisil)",
              "sonuc": "Onay sonrası DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "tasiyiciekle",
              "tetik": "KAYDET",
              "etki": "irsaliye_tasiyici tablosuna insert veya update (VKN, UNVAN, DURUM)",
              "neden_sonuc": "Taşıyıcıyı sisteme tanımlar; tanımlı taşıyıcılar irsaliye formunda hızlı seçilir. Tanımlamazsanız her irsaliyede elle yazmanız gerekir."
            },
            {
              "ad": "tasiyicisil",
              "tetik": "Sil",
              "etki": "irsaliye_tasiyici DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan taşıyıcıyı listeden kaldırır; geçmiş irsaliyelerdeki taşıyıcı bilgisi etkilenmez."
            }
          ],
          "iliskiler": [
            "irsaliye giriş formu (giden/gelen)"
          ],
          "ipuclari": [
            "Taşıyıcı VKN'si e-İrsaliyede taşıyıcı firma bilgisi olarak kullanılır, doğru girin.",
            "Pasif yapılan taşıyıcı yeni seçimlerde görünmez ama kaydı silinmez."
          ]
        },
        {
          "id": "sofor",
          "baslik": "Şoförler",
          "yol": "/ekran/irsaliye/tanim/sofor",
          "sub": "tanim",
          "amac": "Sevkiyatta araç kullanan şoförleri (TC Kimlik No + Ad Soyad) tanımlar; irsaliye girişinde şoför seçim listesini besler.",
          "neden": "e-İrsaliyede şoför TCKN'si ve adı zorunlu bilgilerdendir; şoförleri önceden tanımlamak her sevkiyatta hatasız ve hızlı giriş sağlar.",
          "nasil": [
            "Formda şoförün T.C. Kimlik No ve Adı Soyadı bilgisini girin.",
            "Durumu Aktif/Pasif seçin.",
            "KAYDET ile listeye ekleyin.",
            "Alt tablodan mevcut şoförü Düzenle veya Sil ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Şoför tanımını ekler/günceller (soforekle)",
              "sonuc": "irsaliye_sofor tablosuna kayıt yazılır",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu temizler/iptal eder",
              "sonuc": "Giriş sıfırlanır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili şoförü düzenleme modunda açar",
              "sonuc": "Form mevcut değerlerle dolar",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Şoförü siler (soforsil)",
              "sonuc": "Onay sonrası DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "soforekle",
              "tetik": "KAYDET",
              "etki": "irsaliye_sofor tablosuna insert veya update (TCKIMLIK, ADSOYAD, DURUM)",
              "neden_sonuc": "Şoförü sisteme tanımlar; irsaliye formunda hızlı seçilir ve e-İrsaliyeye doğru TCKN/ad gider. Yanlış TCKN e-İrsaliye reddine yol açabilir."
            },
            {
              "ad": "soforsil",
              "tetik": "Sil",
              "etki": "irsaliye_sofor DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan şoförü listeden kaldırır; geçmiş irsaliyeler etkilenmez."
            }
          ],
          "iliskiler": [
            "irsaliye giriş formu (giden/gelen)"
          ],
          "ipuclari": [
            "Şoför TCKN'si boş/0 ise e-İrsaliyede varsayılan (11111111111) gönderilir; mümkünse gerçek TCKN girin.",
            "Şoför ad-soyadı e-İrsaliyede ad ve soyad olarak ayrıştırılarak gönderilir."
          ]
        },
        {
          "id": "irsaliyeliste",
          "baslik": "İrsaliye Listesi",
          "yol": "/ekran/irsaliye/rapor/irsaliyeliste",
          "sub": "rapor",
          "amac": "Giden ve gelen tüm irsaliyeleri tek liste halinde gösteren genel takip raporudur; KPI kartları ile toplam adet, giden/gelen dağılımı ve toplam tutarı özetler.",
          "neden": "Sevkiyat operasyonunun bütününü tek ekranda görmek, mal kabul/gönderim mutabakatı yapmak ve faturalanmamış kayıtları iki yönde tespit etmek için kullanılır.",
          "nasil": [
            "Performans için ekran filtresiz boş gelir; sağ üstteki 'Filtreleme Yap' ile başlayın.",
            "Cari, evrak tipi (Gelen/Giden), evrak no veya tarih aralığı belirleyip 'Arama Yap' deyin.",
            "KPI kartlarından toplam adet, giden/gelen ve toplam tutarı okuyun.",
            "Tablodan bir kaydın İŞLEMLER menüsüyle Yazdır / Düzenle / Sil yapın (kaydın tipine göre doğru forma yönlenir).",
            "Excel veya A4 Yazdır ile raporu dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Filtre modalını açar (rapor filtresiz çalışmaz)",
              "sonuc": "Kriter girip arayınca liste ve KPI'lar dolar",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre kriterlerini uygular",
              "sonuc": "Kriterlere uyan irsaliyeler listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre boşalır",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Kayıt baskı modalını açar (printModal, kaydın EVRAK_TIP'ine göre)",
              "sonuc": "Yazdırılabilir irsaliye çıktısı gösterilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "İrsaliyeyi (gelen/giden tipine göre) düzenleme modunda açar",
              "sonuc": "İlgili giriş formu yüklenir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "İrsaliyeyi siler (irsaliyefissil)",
              "sonuc": "Onay sonrası kayıt pasifleşir, stok ve bağlı kayıtlar geri alınır",
              "renk": "danger"
            },
            {
              "ad": "Excel",
              "islev": "Listeyi Excel'e aktarır (excelExport)",
              "sonuc": "Excel indirilir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır (Liste)",
              "islev": "Listeyi A4 rapor olarak yazdırır (reportPrint A4)",
              "sonuc": "A4 baskı görünümü açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "irsaliyefissil",
              "tetik": "İşlemler > Sil",
              "etki": "irsaliye_fis/detay DURUM=-1, stok hareketi ve seri no geri alınır, bağlı sipariş teslim miktarı / servis iş emri bağı / saha satış tutarı denormalizeleri düzeltilir",
              "neden_sonuc": "Hatalı irsaliyeyi kaldırır ve tüm bağlı kayıtları tutarlı hale getirir; faturalanmış (FATURALANDI_MI=1) irsaliye silinemez."
            }
          ],
          "iliskiler": [
            "stok",
            "cari",
            "fatura",
            "siparis",
            "servis",
            "sahasatis"
          ],
          "ipuclari": [
            "İrsaliye sayısı yüksek olabileceği için filtre zorunludur; en azından tarih aralığı seçin.",
            "Bu ekran hem giden (402) hem gelen (401) irsaliyeleri birlikte gösterir; düzenle/sil işlemi kaydın tipine göre doğru forma yönlenir.",
            "KPI kartları filtreye uyan sayfadaki kayıtların toplam adet, giden/gelen ve tutar özetini verir."
          ]
        },
        {
          "id": "gonderimbekleyenler",
          "baslik": "Gönderim Bekleyenler",
          "yol": "/ekran/irsaliye/ebelge/gonderimbekleyenler",
          "sub": "ebelge",
          "amac": "e-İrsaliye olarak gönderilmek üzere işaretlenmiş ancak henüz GİB'e iletilmemiş giden irsaliyeleri (EVRAK_TIP=402, EIRSALIYE_GONDERILECEK=1) listeler; tek tek veya toplu gönderim yapılır.",
          "neden": "Kaydedilirken hemen gönderilmeyen veya gönderimi hata alan e-İrsaliyeleri tek yerden toplayıp göndermek, hiçbir sevkiyatın gönderilmeden kalmamasını sağlar. Bu ekran yalnızca e-İrsaliye entegrasyonu aktifse görünür.",
          "nasil": [
            "Gönderim bekleyen irsaliyeler ve varsa son deneme hata mesajı listelenir.",
            "Göndermek istediklerinizi kutucuklarla seçin (veya tümünü seç).",
            "'Seçilileri Gönder' ile toplu gönderim yapın.",
            "Tek kayıt için İŞLEMLER > 'Gönder' veya 'Gönder + Yazdır' kullanın.",
            "Entegratör panelinden manuel gönderdiyseniz 'Gönderildi Olarak İşaretle' ile listeden düşürün.",
            "'Önizleme' ile taslak belgeyi kontrol edin."
          ],
          "butonlar": [
            {
              "ad": "Seçilileri Gönder",
              "islev": "İşaretli irsaliyeleri toplu GİB'e gönderir (gonderBtn → eirsaliyegonder döngüsü)",
              "sonuc": "Her biri sırayla gönderilir, sonuç bildirilir",
              "renk": "accent"
            },
            {
              "ad": "Tümünü Seç",
              "islev": "Tüm satırları işaretler (tumunuSec)",
              "sonuc": "Bütün bekleyenler seçili olur",
              "renk": "ghost"
            },
            {
              "ad": "Gönder",
              "islev": "Tek irsaliyeyi GİB'e gönderir (gonderTek → eirsaliyegonder)",
              "sonuc": "Başarılıysa listeden düşer, EVRAK_NO/ETTN alınır",
              "renk": "accent"
            },
            {
              "ad": "Gönder + Yazdır",
              "islev": "Gönderim sonrası resmi belgeyi yazdırır (gonderVeYazdir)",
              "sonuc": "Gönderilir ve baskı açılır",
              "renk": "accent"
            },
            {
              "ad": "Gönderildi Olarak İşaretle",
              "islev": "Entegratör dışı gönderileni manuel kapatır (hariciOnayla → eirsaliyeharicionayla)",
              "sonuc": "Kayıt EIRSALIYE_GONDERILECEK=2, EIRSALIYE_STATUS_KOD=HARICI yapılır, listeden düşer",
              "renk": "ghost"
            },
            {
              "ad": "Önizleme",
              "islev": "Taslak e-İrsaliye belgesini modalda gösterir (taslakOnizleme)",
              "sonuc": "Iframe/yeni sekmede taslak açılır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "İrsaliyeyi düzenleme modunda açar",
              "sonuc": "Giden irsaliye formu yüklenir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "eirsaliyegonder",
              "tetik": "Gönder / Gönder + Yazdır / Seçilileri Gönder",
              "etki": "Entegratöre giriş yapılıp e-İrsaliye modeli kurulup gönderilir; başarılıysa irsaliye_fis EIRSALIYE_GONDERILECEK=2, EVRAK_NO, EIRSALIYE_GUID (ETTN) ve status güncellenir, başarısızsa hata metni kayda yazılır",
              "neden_sonuc": "İrsaliyeyi resmi e-belgeye dönüştürüp GİB'e iletir; göndermezseniz sevkiyat yasal olarak e-İrsaliye zorunluluğunu karşılamaz. Cari VKN/TCKN veya detay eksikse gönderim reddedilir ve kayıt bekleyende kalır. Gönderim yalnızca EIRSALIYE_GONDERILECEK=1 olan giden (402) kayıtlarda çalışır."
            },
            {
              "ad": "eirsaliyeharicionayla",
              "tetik": "'Gönderildi Olarak İşaretle'",
              "etki": "irsaliye_fis EIRSALIYE_GONDERILECEK=2, EIRSALIYE_STATUS_KOD=HARICI, EIRSALIYE_STATUS_TEXT ve EIRSALIYE_GONDERI_ZAMAN güncellenir",
              "neden_sonuc": "Entegratör portalından elle gönderilen irsaliyeyi bekleyenler listesinden temizler; işaretlemezseniz aynı belge tekrar gönderilmeye çalışılabilir. Yalnızca e-İrsaliye gönderme yetkisi (eirsaliyegonder) olan kullanıcı yapabilir ve yalnızca gönderim bekleyen (EIRSALIYE_GONDERILECEK=1) kayıtta çalışır."
            }
          ],
          "iliskiler": [
            "ebelge",
            "edonusum",
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Bu ekran sadece İrsaliye Ayarları'nda e-İrsaliye durumu aktifse (eirsaliye.durum=1) görünür.",
            "Kırmızı 'Son deneme' notu önceki gönderim hatasını ve nedenini gösterir; hatayı giderip tekrar gönderin.",
            "Entegratör panelinden gönderdiyseniz mükerrer gönderimi önlemek için 'Gönderildi Olarak İşaretle' kullanın."
          ]
        }
      ]
    },
    {
      "slug": "siparis",
      "title": "Siparis",
      "icon": "📋",
      "modul": "siparis",
      "ad": "Sipariş Yönetimi",
      "ozet": "Sipariş modülü, müşteriden alınan (EVRAK_TIP 904) ve tedarikçiye verilen (EVRAK_TIP 903) siparişleri tek bir çatı altında yönetir. Sipariş girişinden itibaren stokta \"beklenen/rezerve\" hareketi oluşturur, siparişleri kısmi veya tam olarak irsaliye ve faturaya aktarır, teslim/kalan miktarı satır bazında takip eder. Ayrıca açık/geciken/bekleyen siparişler, stok-sipariş dengesi, karlılık ve müşteri eğilimi gibi operasyonel ve stratejik raporlar sunar; durum, konu ve sabit açıklama tanımları ile n8n otomasyon tetikleyicileri (SIPARIS_OLUSTURULDU, SIPARIS_DURUM_DEGISTI) içerir. Not: Verilen siparişlerde toplu aktar ekranı yalnızca faturaya aktarımı destekler.",
      "modul_iliskiler": [
        "cari",
        "stok",
        "fatura",
        "irsaliye",
        "proje",
        "sahasatis",
        "otomasyon (n8n)",
        "b2b / musteri portalı",
        "depo"
      ],
      "ozet_kontrol": "İnventer koda karşı doğrulandı; verilensiparisaktar ekranındaki hayali İrsaliyeye Aktar butonu/olayı çıkarıldı.",
      "ekranlar": [
        {
          "id": "alinansiparisliste",
          "baslik": "Alınan Siparişler",
          "amac": "Müşterilerinizden aldığınız tüm siparişleri (EVRAK_TIP 904) tek listede görüntüleyip yönetmenizi sağlar. Her satırda cari, evrak no, tarih, durum rozeti ve tutar görünür.",
          "neden": "Satış hattınıza gelen işlerin merkezidir; buradan yeni sipariş girer, durumları takip eder, faturaya/irsaliyeye dönüştürmeye hazırlarsınız. Günlük satış operasyonunun başlangıç ekranıdır.",
          "sub": "islem",
          "yol": "/ekran/siparis/islem/alinansiparisliste",
          "nasil": [
            "Sağ üstteki filtre (huni) butonundan cari, evrak no veya sipariş tarih aralığına göre listeyi daraltın.",
            "Yeni sipariş için 'Alınan Sipariş Girişi' butonuna tıklayın.",
            "Bir satırın 'İşlemler' menüsünden Detay, Yazdır, Durum, Düzenle veya Sil seçin.",
            "Toplu durum değiştirmek için satırları işaretleyip 'Seçili Sipariş Durumlarını Değiştir' butonunu kullanın.",
            "Alt taraftaki EXCEL butonu ile listeyi dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Alınan Sipariş Girişi",
              "islev": "Yeni alınan sipariş giriş formunu açar",
              "sonuc": "Boş sipariş formu ekranına gider",
              "renk": "primary"
            },
            {
              "ad": "Seçili Sipariş Durumlarını Değiştir",
              "islev": "İşaretli siparişlerin durumunu topluca değiştirmek için modal açar",
              "sonuc": "Toplu durum değiştirme penceresi açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, evrak no ve tarih aralığı filtre modalını açar",
              "sonuc": "Liste seçilen kriterlere göre yeniden yüklenir",
              "renk": "ghost"
            },
            {
              "ad": "Detay",
              "islev": "Siparişin tüm satır ve bilgilerini görüntüler",
              "sonuc": "Sipariş detay ekranına gider",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırma modalını açar (EVRAK_TIP 904)",
              "sonuc": "Sipariş fişi HTML/PDF olarak yazdırılır",
              "renk": "ghost"
            },
            {
              "ad": "Durum",
              "islev": "Tek siparişin durumunu değiştirme modalını açar",
              "sonuc": "Durum güncellenir ve log/otomasyon tetiklenir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Siparişi düzenleme formunda açar",
              "sonuc": "Sipariş giriş formu düzenleme modunda açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Siparişi onay sonrası siler",
              "sonuc": "Sipariş ve bağlı stok hareketleri silinir",
              "renk": "danger"
            },
            {
              "ad": "Excel",
              "islev": "Listeyi Excel'e aktarır",
              "sonuc": "Filtreli liste dosya olarak indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "durumdegistir",
              "tetik": "İşlemler menüsü > Durum > Kaydet",
              "etki": "siparis.DURUM_ID güncellenir, evrak_islem_log'a kayıt düşer ve SIPARIS_DURUM_DEGISTI otomasyonu tetiklenir",
              "neden_sonuc": "Siparişin iş akışındaki aşamasını (örn. Hazırlanıyor, Sevk Edildi) günceller ve müşteriye e-posta/SMS otomasyonu (n8n) tetikleyebilir. Yapmazsanız ekip siparişin hangi aşamada olduğunu göremez."
            },
            {
              "ad": "topludurumdegistir",
              "tetik": "Seçili siparişler + Toplu Durum modalı > Kaydet",
              "etki": "Seçili tüm siparişlerin DURUM_ID'si güncellenir, her biri için evrak_islem_log düşer (zaten aynı durumdakiler atlanır)",
              "neden_sonuc": "Çok sayıda siparişi tek seferde aynı aşamaya taşır (örn. gün sonu toplu 'Sevk Edildi'). Zaman kazandırır; tek tek uğraşmazsınız. (Toplu işlemde tek tek otomasyon tetiklenmez.)"
            },
            {
              "ad": "siparissil",
              "tetik": "İşlemler menüsü > Sil > Onay",
              "etki": "siparis, siparis_detay ve EVRAK_TIP eşleşen stok_fis/stok_hareket kayıtları DURUM=-1 yapılır; siparis_aciklama_iliski ve siparis_konu_iliski kayıtları silinir; saha satışıysa ziyaretin SATIS_TUTAR'ı geri düşülür",
              "neden_sonuc": "Yanlış/iptal siparişi sistemden kaldırır ve rezerve edilmiş stok blokesini geri açar. Yanlış silerseniz sipariş geçmişi kaybolur (soft-delete olduğu için teknik olarak geri alınabilir)."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "fatura",
            "irsaliye",
            "otomasyon (n8n)",
            "sahasatis"
          ],
          "ipuclari": [
            "Liste yılbaşından bugüne varsayılan tarih aralığıyla açılır; eski siparişler için filtreyi genişletin.",
            "Durum rozetinin rengi 'Sipariş Durumları' tanımından gelir; renkleri anlamlı seçmek listeyi okunur kılar.",
            "Silme işlemi soft-delete'tir (DURUM=-1); kayıt tamamen yok olmaz."
          ]
        },
        {
          "id": "alinansiparisaktar",
          "baslik": "Alınan Siparişleri Aktar",
          "amac": "Müşteriden alınan siparişleri toplu olarak irsaliyeye veya faturaya dönüştürmenizi sağlar. Satır bazında teslim edilecek miktarı girerek kısmi sevk yapabilirsiniz.",
          "neden": "Sipariş alındıktan sonra malın çıkışını (irsaliye) ve satışını (fatura) belgeye bağlamak gerekir. Bu ekran, birden çok siparişi tek seferde ve stok bakiyesini görerek aktararak operasyonu hızlandırır.",
          "sub": "islem",
          "yol": "/ekran/siparis/islem/alinansiparisaktar",
          "nasil": [
            "Sağ üstteki filtreden cari, durum, evrak no ve tarih aralığını seçip 'Arama Yap' deyin (filtre zorunludur).",
            "Listelenen siparişlerin satırlarını açarak sipariş/kalan/stok bakiye ve teslim miktarını görün.",
            "Her satır için teslim edilecek miktarı girin (kalan miktarı aşamaz).",
            "Aktarılacak siparişleri işaretleyin.",
            "'İrsaliyeye Aktar' veya 'Faturaya Aktar' butonundan aktarım tipini seçin.",
            "Açılan modalda evrakın siparişin kendi carisine mi yoksa seçtiğiniz başka bir cariye mi kesileceğini belirleyip 'Aktarım Yap' deyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, durum, evrak no ve tarih filtresi açar",
              "sonuc": "Aktarılabilir sipariş listesi gelir",
              "renk": "ghost"
            },
            {
              "ad": "İrsaliyeye Aktar",
              "islev": "Seçili siparişleri irsaliyeye dönüştürme modalını açar",
              "sonuc": "İrsaliye cari seçim penceresi açılır",
              "renk": "primary"
            },
            {
              "ad": "Faturaya Aktar",
              "islev": "Seçili siparişleri faturaya dönüştürme modalını açar",
              "sonuc": "Fatura cari seçim penceresi açılır",
              "renk": "primary"
            },
            {
              "ad": "Aktarım Yap",
              "islev": "Seçili siparişleri sırayla evraka aktarır",
              "sonuc": "İrsaliye/fatura oluşur, teslim ve kalan miktarlar güncellenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "alinansiparisirsaliyeyeaktar",
              "tetik": "İrsaliyeye Aktar modalı > Aktarım Yap",
              "etki": "Giden irsaliye evrakı oluşturulur, siparis_detay.TESLIM_MIKTAR artırılır ve KALAN_MIKTAR azaltılır, tamamı sevk edilirse durum 'faturalandı/teslim' olarak işaretlenir",
              "neden_sonuc": "Malın fiziksel çıkışını belgeler ve stoktan düşer. Kalan miktar 0 olunca sipariş kapanır; girmezseniz sevkiyat kayıt altına alınmaz ve stok tutmaz."
            },
            {
              "ad": "alinansiparisfaturayaaktar",
              "tetik": "Faturaya Aktar modalı > Aktarım Yap",
              "etki": "Satış faturası oluşturulur, siparis_detay teslim/kalan miktarları güncellenir, cari borçlandırılır",
              "neden_sonuc": "Siparişi resmi satışa dönüştürür (gelir + cari alacak). Sunucu tarafı teslim miktarının kalanı aşmasını engeller; böylece fazla faturalama olmaz."
            }
          ],
          "iliskiler": [
            "irsaliye",
            "fatura",
            "stok",
            "cari"
          ],
          "ipuclari": [
            "Stok bakiyesi kalan sipariş miktarını karşılamıyorsa ilgili satır sarı/kırmızı ile uyarır; yine de aktarabilirsiniz ama stok eksiye düşebilir.",
            "Teslim miktarını kalan miktardan az girerek kısmi sevk/fatura yapabilir, kalanı sonra aktarabilirsiniz.",
            "'Aşağıda seçtiğim cariye aktar' seçeneğiyle siparişleri farklı bir cari üzerine faturalayabilirsiniz."
          ]
        },
        {
          "id": "verilensiparisliste",
          "baslik": "Verilen Siparişler",
          "amac": "Tedarikçilerinize verdiğiniz satınalma siparişlerini (EVRAK_TIP 903) tek listede görüntüleyip yönetmenizi sağlar.",
          "neden": "Tedarik zincirinin takip merkezidir; hangi malı kimden, ne zamana beklediğinizi görür, gelen malı irsaliye/faturaya bağlar ve durumlarını izlersiniz.",
          "sub": "islem",
          "yol": "/ekran/siparis/islem/verilensiparisliste",
          "nasil": [
            "Filtreden tedarikçi (cari), evrak no veya tarih aralığı seçin.",
            "Yeni sipariş için 'Verilen Sipariş Girişi' butonuna tıklayın.",
            "Satırın 'İşlemler' menüsünden Görüntüle, Yazdır, Durum, Düzenle veya Sil seçin.",
            "Toplu durum değişimi için satırları işaretleyip ilgili butonu kullanın.",
            "EXCEL ile listeyi dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Verilen Sipariş Girişi",
              "islev": "Yeni verilen sipariş giriş formunu açar",
              "sonuc": "Boş satınalma sipariş formuna gider",
              "renk": "primary"
            },
            {
              "ad": "Seçili Sipariş Durumlarını Değiştir",
              "islev": "İşaretli siparişlerin durumunu topluca değiştirir",
              "sonuc": "Toplu durum modalı açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, evrak no, tarih filtresi açar",
              "sonuc": "Liste kritere göre yenilenir",
              "renk": "ghost"
            },
            {
              "ad": "Görüntüle",
              "islev": "Sipariş detayını açar",
              "sonuc": "Detay ekranına gider",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırma modalını açar (EVRAK_TIP 903)",
              "sonuc": "Sipariş fişi yazdırılır",
              "renk": "ghost"
            },
            {
              "ad": "Durum",
              "islev": "Tek sipariş durum değiştirme modalını açar",
              "sonuc": "Durum güncellenir, log/otomasyon tetiklenir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Siparişi düzenleme formunda açar",
              "sonuc": "Form düzenleme modunda açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Siparişi onay sonrası siler",
              "sonuc": "Sipariş ve bloke stok hareketleri silinir",
              "renk": "danger"
            },
            {
              "ad": "Excel",
              "islev": "Listeyi Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "durumdegistir",
              "tetik": "İşlemler menüsü > Durum > Kaydet",
              "etki": "siparis.DURUM_ID güncellenir, evrak_islem_log düşer, SIPARIS_DURUM_DEGISTI otomasyonu tetiklenir",
              "neden_sonuc": "Tedarik siparişinin aşamasını (Onaylandı, Yolda, Teslim Alındı) izler; güncellemezseniz beklenen mal takibi zayıflar."
            },
            {
              "ad": "topludurumdegistir",
              "tetik": "Seçili siparişler + toplu modal > Kaydet",
              "etki": "Seçili siparişlerin durumu topluca güncellenir, her biri için log düşer",
              "neden_sonuc": "Birden fazla tedarik siparişini tek hamlede aynı aşamaya taşır."
            },
            {
              "ad": "siparissil",
              "tetik": "İşlemler menüsü > Sil > Onay",
              "etki": "siparis + detay + EVRAK_TIP eşleşen bloke stok_fis/stok_hareket DURUM=-1 yapılır, açıklama/konu ilişkileri silinir",
              "neden_sonuc": "İptal edilen tedarik siparişini kaldırır ve beklenen giriş blokesini temizler."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "fatura",
            "irsaliye",
            "otomasyon (n8n)"
          ],
          "ipuclari": [
            "Verilen sipariş, teslim alınana kadar stokta 'beklenen giriş' olarak görünür; Stok-Sipariş Dengesi raporunu besler.",
            "Tarih aralığı varsayılan olarak yılbaşından bugüne gelir."
          ]
        },
        {
          "id": "verilensiparisaktar",
          "baslik": "Verilen Siparişleri Aktar",
          "amac": "Tedarikçiye verdiğiniz siparişlerden teslim aldığınız malı toplu olarak alış faturasına dönüştürmenizi sağlar. (Bu ekran yalnızca faturaya aktarımı destekler; verilen siparişte irsaliyeye aktarım bulunmaz.)",
          "neden": "Tedarikçiden gelen mal girişini belgeye bağlamak (stok girişi + cari borç) için kullanılır. Kısmi teslimatları satır bazında teslim alınan miktarı girerek takip edebilirsiniz.",
          "sub": "islem",
          "yol": "/ekran/siparis/islem/verilensiparisaktar",
          "nasil": [
            "Filtreden tedarikçi, durum ve tarih aralığı seçip 'Arama Yap' deyin.",
            "Sipariş satırlarını açıp teslim alınan miktarı girin.",
            "Aktaracağınız siparişleri işaretleyin.",
            "'Faturaya Aktar' butonuna basıp cari seçimini (her sipariş kendi carisine / seçtiğiniz cariye) yapın.",
            "'Aktarım Yap' ile alış faturasını oluşturun."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, durum, tarih filtresi açar",
              "sonuc": "Aktarılabilir sipariş listesi gelir",
              "renk": "ghost"
            },
            {
              "ad": "Faturaya Aktar",
              "islev": "Seçili siparişleri alış faturasına dönüştürme modalını açar",
              "sonuc": "Fatura cari seçim penceresi açılır",
              "renk": "primary"
            },
            {
              "ad": "Aktarım Yap",
              "islev": "Seçili siparişleri sırayla alış faturasına aktarır",
              "sonuc": "Alış faturası oluşur, teslim/kalan miktar güncellenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "verilensiparisfaturayaaktar",
              "tetik": "Faturaya Aktar modalı > Aktarım Yap",
              "etki": "Alış faturası oluşturulur, siparis_detay teslim/kalan güncellenir, stok girişi ve cari borç oluşur",
              "neden_sonuc": "Tedarikçiden gelen malı resmi girişe çevirir (stok artışı + tedarikçiye borç). Girmezseniz stok ve cari bakiyeniz gerçeği yansıtmaz."
            }
          ],
          "iliskiler": [
            "fatura",
            "stok",
            "cari"
          ],
          "ipuclari": [
            "Teslim miktarını gelen mal kadar girin; kalan miktar sonraki teslimat için açık kalır.",
            "Aktarım tek tek sıralı yapılır; toplu seçimde ekran ilerlemeyi gösterir.",
            "Verilen siparişte irsaliye aktarımı yoktur; mal girişi doğrudan alış faturasıyla belgelenir."
          ]
        },
        {
          "id": "durum",
          "baslik": "Sipariş Durumları",
          "amac": "Alınan ve verilen siparişler için kullanacağınız durum/aşama etiketlerini (renkli) tanımlamanızı sağlar. Örn: Beklemede, Hazırlanıyor, Sevk Edildi.",
          "neden": "Siparişlerin iş akışını görsel takip etmek için gereklidir. Her durumun arkaplan/yazı rengi listede rozet olarak görünür ve raporları besler.",
          "sub": "tanim",
          "yol": "/ekran/siparis/tanim/durum",
          "nasil": [
            "Kullanım yerini seçin (Verilen Sipariş / Alınan Sipariş).",
            "Durum adını, sıra numarasını, arkaplan ve yazı rengini girin.",
            "Varsayılan olsun mu ve aktif/pasif seçimini yapın.",
            "KAYDET ile durumu ekleyin; alt listeden mevcut durumları düzenleyin veya silin.",
            "İsterseniz kendi durumlarınızı (örn. Üretime Alındı, Araca Yüklendi, Sevk Edildi) Sipariş Ayarları'ndan sistem aşamalarına eşleyin; böylece siparişi üretime aldığınızda ve sahadan/ofisten teslim ettiğinizde sipariş durumu otomatik ilerler."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Durum tanımını ekler/günceller",
              "sonuc": "sys_durum'a yeni durum yazılır",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "Değişiklik yapılmadan boş forma döner",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili durumu forma yükler",
              "sonuc": "Durum düzenleme moduna geçer",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Durumu onay sonrası siler",
              "sonuc": "Durum DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "durumkaydet",
              "tetik": "Kaydet butonu",
              "etki": "sys_durum tablosuna insert/update; varsayılan işaretlenirse aynı modülün diğer varsayılanı sıfırlanır",
              "neden_sonuc": "Sipariş aşamalarını tanımlar. Doğru kurmazsanız siparişleri anlamlı durumlara ayıramaz, geciken/açık takibini zorlaştırırsınız."
            },
            {
              "ad": "durumsil",
              "tetik": "Sil butonu > Onay",
              "etki": "sys_durum kaydı DURUM=-1 yapılır",
              "neden_sonuc": "Artık kullanılmayan durumu kaldırır; kullanımdaki bir durumu silmek eski siparişlerde rozetin boş görünmesine yol açabilir."
            }
          ],
          "iliskiler": [
            "sys_durum"
          ],
          "ipuclari": [
            "Faturalandı/kısmi faturalandı durumları config ile eşleştirilir; bu özel durumları silmeyin.",
            "Sıra numarası, durum seçim listelerindeki görünme sırasını belirler.",
            "Otomatik durum akışı isteğe bağlıdır (varsayılan kapalı): kendi durumlarınızı Sipariş Ayarları'ndan sistem aşamalarına eşlerseniz üretime alma ve teslim adımlarında durum otomatik ilerler ve listede renkli görünür; eşleme yapmazsanız davranış aynen kalır."
          ]
        },
        {
          "id": "konu",
          "baslik": "Sipariş Konuları",
          "amac": "Siparişleri sınıflandırmak için konu/etiket tanımları (Verilen/Alınan sipariş için) oluşturmanızı sağlar.",
          "neden": "Siparişleri konularına göre gruplayarak raporlama ve filtreleme kolaylaşır. Sipariş formunda çoklu konu seçilebilir.",
          "sub": "tanim",
          "yol": "/ekran/siparis/tanim/konu",
          "nasil": [
            "Kullanım yerini (Verilen/Alınan Sipariş) seçin.",
            "Konu adını ve sıra numarasını girin.",
            "Aktif/Pasif durumunu belirleyin.",
            "KAYDET ile ekleyin; alt listeden düzenleyin veya silin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Konu tanımını ekler/günceller",
              "sonuc": "kayit_gruplari'na konu yazılır",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu iptal eder",
              "sonuc": "Boş forma döner",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Konuyu forma yükler",
              "sonuc": "Düzenleme moduna geçer",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Konuyu siler",
              "sonuc": "Konu DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "konuekle",
              "tetik": "Kaydet butonu",
              "etki": "kayit_gruplari tablosuna insert/update (SIRA/DURUM ile)",
              "neden_sonuc": "Sipariş sınıflandırma etiketi oluşturur; tanımlamazsanız siparişleri konuya göre gruplayamazsınız."
            },
            {
              "ad": "konusil",
              "tetik": "Sil butonu > Onay",
              "etki": "kayit_gruplari kaydı DURUM=-1 yapılır",
              "neden_sonuc": "Kullanılmayan konuyu kaldırır."
            }
          ],
          "iliskiler": [
            "kayit_gruplari"
          ],
          "ipuclari": [
            "Konular sipariş formunda çoklu seçilebilir ve siparis_konu_iliski tablosunda tutulur.",
            "Verilen ve Alınan sipariş için ayrı konu listeleri tanımlayın."
          ]
        },
        {
          "id": "siparisaciklama",
          "baslik": "Sabit Açıklamalar",
          "amac": "Sipariş formunda tek tıkla eklenebilecek hazır/sabit açıklama metinlerini ve bunların gruplarını tanımlamanızı sağlar.",
          "neden": "Sık kullanılan not/şart metinlerini (teslim koşulları, garanti notu vb.) her seferinde yazmak yerine hazır seçmek zaman kazandırır ve tutarlılık sağlar.",
          "sub": "tanim",
          "yol": "/ekran/siparis/tanim/siparisaciklama",
          "nasil": [
            "'Açıklamalar' sekmesinde grup, ad, metin, sıra ve durum girip KAYDET deyin.",
            "'Açıklama Grupları' sekmesinden metinleri kategorilere ayırmak için grup oluşturun.",
            "Alt listelerden mevcut açıklama/grupları düzenleyin veya silin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Sabit açıklama metnini ekler/günceller",
              "sonuc": "sys_sabitmetin'e kayıt yazılır (MODULE_KEY=siparis)",
              "renk": "primary"
            },
            {
              "ad": "Kaydet (Grup)",
              "islev": "Açıklama grubunu ekler/günceller",
              "sonuc": "kayit_gruplari (YER=SIPARISACIKLAMAGRUP) kaydı yazılır",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu iptal eder",
              "sonuc": "Boş forma döner",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Kaydı forma yükler",
              "sonuc": "Düzenleme moduna geçer",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Açıklamayı/grubu siler",
              "sonuc": "İlgili kayıt kalıcı olarak silinir (hard delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "sabitaciklamakaydet",
              "tetik": "Açıklamalar sekmesi > Kaydet",
              "etki": "sys_sabitmetin (MODULE_KEY=siparis) insert/update",
              "neden_sonuc": "Hazır açıklama metni oluşturur; sipariş formunda hızlı açıklama modalından seçilebilir."
            },
            {
              "ad": "aciklamasil",
              "tetik": "Açıklama satırı > Sil > Onay",
              "etki": "sys_sabitmetin kaydı kalıcı olarak silinir (delete)",
              "neden_sonuc": "Kullanılmayan hazır metni kaldırır. Soft-delete değildir; kayıt geri gelmez."
            },
            {
              "ad": "sabitaciklamagrupkaydet",
              "tetik": "Açıklama Grupları sekmesi > Kaydet",
              "etki": "kayit_gruplari (YER=SIPARISACIKLAMAGRUP) insert/update",
              "neden_sonuc": "Açıklamaları kategorize etmek için grup oluşturur."
            },
            {
              "ad": "sabitaciklamagrupsil",
              "tetik": "Grup satırı > Sil > Onay",
              "etki": "kayit_gruplari (YER=SIPARISACIKLAMAGRUP) kaydı kalıcı olarak silinir",
              "neden_sonuc": "Kullanılmayan açıklama grubunu kaldırır."
            }
          ],
          "iliskiler": [
            "sys_sabitmetin",
            "kayit_gruplari"
          ],
          "ipuclari": [
            "Açıklamalar sipariş formundaki 'Hızlı Açıklama' modalında listelenir ve çoklu seçilebilir.",
            "Metinleri gruplayarak uzun listelerde bulunabilirliği artırın."
          ]
        },
        {
          "id": "aciksiparis",
          "baslik": "Açık Siparişler",
          "amac": "Kalan miktarı sıfırdan büyük olan tüm sipariş satırlarını, yani henüz teslim edilmemiş iş yükünü satır bazında listeler.",
          "neden": "Operasyon ekibinin günlük teslimat planlaması ve iş yükü takibi için temel rapordur. Teslim tarihi geçmiş satırlar pembe ile işaretlenir.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/aciksiparis",
          "nasil": [
            "Sağ üstteki 'Filtrele' butonundan başlangıç/bitiş tarihi (ve cari) seçin — filtre zorunludur.",
            "'Arama Yap' ile raporu çalıştırın.",
            "KPI kartlarından açık sipariş/satır, bugün teslim ve gecikmiş satır sayılarını görün.",
            "Pembe satırlar teslim tarihi geçenlerdir; bunları önceliklendirin.",
            "EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih ve cari filtre modalını açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste ve KPI'lar yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre temizlenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "cari"
          ],
          "ipuclari": [
            "Performans için filtre zorunludur; geniş tarih aralığında rapor yavaşlayabilir.",
            "Stok yetip yetmediğini görmek için 'Stok-Sipariş Dengesi' raporuyla birlikte kullanın.",
            "Satırlar teslim tarihine göre değerlendirilir; teslim tarihi geçmiş açık satırlar pembe ile işaretlenir. Teslim tarihi hem ofisten sipariş girişinde hem de plasiyerin saha teslim ekranından girilebilir.",
            "Tarih seçici, açık sipariş / bekleyen / geciken ve stok bazlı sipariş raporlarında aynı tutarlı davranışla çalışır."
          ]
        },
        {
          "id": "bekleyenler",
          "baslik": "Teslimata Hazır / Bekleyen",
          "amac": "Müşteriden alınmış ama henüz teslim edilmemiş siparişleri (EVRAK_TIP 904) teslimat tarihine göre sıralı gösterir; sevkiyat ekibinin çalışma listesidir.",
          "neden": "Bugün sevk edilecekleri, geciken ve ileri tarihli işleri ayırt ederek hazırlık ve sevkiyatı planlamak için kullanılır.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/bekleyenler",
          "nasil": [
            "'Filtrele' ile teslim tipini (Bugün / Geçmiş / Gelecek) seçin.",
            "'Arama Yap' ile listeyi getirin.",
            "KPI kartlarından bekleyen sipariş, hazırlanacak satır, bugün teslim ve gecikmiş sayılarını okuyun.",
            "Renk kodlarına göre (pembe=geciken, turuncu=bugün) önceliklendirin.",
            "EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Teslim tipi filtre modalını açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "cari",
            "irsaliye"
          ],
          "ipuclari": [
            "Sadece alınan siparişleri (904) kapsar.",
            "Bugün teslim edilecekler için irsaliyeyi Aktar ekranından hazırlayın.",
            "Filtre teslim tarihine göre çalışır: teslim tipini Bugün / Geçmiş (geciken) / Gelecek olarak seçersiniz; siparişin teslim tarihi giriş formundan gelir."
          ]
        },
        {
          "id": "gecikenler",
          "baslik": "Gecikenler",
          "amac": "Teslimat tarihi geçtiği halde hâlâ teslim edilmemiş sipariş satırlarını, gecikme gün sayısına göre sıralı listeler.",
          "neden": "Müşteri kaybı ve cezai şart riskini önlemek için en kritik listedir; en çok geciken işler tepede görünür.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/gecikenler",
          "nasil": [
            "'Filtrele' ile sipariş tarih aralığını seçin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "KPI'lardan geciken sipariş/satır, kritik (30+ gün) ve ortalama gecikmeyi görün.",
            "Gecikme süresine göre aksiyon alın (ara, yeni tarih ver, eskalasyon).",
            "EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih filtre modalını açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "cari"
          ],
          "ipuclari": [
            "30 gün ve üzeri gecikmeler 'kritik' sayılır; üst yönetim eskalasyonu gerektirir.",
            "Sadece teslimat tarihi bugünden küçük olan açık satırları listeler.",
            "Gecikme, siparişe girilen teslim tarihi ile bugün arasındaki fark üzerinden hesaplanır; teslim tarihi girilmezse satır gecikme sayımına girmez."
          ]
        },
        {
          "id": "alinansiparis",
          "baslik": "Alınan Sipariş (Rapor)",
          "amac": "Müşterilerden alınan tüm siparişleri (EVRAK_TIP 904) sipariş başına toplam/teslim/kalan miktar ve durum etiketiyle özetler.",
          "neden": "Satış hattı hacmini, teslim performansını ve geciken işleri tek ekrandan izlemek için kullanılır. B2B aktifse müşteriyle paylaşım linki üretilebilir.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/alinansiparis",
          "nasil": [
            "'Filtrele' ile tarih aralığı ve müşteri seçin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "Durum etiketlerinden (Tamamlandı/Açık/Gecikmiş) siparişleri değerlendirin.",
            "B2B aktifse paylaşım linkini müşteriyle paylaşın.",
            "EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih ve müşteri filtre modalını açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste yüklenir",
              "renk": "primary"
            },
            {
              "ad": "B2B Link Göster",
              "islev": "Müşteri paylaşım linkini modalda gösterir/kopyalar",
              "sonuc": "Paylaşılabilir link kopyalanır",
              "renk": "accent"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "stok",
            "b2b / musteri portalı"
          ],
          "ipuclari": [
            "B2B linki, müşteri portalı ayarı aktifse (config->b2b) görünür.",
            "id (SAYFA) 'alinansiparis' islem/ altındaki giriş formuyla aynı isimdedir; bu kayıt rapor/ altındaki listedir."
          ]
        },
        {
          "id": "verilensiparis",
          "baslik": "Verilen Sipariş (Rapor)",
          "amac": "Tedarikçilere verilen tüm satınalma siparişlerini (EVRAK_TIP 903) sipariş başına toplam/teslim alınan/kalan miktar ve durumla özetler.",
          "neden": "Tedarik zincirini yönetmek, gelmeyen ürünleri takip etmek ve nakit akışını planlamak için kritik listedir.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/verilensiparis",
          "nasil": [
            "'Filtrele' ile tarih aralığı ve tedarikçi seçin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "Durum etiketlerine (Tamamlandı/Bekleniyor/Gecikti) göre aksiyon alın.",
            "EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih ve tedarikçi filtre modalını açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Stok riski için 'Stok-Sipariş Dengesi' raporuyla birlikte kullanın.",
            "id (SAYFA) 'verilensiparis' islem/ altındaki giriş formuyla aynı isimdedir; bu kayıt rapor/ listedir."
          ]
        },
        {
          "id": "durumanaliz",
          "baslik": "Durum Analizi",
          "amac": "Her siparişin ilk işlem (oluşturma) ile son işlem (kapatma) arasındaki süreyi gün cinsinden ölçerek sipariş çevrim süresini (lead time) gösterir.",
          "neden": "Operasyonel verimliliği ölçmek ve darboğazları belirlemek için kullanılır; en uzun süren siparişler tepede listelenir.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/durumanaliz",
          "nasil": [
            "'Filtrele' ile tarih aralığı ve müşteri seçin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "KPI'lardan hızlı (0-3g), orta (4-7g), yavaş (8+g) sipariş dağılımını ve ortalama süreyi okuyun.",
            "Uzun süreli siparişlerin sebebini araştırın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih ve müşteri filtre modalını açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Süre, evrak_islem_log kayıtlarındaki ilk ve son işlem zamanından hesaplanır.",
            "Sadece alınan siparişleri (904) kapsar."
          ]
        },
        {
          "id": "musteriegilim",
          "baslik": "Müşteri Sipariş Eğilimi",
          "amac": "Sipariş davranışlarını aylık trend, en aktif müşteriler ve haftanın günü dağılımı olmak üzere üç açıdan grafik+tablo ile analiz eder.",
          "neden": "Pazarlama, kapasite planlama ve müşteri ilişkileri için stratejik veri sağlar; düşüş trendleri ve müşteri konsantrasyonu riskini gösterir.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/musteriegilim",
          "nasil": [
            "'Filtrele' ile tarih aralığı, evrak tipi ve cari seçin (varsayılan son 12 ay).",
            "'Arama Yap' ile raporu çalıştırın.",
            "Aylık eğilim grafiğinden adet/ciro trendini izleyin.",
            "En aktif müşteriler ve gün dağılımı bölümlerini değerlendirin.",
            "EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih, evrak tipi ve cari filtre modalını açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Grafik ve tablolar yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Aylık eğilimi Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Grafikler Chart.js ile aylık trend ve haftanın günü dağılımını çizer.",
            "Tek müşteriye yüksek bağımlılık (konsantrasyon) görürseniz yeni müşteri arayın."
          ]
        },
        {
          "id": "stoksiparisdenge",
          "baslik": "Stok - Sipariş Dengesi",
          "amac": "Açık siparişi olan ürünler için Mevcut Stok + Beklenen Giriş (verilen sip.) − Çıkış Yapılacak (alınan sip.) = Net Denge formülünü hesaplar.",
          "neden": "Müşteriye söz verilen malın stokta yetip yetmeyeceğini önceden görmek içindir; negatif net denge eksik mal çıkacağını gösterir.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/stoksiparisdenge",
          "nasil": [
            "'Filtrele' ile stok grubu, depo ve 'sadece dengesiz' seçeneğini belirleyin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "KPI'lardan yetersiz (negatif), sınırda (sıfır) ve yeterli ürün sayılarını görün.",
            "Net dengesi negatif ürünler için tedarik/üretim planlayın.",
            "EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Stok grubu, depo ve dengesiz filtresi açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste ve KPI yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "depo"
          ],
          "ipuclari": [
            "Depo filtresi seçilirse mevcut stok o depoya göre hesaplanır.",
            "'Sadece dengesiz' seçeneği ile yalnızca riskli (negatif) ürünleri görebilirsiniz."
          ]
        },
        {
          "id": "karlilik",
          "baslik": "Karlılık Raporu",
          "amac": "Verilen siparişlerin (EVRAK_TIP 903) tahmini karlılığını hesaplar; maliyet, sipariş tarihindeki stok hareket maliyetleri üzerinden bulunur.",
          "neden": "Fiyatlandırma politikasını değerlendirmek ve düşük/negatif marjlı siparişleri erkenden yakalamak için kullanılır. Gerçek fiili karlılık faturada oluşur.",
          "sub": "rapor",
          "yol": "/ekran/siparis/rapor/karlilik",
          "nasil": [
            "'Filtrele' ile tarih aralığı, müşteri ve maliyet tipini (Ağırlıklı Ortalama/FIFO/LIFO/Son Alış) seçin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "KPI'lardan toplam ciro, maliyet, kâr ve ortalama marjı okuyun.",
            "Bir siparişin ürün bazlı karlılığını görmek için satırdaki 'Detay' butonuna basın.",
            "Sarı ikonlu ürünler maliyeti eksik (stok hareketi yok) demektir; kârı şişik görünebilir."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih, müşteri ve maliyet tipi filtresi açar",
              "sonuc": "Rapor kritere göre çalışır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Liste ve KPI yüklenir",
              "renk": "primary"
            },
            {
              "ad": "Detay",
              "islev": "Siparişin ürün bazlı karlılık modalını açar (AJAX)",
              "sonuc": "Ürün bazlı satış/maliyet/kâr/marj tablosu gösterilir",
              "renk": "accent"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Dosya indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "sipariskarliligi",
              "tetik": "Satırdaki Detay butonu (siparisKarlilik.detay)",
              "etki": "Seçili siparişin ürünleri için satış-maliyet-kâr-marj hesaplanıp JSON döner (yalnızca okuma; kayıt değiştirmez). Maliyet tipi fifo/lifo/last/ağırlıklı ortalama seçeneğine göre hesaplanır",
              "neden_sonuc": "Bir siparişin hangi üründe kâr/zarar ettiğini gösterir. Seçilen maliyet tipine göre değişir; maliyeti eksik ürünlerde kâr yanıltıcı olabilir."
            }
          ],
          "iliskiler": [
            "stok",
            "fatura",
            "cari"
          ],
          "ipuclari": [
            "Bu rapor tahminidir; fiili karlılık için Fatura > Stok Karlılık raporunu kullanın.",
            "Maliyet tipini değiştirerek (FIFO/LIFO/AVG/Son Alış) karşılaştırmalı analiz yapabilirsiniz.",
            "Geçmiş kayıtlarda maliyet eksikse 'Ayar > Stok Maliyet Hesapla' çalıştırın."
          ]
        },
        {
          "id": "alinansiparis-form",
          "baslik": "Alınan Sipariş Girişi / Düzenleme",
          "amac": "Müşteriden alınan yeni bir siparişi (EVRAK_TIP 904) cari, ürün satırları, miktar, fiyat, iskonto, teslimat/fatura adresi ve açıklamalarla kaydetmenizi sağlar. (Menüde 'Alınan Sipariş Girişi' butonuyla açılır; bağımsız menü öğesi değildir.)",
          "neden": "Sipariş sürecinin başladığı ana giriş ekranıdır; kaydedildiğinde stokta 'beklenen çıkış/rezerve' hareketi oluşur ve tüm takip buradan doğar.",
          "sub": "islem",
          "yol": "/ekran/siparis/islem/alinansiparis",
          "nasil": [
            "Cariyi arayıp seçin (yoksa hızlı cari ekleyin); adres ve vade otomatik dolar.",
            "Evrak/teslimat/vade tarihlerini ve para birimini ayarlayın.",
            "Satır ekleyip ürünü arayın, miktar-fiyat-KDV-iskonto girin (KDV dahil/toplam tutar yardımcı modalları vardır).",
            "İsterseniz konu ve hazır açıklama seçin, teslimat/fatura adresini düzenleyin.",
            "Dip toplamı kontrol edip KAYDET deyin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Siparişi kaydeder (form submit)",
              "sonuc": "Sipariş ve satırları oluşur, stok rezerve hareketi yazılır",
              "renk": "primary"
            },
            {
              "ad": "Satır Ekle",
              "islev": "Yeni ürün satırı ekler (mobilde modal)",
              "sonuc": "Tabloya boş satır eklenir",
              "renk": "accent"
            },
            {
              "ad": "Satır Sil",
              "islev": "İlgili ürün satırını kaldırır",
              "sonuc": "Satır silinir, dip toplam güncellenir",
              "renk": "danger"
            },
            {
              "ad": "Hızlı Cari Ekle",
              "islev": "Yeni cari ekleme modalını açar",
              "sonuc": "Cari oluşturulup forma seçilir",
              "renk": "accent"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu iptal eder",
              "sonuc": "Kayıt yapılmadan çıkılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "alinansiparisekle",
              "tetik": "Yeni kayıtta Kaydet",
              "etki": "siparis (904/ISLEM_TIP=1), siparis_detay, konu/açıklama ilişkileri ve stok_fis + stok_hareket (ISLEM_TIP=3 beklenen) oluşturulur; evrakIslemLog ve SIPARIS_OLUSTURULDU otomasyonu tetiklenir",
              "neden_sonuc": "Müşteri siparişini sisteme alır ve stoğu rezerve eder; kaydetmezseniz sipariş takibe girmez, sevkiyat/fatura zinciri başlamaz."
            },
            {
              "ad": "alinansiparisduzenle",
              "tetik": "Düzenleme modunda Kaydet",
              "etki": "siparis güncellenir; eski detay/ilişki/bloke stok hareketleri silinip yeniden oluşturulur",
              "neden_sonuc": "Var olan siparişi (miktar, fiyat, ürün) revize eder ve stok rezervini yeniden hesaplar."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "depo",
            "proje",
            "otomasyon (n8n)"
          ],
          "ipuclari": [
            "Stok kartı bulunamayan ürünü 'Yeni kart olarak ekle' onayıyla anında oluşturabilirsiniz.",
            "Fatura adresini teslimat adresine tek tıkla kopyalayabilirsiniz.",
            "Cari seçilince vade günü ve iskonto oranı varsa otomatik uygulanır.",
            "Girdiğiniz teslim (teslimat) tarihi; Açık Siparişler, Teslimata Hazır/Bekleyen, Gecikenler ve Stok Bazlı Sipariş Raporu ekranlarının teslim tarihine göre filtrelenmesini ve gecikme hesabını besler. Bu yüzden mümkünse her siparişe teslim tarihi girin."
          ]
        },
        {
          "id": "verilensiparis-form",
          "baslik": "Verilen Sipariş Girişi / Düzenleme",
          "amac": "Tedarikçiye verilen yeni bir satınalma siparişini (EVRAK_TIP 903) cari, ürün satırları, miktar, alış fiyatı, iskonto ve teslimat bilgileriyle kaydetmenizi sağlar. (Menüde 'Verilen Sipariş Girişi' butonuyla açılır; bağımsız menü öğesi değildir.)",
          "neden": "Tedarik sürecinin başladığı ana giriş ekranıdır; kaydedildiğinde stokta 'beklenen giriş' hareketi oluşur ve tedarik takibi buradan başlar.",
          "sub": "islem",
          "yol": "/ekran/siparis/islem/verilensiparis",
          "nasil": [
            "Tedarikçiyi (cari) arayıp seçin veya hızlı ekleyin.",
            "Evrak/teslimat/vade tarihlerini ve para birimini belirleyin.",
            "Satır ekleyip ürünü arayın; ürün seçilince alış fiyatı ve alış KDV oranı otomatik gelir.",
            "Miktar, iskonto ve gerekli açıklamaları girin.",
            "Dip toplamı kontrol edip KAYDET deyin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Siparişi kaydeder",
              "sonuc": "Sipariş ve satırları oluşur, stok beklenen giriş hareketi yazılır",
              "renk": "primary"
            },
            {
              "ad": "Satır Ekle",
              "islev": "Yeni ürün satırı ekler",
              "sonuc": "Tabloya boş satır eklenir",
              "renk": "accent"
            },
            {
              "ad": "Satır Sil",
              "islev": "Ürün satırını kaldırır",
              "sonuc": "Satır silinir, dip toplam güncellenir",
              "renk": "danger"
            },
            {
              "ad": "Hızlı Cari Ekle",
              "islev": "Yeni cari ekleme modalını açar",
              "sonuc": "Cari oluşturulup forma seçilir",
              "renk": "accent"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu iptal eder",
              "sonuc": "Kayıt yapılmadan çıkılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "verilensiparisekle",
              "tetik": "Yeni kayıtta Kaydet",
              "etki": "siparis (903/ISLEM_TIP=0), siparis_detay, konu/açıklama ilişkileri ve stok_fis + stok_hareket (ISLEM_TIP=3 beklenen giriş) oluşturulur; evrakIslemLog ve SIPARIS_OLUSTURULDU otomasyonu tetiklenir",
              "neden_sonuc": "Tedarik siparişini sisteme alır ve beklenen mal girişini stok dengesine yansıtır; kaydetmezseniz tedarik takibi ve stok planlaması eksik kalır."
            },
            {
              "ad": "verilensiparisduzenle",
              "tetik": "Düzenleme modunda Kaydet",
              "etki": "siparis güncellenir; eski detay/ilişki/bloke stok hareketleri silinip yeniden oluşturulur",
              "neden_sonuc": "Var olan tedarik siparişini revize eder ve beklenen giriş miktarını günceller."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "depo",
            "proje",
            "otomasyon (n8n)"
          ],
          "ipuclari": [
            "Ürün seçiminde alış fiyatı ve alış KDV oranı otomatik dolar (satış değil).",
            "Yeni ürünü sipariş sırasında hızlıca stok kartı olarak açabilirsiniz."
          ]
        },
        {
          "id": "siparisdetay",
          "baslik": "Sipariş Detayı / Görüntüleme",
          "amac": "Bir siparişin tüm satır, tutar, adres ve durum bilgisini görüntüler; buradan yazdırma, durum değiştirme, düzenleme ve tek tıkla irsaliye/faturaya aktarma yapılır. (Listelerden Detay/Görüntüle ile açılır; bağımsız menü öğesi değildir.)",
          "neden": "Tek bir siparişin 360° görünümüdür; sevk/fatura aksiyonlarını ve B2B paylaşımını tek ekrandan yönetirsiniz. İrsaliyeye aktarım yalnızca alınan siparişlerde geçerlidir.",
          "sub": "islem",
          "yol": "/ekran/siparis/islem/siparisdetay",
          "nasil": [
            "Listeden bir siparişin Detay/Görüntüle bağlantısına tıklayın.",
            "Satırları, teslim/kalan miktarları ve tutarları inceleyin.",
            "Durumu değiştirmek için DURUM DEĞİŞTİR, belgeyi almak için Yazdır (HTML/PDF) kullanın.",
            "'Siparişi Aktar' sekmesinden malı sevk/faturalamak için ilgili aktar butonlarını kullanın.",
            "B2B linki üretip müşteriyle paylaşın veya DÜZENLE ile forma geçin."
          ],
          "butonlar": [
            {
              "ad": "Yazdır (HTML/PDF)",
              "islev": "Yazdırma modalını açar",
              "sonuc": "Sipariş fişi HTML veya PDF olarak üretilir",
              "renk": "ghost"
            },
            {
              "ad": "Durum Değiştir",
              "islev": "Sipariş durumunu günceller",
              "sonuc": "DURUM_ID güncellenir, log/otomasyon tetiklenir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Siparişi düzenleme formunda açar",
              "sonuc": "Giriş formu düzenleme modunda açılır",
              "renk": "accent"
            },
            {
              "ad": "İrsaliyeye Aktar",
              "islev": "Bu siparişi tek başına irsaliyeye dönüştürür (yalnızca alınan sipariş)",
              "sonuc": "İrsaliye oluşur, teslim/kalan güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Faturaya Aktar",
              "islev": "Bu siparişi tek başına faturaya dönüştürür",
              "sonuc": "Fatura oluşur, teslim/kalan güncellenir",
              "renk": "primary"
            },
            {
              "ad": "B2B Paylaşım Linki",
              "islev": "Müşteriyle paylaşım linkini (HMAC imzalı) modalda gösterir/kopyalar",
              "sonuc": "Paylaşılabilir link kopyalanır",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "durumdegistir",
              "tetik": "DURUM DEĞİŞTİR butonu",
              "etki": "siparis.DURUM_ID güncellenir, evrak_islem_log ve SIPARIS_DURUM_DEGISTI otomasyonu tetiklenir",
              "neden_sonuc": "Siparişin aşamasını günceller ve müşteriye durum bildirimi otomasyonu (n8n) çalıştırabilir."
            },
            {
              "ad": "alinansiparisfaturayaaktar",
              "tetik": "Faturaya Aktar (alınan sipariş)",
              "etki": "Alınan siparişten satış faturası oluşur, teslim/kalan miktar güncellenir",
              "neden_sonuc": "Müşteri siparişini tek adımda satış faturasına çevirir."
            },
            {
              "ad": "verilensiparisfaturayaaktar",
              "tetik": "Faturaya Aktar (verilen sipariş)",
              "etki": "Verilen siparişten alış faturası oluşur, teslim/kalan güncellenir",
              "neden_sonuc": "Tedarik siparişini tek adımda alış faturasına çevirir."
            },
            {
              "ad": "alinansiparisirsaliyeyeaktar",
              "tetik": "İrsaliyeye Aktar (alınan sipariş)",
              "etki": "Alınan siparişten giden irsaliye oluşur, teslim/kalan güncellenir",
              "neden_sonuc": "Malın çıkışını tek adımda giden irsaliyeye bağlar."
            }
          ],
          "iliskiler": [
            "irsaliye",
            "fatura",
            "cari",
            "stok",
            "b2b / musteri portalı",
            "otomasyon (n8n)"
          ],
          "ipuclari": [
            "Kısmi aktarımda kalan miktar açık kalır; birden çok kez sevk/fatura yapabilirsiniz.",
            "B2B paylaşım linki, müşterinin siparişini portalden görmesini sağlar (config->b2b aktifse görünür).",
            "Verilen siparişte irsaliye aktarımı yoktur; yalnızca faturaya aktarılır.",
            "Yazdırmada numaratör ve dosya tipi (HTML/PDF) seçilebilir."
          ]
        },
        {
          "id": "stokbazli",
          "baslik": "Stok Bazlı Sipariş Raporu",
          "yol": "/ekran/siparis/rapor/stokbazli",
          "sub": "rapor",
          "amac": "Açık siparişleri belge bazında değil ürün bazında toplar: hangi üründen toplam ne kadar sipariş alınmış, ne kadarı teslim edilmiş, ne kadarı bekliyor tek satırda görünür.",
          "neden": "Üretim ve satın alma kararı ürün bazında verilir; sipariş listesinde her belgeyi tek tek toplamak zaman kaybıdır. Bu rapor bekleyen talebi ürün kırılımında verir, böylece neyi üretmeniz veya satın almanız gerektiğini görürsünüz.",
          "nasil": [
            "Sipariş menüsünden Stok Bazlı Sipariş Raporu ekranını açın.",
            "Filtre penceresinden tarih aralığı, cari ve ürün ölçütlerini seçin.",
            "Sipariş, teslim ve kalan miktarları ürün bazında inceleyin; gerekirse EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Seçilen ölçütlerle raporu yeniden hesaplar",
              "sonuc": "Ürün bazlı sipariş/teslim/kalan tablosu güncellenir",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Raporu ekrandaki filtrelerle Excel olarak indirir",
              "sonuc": "Ürün bazlı tablo indirilir",
              "renk": "success"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "uretim",
            "irsaliye",
            "fatura"
          ],
          "ipuclari": [
            "Silinmiş (iptal) sipariş satırları toplamlara girmez.",
            "Miktarlar ana birimde toplanır; bir üründe farklı birimler karışıksa birim sütununda Karışık ifadesi görünür.",
            "Filtre penceresinde tarih aralığını teslim tarihine göre daraltarak, örneğin bu haftaya kadar teslim edilmesi gereken ürün bazlı talebi çıkarabilirsiniz."
          ]
        }
      ]
    },
    {
      "slug": "teklif",
      "title": "Teklif",
      "icon": "📝",
      "modul": "teklif",
      "ad": "Teklif Yönetimi",
      "ozet": "Teklif modülü, müşterilere verilen ve tedarikçilerden alınan teklifleri baştan sona yönetir: teklif oluşturma/düzenleme, ürün-fiyat satırları, hazır açıklama ve konu ekleme, durum (pozisyon) takibi, PDF yazdırma/e-posta gönderme, revize ederek yeni versiyon çıkarma ve tek tuşla faturaya aktarma işlemlerini kapsar. Kayıtlı cari, İş Takip (CRM) kaydı veya manuel giriş olmak üzere üç farklı müşteri kaynağını destekler; teklif oluşturulduğunda ve durumu değiştiğinde otomasyon tetikleyicilerini çalıştırır. Verilen teklifler satış faturasına, alınan teklifler alış faturasına dönüştürülür; İş Takip fırsatları üzerinden siparişe aktarım da mümkündür. Ayrıca satış dönüşümü, bekleyen/süresi dolmuş, kaybedilen ve kullanıcı performansı gibi karar destek raporları sunar.",
      "modul_iliskiler": [
        "cari",
        "stok",
        "fatura",
        "siparis",
        "crm (İş Takip)",
        "proje",
        "b2b müşteri portalı",
        "otomasyon (n8n)",
        "kasa/cari hareket",
        "özel alan",
        "durum (sys_durum)"
      ],
      "ekranlar": [
        {
          "id": "verilenteklifliste",
          "baslik": "Verilen Teklifler",
          "yol": "/ekran/teklif/islem/verilenteklifliste",
          "sub": "islem",
          "amac": "Müşterilere verdiğiniz tüm tekliflerin durum, cari, evrak no, tarih ve tutar bilgisiyle listelendiği ana ekran.",
          "neden": "Satış hattınızdaki (pipeline) açık ve kapanmış teklifleri tek yerden görmek, hangi teklifin hangi aşamada olduğunu takip etmek ve hızlı işlem yapmak için kullanılır.",
          "nasil": [
            "Sağ üstteki 'Verilen Teklif Girişi' butonuyla yeni teklif oluşturabilirsiniz.",
            "Listede her satırda durum rengi, cari ünvanı, evrak no, teklif ve geçerlilik tarihi ile tutar görünür.",
            "Filtrele butonundan cari, evrak no, tarih aralığı, kaydeden/güncelleyen kullanıcı ve özel alanlara göre arama yapın.",
            "Her satırdaki 'İşlemler' menüsünden Görüntüle, Yazdır, DURUM (pozisyon değiştir), GEÇMİŞ, Düzenle ve Sil seçeneklerine ulaşın.",
            "Sayfanın altındaki EXCEL butonuyla listeyi dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Verilen Teklif Girişi",
              "islev": "Yeni verilen teklif formunu açar",
              "sonuc": "verilenteklif formu ekranına gider",
              "renk": "accent"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari/evrak/tarih/kullanıcı/özel alan kriterleriyle listeyi süzen filtre modalını açar",
              "sonuc": "Filtre modalı açılır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre modalındaki kriterleri uygular",
              "sonuc": "Liste filtrelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre kriterlerini sıfırlar",
              "sonuc": "Tüm kayıtlar geri gelir",
              "renk": "ghost"
            },
            {
              "ad": "Görüntüle",
              "islev": "Teklif detay ekranını açar",
              "sonuc": "teklifdetay ekranına gider",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Teklif çıktısı için yazdırma modalını açar (evrak tipi 901)",
              "sonuc": "PDF/HTML çıktı üretilir",
              "renk": "ghost"
            },
            {
              "ad": "DURUM",
              "islev": "Pozisyon değiştir modalını açar",
              "sonuc": "Teklifin durumu güncellenir",
              "renk": "primary"
            },
            {
              "ad": "GEÇMİŞ",
              "islev": "Teklifte yapılan işlem/durum geçmişini modalda gösterir",
              "sonuc": "İşlem log listesi görüntülenir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Teklifi düzenleme modunda açar",
              "sonuc": "verilenteklif formu düzenle modunda açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Teklifi siler (onay ister)",
              "sonuc": "Teklif pasife çekilir",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel'e aktarır",
              "sonuc": "Excel dosyası indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "teklifsil",
              "tetik": "Sil butonu (onay dialogu sonrası)",
              "etki": "teklif_fis ve teklif_fis_detay DURUM=-1 yapılır; bağlı crm_firsat.TEKLIF_ID sıfırlanır ve ASAMA=2 (Teklif Hazırlanıyor) olur",
              "neden_sonuc": "Teklifi silince satış listesinden kalkar ve bağlı İş Takip fırsatı tekrar 'teklif hazırla' aşamasına döner; yanlış silerseniz teklif geçmişten kaybolur, ancak veriler soft-delete olduğu için tamamen yok olmaz."
            },
            {
              "ad": "pozisyondegistir",
              "tetik": "DURUM menüsü → modal → Kaydet",
              "etki": "teklif_fis.POZISYON ve POZISYON_ALT güncellenir, evrak_islem_log kaydı düşülür ve durum adı 'onay/kabul' veya 'red/iptal' içeriyorsa ilgili otomasyon tetiklenir",
              "neden_sonuc": "Teklifin aşamasını (ör. Gönderildi → Onaylandı) günceller; otomasyon ve raporlar bu duruma göre çalışır. Durumu güncellemezseniz satış hattınız gerçeği yansıtmaz."
            },
            {
              "ad": "logliste",
              "tetik": "GEÇMİŞ butonu",
              "etki": "evrak_islem_log tablosundan salt-okuma listeleme",
              "neden_sonuc": "Teklifte kim ne zaman hangi durumu değiştirmiş görünür; denetim ve müşteri iletişimi için kanıt sağlar."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "crm (İş Takip)",
            "durum (sys_durum)",
            "özel alan"
          ],
          "ipuclari": [
            "Cari kaynağı rozetle ayrılır: kod (Kayıtlı), 'İş Takip' (CRM), 'Manuel'.",
            "Versiyon 1'den büyük teklifler satırda 'v2, v3...' rozetiyle işaretlenir; bunlar revize edilmiş tekliflerdir.",
            "'Yalnızca kendi kayıtları' yetkisi olan kullanıcı sadece kendi oluşturduğu teklifleri görür.",
            "Liste sayfa başına 50 kayıt gösterir; büyük listelerde filtre kullanın."
          ]
        },
        {
          "id": "verilenteklif",
          "baslik": "Verilen Teklif Formu",
          "yol": "/ekran/teklif/islem/verilenteklif",
          "sub": "islem",
          "amac": "Müşteriye verilecek yeni teklifi oluşturmak veya mevcut teklifi düzenlemek için kullanılan giriş formu.",
          "neden": "Teklifin cari bilgisi, tarih/geçerlilik, ürün-fiyat satırları, iskonto, para birimi, konu ve açıklamalarını tek formda toplamak için kullanılır. Doğru teklif = doğru fatura zinciri demektir.",
          "nasil": [
            "Müşteri kaynağını seçin: Kayıtlı cari, İş Takip (CRM) kaydı veya Manuel giriş.",
            "Teklif tarihi ve geçerlilik tarihini belirleyin (evrak no boş bırakılırsa otomatik üretilir).",
            "Ürün satırı ekleyin: stok arayıp seçin, miktar/birim fiyat/KDV/iskonto girin; dip toplam otomatik hesaplanır.",
            "İsterseniz 'Hazır Açıklama Seç' ile tanımlı açıklamaları, teklif konularını ve özel alanları doldurun.",
            "Kaydet butonuyla teklifi kaydedin; sistem sizi teklif detay ekranına yönlendirir."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Teklifi ve tüm satırları kaydeder",
              "sonuc": "Teklif oluşur/güncellenir ve detay ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Manuel Bilgi Ekle",
              "islev": "Manuel cari bilgilerini (ünvan/yetkili/tel/e-posta) girmek için modal açar",
              "sonuc": "Kayıtsız müşteriye teklif verilebilir",
              "renk": "accent"
            },
            {
              "ad": "Hazır Açıklama Seç",
              "islev": "Tanımlı sabit açıklamalardan seçim modalını açar",
              "sonuc": "Seçilen açıklamalar teklife eklenir",
              "renk": "ghost"
            },
            {
              "ad": "Satır Ekle",
              "islev": "Yeni ürün/hizmet satırı ekler (stok arama ile)",
              "sonuc": "Detay satırı eklenir, dip toplam güncellenir",
              "renk": "accent"
            },
            {
              "ad": "Satır Sil",
              "islev": "İlgili ürün satırını kaldırır",
              "sonuc": "Satır silinir, toplam yeniden hesaplanır",
              "renk": "danger"
            },
            {
              "ad": "B2B Link",
              "islev": "Yalnızca düzenle modunda ve B2B aktifken müşteri portalı paylaşım bağlantısını gösterir/kopyalar",
              "sonuc": "Müşteriye gönderilecek link üretilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "verilenteklifkaydet",
              "tetik": "Kaydet butonu",
              "etki": "teklif_fis (ISLEM_TIP=1) master + teklif_fis_detay satırları, teklif_konu_iliski, teklif_aciklama_iliski, ozel_alan_deger yazılır; her satır için maliyet snapshot (MALIYET_BIRIM/TUTAR/TIP) alınır; evrak_islem_log basılır; İş Takip fırsatı varsa crm_firsat ASAMA=3 yapılır",
              "neden_sonuc": "Teklif kaydedilince resmi bir belge haline gelir, faturaya aktarılabilir ve raporlara girer. Maliyet snapshot sayesinde sonradan alış fiyatı değişse bile teklif anındaki kâr marjı korunur."
            },
            {
              "ad": "TEKLIF_OLUSTURULDU",
              "tetik": "verilenteklifkaydet içinde yeni teklif kaydı başarıyla oluştuğunda",
              "etki": "Otomasyon tetikleyici çalışır (teklif no, genel toplam, geçerlilik, teklif tipi, cari id/ünvan/tel/email değişkenleriyle)",
              "neden_sonuc": "n8n/otomasyon üzerinden müşteriye otomatik e-posta/SMS/bildirim gönderilebilir; kurulmamışsa etki olmaz."
            },
            {
              "ad": "crmilgilenensorgula",
              "tetik": "CRM kaynağı seçilip arama kutusuna yazınca",
              "etki": "crm_ilgilenen tablosunda ad/firma/tel/e-posta araması (salt-okuma)",
              "neden_sonuc": "İş Takip'teki potansiyel müşteriyi teklife hızlıca bağlar; kayıtlı cari açmadan teklif verilebilir."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "crm (İş Takip)",
            "proje",
            "özel alan",
            "otomasyon",
            "b2b müşteri portalı"
          ],
          "ipuclari": [
            "İş Takip fırsatından gelen tekliflerde form otomatik ön-doldurulur (kaynak/cari/firsatid URL parametreleriyle).",
            "Manuel veya CRM kaynaklı tekliflerde henüz cari kart yoktur; faturaya aktarmadan önce detay ekranından cari kart oluşturmanız gerekir.",
            "İskonto oran bazında satır satır uygulanır; matrah ve KDV otomatik hesaplanır."
          ]
        },
        {
          "id": "alinanteklifliste",
          "baslik": "Alınan Teklifler",
          "yol": "/ekran/teklif/islem/alinanteklifliste",
          "sub": "islem",
          "amac": "Tedarikçilerden/satıcılardan aldığınız teklifleri listeleyen ekran.",
          "neden": "Alım kararlarında farklı tedarikçi tekliflerini karşılaştırmak, geçerliliklerini takip etmek ve seçileni alış faturasına dönüştürmek için kullanılır.",
          "nasil": [
            "Sağ üstteki 'Alınan Teklif Girişi' butonuyla yeni alınan teklif kaydedin.",
            "Listede durum, cari (tedarikçi), evrak no, teklif/geçerlilik tarihi ve tutar görünür.",
            "Filtrele ile cari, evrak no, tarih ve kullanıcı bazında arama yapın.",
            "İşlemler menüsünden Görüntüle, Yazdır, DURUM, GEÇMİŞ, Düzenle, Sil işlemlerini yapın.",
            "EXCEL butonuyla listeyi dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Alınan Teklif Girişi",
              "islev": "Yeni alınan teklif formunu açar",
              "sonuc": "alinanteklif formuna gider",
              "renk": "accent"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari/evrak/tarih/kullanıcı kriterleriyle süzen filtre modalını açar",
              "sonuc": "Filtre modalı açılır",
              "renk": "ghost"
            },
            {
              "ad": "Görüntüle",
              "islev": "Teklif detay ekranını açar",
              "sonuc": "teklifdetay ekranına gider",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırma modalını açar (evrak tipi 902)",
              "sonuc": "Çıktı üretilir",
              "renk": "ghost"
            },
            {
              "ad": "DURUM",
              "islev": "Pozisyon değiştir modalını açar (alınan teklif durumları)",
              "sonuc": "Teklif durumu güncellenir",
              "renk": "primary"
            },
            {
              "ad": "GEÇMİŞ",
              "islev": "İşlem geçmişini gösterir",
              "sonuc": "Log listesi açılır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Alınan teklifi düzenle modunda açar",
              "sonuc": "alinanteklif formu düzenle modunda açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Alınan teklifi siler (onay ister)",
              "sonuc": "Teklif pasife çekilir",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel'e aktarır",
              "sonuc": "Excel dosyası indirilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "teklifsil",
              "tetik": "Sil butonu",
              "etki": "teklif_fis/teklif_fis_detay DURUM=-1",
              "neden_sonuc": "Alınan teklif listeden kalkar; yanlış silmek karşılaştırma verinizi eksiltir (soft-delete olduğu için veri fiziksel olarak silinmez)."
            },
            {
              "ad": "pozisyondegistir",
              "tetik": "DURUM menüsü",
              "etki": "teklif_fis.POZISYON/POZISYON_ALT güncellenir, evrak_islem_log basılır",
              "neden_sonuc": "Tedarikçi teklifinin aşamasını (değerlendirmede/kabul/red) izlemenizi sağlar."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "durum (sys_durum)"
          ],
          "ipuclari": [
            "Alınan tekliflerde cari her zaman kayıtlı bir cari (tedarikçi) olmalıdır; manuel/CRM kaynağı verilen tekliflere özeldir.",
            "Alınan teklif alış faturasına aktarılır (satış değil)."
          ]
        },
        {
          "id": "alinanteklif",
          "baslik": "Alınan Teklif Formu",
          "yol": "/ekran/teklif/islem/alinanteklif",
          "sub": "islem",
          "amac": "Tedarikçiden alınan teklifi kaydetmek/düzenlemek için kullanılan giriş formu.",
          "neden": "Tedarikçi tekliflerini sisteme işleyip karşılaştırmak ve seçileni alış faturasına dönüştürmek için gereklidir.",
          "nasil": [
            "Kayıtlı cari (tedarikçi) seçin.",
            "Teklif ve geçerlilik tarihini girin, evrak no otomatik üretilebilir.",
            "Ürün satırlarını miktar/fiyat/KDV ile ekleyin; dip toplam otomatik hesaplanır.",
            "Gerekirse açıklama ekleyin.",
            "Kaydet ile teklifi oluşturun."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Alınan teklifi kaydeder",
              "sonuc": "Teklif oluşur/güncellenir, detay ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Satır Ekle",
              "islev": "Ürün satırı ekler",
              "sonuc": "Detay satırı eklenir",
              "renk": "accent"
            },
            {
              "ad": "Satır Sil",
              "islev": "Ürün satırını kaldırır",
              "sonuc": "Satır silinir, toplam güncellenir",
              "renk": "danger"
            },
            {
              "ad": "Mobil Satır Kaydet",
              "islev": "Mobil ekranda ürün satırını modalden kaydeder",
              "sonuc": "Satır eklenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "alinanteklifkaydet",
              "tetik": "Kaydet butonu",
              "etki": "teklif_fis (ISLEM_TIP=0) master + teklif_fis_detay satırları, teklif_konu_iliski, teklif_aciklama_iliski ve satır maliyet snapshot yazılır; evrak_islem_log basılır",
              "neden_sonuc": "Tedarikçi teklifi resmi kayda geçer ve alış faturasına aktarılabilir."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "özel alan"
          ],
          "ipuclari": [
            "Alınan teklif ISLEM_TIP=0 olarak saklanır; verilen tekliflerden bu alanla ayrışır.",
            "Cari zorunludur; tedarikçi kartı yoksa önce cari modülünden açın."
          ]
        },
        {
          "id": "teklifdetay",
          "baslik": "Teklif Detay",
          "yol": "/ekran/teklif/islem/teklifdetay",
          "sub": "islem",
          "amac": "Bir teklifin tüm bilgilerini (cari, satırlar, toplamlar, karlılık, durum, açıklamalar, versiyon/zincir geçmişi, B2B onay durumu) görüntüleyen ve teklif üzerinde tüm aksiyonların yapıldığı merkez ekran.",
          "neden": "Teklifi müşteriye göndermek, durumunu ilerletmek, faturaya dönüştürmek, revize etmek ve cari kart oluşturmak gibi kritik satış aksiyonları buradan yürütülür.",
          "nasil": [
            "Genel sekmesinde cari, evrak no, tarihler, ürün satırları ve dip toplamlar; Karlılık sekmesinde satır bazlı maliyet/kâr marjı görünür.",
            "Manuel/CRM kaynaklı ve cari kartı olmayan tekliflerde 'Cari Kart Oluştur' ile müşteriyi kaydedin.",
            "Yazdır menüsünden HTML/PDF çıktı alın, 'E-posta Gönder' ile teklifi PDF ek olarak müşteriye yollayın.",
            "Kayıtlı cariye bağlı tekliflerde 'TEKLİFİ AKTAR' sekmesindeki 'Faturaya Aktar' ile teklifi satış/alış faturasına dönüştürün.",
            "'Pozisyon Değiştir' ile durumu güncelleyin, 'Revize Et' ile yeni versiyon oluşturun, 'Kur Güncelle' ile döviz kurlarını yenileyin."
          ],
          "butonlar": [
            {
              "ad": "Cari Kart Oluştur",
              "islev": "Manuel/CRM teklifteki müşteriden kayıtlı cari kart üretir veya aynı ünvanlıyla eşleştirir",
              "sonuc": "Teklif kayıtlı cariye bağlanır",
              "renk": "primary"
            },
            {
              "ad": "Faturaya Aktar",
              "islev": "'TEKLİFİ AKTAR' sekmesinden teklifi satış (verilen) / alış (alınan) faturasına dönüştürme modalını açar",
              "sonuc": "Fatura oluşturulur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır (HTML/PDF)",
              "islev": "Teklif çıktısı üretir (evrak tipi 901/902)",
              "sonuc": "Yazdırılabilir belge açılır",
              "renk": "ghost"
            },
            {
              "ad": "E-posta Gönder",
              "islev": "Teklifi PDF ek olarak müşteriye e-posta ile gönderme modalını açar",
              "sonuc": "Müşteriye e-posta gider",
              "renk": "accent"
            },
            {
              "ad": "Pozisyon Değiştir",
              "islev": "Teklif durumunu (ana+alt) değiştirir",
              "sonuc": "Durum güncellenir, log düşer",
              "renk": "primary"
            },
            {
              "ad": "Revize Et",
              "islev": "Mevcut teklifi arşivleyip yeni versiyon oluşturur",
              "sonuc": "Yeni v(N+1) teklif açılır",
              "renk": "accent"
            },
            {
              "ad": "Kur Güncelle",
              "islev": "Döviz kurlarını (TCMB'den) yenileme modalını açar",
              "sonuc": "Satır tutarları güncel kurla hesaplanır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Teklifi düzenleme formunda açar (yalnızca aktif/DURUM=1 tekliflerde)",
              "sonuc": "verilenteklif/alinanteklif formu düzenle modunda açılır",
              "renk": "accent"
            },
            {
              "ad": "B2B Paylaşım Linki",
              "islev": "Müşteri portalı paylaşım linkini gösterir/kopyalar (B2B aktif ve teklif aktifken üst başlıkta çıkar)",
              "sonuc": "Müşteri teklifi portalda görüntüleyip onaylayabilir/reddedebilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "teklifcariolustur",
              "tetik": "Cari Kart Oluştur butonu (onaylı)",
              "etki": "cari_kart oluşturulur veya aynı ünvanlı mevcut cariyle eşleştirilir; teklif_fis.CARI_ID/CARI_KOD güncellenir; CRM kaynaklıysa crm_ilgilenen.CARI_ID bağlanır",
              "neden_sonuc": "Cari kart oluşturmadan manuel/CRM teklif faturaya/siparişe aktarılamaz; bu adım müşteriyi resmi kayda geçirir."
            },
            {
              "ad": "verilentekliffaturayaaktar",
              "tetik": "TEKLİFİ AKTAR sekmesi → Faturaya Aktar → Satış Faturasına Aktar",
              "etki": "fatura + fatura_detay + stok hareket fişi + cari hareket fişi + evrak_baglanti oluşturulur; teklif_fis.AKTARILDI_MI=1, AKTARILAN_MODUL=4",
              "neden_sonuc": "Teklif tek tuşla gelir belgesine döner, stok çıkışı ve cari bakiye işler; mükerrer aktarım engellenir (aktarılmış teklif tekrar faturalanamaz)."
            },
            {
              "ad": "alinantekliffaturayaaktar",
              "tetik": "TEKLİFİ AKTAR sekmesi → Faturaya Aktar → Alış Faturasına Aktar",
              "etki": "Alış faturası + fatura_detay + stok hareket fişi + cari hareket fişi + evrak_baglanti oluşturur; AKTARILDI_MI=1, AKTARILAN_MODUL=4",
              "neden_sonuc": "Tedarikçi teklifi alış faturasına dönüşür; stok girişi ve tedarikçi borcu oluşur."
            },
            {
              "ad": "verilenteklifsipariseyaktar",
              "tetik": "İş Takip (CRM) fırsatı üzerinden siparişe aktarım akışı — teklif detay ekranında ayrı buton bulunmaz, işlem CRM tarafından tetiklenir",
              "etki": "siparis + siparis_detay oluşturulur (EVRAK_TIP 903); tutarlar detay satırlarından yeniden hesaplanır; teklif_fis.AKTARILDI_MI=1, AKTARILAN_MODUL=6",
              "neden_sonuc": "Onaylanan teklif sipariş sürecine geçer. Cari kart yoksa veya teklif daha önce aktarıldıysa aktarım engellenir."
            },
            {
              "ad": "teklifeposta",
              "tetik": "E-posta Gönder → gönder",
              "etki": "Seçilen teklif tasarımından PDF üretilir (XSLT+Dompdf), PHPMailer/SMTP ile ek olarak gönderilir, evrak_islem_log'a kaydedilir",
              "neden_sonuc": "Müşteriye profesyonel PDF teklif ulaşır; SMTP ayarı yapılmamışsa gönderim başarısız olur."
            },
            {
              "ad": "teklifresize",
              "tetik": "Revize Et butonu (onaylı)",
              "etki": "Mevcut teklif arşivlenir (DURUM=-2), aynı içerikle VERSIYON+1 yeni teklif_fis + kopyalanan detaylar oluşturulur, zincirin kökü ANA_TEKLIF_ID ile bağlanır",
              "neden_sonuc": "Fiyat/şart değişikliğinde eski teklifi bozmadan yeni sürüm çıkarırsınız; geçmiş versiyonlar salt-okunur korunur ve TEKLİF ZİNCİRİ sekmesinde listelenir."
            },
            {
              "ad": "kurguncelle",
              "tetik": "Kur Güncelle → Kur Güncelle",
              "etki": "Teklif satırlarındaki döviz kur çarpanları güncellenir",
              "neden_sonuc": "Döviz kurlu tekliflerde güncel kurla yerel tutarlar doğrulanır; güncellenmezse eski kur üzerinden fatura oluşabilir."
            },
            {
              "ad": "tcmb",
              "tetik": "Kur modalında 'TCMB Den Kur Getir'",
              "etki": "TCMB güncel döviz kurlarını çeker",
              "neden_sonuc": "Manuel kur girmeden resmi kur otomatik dolar."
            },
            {
              "ad": "pozisyondegistir",
              "tetik": "Pozisyon Değiştir butonu (yalnızca aktif teklifte)",
              "etki": "teklif_fis.POZISYON/POZISYON_ALT güncellenir; evrak_islem_log basılır; durum adı 'onay/kabul' veya 'red/iptal' içeriyorsa ilgili otomasyon (TEKLIF_ONAYLANDI/REDDEDILDI) tetiklenir",
              "neden_sonuc": "Teklifin onay/red durumu değişince otomasyon ve raporlar tetiklenir; durumu ilerletmezseniz satış hattı gerçeği yansıtmaz."
            },
            {
              "ad": "TEKLIF_DURUM_DEGISTI",
              "tetik": "Pozisyon değiştirildiğinde",
              "etki": "Otomasyon tetikleyici (teklif no/genel toplam/eski_durum/yeni_durum/cari değişkenleriyle) çalışır",
              "neden_sonuc": "Durum değişiminde müşteriye/satıcıya otomatik bildirim akışı kurulabilir."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "fatura",
            "siparis",
            "crm (İş Takip)",
            "kasa/cari hareket",
            "b2b müşteri portalı",
            "otomasyon",
            "proje"
          ],
          "ipuclari": [
            "Bir teklif aktarıldıktan (AKTARILDI_MI=1) sonra tekrar faturaya/siparişe aktarılamaz — mükerrer belge önlenir.",
            "Arşivlenmiş (DURUM=-2, eski versiyon) teklifler salt-okunur açılır; düzenle/revize/kur/pozisyon butonları görünmez.",
            "B2B onay bilgisi (ONAY/RED, tarih, IP, not) müşteri portalından geldiyse detayda sağ panelde gösterilir.",
            "Karlılık sekmesi yalnızca kayıtta maliyet snapshot alınmış tekliflerde dolu gelir; eski tekliflerde maliyet verisi olmayabilir.",
            "Dövizli tekliflerde alt bölümdeki döviz kartlarının en başına 'Ana Para Birimi Toplamı' kartı eklendi; tüm dövizlerin ana para birimi (ör. TL) karşılığının toplamını tek bakışta gösterir. Mevcut döviz kartları aynen korunur."
          ]
        },
        {
          "id": "durum",
          "baslik": "Teklif Durumları",
          "yol": "/ekran/teklif/tanim/durum",
          "sub": "tanim",
          "amac": "Verilen ve alınan teklifler için ana ve alt durum (pozisyon) tanımlarını renkleriyle birlikte yönetmek.",
          "neden": "Satış hattınızın aşamalarını (ör. Hazırlanıyor, Gönderildi, Onaylandı, Reddedildi) firmanıza göre özelleştirmek için kullanılır; teklif takibi ve raporların temeli bu durumlardır.",
          "nasil": [
            "Kullanım yerini seçin: Verilen Teklif veya Alınan Teklif.",
            "Ana durum mu alt durum mu olduğunu (Bağlı Olduğu Yer) belirleyin.",
            "Durum adını, arka plan ve yazı rengini, sırasını girin.",
            "Varsayılan yapmak isterseniz işaretleyin (yeni tekliflerin başlangıç durumu olur).",
            "Kaydet ile durumu ekleyin; gereksiz durumları Sil ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Durum tanımını ekler/günceller",
              "sonuc": "Durum listeye eklenir",
              "renk": "primary"
            },
            {
              "ad": "Sil",
              "islev": "Durumu pasife çeker",
              "sonuc": "Durum kullanımdan kalkar",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "durumkaydet",
              "tetik": "Kaydet butonu",
              "etki": "sys_durum tablosuna kayıt eklenir/güncellenir; varsayılan işaretlendiyse aynı modülün diğer varsayılanı sıfırlanır",
              "neden_sonuc": "Firmaya özel satış aşamaları tanımlanır; varsayılan durum yeni tekliflere otomatik atanır. Yanlış varsayılan tüm yeni teklifleri etkiler."
            },
            {
              "ad": "durumsil",
              "tetik": "Sil butonu",
              "etki": "sys_durum.DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan durum gizlenir; aktif tekliflere bağlı durumu silmek raporlarda boş durum gösterebilir."
            }
          ],
          "iliskiler": [
            "durum (sys_durum)"
          ],
          "ipuclari": [
            "Renkler listede görsel takibi kolaylaştırır; onay için yeşil, red için kırmızı gibi tutarlı kullanın.",
            "Durum adında 'onay/kabul' veya 'red/iptal' geçmesi otomasyon tetikleyicilerini (TEKLIF_ONAYLANDI/TEKLIF_REDDEDILDI) çalıştırır."
          ]
        },
        {
          "id": "teklifaciklama",
          "baslik": "Sabit Açıklamalar",
          "yol": "/ekran/teklif/tanim/teklifaciklama",
          "sub": "tanim",
          "amac": "Tekliflerde sık kullanılan hazır açıklama metinlerini ve bunları gruplayan başlıkları tanımlamak.",
          "neden": "Her teklifte aynı şart/garanti/teslimat metinlerini elle yazmak yerine hazır bloklardan seçmek zaman kazandırır ve tutarlılık sağlar.",
          "nasil": [
            "Açıklamalar sekmesinde grup, başlık, metin ve sırayı girin (metin editörüyle biçimlendirilebilir).",
            "Açıklama Grupları sekmesinden metinleri kategorilere ayırın.",
            "Kaydet ile ekleyin; teklif formunda 'Hazır Açıklama Seç' ile kullanın.",
            "Gereksiz açıklama/grupları Sil ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Açıklama metnini ekler/günceller",
              "sonuc": "Hazır açıklama listeye eklenir",
              "renk": "primary"
            },
            {
              "ad": "Grup Kaydet",
              "islev": "Açıklama grubunu ekler/günceller",
              "sonuc": "Grup oluşur",
              "renk": "primary"
            },
            {
              "ad": "Sil",
              "islev": "Açıklamayı veya grubu siler",
              "sonuc": "İlgili kayıt kaldırılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "sabitaciklamakaydet",
              "tetik": "Açıklama Kaydet butonu",
              "etki": "sys_sabitmetin (MODULE_KEY='teklif') kaydı eklenir/güncellenir",
              "neden_sonuc": "Hazır açıklama teklif formunda seçilebilir hale gelir; iyi tanımlanmış metinler teklif kalitesini artırır."
            },
            {
              "ad": "sabitaciklamagrupkaydet",
              "tetik": "Grup Kaydet butonu",
              "etki": "kayit_gruplari (YER='TEKLIFACIKLAMAGRUP') kaydı yazılır",
              "neden_sonuc": "Açıklamalar kategorize edilir; çok metin olduğunda seçim kolaylaşır."
            },
            {
              "ad": "aciklamasil",
              "tetik": "Açıklama Sil",
              "etki": "sys_sabitmetin ilgili kayıt silinir",
              "neden_sonuc": "Kullanılmayan metin listeden çıkar."
            },
            {
              "ad": "sabitaciklamagrupsil",
              "tetik": "Grup Sil",
              "etki": "kayit_gruplari ilgili grup silinir",
              "neden_sonuc": "Boş/gereksiz grup kaldırılır."
            }
          ],
          "iliskiler": [
            "teklif"
          ],
          "ipuclari": [
            "Metinlerde HTML biçimlendirme (summernote editörü) kullanılabilir; teklif çıktısına biçimli yansır.",
            "Grup+satır ID kombinasyonu teklife bağlanır; grubu silmeden önce bağlı açıklamaları kontrol edin."
          ]
        },
        {
          "id": "konu",
          "baslik": "Teklif Konuları",
          "yol": "/ekran/teklif/tanim/konu",
          "sub": "tanim",
          "amac": "Teklifleri sınıflandırmak için konu/kategori etiketleri tanımlamak (Verilen/Alınan teklif ayrı).",
          "neden": "Teklifleri konuya göre etiketleyip filtrelemek, hangi tür işlerde ne kadar teklif verildiğini görmek için kullanılır.",
          "nasil": [
            "Kullanım yerini (Verilen/Alınan Teklif) seçin.",
            "Konu adını ve sırasını girin, durumu aktif yapın.",
            "Kaydet ile konuyu ekleyin.",
            "Teklif formunda konuları seçerek teklifi etiketleyin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Teklif konusunu ekler/günceller",
              "sonuc": "Konu listeye eklenir",
              "renk": "primary"
            },
            {
              "ad": "Sil",
              "islev": "Konuyu pasife çeker",
              "sonuc": "Konu kullanımdan kalkar",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "konuekle",
              "tetik": "Kaydet butonu",
              "etki": "kayit_gruplari (YER=VERILENTEKLIF/ALINANTEKLIF) kaydı eklenir/güncellenir",
              "neden_sonuc": "Teklifler bu konuyla etiketlenebilir ve konu bazlı gruplanabilir."
            },
            {
              "ad": "konusil",
              "tetik": "Sil butonu",
              "etki": "kayit_gruplari.DURUM=-1",
              "neden_sonuc": "Kullanılmayan konu gizlenir; aktif tekliflere bağlı konuyu silmek etiketleri boşaltabilir."
            }
          ],
          "iliskiler": [
            "teklif"
          ],
          "ipuclari": [
            "Bir teklife birden fazla konu atanabilir; listede konular birleştirilerek gösterilir.",
            "Verilen ve alınan teklif konuları ayrı yönetilir."
          ]
        },
        {
          "id": "ozelalan",
          "baslik": "Özel Alanlar",
          "yol": "/ekran/teklif/tanim/ozelalan",
          "sub": "tanim",
          "amac": "Standart teklif formunda olmayan, firmaya özel ek bilgi alanları (metin, seçim, çoklu seçim vb.) tanımlamak.",
          "neden": "Sektörünüze özgü bilgileri (ör. proje kodu, referans, teslim yeri) teklifte tutmak ve bunlara göre filtrelemek için kullanılır.",
          "nasil": [
            "Alan adını ve sırasını girin.",
            "Alan tipini seçin (metin, seçim listesi, çoklu seçim vb.); seçim tipinde seçenekleri ekleyin.",
            "Zorunlu olmasını istiyorsanız işaretleyip zorunluluk mesajını yazın.",
            "Kaydet ile alanı oluşturun; teklif formu ve filtre modalında görünür.",
            "Gereksiz alanları Sil ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Özel alan tanımını ekler/günceller",
              "sonuc": "Alan teklif formuna eklenir",
              "renk": "primary"
            },
            {
              "ad": "Sil",
              "islev": "Özel alanı pasife çeker",
              "sonuc": "Alan formdan kalkar",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "ozelalanekle",
              "tetik": "Kaydet butonu",
              "etki": "ozel_alan_tanim (MODULE_KEY='teklif') kaydı eklenir/güncellenir; seçim tiplerinde seçenekler saklanır",
              "neden_sonuc": "Teklif formuna dinamik alan eklenir."
            },
            {
              "ad": "ozelalansil",
              "tetik": "Sil butonu",
              "etki": "ozel_alan_tanim.DURUM=-1",
              "neden_sonuc": "Alan gizlenir; eski tekliflerdeki değerler korunur ama yeni formda görünmez."
            }
          ],
          "iliskiler": [
            "özel alan",
            "teklif"
          ],
          "ipuclari": [
            "Özel alan değerlerine göre teklif listesinde filtreleme yapabilirsiniz.",
            "Zorunlu alanlar teklif kaydını bloklar; gereksiz zorunluluktan kaçının."
          ]
        },
        {
          "id": "satisdonusum",
          "baslik": "Satış Dönüşümü",
          "yol": "/ekran/teklif/rapor/satisdonusum",
          "sub": "rapor",
          "amac": "Verilen tekliflerin ne kadarının gerçekten satışa (faturaya) dönüştüğünü hem adet hem tutar bazında gösteren rapor.",
          "neden": "Teklif verimliliğinizi ölçmek; küçük teklifleri mi büyükleri mi kazandığınızı görüp satış stratejisini ayarlamak için kullanılır.",
          "nasil": [
            "Filtrele butonuyla başlangıç ve bitiş tarihi seçin.",
            "Adet ve tutar dönüşüm oranlarını KPI kartlarında okuyun.",
            "Müşteri detay tablosunda hangi teklifin kazanıldığını/açık olduğunu inceleyin.",
            "Adet ve tutar oranlarının farkını yorumlayın (büyük mü küçük mü müşteri kazanıyorsunuz)."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı seçip raporu çalıştırır",
              "sonuc": "Dönüşüm oranları hesaplanır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "(rapor-goruntuleme)",
              "tetik": "Filtrele",
              "etki": "teklif_fis üzerinden AKTARILDI_MI bazlı adet/tutar toplamları hesaplanır (salt-okuma)",
              "neden_sonuc": "Dönüşüm oranı düşükse fiyat/sunum/süreç gözden geçirilir; bu rapor veri değiştirmez."
            }
          ],
          "iliskiler": [
            "teklif",
            "fatura"
          ],
          "ipuclari": [
            "Adet oranı > tutar oranı ise küçük teklifleri kazanıp büyükleri kaçırıyorsunuz demektir.",
            "%30 altı dönüşüm süreç revizyonu gerektirir; %50+ mükemmeldir."
          ]
        },
        {
          "id": "bekleyen",
          "baslik": "Bekleyen & Süresi Dolmuş",
          "yol": "/ekran/teklif/rapor/bekleyen",
          "sub": "rapor",
          "amac": "Henüz satışa dönmemiş, geçerlilik tarihine göre bekleyen veya süresi dolmuş verilen teklifleri listeler.",
          "neden": "Takip edilmesi gereken açık teklifleri ve süresi geçmek üzere olanları görüp müşteriyi zamanında aramak için kullanılır.",
          "nasil": [
            "Filtrele ile tarih aralığı seçin.",
            "KPI kartlarında bekleyen/süresi dolmuş adet ve tutarları görün.",
            "Listede geçerlilik tarihine göre sıralı teklifleri, geçen gün sayısıyla inceleyin.",
            "B2B linki aktifse müşteriye onay linki paylaşın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı seçip raporu çalıştırır",
              "sonuc": "Bekleyen/dolmuş teklifler listelenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "(rapor-goruntuleme)",
              "tetik": "Filtrele",
              "etki": "AKTARILDI_MI=0 ve geçerlilik tarihine göre teklif_fis listelenir (salt-okuma)",
              "neden_sonuc": "Süresi dolmadan takip ederseniz kaçan satışı önlersiniz; rapor veri değiştirmez."
            }
          ],
          "iliskiler": [
            "teklif",
            "b2b müşteri portalı"
          ],
          "ipuclari": [
            "Geçerlilik tarihi geçmiş teklifler süresi dolmuş sayılır; hızlı aksiyon alın.",
            "Büyük listelerde tarih aralığını daraltın."
          ]
        },
        {
          "id": "enbuyukacik",
          "baslik": "En Büyük Açıklar",
          "yol": "/ekran/teklif/rapor/enbuyukacik",
          "sub": "rapor",
          "amac": "Satışa dönmemiş açık teklifleri tutara göre büyükten küçüğe sıralayan rapor.",
          "neden": "Sınırlı zamanınızı en yüksek değerli fırsatlara ayırıp satış kapama oranını artırmak için kullanılır.",
          "nasil": [
            "Filtrele ile tarih aralığı seçin (performans için filtre zorunludur).",
            "En büyük açık teklifleri tepeden görün.",
            "Toplam açık potansiyel tutarını KPI'da okuyun.",
            "Öncelik sırasına göre müşterileri arayın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı seçip raporu çalıştırır",
              "sonuc": "Açık teklifler tutara göre listelenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "(rapor-goruntuleme)",
              "tetik": "Filtrele",
              "etki": "AKTARILDI_MI=0 açık teklifler tutara göre sıralı listelenir (salt-okuma)",
              "neden_sonuc": "Büyük fırsatlara odaklanınca tek büyük kazanç çok sayıda küçük teklife bedeldir."
            }
          ],
          "iliskiler": [
            "teklif"
          ],
          "ipuclari": [
            "Bir büyük teklifin kaybı on küçük teklifin kazancını sıfırlar; önceliklendirin.",
            "Kayıt çok olabileceği için filtresiz açılmaz."
          ]
        },
        {
          "id": "saticiperformans",
          "baslik": "Kullanıcı Performans",
          "yol": "/ekran/teklif/rapor/saticiperformans",
          "sub": "rapor",
          "amac": "Her kullanıcı/satıcının teklif ve satış (dönüşüm) istatistiklerini karşılaştıran performans raporu.",
          "neden": "Satış ekibinin verimini ölçmek, eğitim/mentorluk ihtiyacını belirlemek ve en iyi satıcıları görmek için kullanılır.",
          "nasil": [
            "Filtrele ile tarih aralığı seçin.",
            "Her satıcının teklif adedi, satış adedi ve tutar bazlı dönüşüm yüzdesini görün.",
            "Renkli performans bantlarıyla (yeşil/turuncu/kırmızı) hızlı okuyun.",
            "Satış tutarına göre sıralamayı inceleyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı seçip raporu çalıştırır",
              "sonuc": "Satıcı bazlı performans listelenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "(rapor-goruntuleme)",
              "tetik": "Filtrele",
              "etki": "teklif_fis INSERT_ID bazında gruplanarak adet/tutar/dönüşüm hesaplanır (salt-okuma)",
              "neden_sonuc": "Düşük dönüşümlü satıcıya eğitim, yüksek dönüşümlüye büyük müşteri verilerek ekip verimi artırılır."
            }
          ],
          "iliskiler": [
            "teklif",
            "fatura"
          ],
          "ipuclari": [
            "%50+ dönüşüm yıldız satıcıdır; %30 altı acil müdahale gerektirir.",
            "Dönüşüm tutar bazlıdır; adet çok olsa da düşük tutarlı satış oranı düşürür."
          ]
        },
        {
          "id": "kaybedilen",
          "baslik": "Kaybedilenler",
          "yol": "/ekran/teklif/rapor/kaybedilen",
          "sub": "rapor",
          "amac": "Geçerlilik süresi dolmuş ve satışa dönüştürülemeyen (kaybedilen) teklifleri analiz eden rapor.",
          "neden": "Hangi müşteri, hangi tutarda, ne kadar süredir cevapsız kaldı sorularını yanıtlayıp bir sonraki teklifi kazanmayı öğrenmek için kullanılır.",
          "nasil": [
            "Filtrele ile tarih aralığı seçin.",
            "Süresi dolmuş ve satışa dönmeyen teklifleri listeleyin.",
            "Toplam kayıp tutarını ve geçen süreyi inceleyin.",
            "En büyük tekil kaybı belirleyip nedenini araştırın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı seçip raporu çalıştırır",
              "sonuc": "Kaybedilen teklifler listelenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "(rapor-goruntuleme)",
              "tetik": "Filtrele",
              "etki": "AKTARILDI_MI=0 ve geçerliliği geçmiş teklifler listelenir (salt-okuma)",
              "neden_sonuc": "Kayıp desenlerini görünce fiyat/süreç iyileştirip gelecekteki kayıpları azaltırsınız."
            }
          ],
          "iliskiler": [
            "teklif"
          ],
          "ipuclari": [
            "Her kaybedilen teklif bir öğrenme fırsatıdır; ortak kayıp nedenini arayın.",
            "Yüksek tutarlı kayıplara özel geri kazanım araması yapın."
          ]
        },
        {
          "id": "saglikrapor",
          "baslik": "Durum/Sağlık Raporu",
          "yol": "/ekran/teklif/rapor/saglikrapor",
          "sub": "rapor",
          "amac": "Tekliflerin durum dağılımını (satışa döndü / süresi doldu / açık bekliyor) adet ve tutar bazında özetleyen genel sağlık raporu.",
          "neden": "Teklif portföyünüzün genel durumunu bir bakışta görüp satış hattının sağlığını değerlendirmek için kullanılır.",
          "nasil": [
            "Filtrele ile tarih aralığı seçin.",
            "Satışa dönen, süresi dolan ve açık teklif dağılımını adet/tutar olarak görün.",
            "Toplamlar üzerinden portföy sağlığını yorumlayın.",
            "Sorunlu dağılımlarda ilgili detay raporuna (bekleyen/kaybedilen) geçin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı seçip raporu çalıştırır",
              "sonuc": "Durum dağılımı özetlenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "(rapor-goruntuleme)",
              "tetik": "Filtrele",
              "etki": "teklif_fis, AKTARILDI_MI ve geçerlilik tarihine göre durum kategorilerine gruplanır (salt-okuma)",
              "neden_sonuc": "Açık/süresi dolmuş oranı yüksekse takip zayıf demektir; erken görüp müdahale edersiniz."
            }
          ],
          "iliskiler": [
            "teklif"
          ],
          "ipuclari": [
            "Süresi dolmuş dilim büyükse teklif takip disiplini zayıftır.",
            "Bu rapor genel resmi verir; detay için diğer teklif raporlarını kullanın."
          ]
        }
      ]
    },
    {
      "slug": "stok",
      "title": "Stok & Ürün / Hizmet",
      "icon": "🏷️",
      "modul": "urunhizmet",
      "ad": "Ürün ve Hizmet (Stok) Yönetimi",
      "ozet": "Ürün ve Hizmet modülü, işletmenin sattığı/aldığı tüm ürün ve hizmet kartlarını, bunların stok giriş-çıkış hareketlerini, bakiyelerini, sayımlarını ve maliyetlerini tek çatı altında yönetir. Stok kartları, işlem fişleri, sayım, seri no takibi, varyant (renk/beden) yönetimi, depo, birim, grup, fiyat listeleri ve müşteri bazlı abonelik/süreli hizmet takibi bu modülde yürütülür. FIFO/LIFO/AVG/LAST maliyetleme ile envanter, yeterlilik, ABC ve yaşam döngüsü gibi karar-destek raporları üretir; fatura, irsaliye, kasa ve cari modülleriyle entegre çalışır. Ayrıca serisiz alınan ürünlere işletmenin kendi verdiği seri numarasıyla satış yapılabilmesi için, isteğe bağlı bir ayarla stokta kayıtlı olmayan seri numaraları satış ekranında elle (girişsiz) girilip satılmış olarak kaydedilebilir. İsteğe bağlı 'Akıllı Arama' ayarı (Ürün/Hizmet Ayarları) açıldığında ürün araması kelimeleri HERHANGİ SIRADA eşleştirir ve Türkçe harf duyarsız çalışır (ör. 'TOSHİBA 2TB' = '2tb toshiba' = 'toshıba'); fatura/irsaliye/sipariş/teklif satır aramalarının tümünde geçerli; varsayılan KAPALI (birebir arama korunur).",
      "modul_iliskiler": [
        "fatura",
        "irsaliye",
        "cari",
        "kasa",
        "servis",
        "siparis",
        "teklif",
        "uretim",
        "sahasatis",
        "otomasyon (n8n)",
        "b2b musteri portali"
      ],
      "ekranlar": [
        {
          "id": "kartliste",
          "baslik": "Stok Kartları",
          "yol": "/ekran/urunhizmet/rapor/kartliste",
          "sub": "rapor",
          "amac": "Sistemdeki tüm ürün ve hizmet kartlarını (kod, ad, tip, birim, alış/satış fiyatı, KDV, etiket, varyant) filtreli listeler; buradan yeni kart eklenir, düzenlenir, silinir.",
          "neden": "Ürün/hizmet portföyünüzün merkezi. Fatura, irsaliye, teklif, sipariş vb. her belge bu kartlardan beslenir. Kart tanımı yoksa satış/alış yapılamaz. Fiyat ve KDV bilgileri buradan gelir.",
          "nasil": [
            "Sağ üstteki 'Kart Ekle' ile yeni ürün/hizmet kartı oluşturun (tanim/kart formu açılır).",
            "Kart formunda kod, ad, grup, tip (ürün/hizmet), barkod, alış/satış fiyatı ve KDV oranı, birim, resim, etiket ve varsa hatırlatma/seri no takibi ayarlarını girip KAYDET deyin.",
            "Listeyi Kod, Ad, Tip, Etiket veya Grup'a göre 'Filtrele' ile daraltın.",
            "Varyant yönetimi açıksa düz listede sadece ana/normal kartlar görünür; ana kartı düzenleyip Varyantlar sekmesinden alt varyantları (renk/beden) yönetin.",
            "Bir kartı düzenlemek için satır İŞLEMLER > Düzenle; kaldırmak için Sil'i kullanın.",
            "Excel veya YAZDIR ile listeyi dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Kart Ekle",
              "islev": "Yeni ürün/hizmet kartı oluşturma formunu açar",
              "sonuc": "tanim/kart giriş ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Kod/ad/tip/etiket/grup kriterleriyle listeyi daraltır",
              "sonuc": "Sadece kriterlere uyan kartlar listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili kartı düzenleme modunda açar",
              "sonuc": "Kart bilgileri güncellenebilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Kartı onaylı şekilde siler (soft-delete)",
              "sonuc": "Kart pasifleşir; varyantlıysa hareketsiz varyantları da silinir",
              "renk": "danger"
            },
            {
              "ad": "Excel",
              "islev": "Listeyi Excel dosyası olarak indirir",
              "sonuc": "Toplu güncelleme/analiz için dosya iner",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Listeyi A4 yazdırma çıktısı üretir",
              "sonuc": "Yazıcı/PDF çıktısı",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "kartekle",
              "tetik": "Kart formunda KAYDET (tanim/kart üzerinden)",
              "etki": "stok_kart tablosuna kayıt ekler/günceller; etiketleri sys_etiket'e yeniden yazar; resim yüklenirse dosyayı kaydeder; yeni kayıtta aynı KOD varsa engeller",
              "neden_sonuc": "Kartı doğru kod/fiyat/KDV ile kaydederseniz tüm belgeler doğru çalışır. Aynı kodu ikinci kez girerseniz sistem uyarır; eksik/yanlış KDV girilirse faturalarda vergi hatalı hesaplanır."
            },
            {
              "ad": "kartsil",
              "tetik": "Listede Sil butonu + onay",
              "etki": "stok_kart DURUM=-1; varyantlı ana kartta hareketsiz alt varyantlar da pasiflenir; ilgili sys_etiket DURUM=-1 yapılır",
              "neden_sonuc": "Kullanılmayan kartı silerek listeyi temiz tutarsınız. Alt varyantlardan herhangi birinin stok hareketi varsa silme engellenir; aksi halde geçmiş belgeler dayanaksız kalırdı."
            },
            {
              "ad": "varyanturet",
              "tetik": "Kart düzenlemede Varyantlar sekmesinde 'Üret'",
              "etki": "Ana kartı VARYANTLI_MI=1 yapar; her nitelik kombinasyonu için stok_kart alt kaydı ve stok_kart_nitelik eşlemesi oluşturur (var olan varyantı idempotent günceller); matriste olmayan hareketsiz varyantları pasifler",
              "neden_sonuc": "Renk/beden gibi çeşitleri tek tek elle açmak yerine toplu üretirsiniz. Kodlar/barkodlar benzersiz olmalı; çakışma, tekrar eden kombinasyon veya yetkisiz/pasif nitelik değeri varsa üretim durur, böylece bozuk stok oluşmaz. Stok hareketi olan ürün henüz varyantlı değilse varyantlıya çevrilemez."
            },
            {
              "ad": "varyantkapat",
              "tetik": "Kart düzenlemede 'Varyant Modunu Kapat' + onay",
              "etki": "Ana kart VARYANTLI_MI=0; hareketsiz alt varyantlar soft-delete",
              "neden_sonuc": "Yanlışlıkla varyantlı yapılan ürünü normale döndürür. Hareketi olan varyant varsa işlem engellenir; aksi halde geçmiş stok kayıtları kopuk kalırdı."
            },
            {
              "ad": "etiketara",
              "tetik": "Kart formu/filtrede etiket kutusuna yazma",
              "etki": "sys_etiket'ten (urunhizmet, DURUM=1) benzersiz etiketleri önerir",
              "neden_sonuc": "Tutarlı etiketleme sağlar; aynı anlamda farklı etiketler oluşmasını azaltır."
            }
          ],
          "iliskiler": [
            "fatura",
            "irsaliye",
            "teklif",
            "siparis",
            "stok (hareket)",
            "grup",
            "birim",
            "fiyat listesi",
            "varyant/nitelik"
          ],
          "ipuclari": [
            "Varyant yönetimi ayarı açıksa düz listede sadece ana/normal kartlar görünür, alt varyantlar ana kartın Varyantlar sekmesinde yönetilir.",
            "Aynı kart kodu iki kez girilemez; benzersiz kodlama stok karışıklığını önler.",
            "Hizmet kartlarında stok takibi anlamlı değildir; TIP'i doğru seçin (Ürün/Hizmet).",
            "Şube filtresi: Birden fazla şubesi olan işletmelerde filtre penceresine eklenen Şube seçiciyle, yalnız erişim yetkiniz olan şubeleri seçerek listeyi o şubeye ait kayıtlarla süzersiniz; tek şubeli işletmelerde bu seçici görünmez.",
            "Ürün görselinin nasıl saklanacağını Ayarlar > Stok > 'Stok Kartında Resim' belirler: Dosya Yükle (dosya arşivi — Google Drive / Narbulut S3) / Resim Adresi Gir (URL) / Kapalı / Otomatik.",
            "Birden çok üründen oluşan set/paketi 'Paket Ürün mü? = Evet' ile tanımlarsınız; satışta bileşenler otomatik stoktan düşer.",
            "Stok kodunu boş bırakabilirsiniz — kaydettiğinizde sıradaki numara otomatik verilir. Numara ekranı açtığınızda değil, kaydettiğinizde üretilir; vazgeçtiğiniz kayıtlar numara harcamaz. Kod tekilliği varyant satırlarında da çalışır ve kopyala-yapıştırla gelen görünmez boşluklar temizlenir, böylece Excel’den yapıştırdığınız kod ile elle yazdığınız kod aynı sayılır."
          ]
        },
        {
          "id": "kartbirlestir",
          "baslik": "Stok Kartı Birleştir",
          "yol": "/ekran/urunhizmet/rapor/kartbirlestir",
          "sub": "rapor",
          "amac": "Aynı ürünün yanlışlıkla birden çok kez açılmış (mükerrer) stok kartlarını tek bir hedef kartta toplar. Birden çok kaynak stok seçilir, tek hedef stok seçilir; kaynakların tüm geçmişi (hareket, seri no, fatura/irsaliye/sipariş/teklif/sayım satırları, abonelik, keşif/servis malzemeleri, e-fatura eşleşmeleri) hedefe bağlanır, kaynak kartlar pasife çekilir.",
          "neden": "Müşteriler aynı ürünü 2-3 kez farklı kart olarak açtığında stok bakiyesi ve geçmiş kartlara dağılır; sayımda tutarsızlık ve yanlış maliyet oluşur. Birleştirme bu dağınıklığı tek kartta toplar. Kayıtlar silinip yeniden yazılmaz, olduğu yerde hedefe repoint edilir; tarih, maliyet ve evrak bağı korunur, bakiye/maliyet (FIFO/LIFO/AORT) otomatik doğrulanır.",
          "nasil": [
            "Ürün ve Hizmet menüsünden Stok Kartı Birleştir ekranını açın.",
            "Kaynak Stoklar alanına birleştirilecek (mükerrer) kartları arayıp seçin — birden fazla seçebilirsiniz.",
            "Hedef Stok alanına kalacak kartı seçin (kaynaklardan farklı olmalı).",
            "Önizle deyin: hangi tablodan kaç kayıt taşınacak, kaç seri no ve hedef/kaynak/birleşme sonrası bakiye gösterilir; engel varsa (birim farkı, seri takip farkı, seri çakışması, açık sayım) sebebi listelenir.",
            "Engel yoksa Onayla ve Birleştir ile tek işlemde birleştirin (geri alınamaz olduğu için çift onay istenir)."
          ],
          "butonlar": [
            {
              "ad": "Önizle",
              "islev": "Seçilen kaynak/hedef için taşınacak kayıtları, seri sayısını, bakiyeleri ve varsa engel sebeplerini hesaplar (yazma yapmaz)",
              "sonuc": "Önizleme paneli açılır; sorun yoksa Birleştir butonu görünür",
              "renk": "primary"
            },
            {
              "ad": "Onayla ve Birleştir",
              "islev": "Kaynakların tüm kayıtlarını hedefe taşır, kaynakları pasife çeker, işlemi kayıt altına alır",
              "sonuc": "Tek transaction'da birleştirme yapılır; hata olursa hiçbir şey değişmez",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "birlestirstokara",
              "tetik": "Kaynak/hedef arama kutusuna yazınca",
              "etki": "Aktif stok kartlarını (kod/ad/barkod) arar"
            },
            {
              "ad": "kartbirlestironizle",
              "tetik": "Önizle",
              "etki": "Ön kontroller + tablo bazında taşınacak kayıt sayısı + bakiye hesabı döner (salt-okuma)"
            },
            {
              "ad": "kartbirlestir",
              "tetik": "Onayla ve Birleştir",
              "etki": "12 tabloda stok referansını hedefe repoint eder, kaynakları DURUM=-1 yapar, stok_birlestirme_log kaydı yazar"
            }
          ],
          "iliskiler": [
            "kartliste",
            "stokhareket",
            "serino",
            "sayimlar",
            "fatura",
            "irsaliye"
          ],
          "ipuclari": [
            "Birleştirme geri alınamaz; önce mutlaka Önizle ile rakamları doğrulayın.",
            "Farklı stok birimine sahip kartlar, seri takibi farklı kartlar veya aynı seri no iki kartta varsa işlem engellenir.",
            "Taraflardan biri devam eden (kesinleşmemiş) bir sayımda ise önce sayımı bitirin.",
            "Kaynak kartlar silinmez; adına [BİRLEŞTİRİLDİ→#hedef] izi düşülüp pasife çekilir, her işlem loglanır."
          ]
        },
        {
          "id": "fisliste",
          "baslik": "İşlem Fişi",
          "yol": "/ekran/urunhizmet/rapor/fisliste",
          "sub": "rapor",
          "amac": "Tüm stok fişlerini (manuel giriş/çıkış genel stok fişleri ile fatura/irsaliye kaynaklı entegrasyon fişleri) tek listede gösterir; manuel fişleri yazdırır, düzenler, siler.",
          "neden": "Stok hareketlerinin belge düzeyindeki kaydıdır. Hangi fişin ne zaman düzenlendiğini görür, hata durumunda geçmişi izler ve manuel stok düzeltmelerini yönetirsiniz.",
          "nasil": [
            "Sağ üstteki 'Fiş Girişi' ile yeni manuel stok fişi oluşturun.",
            "Fiş formunda evrak no/tarih, (varsa) depo seçip satır satır ürün, miktar, birim fiyat ve işlem tipini girip KAYDET deyin.",
            "Listeyi Evrak No ve tarih aralığına göre 'Filtrele' ile daraltın.",
            "Manuel (EVRAK_TIP=500) fişlerde İŞLEMLER menüsünden Yazdır / Düzenle / Sil yapın.",
            "Fatura/irsaliye kaynaklı satırlar 'Entegrasyon Kaydı' etiketiyle görünür ve buradan düzenlenmez."
          ],
          "butonlar": [
            {
              "ad": "Fiş Girişi",
              "islev": "Yeni manuel stok işlem fişi formunu açar",
              "sonuc": "islem/fis giriş ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Evrak no ve tarih aralığıyla listeyi süzer",
              "sonuc": "Kriterlere uyan fişler listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Manuel fişin yazdırma önizlemesini açar",
              "sonuc": "Yazıcı/PDF çıktısı",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Manuel fişi düzenleme modunda açar",
              "sonuc": "Fiş ve satırları güncellenebilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Fişi ve tüm satır hareketlerini onayla siler",
              "sonuc": "Fiş ve stok hareketleri pasifleşir",
              "renk": "danger"
            },
            {
              "ad": "Excel",
              "islev": "Fiş listesini Excel olarak indirir",
              "sonuc": "Muhasebe/dış analiz için dosya",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "fiskaydet",
              "tetik": "Fiş formunda KAYDET",
              "etki": "stok_fis başlık kaydını (EVRAK_TIP=500) ekler/günceller; güncellemede eski satırları silip satırları stok_hareket'e yeniden yazar; her satıra maliyet damgası (StokTuketimMaliyet: FIFO/LIFO/AVG/LAST) uygular; STOK_HAREKETI_OLUSTU otomasyonunu tetikler",
              "neden_sonuc": "Manuel giriş/çıkış/düzeltmeyi belgeye bağlar; stok bakiyesi ve maliyet doğru güncellenir. Detay satırı olmadan kayıt yapılmaz; varsayılan para birimi tanımlı değilse fiş oluşmaz."
            },
            {
              "ad": "fissil",
              "tetik": "Listede Sil + onay",
              "etki": "stok_fis DURUM=-1 ve o fişe bağlı stok_hareket kayıtları DURUM=-1",
              "neden_sonuc": "Yanlış girilen fişi iptal ederek stok bakiyesini düzeltirsiniz. Silmezseniz hatalı miktar bakiyede kalır; silince ilgili hareketler bakiyeden düşer."
            }
          ],
          "iliskiler": [
            "stok (hareket)",
            "depo",
            "cari",
            "fatura",
            "irsaliye",
            "otomasyon"
          ],
          "ipuclari": [
            "Sadece manuel Genel Stok Fişleri (500) düzenlenip silinebilir; fatura/irsaliye kaynaklı fişler kendi belgesinden düzeltilir.",
            "Fiş güncellenirken eski satır hareketleri silinip yeniden yazılır; kayıtları tekrar kontrol edin.",
            "Depo kullanımı açıksa doğru depoyu seçin, yoksa bakiye yanlış depoya işlenir."
          ]
        },
        {
          "id": "sayimlar",
          "baslik": "Stok Sayım",
          "yol": "/ekran/urunhizmet/rapor/sayimlar",
          "sub": "rapor",
          "amac": "Yapılmış tüm stok sayım fişlerini (tarih, depo, durum, fark tutarı) listeler; devam eden sayımları sürdürür, tamamlananları görür, sayım fişini siler.",
          "neden": "Fiziksel sayımla sistem kaydını karşılaştırıp farkları tespit ve düzeltmenin merkezi. Devam eden (kesinleşmemiş) sayımlar stoğa yansımaz; zamanında bitirilmesi gerekir.",
          "nasil": [
            "Sağ üstteki 'Sayım Yap' ile yeni sayım başlatın (tarih, açıklama, depo girip başlat).",
            "Sayım ekranında ürün seçin; sistem mevcut bakiyeyi otomatik getirir, siz raftaki gerçek miktarı girin, satır olarak ekleyin.",
            "Seri no takipli üründe okunan seri numaralarını tek tek girin; miktar otomatik hesaplanır.",
            "Tüm ürünleri ekledikten sonra 'Kesinleştir' ile sayımı kapatın; fark kadar otomatik giriş/çıkış hareketi oluşur.",
            "Listeden devam eden sayımları Düzenle ile sürdürün; gereksiz sayımı Sil ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Sayım Yap",
              "islev": "Yeni sayım fişi başlatma ekranını açar",
              "sonuc": "islem/sayim ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Sayım adı, depo, durum ve tarih aralığına göre süzer",
              "sonuc": "Kriterlere uyan sayımlar listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Devam eden sayımı sürdürme/detay ekranına götürür",
              "sonuc": "Sayıma ürün eklenmeye devam edilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Sayım fişini ve oluşan sayım hareketlerini siler",
              "sonuc": "Sayım kaydı pasifleşir, ilgili düzeltme hareketleri silinir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "sayimbaslat",
              "tetik": "Sayım Yap ekranında başlat",
              "etki": "sayim_fis kaydını DURUM=99 (devam ediyor) açar",
              "neden_sonuc": "Sayımı başlatır; kesinleştirilene kadar stoğa yansımaz. Başlatmadan ürün eklenemez."
            },
            {
              "ad": "bakiyesorgula",
              "tetik": "Sayımda ürün seçimi",
              "etki": "stok_hareket'ten ürünün anlık giriş/çıkış/bakiyesini hesaplar (varyantlıysa alt varyant toplamı)",
              "neden_sonuc": "Envanter miktarını otomatik doldurur; siz sadece gerçek sayılanı girersiniz, hata azalır."
            },
            {
              "ad": "sayimaekle",
              "tetik": "Sayımda satır Ekle",
              "etki": "sayim_fis_detay'a envanter, sayılan miktar, fark (SAYIM_SONUC = envanter − sayılan) ve varsa seri nolar kaydı ekler",
              "neden_sonuc": "Her ürünün farkını kaydeder. Aynı ürün ikinci kez eklenemez; önce satırı silip yeniden ekleyin, yoksa çift sayım olur."
            },
            {
              "ad": "sayimsatirsil",
              "tetik": "Sayım satırında sil",
              "etki": "sayim_fis_detay'dan o ürün satırını siler",
              "neden_sonuc": "Yanlış sayılan satırı düzeltmek için kaldırır."
            },
            {
              "ad": "sayimbitir",
              "tetik": "Kesinleştir + onay",
              "etki": "sayim_fis DURUM=1 yapar; tek bir stok_fis (EVRAK_TIP=500) başlığı açar ve farkı olan her satır için stok_hareket üretir: fiziki eksikse (envanter>sayılan) çıkış EVRAK_TIP=508, fiziki fazlaysa (envanter<sayılan) giriş EVRAK_TIP=507; her satıra maliyet damgalar; seri no takipli ürünlerde stok_seri_no giriş/çıkışını (DURUM 1/2) günceller",
              "neden_sonuc": "Sayım sonucunu stoğa işleyerek sistemi gerçekle eşitler. Kesinleştirmezseniz farklar bakiyeye yansımaz ve raporlar yanıltıcı kalır."
            },
            {
              "ad": "sayimsil",
              "tetik": "Listede Sil + onay",
              "etki": "sayim_fis DURUM=-1; o sayımdan doğan EVRAK_TIP IN (507,508) ve REF_EVRAK_ID eşleşen stok_hareket kayıtlarını siler",
              "neden_sonuc": "Hatalı sayımı geri alır; oluşturduğu düzeltme hareketleri de silinerek bakiye eski haline döner."
            }
          ],
          "iliskiler": [
            "stok (hareket)",
            "depo",
            "seri no",
            "envanter raporu",
            "bakiye raporu"
          ],
          "ipuclari": [
            "'Devam Eden' sayımlar acil bitirilmeli; kesinleşene dek stok düzeltmesi yapılmaz.",
            "Büyük fark tutarlarını (hata mı, kayıp mı) mutlaka detayından inceleyin.",
            "Seri no takipli ürünlerde sayım miktarı, girilen seri no adedinden otomatik belirlenir.",
            "Telefondan barkodlu sayım (PWA): depoda telefonla barkod okutarak sayarsınız; her okutma +1, çevrimdışı çalışır ve bağlantı gelince kopyasız işlenir. Yalnız yetkili depolarınızı görürsünüz; kesinleştirme (stoğa işleme) güvenlik için masaüstünde yapılır.",
            "Özel modülü olan tenant'ta GS1 DataMatrix kutu barkodu kancayla çözülür; standart tenant'ta düz EAN/kart kodu okunur."
          ]
        },
        {
          "id": "abonelik",
          "baslik": "Abonelikler",
          "yol": "/ekran/urunhizmet/rapor/abonelik",
          "sub": "rapor",
          "amac": "Müşteri bazlı süreli/tekrarlayan hizmetleri (domain, lisans, bakım, hosting vb.) başlangıç-bitiş, kalan gün, periyot ve durum bilgisiyle takip eder; yenileme faturası oluşturur, işlem geçmişini gösterir.",
          "neden": "Süresi dolan abonelikleri önceden görüp proaktif yenileme yaparak müşteri ve gelir kaybını önlersiniz. Kritik/yaklaşan/süresi geçmiş abonelikler renkli rozetlerle öne çıkar.",
          "nasil": [
            "Performans için önce 'Filtrele' ile durum/müşteri/hizmet/yaklaşan süre kriterlerini seçip raporu çalıştırın.",
            "Sağ üstteki 'Yeni Abonelik' ile müşteri, hizmet, tarih ve periyot girerek abonelik oluşturun.",
            "Yaklaşan/kritik olanlar için satır İŞLEMLER > 'Yenileme Faturası' ile fatura akışına geçin.",
            "'İşlem Detayları' ile aboneliğin tüm geçmişini (yeni/yenileme/iptal/güncelleme) modal olarak görün.",
            "İşlem yeri atanmış aboneliklerde işi tamamlayınca 'İşlem Yapıldı' ile işaretleyin."
          ],
          "butonlar": [
            {
              "ad": "Yeni Abonelik",
              "islev": "Manuel abonelik ekleme formunu açar",
              "sonuc": "islem/abonelik giriş ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Müşteri/hizmet/detay/durum/yaklaşan süre/işlem yeri süzgeci uygular",
              "sonuc": "Kriterlere uyan abonelikler listelenir",
              "renk": "ghost"
            },
            {
              "ad": "İşlem Yapıldı",
              "islev": "İşlem yeri bekleyen aboneliği yapıldı olarak işaretler",
              "sonuc": "Abonelik işlem durumu 'Yapıldı'ya döner",
              "renk": "accent"
            },
            {
              "ad": "Yenileme Faturası",
              "islev": "Abonelik için satış faturası (abonelik uzatma modu) açar",
              "sonuc": "Fatura modülüne yönlenir, süre uzatma faturalanır",
              "renk": "primary"
            },
            {
              "ad": "İşlem Detayları",
              "islev": "Aboneliğin hareket geçmişini modalda gösterir",
              "sonuc": "Geçmiş işlemler tablosu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Aboneliği düzenleme modunda açar",
              "sonuc": "Abonelik bilgileri güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Aboneliği onayla siler",
              "sonuc": "Abonelik pasifleşir ve iptal hareketi yazılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "abonelikekle",
              "tetik": "Yeni Abonelik formunda kaydet",
              "etki": "stok_abonelik kaydı ekler ve stok_abonelik_hareket'e ISLEM_TIP=1 (yeni kayıt) hareketi yazar",
              "neden_sonuc": "Süreli hizmeti sisteme alır; bitiş tarihi ve hatırlatma buradan hesaplanır. Geçersiz müşteri/stok seçilirse kayıt engellenir."
            },
            {
              "ad": "abonelikguncelle",
              "tetik": "Düzenle formunda kaydet",
              "etki": "stok_abonelik günceller; bitiş tarihi değiştiyse ISLEM_TIP=4 (güncelleme) hareket kaydı ekler",
              "neden_sonuc": "Tarih/fiyat/periyot değişikliklerini takip altında tutar; bitiş değişimi geçmişe düşer."
            },
            {
              "ad": "aboneliksil",
              "tetik": "Sil + onay",
              "etki": "stok_abonelik DURUM=-1; ISLEM_TIP=3 (iptal/silme) hareketi yazılır",
              "neden_sonuc": "Biten/iptal aboneliği kaldırır; iz kaydı korunur."
            },
            {
              "ad": "abonelikyenile",
              "tetik": "Manuel yenileme aksiyonu",
              "etki": "periyoda göre yeni bitiş tarihi hesaplar (süre geçmişse bugünden, değilse mevcut bitişten), stok_abonelik günceller, ISLEM_TIP=2 (yenileme) hareketi ekler",
              "neden_sonuc": "Fatura olmadan süreyi uzatır; kalan gün sıfırlanır, müşteri hizmette kalır."
            },
            {
              "ad": "abonelikislemyapildi",
              "tetik": "İşlem Yapıldı + onay",
              "etki": "stok_abonelik ISLEM_DURUM=2, işlem tarih/kişi damgalanır, ISLEM_TIP=6 hareketi yazılır (yalnız bekleyen işlem varsa)",
              "neden_sonuc": "İşlem yeri panelinde (ör. hosting paneli) uzatmayı yaptığınızı işaretler; ekipte 'kim yaptı' takibi netleşir."
            },
            {
              "ad": "abonelikhareket",
              "tetik": "İşlem Detayları",
              "etki": "stok_abonelik_hareket geçmişini (işlem tipi etiketli) okur",
              "neden_sonuc": "Aboneliğin tüm yaşam öyküsünü gösterir; anlaşmazlıkta kanıt olur."
            },
            {
              "ad": "cariabonelikler",
              "tetik": "Fatura ekranından çağrı",
              "etki": "Belirli cari+stok için aktif abonelikleri listeler",
              "neden_sonuc": "Fatura keserken müşterinin mevcut aboneliklerini gösterir; mükerrer/eksik yenilemeyi önler."
            },
            {
              "ad": "abonelikbul",
              "tetik": "Fatura kaydında otomatik",
              "etki": "cari+stok+detay ile aboneliği bulur",
              "neden_sonuc": "Faturayı doğru aboneliğe bağlar; süre otomatik uzayabilir."
            },
            {
              "ad": "abonelikistatistik",
              "tetik": "Dashboard widget",
              "etki": "Toplam/geciken/yaklaşan(7-30 gün)/toplam tutar özetini döner",
              "neden_sonuc": "Yönetim ekranında abonelik sağlığını özetler."
            },
            {
              "ad": "yaklasenabonelikler",
              "tetik": "Dashboard widget",
              "etki": "Bitişe yakın (kalan gün aralığına göre) abonelik listesi döner",
              "neden_sonuc": "Aksiyon gerektiren yenilemeleri panoda öne çıkarır."
            }
          ],
          "iliskiler": [
            "cari",
            "stok (kart)",
            "fatura",
            "işlem yeri tanımı",
            "dashboard/widget"
          ],
          "ipuclari": [
            "Stok/kayıt sayısı çok olabileceğinden rapor filtre seçmeden çalışmaz.",
            "7-30 gün kalanları 'yaklaşan' filtresiyle avlayıp erken yenileme teklifi sunun.",
            "İşlem yeri (panel URL) tanımlarsanız hangi abonelikte manuel işlem gerektiğini renkli rozetle görürsünüz."
          ]
        },
        {
          "id": "stokhareket",
          "baslik": "Hareket Raporu",
          "yol": "/ekran/urunhizmet/rapor/stokhareket",
          "sub": "rapor",
          "amac": "Seçilen ürünün tüm giriş/çıkış hareketlerini kronolojik, yürüyen bakiyeli ve FIFO maliyet detaylı gösterir.",
          "neden": "Stok hata analizi ve tedarikçi/müşteri mutabakatının temel raporu. Bir ürünün nereden geldiğini, nereye gittiğini ve maliyetini satır satır izlersiniz.",
          "nasil": [
            "Önce 'Filtrele' ile ürün, işlem tipi ve tarih aralığını seçin (performans için filtre zorunlu).",
            "Listede her satırda giriş/çıkış miktarını ve o an oluşan yürüyen stok bakiyesini görün.",
            "Çıkış satırlarında FIFO maliyet tutarını inceleyin.",
            "Referanslı satırlarda 'Evrak Önizle' ile kaynağı (fatura/irsaliye) modalda açın.",
            "Excel veya Yazdır ile raporu dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Ürün, işlem tipi ve tarih aralığıyla süzer",
              "sonuc": "Seçili ürünün hareketleri listelenir",
              "renk": "primary"
            },
            {
              "ad": "Evrak Önizle",
              "islev": "Referanslı hareketin kaynak belgesini modalda açar",
              "sonuc": "İlgili fatura/irsaliye önizlenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Hareket listesini Excel indirir",
              "sonuc": "Dış analiz dosyası",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "A4 hareket dökümü çıktısı üretir",
              "sonuc": "Yazıcı/PDF çıktısı",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok (hareket)",
            "fatura",
            "irsaliye",
            "sayım",
            "maliyet"
          ],
          "ipuclari": [
            "Sayımda fark çıkan ürünü burada tarayarak hangi hareketin hatalı olduğunu bulun.",
            "Tedarikçi faturasıyla sistemdeki girişi karşılaştırıp mutabakat yapın.",
            "Beklenmedik miktar/tarih gördüğünüzde kaynak belgeyi önizleyip düzeltin."
          ]
        },
        {
          "id": "bakiyerapor",
          "baslik": "Stok Bakiyeleri",
          "yol": "/ekran/urunhizmet/rapor/bakiyerapor",
          "sub": "rapor",
          "amac": "Her stoğun toplam giriş, çıkış, bloke, fiziki ve kullanılabilir (satılabilir) miktar bakiyesini anlık gösterir.",
          "neden": "Anlık stok mevcudunu görmek, negatife düşmüş (hata işareti) ve sıfır bakiyeli (sipariş gerektiren) ürünleri tespit etmek için kullanılır.",
          "nasil": [
            "'Filtrele' ile ürün, (varsa) depo ve tarih aralığını seçin.",
            "KPI kartlarından pozitif/negatif/sıfır bakiye ve toplam bloke özetini okuyun.",
            "Tabloda kırmızı (negatif) ve gri (sıfır) satırları önceliklendirin.",
            "Fiziki Stok = Giriş − Çıkış; Kullanılabilir = Fiziki − Bloke değerlerini kontrol edin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Ürün/depo/tarih ile bakiyeyi süzer",
              "sonuc": "Kriterlere uyan stok bakiyeleri listelenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok (hareket)",
            "depo",
            "grup",
            "sayım",
            "envanter raporu"
          ],
          "ipuclari": [
            "Negatif bakiye genelde fişlenmemiş giriş veya hatalı çıkış işaretidir; acil inceleyin.",
            "Bloke miktar (rezerve) satılabilir stoktan düşülür; sipariş rezervasyonlarını dikkate alın.",
            "Depo kullanımı açıksa depo bazında bakiye alabilirsiniz."
          ]
        },
        {
          "id": "envanter",
          "baslik": "Envanter",
          "yol": "/ekran/urunhizmet/rapor/envanter",
          "sub": "rapor",
          "amac": "Fiziksel sayım için yazdırılabilir envanter listesi ve seçilen maliyet tipiyle (FIFO/LIFO/AVG/LAST) stok değerlemesi sunar.",
          "neden": "Depoda elle sayım yapmak, yıl sonu/vergi denetimi için envanter değeri hesaplamak ve sistem-gerçek farkını görmek için kullanılır.",
          "nasil": [
            "'Filtrele' ile ürün, depo, tarih ve maliyet tipini seçin.",
            "Sistem miktarı ve birim maliyet sütunlarını inceleyin (fiziki stoğu sıfırdan farklı ürünler listelenir).",
            "Listeyi yazdırıp depoda gerçek sayımı elle doldurun.",
            "Farkları 'Stok Sayım' ekranından fişleyip düzeltin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Ürün/depo/tarih/maliyet tipiyle envanteri süzer",
              "sonuc": "Envanter listesi ve değerleme çıkar",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok (hareket)",
            "depo",
            "sayım",
            "maliyet"
          ],
          "ipuclari": [
            "Vergi beyanında AVG, sigortada en güncel (LAST) maliyet tipini tercih edin.",
            "Yıl sonu denetimi öncesi bu raporu temel referans alın.",
            "Sayım öncesi yazdırıp saha çalışmasında kullanın."
          ]
        },
        {
          "id": "yeterlilik",
          "baslik": "Stok Yeterlilik",
          "yol": "/ekran/urunhizmet/rapor/yeterlilik",
          "sub": "rapor",
          "amac": "Belirlenen dönemdeki tüketim hızına göre mevcut stoğun kaç gün yeteceğini hesaplar; kritik/dikkat/yeterli seviyelere ayırır.",
          "neden": "Ne zaman sipariş vermeniz gerektiğini önceden görüp stoksuz kalmayı (satış kaybı) veya aşırı stoğu önlemek için kullanılır.",
          "nasil": [
            "'Filtrele' ile ürün, depo, gün aralığı, kritik/dikkat gün eşikleri ve maliyet tipini seçin.",
            "Dönem çıkışına göre hesaplanan yeterlilik günlerini inceleyin.",
            "Kritik seviyedeki ürünler için sipariş/tedarik planlayın.",
            "KPI kartlarından kritik/dikkat/yeterli/hareketsiz dağılımını okuyun."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Ürün/depo/gün aralığı/eşik/maliyet parametreleriyle süzer",
              "sonuc": "Yeterlilik gün analizi çıkar",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok (hareket)",
            "depo",
            "sipariş",
            "ABC analizi"
          ],
          "ipuclari": [
            "Kritik gün eşiğini tedarik sürenize göre ayarlayın (tedarik 10 günse kritik ≥10 olmalı).",
            "Hareketsiz ürünler ölü stok olabilir; ayrıca değerlendirin.",
            "ABC analizindeki A grubu ürünleri asla kritik seviyeye düşürmeyin."
          ]
        },
        {
          "id": "abc",
          "baslik": "Stok Öncelik Analizi",
          "yol": "/ekran/urunhizmet/rapor/abc",
          "sub": "rapor",
          "amac": "Pareto 80/20 prensibiyle ürünleri tüketim tutarına göre A/B/C gruplarına ayırır; cironun büyük kısmını sağlayan az sayıda ürünü öne çıkarır.",
          "neden": "Sınırlı zaman ve sermayeyi en değerli ürünlere odaklamak için. A grubu ürünlerde stok yönetimi ve tedarikçi ilişkisi kritiktir.",
          "nasil": [
            "'Filtrele' ile ürün, depo, dönem (gün aralığı) ve maliyet tipini seçin.",
            "Ürünler tüketim tutarına göre sıralanır; pay% ve kümülatif% sütunlarını inceleyin.",
            "A grubunu (ilk ~%80) belirleyip stoksuz bırakmamaya odaklanın.",
            "C grubunu minimumda tutup ölü ürünleri portföyden çıkarmayı değerlendirin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Ürün/depo/dönem/maliyet ile ABC analizini süzer",
              "sonuc": "A/B/C sınıflandırmalı liste çıkar",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok (hareket)",
            "maliyet",
            "yeterlilik",
            "yaşam döngüsü"
          ],
          "ipuclari": [
            "Bu raporu aylık inceleyin; ürün stratejinizin temelidir.",
            "A grubu için fiyat değişikliklerini günlük takip edin.",
            "Sınıflandırma çıkış (tüketim) tutarına göre yapılır; sadece hareketli ürünler girer."
          ]
        },
        {
          "id": "yasamdongusu",
          "baslik": "Stok Yaşam Döngüsü",
          "yol": "/ekran/urunhizmet/rapor/yasamdongusu",
          "sub": "rapor",
          "amac": "Son dönemi bir önceki dönemle karşılaştırarak ürünleri Büyüyen/Gerileyen/Yeni/Durağan olarak sınıflar; satış trendini gösterir.",
          "neden": "Hangi ürünün yükselişte, hangisinin düşüşte olduğunu görüp doğru zamanda stok artırma, kampanya veya portföyden çıkarma kararı almak için.",
          "nasil": [
            "'Filtrele' ile ürün, depo, gün aralığı ve değişim eşik yüzdesini seçin.",
            "Önceki ve son dönem tüketimini ve değişim yüzdesini inceleyin.",
            "Büyüyen ürünlerde stok/tedarik hazırlığı yapın.",
            "Gerileyen ürünlerde sebep analiz edip kampanya/fiyat aksiyonu alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Ürün/depo/gün aralığı/eşik ile trend analizini süzer",
              "sonuc": "Büyüyen/gerileyen/yeni/durağan sınıflı liste çıkar",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok (hareket)",
            "ABC analizi",
            "yeterlilik"
          ],
          "ipuclari": [
            "Eşik yüzdesi trend hassasiyetini belirler; küçük eşik daha fazla ürünü 'büyüyen/gerileyen' işaretler.",
            "'Yeni' ürünleri takibe alın; tek seferlik mi kalıcı trend mi anlayın.",
            "Gerilemede mevsim/fiyat/rakip faktörünü ayırt edin."
          ]
        },
        {
          "id": "serino",
          "baslik": "Seri No Takibi",
          "yol": "/ekran/urunhizmet/rapor/serino",
          "sub": "rapor",
          "amac": "Seri numaralı ürünlerin (giriş-çıkış-servis) yaşam öyküsünü izler; hangi seri no hangi belgeyle girdi, kime satıldı, serviste mi gösterir.",
          "neden": "Garanti, iade ve servis takibinin temeli. Bir cihazın nereden alındığı, kime satıldığı ve mevcut durumu (stokta/çıkış/serviste) tek ekranda görülür.",
          "nasil": [
            "'Filtrele' ile seri no, ürün, durum, giriş/çıkış tarihi, cari ve evrak tipini seçin.",
            "Durum rozetlerinden (Stokta/Çıkış/Serviste) seri numaralarının mevcut halini görün.",
            "Giriş ve çıkış belge/cari bilgisiyle izlenebilirlik sağlayın.",
            "Belirli bir seri numarasını arayarak tüm geçmişini takip edin.",
            "Ürün ve Hizmet > Ayarlar'daki 'Satışta Elle (Girişsiz) Seri Girişi' ayarı açıksa, satış ekranındaki seri seçim penceresinde stokta olmayan bir seri no yazıp Enter'a basınca o seri elle eklenir ve satılmış olarak bu ekranda görünür."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Seri no/ürün/durum/tarih/cari/evrak tipiyle süzer",
              "sonuc": "Kriterlere uyan seri no kayıtları listelenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok (kart)",
            "fatura",
            "irsaliye",
            "servis",
            "sayım",
            "cari"
          ],
          "ipuclari": [
            "Bu ekran yalnızca 'seri no kullan' ayarı açıkken menüde görünür; ayrıca ürünün kartında seri no takibi açık olmalıdır.",
            "Serviste görünen seri numaraları servis modülüyle senkrondur.",
            "Sayım sırasında girilen yeni seri numaraları da bu izleme kaydına (SAYIM-<id> referansıyla) düşer.",
            "Elle (girişsiz) eklenen seriler stok girişi olmadan doğrudan 'Çıkış/Satılmış' olarak kaydedilir; hangi tarihte, hangi cariye ve hangi belgeyle (satış faturası/giden irsaliye) satıldığı bu ekranda izlenir. Bu davranış 'Satışta Elle (Girişsiz) Seri Girişi' ayarına bağlıdır (varsayılan kapalı)."
          ]
        },
        {
          "id": "fiyatliste",
          "baslik": "Fiyat Listeleri",
          "yol": "/ekran/urunhizmet/tanim/fiyatliste",
          "sub": "tanim",
          "amac": "Müşteri veya cari gruplarına özel fiyat listeleri oluşturur; her listeye ürün+özel fiyat (KDV dahil/hariç) ve hedef cari/grup atar.",
          "neden": "Farklı müşteri segmentlerine (bayi, perakende, kurumsal) farklı fiyat uygulamak için. Fatura/teklif kesilirken müşteriye atanmış liste fiyatı otomatik gelir.",
          "nasil": [
            "Sol panelden yeni liste adı yazıp 'Ekle' ile fiyat listesi oluşturun.",
            "Bir listeyi 'Seç' ile açın; sağ panelde iki sekme gelir.",
            "'Atananlar' sekmesinde listeye cari veya cari grup atayın.",
            "'Ürün Fiyatları' sekmesinde ürün arayıp özel liste fiyatını ve KDV dahil/hariç seçimini girin; alan dışına çıkınca otomatik kaydedilir.",
            "Gereksiz ürünü/atamayı çöp ikonuyla kaldırın, listeyi silmek için liste satırındaki sil butonunu kullanın."
          ],
          "butonlar": [
            {
              "ad": "Ekle (Liste)",
              "islev": "Yeni fiyat listesi oluşturur",
              "sonuc": "stok_fiyat_liste kaydı açılır",
              "renk": "primary"
            },
            {
              "ad": "Seç",
              "islev": "Listeyi sağ panelde detaylandırır",
              "sonuc": "Atananlar ve ürün fiyatları yüklenir",
              "renk": "ghost"
            },
            {
              "ad": "Ekle (Ürün)",
              "islev": "Listeye ürün+özel fiyat ekler",
              "sonuc": "Ürün liste fiyatı kaydedilir",
              "renk": "primary"
            },
            {
              "ad": "Ekle (Cari/Grup)",
              "islev": "Listeye hedef cari veya grup atar",
              "sonuc": "Atama kaydı oluşur",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Liste, ürün satırı veya atamayı kaldırır",
              "sonuc": "İlgili kayıt silinir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "fiyatlisteekle",
              "tetik": "Liste Ekle butonu",
              "etki": "stok_fiyat_liste kaydı ekler/günceller",
              "neden_sonuc": "Segment bazlı fiyatlamanın kabını oluşturur. Ad boşsa kayıt engellenir."
            },
            {
              "ad": "fiyatlistesil",
              "tetik": "Liste sil butonu",
              "etki": "stok_fiyat_liste DURUM=-1; ilgili detay ve hedef kayıtları silinir",
              "neden_sonuc": "Kullanılmayan listeyi tümüyle kaldırır; içindeki ürün ve atamalar da temizlenir."
            },
            {
              "ad": "fiyatlistedetayekle",
              "tetik": "Ürün Ekle / satır içi fiyat düzenleme",
              "etki": "stok_fiyat_liste_detay'a ürün, özel fiyat, KDV oranı (stok kartından) ve KDV dahil/hariç bilgisini ekler/günceller",
              "neden_sonuc": "Ürünün o listedeki özel fiyatını belirler; faturada bu fiyat kullanılır. Yanlış girilirse ilgili müşterilere hatalı fiyat çıkar."
            },
            {
              "ad": "fiyatlistedetaysil",
              "tetik": "Ürün satırı çöp ikonu",
              "etki": "stok_fiyat_liste_detay'dan ürünü siler",
              "neden_sonuc": "Üründe artık standart fiyat geçerli olur."
            },
            {
              "ad": "fiyatlistehedefekle",
              "tetik": "Cari/Grup Ekle butonu",
              "etki": "stok_fiyat_liste_hedef'e cari veya grup ataması ekler",
              "neden_sonuc": "Listeyi hangi müşterilerin göreceğini belirler; atanmış müşteriye otomatik liste fiyatı uygulanır."
            },
            {
              "ad": "fiyatlistehedefsil",
              "tetik": "Atama çöp ikonu",
              "etki": "stok_fiyat_liste_hedef'ten atamayı siler",
              "neden_sonuc": "İlgili müşteri/grup artık standart fiyatı görür."
            },
            {
              "ad": "fiyatlisteyukle",
              "tetik": "Liste 'Seç'",
              "etki": "Listenin ürün ve hedef kayıtlarını okuyup panele getirir",
              "neden_sonuc": "Seçili listenin tüm içeriğini ekranda gösterir."
            }
          ],
          "iliskiler": [
            "cari",
            "cari grup",
            "stok (kart)",
            "fatura",
            "teklif"
          ],
          "ipuclari": [
            "KDV oranı ürün kartından gelir; listede sadece fiyatın KDV dahil mi hariç mi olduğunu seçersiniz.",
            "Ürün fiyatı alanından çıkınca (blur) otomatik kaydolur; ayrıca kaydet butonu gerekmez.",
            "Bir cari birden fazla listeye atanmamalı; çakışma fiyat belirsizliği yaratır."
          ]
        },
        {
          "id": "birim",
          "baslik": "Stok Birimleri",
          "yol": "/ekran/urunhizmet/tanim/birim",
          "sub": "tanim",
          "amac": "Ürünlerin ölçü birimlerini (Adet, Kg, Lt, Metre, Paket vb.) kısa ad ve evrensel kod ile tanımlar.",
          "neden": "Her stok kartı bir birime bağlıdır; e-fatura/e-irsaliyede evrensel birim kodu (UN/ECE) zorunludur. Doğru birim, miktar ve entegrasyon tutarlılığını sağlar.",
          "nasil": [
            "Üstteki formdan Birim Adı, Kısa Ad, Evrensel Kod ve Durumu girin.",
            "KAYDET ile birimi ekleyin; alttaki listede görünür.",
            "Var olan birimi düzenlemek için İŞLEMLER > Düzenle; kaldırmak için Sil kullanın.",
            "Pasif yaptığınız birim yeni kartlarda seçilemez ama geçmiş kayıtlarda kalır."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Birimi ekler veya günceller",
              "sonuc": "stok_birim kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "Giriş iptal edilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili birimi forma yükler",
              "sonuc": "Birim güncellenebilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Birimi onayla siler",
              "sonuc": "Birim pasifleşir (soft-delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "birimekle",
              "tetik": "Formda KAYDET",
              "etki": "stok_birim ekler/günceller (AD, KISA_AD, UNI_CODE, DURUM)",
              "neden_sonuc": "Ürünlerin miktar birimini tanımlar; evrensel kod eksik/yanlışsa e-belge entegrasyonu reddedilebilir."
            },
            {
              "ad": "birimsil",
              "tetik": "Listede Sil",
              "etki": "stok_birim DURUM=-1, silen kullanıcı damgalanır",
              "neden_sonuc": "Kullanılmayan birimi kaldırır; kullanımdaki birimi silmek yeni seçimleri engeller ama geçmiş belgeleri bozmaz."
            }
          ],
          "iliskiler": [
            "stok (kart)",
            "fatura",
            "irsaliye",
            "e-belge entegratörleri"
          ],
          "ipuclari": [
            "Evrensel kodu resmi UN/ECE listesine uygun girin (ör. C62=Adet, KGM=Kilogram).",
            "Kullanımdaki bir birimi silmek yerine pasife almak daha güvenlidir."
          ]
        },
        {
          "id": "grup",
          "baslik": "Gruplar",
          "yol": "/ekran/urunhizmet/tanim/grup",
          "sub": "tanim",
          "amac": "Ürün/hizmetleri hiyerarşik (ağaç yapılı, alt gruplu) kategorilere ayırır.",
          "neden": "Raporlama ve filtrelemede ürünleri kategori bazında incelemek, fiyat listesi/analiz gruplaması yapmak için. Alt grup desteğiyle çok seviyeli sınıflama mümkündür.",
          "nasil": [
            "Formda üst grup seçin (yoksa 'Ana Grup'), grup adını ve durumu girin, KAYDET deyin.",
            "Bir grubun altına alt grup eklemek için satır İŞLEMLER > Alt Grup kullanın.",
            "Ağaç görünümünde grupların alt grup sayısını ve hiyerarşisini izleyin.",
            "Düzenle ile grup adını/üst grubunu değiştirin, Sil ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Grubu ekler veya günceller",
              "sonuc": "stok_grup kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "İşlem iptal",
              "renk": "ghost"
            },
            {
              "ad": "Alt Grup",
              "islev": "Seçili grubun altına yeni grup ekleme moduna geçer",
              "sonuc": "Üst grup önseçili form açılır",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Grubu forma yükler",
              "sonuc": "Grup güncellenebilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Grubu onayla siler",
              "sonuc": "Grup pasifleşir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "grupekle",
              "tetik": "Formda KAYDET",
              "etki": "stok_grup ekler/günceller; üst grup geçerliliğini kontrol eder",
              "neden_sonuc": "Ürün kategorisini oluşturur; seçilen üst grup geçersizse kayıt engellenir (kırık ağaç önlenir)."
            },
            {
              "ad": "grupsil",
              "tetik": "Listede Sil",
              "etki": "stok_grup DURUM=-1, silen kullanıcı/zaman damgalanır",
              "neden_sonuc": "Kullanılmayan kategoriyi kaldırır; grup filtreleri sadeleşir."
            }
          ],
          "iliskiler": [
            "stok (kart)",
            "kart listesi filtresi",
            "bakiye/analiz raporları"
          ],
          "ipuclari": [
            "Kart listesinde grup filtresi, seçilen grubun tüm alt gruplarını da (recursive) kapsar.",
            "Silmeden önce gruba bağlı ürünleri başka gruba taşımayı düşünün.",
            "Çok derin ağaç yerine 2-3 seviye tutmak yönetimi kolaylaştırır."
          ]
        },
        {
          "id": "abonelikislemyer",
          "baslik": "Abonelik İşlem Yeri",
          "yol": "/ekran/urunhizmet/tanim/abonelikislemyer",
          "sub": "tanim",
          "amac": "Aboneliklerin fiilen yönetildiği panel/sistemleri (hosting paneli, domain sağlayıcı, lisans portalı vb.) ad, URL ve açıklama ile tanımlar.",
          "neden": "Bir abonelik yenilendiğinde işlemin hangi dış panelde yapılacağını belirtmek ve 'işlem yapılmalı/yapıldı' takibini bu panel üzerinden yürütmek için.",
          "nasil": [
            "Formda İşlem Yeri Adı, (opsiyonel) Panel URL ve açıklama girin, durumu seçin.",
            "KAYDET ile ekleyin; listede panel bağlantısıyla görünür.",
            "Abonelik tanımında bu işlem yerini seçerek aboneliği ilgili panele bağlayın.",
            "Düzenle/Sil ile tanımları yönetin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "İşlem yerini ekler/günceller",
              "sonuc": "stok_abonelik_islemyeri kaydı oluşur",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "İşlem iptal",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "İşlem yerini forma yükler",
              "sonuc": "Kayıt güncellenebilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "İşlem yerini onayla siler",
              "sonuc": "Kayıt pasifleşir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "islemyeriekle",
              "tetik": "Formda KAYDET",
              "etki": "stok_abonelik_islemyeri ekler/günceller (AD, URL, ACIKLAMA, DURUM)",
              "neden_sonuc": "Aboneliği hangi panelde yöneteceğinizi tanımlar; panel URL'i tıklanabilir kısayol olur."
            },
            {
              "ad": "islemyerisil",
              "tetik": "Listede Sil",
              "etki": "stok_abonelik_islemyeri DURUM=-1",
              "neden_sonuc": "Kullanılmayan panel tanımını kaldırır."
            }
          ],
          "iliskiler": [
            "abonelik",
            "cari"
          ],
          "ipuclari": [
            "Panel URL'i tam adres (https://...) girerseniz abonelik ekranından tek tıkla açılır.",
            "İşlem yeri atanmış aboneliklerde 'İşlem Yapılmalı/Yapıldı' rozetleri devreye girer.",
            "Menüdeki başlık kodda 'Aboelik İşlem Yer' olarak yazılmış (yazım hatası); işlev aynıdır."
          ]
        },
        {
          "id": "depo",
          "baslik": "Depolar",
          "yol": "/ekran/urunhizmet/tanim/depo",
          "sub": "tanim",
          "amac": "Fiziksel depo/lokasyonları kod, ad ve adres ile tanımlar (yalnızca depo kullanımı ayarı açıkken menüde görünür).",
          "neden": "Birden fazla depo/şube ile çalışan işletmelerde stoğun hangi lokasyonda olduğunu ayrıştırmak, depo bazlı bakiye ve sayım almak için.",
          "nasil": [
            "Formdan depo Kodu, Adı, Adresi ve Durumunu girin.",
            "KAYDET ile depoyu ekleyin.",
            "Fiş, sayım ve raporlarda bu depoyu seçerek stoğu lokasyon bazında yönetin.",
            "Düzenle/Sil ile depo tanımlarını güncelleyin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Depoyu ekler/günceller",
              "sonuc": "depo_kart kaydı oluşur",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "İşlem iptal",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Depoyu forma yükler",
              "sonuc": "Depo güncellenebilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Depoyu onayla siler",
              "sonuc": "Depo pasifleşir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "depoekle",
              "tetik": "Formda KAYDET",
              "etki": "depo_kart ekler/günceller (KOD, AD, ADRES, DURUM)",
              "neden_sonuc": "Stok lokasyonu tanımlar; fiş ve sayımlarda seçilerek depo bazlı bakiye sağlanır."
            },
            {
              "ad": "deposil",
              "tetik": "Listede Sil",
              "etki": "depo_kart DURUM=-1, silen kullanıcı/zaman damgalanır",
              "neden_sonuc": "Kullanılmayan depoyu kaldırır; hareketi olan depoyu silmek geçmiş kayıtları bozmaz ama yeni seçimi engeller."
            }
          ],
          "iliskiler": [
            "stok (hareket)",
            "işlem fişi",
            "sayım",
            "bakiye/envanter raporları"
          ],
          "ipuclari": [
            "Depo tanımı yalnızca 'depo kullan' ayarı açıksa görünür ve etkindir.",
            "Depolar arası transferi işlem fişi ile yaparak her deponun bakiyesini doğru tutun."
          ]
        },
        {
          "id": "transfer",
          "baslik": "Depolar Arası Transfer",
          "yol": "/ekran/urunhizmet/islem/transfer",
          "sub": "islem",
          "amac": "Bir depodan başka bir depoya stok taşır. Her kalem için kaynak depodan çıkış + hedef depoya giriş hareketi (tek fiş, EVRAK_TIP 513) oluşur. Seri takipli üründe taşınacak seri numaraları seçilir. Yalnızca depo kullanımı ayarı (stok.depokullan) açıkken menüde görünür.",
          "neden": "Çok depolu/şubeli işletmede malı fiziki taşırken stok bakiyesini depo bazında doğru tutmak için. İç transfer olduğundan cari/finansal hareket oluşmaz; maliyet kaynak deposunun ortalama (AVG) maliyetiyle taşınır, transfer kâr/zarar doğurmaz. Aynı servis (DepoTransfer) saha satış araç yüklemesini de besler.",
          "nasil": [
            "Kaynak depo ve hedef depoyu seçin (aynı olamaz).",
            "Ürün arayıp ekleyin; seri takipsiz üründe miktarı girin.",
            "Seri takipli üründe Seri Seç ile kaynak depoda stokta olan seri numaralarından taşınacakları işaretleyin; miktar seçilen seri adedi kadar olur.",
            "TRANSFER ET ile kaydedin. Kaynak depoda yeterli kullanılabilir stok yoksa/uygun seri yoksa işlem reddedilir.",
            "Sonuç Stok Bakiyeleri raporunda Depo Kırılımı ile, seriler Seri No Takibi raporunda güncel depolarıyla görülür."
          ],
          "butonlar": [
            {
              "ad": "Transfer Et",
              "islev": "Seçili kalemleri kaynak depodan hedefe taşır",
              "sonuc": "Tek stok fişi + kalem başına çıkış/giriş hareketi oluşur",
              "renk": "primary"
            },
            {
              "ad": "Seri Seç",
              "islev": "Seri takipli kalemde kaynak depodaki serileri listeleyip seçtirir",
              "sonuc": "Seçilen seriler kaleme atanır, miktar güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Kalemi sepetten çıkarır",
              "sonuc": "Satır kaldırılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "transferkaydet",
              "tetik": "TRANSFER ET",
              "etki": "DepoTransfer servisi: stok_fis(513) + 2N stok_hareket (çıkış/giriş), kaynak-depo AVG maliyet damgası, seri takipli kalemde stok_seri_no.DEPO_ID hedefe taşınır + stok_seri_hareket audit",
              "neden_sonuc": "Depo bakiyesi güncellenir; iç transfer olduğu için cari/kasa etkilenmez"
            },
            {
              "ad": "transferserisorgula",
              "tetik": "Seri Seç",
              "etki": "Seçili stoğun kaynak depoda stokta (DURUM=1) olan seri numaralarını döner",
              "neden_sonuc": "Kullanıcı yalnız gerçekten o depoda bulunan serileri seçebilir"
            }
          ],
          "iliskiler": [
            "depo (tanım)",
            "bakiyerapor (depo kırılımı)",
            "serino (güncel depo)",
            "saha-satis araç yükleme (aynı DepoTransfer servisi)"
          ],
          "ipuclari": [
            "Seri takipli ürün paket içindeyse transfer edilemez; bileşenleri tek tek taşıyın.",
            "Transfer fişini silmek serileri otomatik kaynak depoya geri alır.",
            "Anlık transferdir (yolda stok kavramı yoktur)."
          ]
        },
        {
          "id": "nitelik",
          "baslik": "Varyant Tanımları",
          "yol": "/ekran/urunhizmet/tanim/nitelik",
          "sub": "tanim",
          "amac": "Varyant üretiminde kullanılacak nitelikleri (Renk, Beden, Numara gibi) ve her niteliğin değerlerini (Kırmızı, S/M/L, 42 vb.) kısa koduyla tanımlar (varyant yönetimi ayarı açıkken menüde görünür).",
          "neden": "Tek üründen renk/beden gibi çok sayıda çeşidi (varyant) otomatik üretebilmek için önce nitelik ve değer havuzunu kurmak gerekir. Bu tanımlar kart varyant matrisini besler.",
          "nasil": [
            "Formda Nitelik Adı (ör. Renk) ve durumu girin.",
            "'Değer Ekle' ile satır ekleyip her değeri (ör. Kırmızı) ve kısa kodunu (ör. KRM) yazın.",
            "KAYDET ile niteliği ve değerlerini kaydedin.",
            "Ürün kartında Varyantlar sekmesinde bu nitelik/değerleri seçip matris oluşturup varyant üretin.",
            "Listeden nitelik adına tıklayıp değerlerini görün; Düzenle/Sil ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Niteliği ve tüm değerlerini kaydeder",
              "sonuc": "stok_nitelik ve stok_nitelik_deger güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Değer Ekle",
              "islev": "Yeni değer satırı ekler",
              "sonuc": "Değer/kısa kod girme alanı açılır",
              "renk": "accent"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "İşlem iptal",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Niteliği değerleriyle forma yükler",
              "sonuc": "Nitelik güncellenebilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Niteliği ve değerlerini onayla siler",
              "sonuc": "Nitelik ve değerleri pasifleşir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "nitelikkaydet",
              "tetik": "Formda KAYDET",
              "etki": "stok_nitelik ekler/günceller; mevcut değerleri pasifleyip formdaki dolu değerleri yeniden yazar (idempotent)",
              "neden_sonuc": "Varyant üretim havuzunu kurar. Boş değerler atlanır; tekrar kaydetmek çift kayıt oluşturmaz."
            },
            {
              "ad": "niteliksil",
              "tetik": "Listede Sil",
              "etki": "stok_nitelik DURUM=-1 ve bağlı stok_nitelik_deger kayıtları pasiflenir",
              "neden_sonuc": "Kullanılmayan nitelik havuzunu kaldırır; mevcut varyantlar geçmişte kalır ama yeni üretimde seçilemez."
            }
          ],
          "iliskiler": [
            "stok (kart) varyant matrisi",
            "varyant üretimi (varyanturet)"
          ],
          "ipuclari": [
            "Varyant tanımları yalnızca 'varyant yönetimi' ayarı açıksa görünür.",
            "Kısa kodlar varyant KOD önerisinde kullanılır (ör. ana kod + KRM + M).",
            "Nitelik değerlerini tutarlı ve az sayıda tutun; çok kombinasyon çok varyant üretir."
          ]
        },
        {
          "id": "cokobirim",
          "baslik": "Çoklu Birim (Alt Birim) Tanımı",
          "yol": "/ekran/urunhizmet/tanim/kart (Birimler sekmesi)",
          "sub": "tanim",
          "amac": "Bir ürünü ana biriminin yanında koli, paket, kutu, düzine gibi alt birimlerle de alıp satabilmek için, alt birimi ve bu birimin kaç ana birime karşılık geldiğini (çarpanı) tanımlar. İsteğe bağlı olarak alt birime kendi barkodu bağlanır ve satış/alış için varsayılan birim seçilir.",
          "neden": "Toptancı koli alır adet satar; gıdacı paket alır kilo satar. Alt birim tanımı olmadan her satırda elle çarpma yapmak yanlış miktar ve yanlış stok bakiyesi demektir. NetEsnaf stoğu her zaman ana birimde saklar, ekranda ise sizin çalıştığınız birimde gösterir; böylece bakiye, maliyet ve raporlar tek düzlemde kalır. Özellik Ayarlar > Stok altındaki Çoklu Birim Kullan seçeneğine bağlıdır ve varsayılan olarak kapalıdır.",
          "nasil": [
            "Ayarlar > Stok bölümünden Çoklu Birim Kullan seçeneğini EVET yapın (varsayılanı HAYIR'dır).",
            "Ürün kartını açıp kaydedin; Birimler sekmesi yalnızca kayıtlı ürün kartında görünür.",
            "Birimler sekmesinde Birim, Çarpan (1 KOLİ = 12 ADET ise 12) ve varsa Barkod alanlarını doldurun. Çarpan kesirli olabilir (1 GRAM = 0,001 KG).",
            "Satışta ve alışta hangi birimin varsayılan geleceğini işaretleyin (her biri için yalnız bir birim).",
            "Kaydedin. Artık fatura, irsaliye, sipariş, teklif ve üretim reçetesi satırlarında bu alt birim seçilebilir; fiyat çarpan kadar otomatik önerilir.",
            "Alt birime barkod tanımladıysanız o barkodu okuttuğunuzda satır doğrudan o birimle açılır."
          ],
          "butonlar": [
            {
              "ad": "Satır Ekle",
              "islev": "Birimler tablosuna yeni alt birim satırı ekler",
              "sonuc": "Birim, çarpan, barkod ve varsayılan alanları doldurulmaya hazır olur",
              "renk": "primary"
            },
            {
              "ad": "Kaydet",
              "islev": "Alt birim tanımlarını kaydeder; ana birim alt birim olarak seçilemez, çarpan sıfır olamaz, aynı barkod başka ürüne veya başka birime verilemez",
              "sonuc": "Belge ekranlarındaki birim listesi güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Sil",
              "islev": "Alt birim satırını kaldırır",
              "sonuc": "Birim yeni belgelerde seçilemez; geçmiş belgeleriniz olduğu gibi kalır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "birimkaydet",
              "tetik": "Birimler sekmesinde Kaydet",
              "etki": "Alt birim tanımlarını doğrulayıp kaydeder (ana birim, çarpan, barkod tekilliği ve tek varsayılan kontrolleri)"
            }
          ],
          "iliskiler": [
            "fatura",
            "irsaliye",
            "siparis",
            "teklif",
            "uretim",
            "sevkiyat"
          ],
          "ipuclari": [
            "Alt birim için ayrı fiyat tutulmaz; fiyat çarpan x ana birim fiyatı olarak önerilir, satırda değiştirebilirsiniz.",
            "Hızlı Satış (kasa) ve saha satış ekranlarında satırda birim seçimi yoktur; koli barkodu okutulduğunda içindeki adet kadar ürün sepete eklenir.",
            "Sevkiyat ve mal kabul ana birimde çalışır; miktar 20 KOLİ (240 ADET) biçiminde gösterilir.",
            "Seri numarası takipli üründe seri adedi ana birim üzerinden istenir: 2 koli (x12) satışında 24 seri girilir."
          ]
        },
        {
          "id": "paket",
          "baslik": "Paket / Set Ürün",
          "yol": "/ekran/urunhizmet/tanim/kart (Paket Ürün mü? = Evet)",
          "sub": "tanim",
          "amac": "Birden çok üründen oluşan (hediye kutusu, kampanya seti, montaj takımı) satılabilir bir kartı 'paket ürün' olarak tanımlar. Ürün kartında 'Paket Ürün mü?' Evet yapılır ve 'Bileşen Ekle' ile paketin içindeki ürünler + miktarları girilir. Paket satıldığında bileşenler otomatik kendi stoklarından düşer; paketin kendi fiziki stoğu tutulmaz, satılabilir adet en kısıtlı bileşenden hesaplanır.",
          "neden": "Set/paket satan işletmede her satışta bileşenleri tek tek elle düşmek zaman kaybı ve hata kaynağıdır. Paket tanımıyla stok bileşenler üzerinden doğru döner, envanter şişmez, sayımda paket gizlenir ve yalnız bileşenler sayılır. Bileşen normal ürün veya varyant olabilir; paket ürün başka bir pakette bileşen olamaz (iç içe paket yok).",
          "nasil": [
            "Ürün kartını açın; 'Paket Ürün mü?' alanını Evet yapın (Paket Bileşenleri bölümü açılır).",
            "'Bileşen Ekle' ile her bileşen ürünü arayıp seçin ve miktarını girin.",
            "KAYDET deyin; paket artık fatura/satış satırında seçilebilir olur.",
            "Paketi bir belgede satınca bileşenler otomatik stoktan düşer; paketin adedini ayrıca girmezsiniz."
          ],
          "butonlar": [
            {
              "ad": "Paket Ürün mü? (Evet)",
              "islev": "Kartı paket moduna alır ve Paket Bileşenleri bölümünü açar",
              "sonuc": "Bileşen tablosu görünür; kart kendi fiziki stoğunu tutmaz",
              "renk": "primary"
            },
            {
              "ad": "Bileşen Ekle",
              "islev": "Pakete yeni bileşen satırı ekler",
              "sonuc": "Ürün arama ve miktar alanı açılır",
              "renk": "accent"
            },
            {
              "ad": "Kaydet",
              "islev": "Paketi ve bileşenlerini kaydeder",
              "sonuc": "Paket belgelerde seçilebilir; satışta bileşenler stoktan düşer",
              "renk": "primary"
            },
            {
              "ad": "Sil",
              "islev": "Bileşen satırını paketten çıkarır",
              "sonuc": "O ürün paketin içeriğinde sayılmaz",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "kartekle",
              "tetik": "Paket kartında KAYDET",
              "etki": "stok_kart PAKET_MI=1 yapar; paket bileşenlerini (BILESEN_STOK_ID + MIKTAR) StokPaket üzerinden yazar; bileşen olarak paket seçilmesini ve iç içe paketi engeller",
              "neden_sonuc": "Paketi satılabilir bir SKU'ya bağlar. Satışta bileşenler kendi stoklarından düşer; paketin fiziki stoğu tutulmadığından satılabilir adet bileşenlerden hesaplanır."
            }
          ],
          "iliskiler": [
            "fatura",
            "irsaliye",
            "stok (hareket)",
            "sayım",
            "bakiye raporu",
            "varyant"
          ],
          "ipuclari": [
            "Bileşen normal ürün veya varyant olabilir; paket ürün bileşen olamaz (iç içe paket yok).",
            "Paketin satılabilir adedi en kısıtlı bileşene göre hesaplanır; paket kartına ayrıca fiziki stok girmezsiniz.",
            "Sayımda paket kartı gizlenir; bileşenler sayılır, paket adedi bunlardan türetilir."
          ]
        }
      ]
    },
    {
      "slug": "kasa-banka",
      "title": "Kasa, Banka & Masraf",
      "icon": "💰",
      "modul": "kasa",
      "ad": "Kasa & Banka",
      "ozet": "Kasa & Banka modülü; işletmenin nakit kasalarını, banka hesaplarını, POS ve kredi kartlarını, aracı ödeme kuruluşlarını (PayTR/iyzico vb.) ve masraf kalemlerini tanımlayıp bu hesaplar üzerindeki para hareketlerini (virman, tahakkuk, masraf fişi, aracı ödeme onayı, banka hareketi aktarımı) yönetir. Hareketler kasa_fis/kasa_hareket tablolarında tutulur, masraflar masraf_fis'te izlenir; ödeme yapıldığında otomatik cari hareket ve kasa fişi üretilerek cari bakiyeler ve nakit mevcudu güncellenir. Bakiye durumu, hareket dökümü, gün sonu, nakit akış tahmini, masraf kontrol paneli ve işletme durum raporu ile mali kontrol sağlar. Masraf fişi kesildiğinde (MASRAF_FISI_KESILDI) ve virman yapıldığında (VIRMAN_YAPILDI) otomasyon tetikleyicileri devreye girer. Kasa/Banka bakiyeleri çok para birimli görüntülenebilir: Bakiye Durumu ekranındaki 'Görünüm: Genel / Döviz Bazlı' seçimiyle her hesabın bakiyesi para birimine göre ayrı sütunlarda gösterilir (hesaba sabit para birimi bağlanmaz; her hareket kendi para biriminde gruplanır, cari mantığıyla aynı).",
      "modul_iliskiler": [
        "cari",
        "fatura",
        "irsaliye",
        "ceksenet",
        "stok",
        "proje",
        "servis",
        "sahasatis",
        "onlinebanka (Finekra)",
        "otomasyon"
      ],
      "ekranlar": [
        {
          "id": "kasa",
          "baslik": "Kasalar",
          "yol": "/ekran/kasa/tanim/kasa",
          "sub": "tanim",
          "amac": "Nakit kasalarınızı (ana kasa, şube kasası, personel kasası gibi) tanımladığınız ve listelediğiniz ekran. Kod, ad ve durum (Aktif/Pasif) bilgisiyle kasa kartı açarsınız.",
          "neden": "Her nakit hesabın sistemde ayrı bir kasa kartı olması, tahsilat/ödeme/virman işlemlerinin doğru hesaba yazılması ve güncel kasa bakiyesinin takibi için şarttır. Kasa tanımı olmadan tahsilat veya masraf ödemesi yapılamaz.",
          "nasil": [
            "Kod alanı otomatik dolu gelir, isterseniz değiştirebilirsiniz",
            "Kasa Ad alanına anlaşılır bir isim yazın (örn: Ana Kasa)",
            "Durumu Aktif seçili bırakın",
            "KAYDET'e basın; kasa alttaki listeye eklenir",
            "Var olan kasayı düzenlemek için İşlemler > Düzenle, kaldırmak için Sil kullanın"
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Formdaki kasa bilgilerini kaydeder/günceller",
              "sonuc": "kasa_kart tablosuna TIP=1 kayıt eklenir veya güncellenir, liste yenilenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler, düzenleme modundan çıkar",
              "sonuc": "Değişiklik yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili kasayı forma yükler",
              "sonuc": "Düzenleme moduna geçilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Seçili kasayı siler (onay ister)",
              "sonuc": "kasa_kart DURUM=-1 yapılır (soft delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "kasakartekle",
              "tetik": "Kaydet butonu",
              "etki": "kasa_kart tablosunda TIP=1 kaydı ekler/günceller; aynı KOD varsa uyarı verir",
              "neden_sonuc": "Kasayı kaydedince tahsilat ve ödemeleri bu kasaya işleyebilirsiniz. Aynı kodu ikinci kez kullanamazsınız; yanlış tanım yaparsanız bakiyeler karışır."
            },
            {
              "ad": "kasasil",
              "tetik": "Sil butonu",
              "etki": "kasa_kart DURUM=-1, SILINDI_ID/ZAMAN yazılır",
              "neden_sonuc": "Kullanılmayan kasayı listeden kaldırır. Hareketi olan bir kasayı silerseniz geçmiş raporlarda hesap adı boş görünebilir; pasife almak daha güvenlidir."
            }
          ],
          "iliskiler": [
            "kasa",
            "cari"
          ],
          "ipuclari": [
            "Bakiyesi olan kasayı silmek yerine Pasif yapın.",
            "Kod her hesapta benzersiz olmalıdır (kasa/banka/POS/kredi kartı ortak kod havuzu).",
            "Mail Order (kart ile tahsilat) kasadaki nakit bakiyesini etkilemez; tutar müşteri carisinden tahsil edilip seçilen POS/banka hesabına borç yazılır. Mail Order işlemini Müşteri & Tedarikçi modülündeki Mail Order ekranından yaparsınız."
          ]
        },
        {
          "id": "banka",
          "baslik": "Banka Kartı",
          "yol": "/ekran/kasa/tanim/banka",
          "sub": "tanim",
          "amac": "Banka hesaplarınızı (banka adı, şube, hesap no, IBAN) tanımladığınız ekran. Online Bankacılık (Finekra) lisansı varsa hesabı Finekra hesabıyla eşleştirerek otomatik hareket aktarımı için hazırlarsınız. Banka satırından POS ve Kredi Kartı tanımlarına da geçilir.",
          "neden": "Banka hesaplarının sistemde tanımlı olması havale/EFT tahsilat ve ödemelerinin doğru hesaba işlenmesi, banka mutabakatı ve otomatik banka hareketi aktarımı için gereklidir.",
          "nasil": [
            "Kod otomatik gelir; Hesap Ad, Banka Adı, Şube, Hesap No ve IBAN girin",
            "Online Bankacılık lisansınız ve Finekra bağlantınız varsa Finekra Hesap eşleştirmesini seçin",
            "Durumu Aktif bırakıp KAYDET'e basın",
            "Listede İşlemler menüsünden POS veya Kredi Kartı ekleyebilir, Düzenle/Sil yapabilirsiniz"
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Banka kartını kaydeder/günceller",
              "sonuc": "kasa_kart TIP=2 kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu sıfırlar",
              "sonuc": "Değişiklik yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Banka kartını forma yükler",
              "sonuc": "Düzenleme modu",
              "renk": "ghost"
            },
            {
              "ad": "POS",
              "islev": "Bu bankaya bağlı POS cihazı tanım ekranını açar",
              "sonuc": "tanim/pos ekranına gidilir",
              "renk": "ghost"
            },
            {
              "ad": "Kredi Kartı",
              "islev": "Bu bankaya bağlı kredi kartı tanım ekranını açar",
              "sonuc": "tanim/kredikarti ekranına gidilir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Banka kartını siler (onay ister)",
              "sonuc": "kasa_kart DURUM=-1",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "bankakartekle",
              "tetik": "Kaydet butonu",
              "etki": "kasa_kart TIP=2 ekler/günceller, FINEKRA_HESAP_ID ile eşleştirir, aynı KOD varsa uyarı",
              "neden_sonuc": "Banka hesabını kaydedince havale/EFT ve otomatik banka hareketleri bu hesaba işlenir. Finekra eşleştirmesi yaparsanız banka hareketleri doğru hesaba otomatik düşer; eşleştirmezseniz aktarımda hesap el ile seçilmelidir."
            },
            {
              "ad": "bankakartsil",
              "tetik": "Sil butonu",
              "etki": "kasa_kart DURUM=-1",
              "neden_sonuc": "Kullanılmayan hesabı kaldırır. Hareketi olan hesabı silmek yerine pasife almak geçmiş raporların bütünlüğünü korur."
            }
          ],
          "iliskiler": [
            "kasa",
            "cari",
            "onlinebanka (Finekra)"
          ],
          "ipuclari": [
            "IBAN'ı doğru girin; banka hareketi aktarımında IBAN eşleştirme yedek yöntemdir.",
            "Finekra eşleştirmesi Online Bankacılık lisansı gerektirir."
          ]
        },
        {
          "id": "araciodeme",
          "baslik": "Aracı Ödeme Kuruluşları",
          "yol": "/ekran/kasa/tanim/araciodeme",
          "sub": "tanim",
          "amac": "Sanal POS / ödeme aracıları (PayTR, iyzico, Sipay vb.) için kuruluş tanımladığınız ekran. Komisyon oranı, bekleme günü, komisyonun yazılacağı masraf kalemi, paranın aktarılacağı hedef banka hesabı ve kuruluşun cari kartını belirlersiniz.",
          "neden": "Kredi kartıyla alınan tahsilatların parası aracı kuruluşta bir süre bekler, komisyon kesilir ve sonra bankaya geçer. Bu tanım; bekleyen ödemelerin takibi, komisyonun otomatik masraflaşması ve net tutarın doğru banka hesabına düşmesi için gereklidir.",
          "nasil": [
            "Kod otomatik gelir; Kuruluş Adını yazın (örn: iyzico)",
            "Bağlı Cari seçin (kuruluşun cari kartı, zorunludur)",
            "Komisyon Oranı (%), komisyonun işleneceği Masraf Kalemi ve Bekleme Günü'nü girin",
            "Paranın aktarılacağı Hedef Banka Hesabını seçin",
            "Durumu Aktif bırakıp KAYDET'e basın"
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Aracı ödeme kuruluşunu kaydeder/günceller",
              "sonuc": "kasa_kart TIP=5 kaydı oluşur (KOMISYON_ORAN, BEKLEME_GUN, HEDEF_BANKA_ID, MASRAF_KART_ID, CARI_ID)",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu sıfırlar",
              "sonuc": "Değişiklik yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Kuruluşu forma yükler",
              "sonuc": "Düzenleme modu",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Kuruluşu siler (onay ister)",
              "sonuc": "kasa_kart DURUM=-1",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "araciodemeekle",
              "tetik": "Kaydet butonu",
              "etki": "kasa_kart TIP=5 ekler/günceller; bağlı cari zorunludur ve kontrol edilir, aynı KOD varsa uyarı",
              "neden_sonuc": "Kuruluşu tanımlayınca kredi kartı tahsilatları bu kuruluş üzerinden takip edilir; komisyon ve bekleme günü doğru girilirse net tutar ve masraf otomatik hesaplanır. Bağlı cari seçilmezse kayıt yapılmaz; yanlış hedef banka seçilirse para onaylandığında yanlış hesaba düşer."
            },
            {
              "ad": "araciodemesil",
              "tetik": "Sil butonu",
              "etki": "kasa_kart DURUM=-1 (TIP=5)",
              "neden_sonuc": "Kullanılmayan kuruluşu kaldırır. Bekleyen ödemesi varsa önce onları sonuçlandırın."
            }
          ],
          "iliskiler": [
            "kasa",
            "cari",
            "masraf"
          ],
          "ipuclari": [
            "Komisyon oranını doğru girin; onay anında brütten düşülüp net tutar bankaya yazılır.",
            "Bekleme günü, tahsilattan kaç gün sonra paranın bankaya geçtiğini belirtir.",
            "Bağlı cari seçimi zorunludur; kuruluşun alacağı bu cari üzerinden izlenir."
          ]
        },
        {
          "id": "masrafkart",
          "baslik": "Masraf Kalemleri",
          "yol": "/ekran/kasa/tanim/masrafkart",
          "sub": "tanim",
          "amac": "İşletme giderlerini gruplamak için masraf kalemleri (kira, elektrik, yakıt, yemek, ofis malzemesi vb.) tanımladığınız ekran. Kod, ad, birim ve açıklama girilir.",
          "neden": "Masraf fişleri bir masraf kalemine bağlanır. Kalemler olmadan masraf girilemez; doğru kalemlendirme masraf kontrol paneli, bütçe analizi ve vergi hazırlığı için gerekir.",
          "nasil": [
            "Kod otomatik gelir; Ad alanına kalem adını yazın (örn: Kira)",
            "Birim seçin ve isterseniz Açıklama ekleyin",
            "Durumu Aktif bırakıp KAYDET'e basın",
            "Listeden Düzenle/Sil yapabilirsiniz"
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Masraf kalemini kaydeder/günceller",
              "sonuc": "masraf_kart kaydı oluşur/güncellenir, aynı KOD varsa uyarı",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu sıfırlar",
              "sonuc": "Değişiklik yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Kalemi forma yükler",
              "sonuc": "Düzenleme modu",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Kalemi siler (onay ister)",
              "sonuc": "masraf_kart DURUM=-1",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "masrafkartekle",
              "tetik": "Kaydet butonu",
              "etki": "masraf_kart ekler/günceller; KOD tekrarını engeller",
              "neden_sonuc": "Kalemi tanımlayınca masraf fişlerini bu kaleme göre gruplayabilirsiniz. İyi kurgulanmış kalemler masraf analizini anlamlı kılar; her gideri tek kaleme yığarsanız rapor işe yaramaz."
            },
            {
              "ad": "masrafkartsil",
              "tetik": "Sil butonu",
              "etki": "masraf_kart DURUM=-1",
              "neden_sonuc": "Kullanılmayan kalemi kaldırır. Geçmiş masrafı olan kalemi pasife almak daha güvenlidir."
            }
          ],
          "iliskiler": [
            "masraf",
            "stok (birim)"
          ],
          "ipuclari": [
            "Kalemleri sade ve anlamlı tutun.",
            "Aracı ödeme komisyonları için ayrı bir masraf kalemi açmak takibi kolaylaştırır."
          ]
        },
        {
          "id": "masraffisliste",
          "baslik": "Masraflar",
          "yol": "/ekran/kasa/rapor/masraffisliste",
          "sub": "rapor",
          "amac": "Kira, fatura, yakıt, yemek gibi tüm işletme masraflarının listelendiği ekran. Ödeme durumu (Ödendi/Ödenmedi, vadesi geçti/yaklaştı) rozetleriyle görülür; buradan masraf girişine gidilir, ödenmemiş masraf 'Ödendi' işaretlenir, düzenlenir veya silinir.",
          "neden": "Masrafların tek yerden izlenmesi; vade takibi, gecikmiş ödemelerin görülmesi, KDV/net masraf analizi ve vergi beyannamesi hazırlığı için temel rapordur.",
          "nasil": [
            "Üstteki KPI kartlarından toplam masraf, KDV ve net masrafı görün",
            "Filtrele ile masraf kalemi, ödeme durumu, evrak no, tarih ve etiket bazlı arayın",
            "Yeni masraf için 'Masraf Girişi' butonuna gidin",
            "Ödenmemiş bir masrafı İşlemler > Ödendi ile ödeme modalından işaretleyin (tek veya çoklu kasa/banka satırıyla)",
            "Gerekirse Düzenle/Sil yapın, Excel'e aktarın"
          ],
          "butonlar": [
            {
              "ad": "Masraf Girişi",
              "islev": "Yeni masraf fişi giriş ekranını açar",
              "sonuc": "islem/masraffis ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar",
              "sonuc": "Seçili kriterlere göre liste süzülür",
              "renk": "ghost"
            },
            {
              "ad": "Ödendi",
              "islev": "Ödeme modalını açar, kasa/banka satırlarıyla ödemeyi kaydeder",
              "sonuc": "masraf_fis ODEME_DURUM=1 olur, kasa_fis/kasa_hareket ve cari hareket üretilir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Masraf fişini düzenleme ekranına götürür",
              "sonuc": "islem/masraffis düzenleme modu",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Masraf fişini siler (onay ister)",
              "sonuc": "masraf_fis DURUM=-1 ve bağlı kasa/cari hareketleri silinir",
              "renk": "danger"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Listeyi Excel olarak indirir",
              "sonuc": "Excel dosyası oluşur",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "masraffiskaydet",
              "tetik": "Masraf Girişi ekranındaki Kaydet",
              "etki": "masraf_fis kaydı oluşur; ödendi işaretliyse kasa_fis+kasa_hareket, cari seçiliyse cari_hareket (borç ve ödeme) üretilir; tekrar eden masraf seçiliyse dönemlere göre çok sayıda masraf_fis oluşur",
              "neden_sonuc": "Masrafı kaydedince gider kayıt altına alınır ve ödendiyse kasadan düşülür. Tutar 0/negatif olamaz; ödendi işaretlerken kasa/banka ve ödeme tarihi zorunludur. Tekrar eden masrafta tarih aralığı ve sıklık seçilmezse kayıt yapılmaz. Kayıt sonrası MASRAF_FISI_KESILDI otomasyonu tetiklenir."
            },
            {
              "ad": "masraffisodeme",
              "tetik": "Ödendi (ödeme modalında Onayla)",
              "etki": "masraf_fis ODEME_DURUM=1; her ödeme satırı için ayrı kasa_fis+kasa_hareket, cari seçiliyse tek toplam cari_hareket oluşur",
              "neden_sonuc": "Ödemeyi işaretleyince nakit/banka bakiyesi düşer ve masraf 'ödendi' olur. Satır toplamı masraf tutarına eşit değilse veya kasa/banka seçilmezse işlem reddedilir; böylece eksik/yanlış ödeme engellenir."
            },
            {
              "ad": "masraffissil",
              "tetik": "Sil butonu",
              "etki": "masraf_fis DURUM=-1; refFisSil ile kasa fişleri ve refSil ile cari hareketleri iptal edilir",
              "neden_sonuc": "Hatalı masrafı iptal eder ve bağlı kasa/cari etkilerini geri alır. Silmezseniz hatalı gider raporlarda ve bakiyede kalmaya devam eder."
            }
          ],
          "iliskiler": [
            "masraf",
            "kasa",
            "cari",
            "proje",
            "otomasyon"
          ],
          "ipuclari": [
            "Çoklu ödeme yapıldığında listede 'Çoklu Ödeme' rozeti görünür ve KASA_BANKA_ID=0 tutulur.",
            "Vade rozetleri (Vadesi Geçti/Yaklaştı) ödeme önceliğini belirlemenize yardımcı olur.",
            "Tekrar eden (kira gibi) masraflarda tarih aralığı ve sıklık seçmeyi unutmayın."
          ]
        },
        {
          "id": "virmanliste",
          "baslik": "Virman",
          "yol": "/ekran/kasa/islem/virmanliste",
          "sub": "islem",
          "amac": "Kasa/banka hesapları arasında yapılan para transferlerinin (virman) listelendiği ekran. Kaynak hesap, hedef hesap, tutar ve açıklama görülür; buradan yeni virman yapılır, fiş yazdırılır, düzenlenir veya silinir.",
          "neden": "Kasadan bankaya para yatırma, hesaplar arası aktarım gibi işlemlerin kaydı; her iki hesabın bakiyesinin doğru olması ve işlem ücretinin (varsa) masraflaşması için gereklidir.",
          "nasil": [
            "Yeni transfer için 'Virman İşlemi Yap' butonuna gidin",
            "Kaynak ve hedef kasayı, tutarı, para birimini ve varsa işlem ücretini girin",
            "Listede İşlemler menüsünden fişi Yazdır, Düzenle veya Sil yapın",
            "Filtrele ile kaynak/hedef kasa, evrak no ve tarih bazlı arayın"
          ],
          "butonlar": [
            {
              "ad": "Virman İşlemi Yap",
              "islev": "Virman giriş ekranını açar",
              "sonuc": "islem/virman ekranına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar",
              "sonuc": "Kaynak/hedef/tarih/evrak no'ya göre süzer",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Virman fişini yazdırma önizlemesini açar",
              "sonuc": "Fiş çıktısı üretilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Virmanı düzenleme ekranına götürür",
              "sonuc": "islem/virman düzenleme modu",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Virman fişini siler (onay ister)",
              "sonuc": "kasa_fis ve kasa_hareket DURUM=-1",
              "renk": "danger"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Listeyi Excel olarak indirir",
              "sonuc": "Excel dosyası oluşur",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "virmanekle",
              "tetik": "Virman giriş ekranında Kaydet",
              "etki": "kasa_fis (EVRAK_TIP=203) ve kaynak çıkış (SIRANO=1, kasa_hareket EVRAK_TIP=205) + hedef giriş (SIRANO=2) satırları; işlem ücreti varsa 3. satır (SIRANO=3, EVRAK_TIP=203) oluşur/güncellenir",
              "neden_sonuc": "Virmanı kaydedince kaynak hesaptan düşülüp hedef hesaba eklenir, iki hesabın bakiyesi güncellenir. İşlem ücreti girerseniz kaynak hesaptan ayrıca düşülür. Kaydettikten sonra VIRMAN_YAPILDI otomasyonu tetiklenir; yanlış hesap seçerseniz para yanlış yere transfer edilmiş görünür."
            },
            {
              "ad": "fissil",
              "tetik": "Sil butonu",
              "etki": "kasa_fis DURUM=-1 ve bağlı kasa_hareket satırları DURUM=-1; ilgili cari/servis/saha bağları geri düşülür",
              "neden_sonuc": "Hatalı transferi iptal eder ve her iki hesabın bakiyesini geri alır. İptal etmezseniz hesaplar arasında olmayan bir hareket kalır."
            }
          ],
          "iliskiler": [
            "kasa",
            "masraf (işlem ücreti)"
          ],
          "ipuclari": [
            "İşlem ücreti (banka masrafı) alanı sadece ücretli transfer tiplerinde açılır.",
            "Kaynak ve hedef aynı hesap olmamalıdır.",
            "Menüde silme eventi 'virmansil' adıyla tanımlı olsa da işlem gerçekte ortak 'fissil' case'i üzerinden yürür."
          ]
        },
        {
          "id": "tahakkukliste",
          "baslik": "Tahakkuk",
          "yol": "/ekran/kasa/islem/tahakkukliste",
          "sub": "islem",
          "amac": "Kasa/banka hesaplarına cariye bağlı olmadan doğrudan giriş/çıkış (tahakkuk) kaydı yapılan ekran. Açılış devri, düzeltme, faiz/masraf gibi kalemleri hesaba işler; liste giriş/çıkış olarak gösterir.",
          "neden": "Bir cari veya fatura ile ilişkilendirilemeyen para hareketlerini (örn: kasa açılış bakiyesi, banka faizi, düzeltme) hesaba işlemek ve gerçek bakiyeyi yakalamak için kullanılır.",
          "nasil": [
            "Tek kayıt için 'Tahakkuk Girişi', çok sayıda satır için 'Toplu Giriş' butonuna gidin",
            "Kasa/banka, işlem tipi (giriş/çıkış), tarih, tutar ve açıklama girin",
            "İstenirse proje ve etiket bağlayın",
            "Listeden Yazdır, Düzenle veya Sil yapın; Filtrele ile arayın"
          ],
          "butonlar": [
            {
              "ad": "Tahakkuk Girişi",
              "islev": "Tek tahakkuk giriş ekranını açar",
              "sonuc": "islem/tahakkuktek ekranına gidilir",
              "renk": "accent"
            },
            {
              "ad": "Toplu Giriş",
              "islev": "Çok satırlı tahakkuk giriş ekranını açar",
              "sonuc": "islem/tahakkuk ekranına gidilir",
              "renk": "ghost"
            },
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar",
              "sonuc": "Kasa/banka, evrak no ve tarihe göre süzer",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Tahakkuk fişini yazdırma önizlemesini açar",
              "sonuc": "Fiş çıktısı üretilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Tahakkuk kaydını düzenleme ekranına götürür",
              "sonuc": "islem/tahakkuktek düzenleme modu",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Tahakkuk kaydını siler (onay ister)",
              "sonuc": "kasa_hareket DURUM=-1",
              "renk": "danger"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Listeyi Excel olarak indirir",
              "sonuc": "Excel dosyası oluşur",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "kasatahakkukekle",
              "tetik": "Toplu Giriş ekranında Kaydet",
              "etki": "Her satır için kasa_hareket (EVRAK_TIP=210) kaydı oluşur",
              "neden_sonuc": "Toplu tahakkukla açılış devirlerini/düzeltmeleri tek seferde işler, hesap bakiyeleri güncellenir. Detay girmeden kaydedilemez."
            },
            {
              "ad": "kasatahakkuktekekle",
              "tetik": "Tahakkuk Girişi ekranında Kaydet",
              "etki": "Tek kasa_hareket (EVRAK_TIP=210) kaydı oluşur, evrak no otomatik verilir",
              "neden_sonuc": "Tek bir giriş/çıkışı hesaba işler; işlem tipini yanlış seçerseniz bakiye ters yönde değişir."
            },
            {
              "ad": "kasatahakkuktekduzenle",
              "tetik": "Düzenle sonrası Kaydet",
              "etki": "İlgili kasa_hareket (EVRAK_TIP=210) kaydını günceller",
              "neden_sonuc": "Hatalı tahakkuku düzeltir; tutar/işlem tipi değişince bakiye yeniden hesaplanır."
            },
            {
              "ad": "kasatahakkuksil",
              "tetik": "Sil butonu",
              "etki": "kasa_hareket DURUM=-1 (EVRAK_TIP=210)",
              "neden_sonuc": "Yanlış tahakkuku iptal eder ve bakiyeyi geri alır."
            }
          ],
          "iliskiler": [
            "kasa",
            "proje"
          ],
          "ipuclari": [
            "Tahakkuk cariye bağlanmaz; cariden tahsilat/ödeme için tahsilat-ödeme ekranlarını kullanın.",
            "Açılış bakiyelerini tahakkukla girmek güncel bakiyeyi doğru başlatır.",
            "Tahakkuk kaydı döviz destekler; açılış bakiyesini veya düzeltmeyi yabancı para biriminde girebilirsiniz."
          ]
        },
        {
          "id": "bekleyenodemeler",
          "baslik": "Bekleyen Aracı Ödemeler",
          "yol": "/ekran/kasa/islem/bekleyenodemeler",
          "sub": "islem",
          "amac": "Aracı ödeme kuruluşları (sanal POS) üzerinden alınmış ama parası henüz bankaya geçmemiş tahsilatların listelendiği ekran. Bekleyen adet, brüt toplam görülür; tek tek veya toplu olarak 'para geldi' onayı verilir.",
          "neden": "Kredi kartı tahsilatlarının parası kuruluşta bekler; banka hesabına geçtiğinde onaylanması gerekir. Onay; komisyonu masraflaştırır, net tutarı hedef bankaya işler ve aracı carisinin alacağını kapatır.",
          "nasil": [
            "Üstteki kutulardan bekleyen adet ve brüt toplamı görün",
            "Filtrele ile aracı kuruluş ve tarih bazlı süzün",
            "Parası gelen bir satırda tekli onay verin",
            "Birden fazla satırı işaretleyip 'Seçilenleri Onayla' ile toplu onaylayın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar",
              "sonuc": "Aracı kuruluş ve tarihe göre süzer",
              "renk": "ghost"
            },
            {
              "ad": "Tekli Onayla",
              "islev": "Seçili tek ödemeyi onaylar (emin misiniz sorar)",
              "sonuc": "araciodemeonay çalışır, fiş onaylanır",
              "renk": "accent"
            },
            {
              "ad": "Seçilenleri Onayla",
              "islev": "İşaretli tüm ödemeleri toplu onaylar",
              "sonuc": "Seçili fişler onaylanır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "araciodemeonay",
              "tetik": "Tekli/Toplu Onayla butonu",
              "etki": "Sadece EVRAK_TIP=201 ve ONAY_DURUM=0 fişler işlenir; her fiş için komisyon hesaplanır, aracı carisine net alacak (cari_hareket EVRAK_TIP=103), hedef bankaya net giriş (kasa_hareket EVRAK_TIP=201), kasa_fis ONAY_DURUM=1/ONAY_TARIH/ONAY_ID işaretlenir",
              "neden_sonuc": "Onayladığınızda para banka hesabınıza girmiş sayılır, komisyon otomatik düşülür (net=brüt-komisyon) ve aracı kuruluşun alacağı kapanır. Para gerçekten gelmeden onaylarsanız banka bakiyeniz olduğundan yüksek görünür; onaylamazsanız tahsilat 'kuruluşta bekliyor' olarak kalır."
            }
          ],
          "iliskiler": [
            "kasa",
            "araciodeme",
            "cari",
            "masraf"
          ],
          "ipuclari": [
            "Onayı gerçekten para banka hesabına geçince verin.",
            "Komisyon oranı ve hedef banka kuruluş tanımından gelir; tanım yanlışsa onay sonucu da yanlış olur."
          ]
        },
        {
          "id": "onlinebankahareketler",
          "baslik": "Banka Hesap Hareketleri",
          "yol": "/ekran/kasa/islem/onlinebankahareketler",
          "sub": "islem",
          "amac": "Online Bankacılık (Finekra) entegrasyonuyla banka hesaplarınızın gerçek hareketlerini çekip sisteme aktardığınız ekran. Her hareketi cari tahsilat/ödeme veya masraf ödemesi olarak, tek tek ya da toplu aktarabilirsiniz. Banka hesabı IBAN/Finekra ID, cari ise VKN/TCKN ile otomatik eşleşir.",
          "neden": "Banka ekstresini elle girmek yerine gerçek hareketleri otomatik sisteme almak; kayıt yükünü azaltır, banka mutabakatını hızlandırır ve tahsilat/ödemelerin doğru cariye düşmesini sağlar.",
          "nasil": [
            "Tarih aralığı ve hesap seçip hareketleri listeleyin (Finekra API'sinden gelir)",
            "Bir hareketin 'Aktar' butonuyla modalı açın; banka hesabı ve cari otomatik eşleşmişse doğrulayın",
            "Aktarım tipini Cari veya Masraf seçin (giriş hareketinde masraf gizlenir)",
            "Birden çok hareketi işaretleyip 'Toplu Aktar' ile hepsini aktarın",
            "Aktarılmış hareketler tekrar aktarılmaz (mükerrer engeli)"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih ve hesap filtresini uygular",
              "sonuc": "Seçili döneme ait banka hareketleri listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Aktar (Tekli)",
              "islev": "Hareketi aktarım modalında açar",
              "sonuc": "Kaydet ile kasa_fis+kasa_hareket ve gerekiyorsa cari/masraf kaydı üretilir",
              "renk": "accent"
            },
            {
              "ad": "Toplu Aktar",
              "islev": "İşaretli hareketleri toplu aktarır (emin misiniz sorar)",
              "sonuc": "Eşleşen hareketler kasa_fis/kasa_hareket olarak aktarılır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "finekrahareketaktar",
              "tetik": "Aktar / Toplu Aktar butonu",
              "etki": "Online Bankacılık lisansı kontrol edilir; her hareket için banka kartı (FINEKRA_HESAP_ID veya IBAN, TIP=2) ve cari (VKN/TCKN) eşleştirilir, kasa_fis (EVRAK_TIP 201 giriş / 202 çıkış / 304 masraf) + kasa_hareket + varsa cari_hareket/masraf_fis oluşturulur; FINEKRA_ID ile mükerrer engellenir",
              "neden_sonuc": "Aktarınca banka hareketi sisteme kayıt olur ve bakiye/cari güncellenir. Banka kartı eşleşmezse hareket atlanır; aynı hareket ikinci kez aktarılamaz, böylece çift kayıt önlenir. Lisans yoksa özellik çalışmaz."
            }
          ],
          "iliskiler": [
            "kasa",
            "banka",
            "cari",
            "masraf",
            "onlinebanka (Finekra)"
          ],
          "ipuclari": [
            "Özellik Online Bankacılık lisansı ve Finekra bağlantısı gerektirir.",
            "Banka kartlarını IBAN/Finekra Hesap ID ile eşleştirirseniz otomatik eşleşme artar.",
            "Cari eşleşmesi için cari kartlarda VKN/TCKN dolu olmalıdır."
          ]
        },
        {
          "id": "hareketdokum",
          "baslik": "Hareket Dökümü",
          "yol": "/ekran/kasa/rapor/hareketdokum",
          "sub": "rapor",
          "amac": "Seçili tarih aralığında kasa/banka/POS üzerindeki tüm tahsilat, ödeme ve virman hareketlerini detaylı listeleyen rapor. Kasa seçilirse devir bakiyesiyle birlikte yürüyen bakiye gösterir. Performans için filtre zorunludur.",
          "neden": "Mali denetim, banka mutabakatı, şüpheli hareket incelemesi ve vergi beyannamesi için dönemsel hareket dökümü esastır.",
          "nasil": [
            "Filtrele butonuyla kasa/banka, cari, tarih aralığı, evrak tipi ve işlem tipini seçin",
            "Arama yapınca KPI kartları (toplam hareket, tahsilat, ödeme, net) ve hareket listesi gelir",
            "Tek kasa seçerseniz devir bakiyesi ve yürüyen bakiye görünür",
            "Sonucu Excel'e aktarabilir veya yazdırabilirsiniz"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar (zorunlu)",
              "sonuc": "Seçili kriterlere göre rapor üretilir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Dökümü Excel olarak indirir",
              "sonuc": "Excel dosyası oluşur",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Raporu yazdırır",
              "sonuc": "Çıktı üretilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa",
            "cari"
          ],
          "ipuclari": [
            "Hareket sayısı çok olabileceği için filtre zorunludur.",
            "Tek kasa seçmek devir + yürüyen bakiye görmek için gereklidir.",
            "Banka ekstresiyle karşılaştırarak mutabakat yapın.",
            "Şube filtresi: Birden fazla şubesi olan işletmelerde filtre penceresine eklenen Şube seçiciyle, yalnız erişim yetkiniz olan şubeleri seçerek listeyi o şubeye ait kayıtlarla süzersiniz; tek şubeli işletmelerde bu seçici görünmez."
          ]
        },
        {
          "id": "gunceldurum",
          "baslik": "Bakiye Durumu",
          "yol": "/ekran/kasa/rapor/gunceldurum",
          "sub": "rapor",
          "amac": "Tüm kasa, banka, POS ve kredi kartı hesaplarının anlık bakiyesini (gelir - gider) tek tabloda gösteren özet rapor. Pozitif/negatif/sıfır bakiye ve toplam mevcut KPI olarak sunulur.",
          "neden": "Günlük nakit kontrolü, ödeme öncesi 'yeterli para var mı' sorusu ve negatif bakiye (sayım/kayıt hatası) tespiti için en hızlı bakılan rapordur.",
          "nasil": [
            "Ekranı açın; tüm hesaplar ve bakiyeleri otomatik listelenir",
            "KPI kartlarından toplam hesap, pozitif/negatif/sıfır adedi ve toplam bakiyeyi görün",
            "Negatif bakiyeli hesapları acil inceleyin",
            "Alttaki toplam satırından net mevcudu okuyun"
          ],
          "butonlar": [],
          "eventler": [],
          "iliskiler": [
            "kasa"
          ],
          "ipuclari": [
            "Negatif bakiye çoğunlukla eksik/yanlış kayıt işaretidir, hemen inceleyin.",
            "POS bekleyen tutarları için Bekleyen Aracı Ödemeler ekranını da kontrol edin.",
            "Üstteki 'Genel / Döviz Bazlı' geçişiyle görünüm değişir. Döviz Bazlı modda her hesabın bakiyesi para birimine göre ayrı sütunda gösterilir (örn. bir bankada TL ve USD bakiyesi ayrı); hareketsiz para birimi hücresi boştur. Varsayılan Genel (TL).",
            "Kasa/banka güncel durumunda 'Görünüm: Genel / Döviz Bazlı' ile bakiyeleri tek TL toplamı ya da her para birimi ayrı (kur farkı olmadan) görebilirsiniz; 'Döviz Bakiye Görünümü' ayarı ayrı tutma veya TL'ye çevirme arasında seçim sunar."
          ]
        },
        {
          "id": "masrafizleme",
          "baslik": "Masraf Kontrol Paneli",
          "yol": "/ekran/kasa/rapor/masrafizleme",
          "sub": "rapor",
          "amac": "Masrafları dönem (ay) ve masraf kalemi kırılımında analiz eden panel. Dağılım (pasta), yoğunluk, ödeme dağılımı ve masraf trendi grafikleriyle hangi kaleme ne kadar harcandığını gösterir. Filtre zorunludur.",
          "neden": "Bütçe analizi, maliyet kontrolü ve gider trendlerini görmek için kullanılır; hangi kalemin bütçeyi zorladığını erken fark etmenizi sağlar.",
          "nasil": [
            "Filtrele ile dönem aralığı, ödeme durumu, masraf kalemi ve etiket seçin",
            "Dönemsel kırılım tablosunu ve grafik sekmelerini inceleyin",
            "Mobilde sekme seçiciyle grafikler arasında geçin",
            "Sonucu Excel'e aktarın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Dönem/kalem/etiket/ödeme durumu filtresini uygular (zorunlu)",
              "sonuc": "Kırılım tablosu ve grafikler üretilir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Paneli Excel olarak indirir",
              "sonuc": "Excel dosyası oluşur",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "masraf"
          ],
          "ipuclari": [
            "Ters tarih aralığı otomatik düzeltilir.",
            "Ödeme durumu filtresiyle sadece ödenen veya ödenmeyen masrafları izleyebilirsiniz.",
            "Kalem bazlı trendden tekrar eden yüksek giderleri yakalayın."
          ]
        },
        {
          "id": "nakitakistahmin",
          "baslik": "Günlük Nakit Akış Tahmini",
          "yol": "/ekran/kasa/rapor/nakitakistahmin",
          "sub": "rapor",
          "amac": "Açık cari vadeleri, ödenmemiş masraf vadeleri ve vadeli çek/senetlere bakarak önümüzdeki 30/60/90 günde beklenen tahsilat, ödeme ve net nakit pozisyonunu grafikle tahmin eden rapor.",
          "neden": "Likidite planlaması, kredi ihtiyacının önceden görülmesi ve yatırım/ödeme kararları için ileriye dönük nakit görünürlüğü sağlar.",
          "nasil": [
            "Gün aralığını (30/60/90) seçin",
            "Giriş (tahsilat), çıkış (ödeme) ve net çizgisini grafikte inceleyin",
            "KPI'lardan 30/60/90 gün beklenen tahsilat/ödeme/net pozisyonu okuyun",
            "Net negatif çıkan dönemler için önlem planlayın"
          ],
          "butonlar": [
            {
              "ad": "30/60/90 Gün",
              "islev": "Tahmin ufkunu değiştirir",
              "sonuc": "Grafik ve KPI'lar seçilen güne göre yeniden hesaplanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "masraf",
            "ceksenet"
          ],
          "ipuclari": [
            "Tahminin doğruluğu vade tarihlerinin doğru girilmesine bağlıdır.",
            "Net pozisyonun negatife döndüğü günleri erken görün ve nakit planlayın."
          ]
        },
        {
          "id": "gunsonu",
          "baslik": "Gün Sonu Raporu",
          "yol": "/ekran/kasa/rapor/gunsonu",
          "sub": "rapor",
          "amac": "Seçili tarih aralığı için satış/alış faturaları, tahsilat, ödeme, masraf, kasa/banka giriş-çıkış kırılımı, irsaliye ve vadesi gelen çek/senet gibi günlük operasyonun özetini tek ekranda toplayan rapor.",
          "neden": "Gün kapanışında işletmenin o günkü tüm para ve belge hareketini tek bakışta görmek, kasa sayımı ve gün sonu kontrolü için kullanılır.",
          "nasil": [
            "Filtrele ile tarih aralığını seçin (varsayılan bugün)",
            "Satış/alış, tahsilat/ödeme, masraf ve kasa-banka kırılım kartlarını inceleyin",
            "Kasa/banka giriş-çıkış toplamlarıyla günü kapatın",
            "Excel'e aktarın veya yazdırın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı filtresini uygular",
              "sonuc": "Gün sonu özeti seçili döneme göre üretilir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Raporu Excel olarak indirir",
              "sonuc": "Excel dosyası oluşur",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "fatura",
            "kasa",
            "masraf",
            "irsaliye",
            "ceksenet"
          ],
          "ipuclari": [
            "Varsayılan tarih bugündür; geçmiş bir günü kontrol için tarihi değiştirin.",
            "Kasa/banka kırılımını fiziki sayımla karşılaştırarak günü güvenle kapatın."
          ]
        },
        {
          "id": "isletmeteshis",
          "baslik": "İşletme Durum Raporu",
          "yol": "/ekran/kasa/rapor/isletmeteshis",
          "sub": "rapor",
          "amac": "Satış/gider faturaları, kasa-banka hareketleri ve cari açık bakiyelere bakarak işletmenin genel sağlığını gösteren yönetsel teşhis panosu. Faaliyet farkı, net nakit, mevcut bakiye ve nakit tampon (runway) gibi göstergeler sunar. Muhasebe/vergi hükmü vermez; analiz ve risk sinyali dili kullanır.",
          "neden": "İşletme sahibinin dönemsel olarak kârlılık, nakit üretimi ve nakit dayanıklılığını hızlı görüp önlem alması, risk sinyallerini erken fark etmesi için kullanılır.",
          "nasil": [
            "Dönem başlangıç/bitiş tarihini seçip raporu yenileyin (AJAX yok, sayfa yenilenir)",
            "Faaliyet farkı (satış-gider), net nakit ve mevcut bakiyeyi inceleyin",
            "Nakit tampon (kaç aylık) göstergesiyle dayanıklılığı değerlendirin",
            "Risk sinyallerine göre önerilen aksiyonları gözden geçirin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele / Dönem Seç",
              "islev": "Başlangıç-bitiş tarihini uygular",
              "sonuc": "Metrikler seçili döneme göre yeniden hesaplanır",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "fatura",
            "kasa",
            "cari"
          ],
          "ipuclari": [
            "Rapor kesin muhasebe/vergi sonucu değil, yönetsel analizdir.",
            "Ortalama aylık çıkış yoksa nakit tampon 'çok yüksek' olarak işaretlenir, panik göstergesi verilmez.",
            "Faaliyet farkının düşmesi kârlılık baskısının erken işaretidir."
          ]
        }
      ]
    },
    {
      "slug": "cek-senet",
      "title": "Çek & Senet",
      "icon": "📄",
      "modul": "ceksenet",
      "ad": "Çek/Senet Yönetimi",
      "ozet": "Alınan ve verilen çek/senetlerin tüm yaşam döngüsünü (kayıt, düzenleme, silme, pozisyon/durum değiştirme, bankaya verme, tahsil, ciro, faktoring, karşılıksız/protesto/iade/avukat) tek yerden yöneten modül. Her hareket cari hesaba, tahsil/ödeme anında ise kasa-bankaya otomatik işlenir; masraflı tahsilde ayrıca masraf fişi üretilir. Ayrıca yaşlandırma, akıllı (risk skorlu) yaşlandırma, gerçek risk, vadesi geçmiş, problemli ve bankada bekleyen evraklar için analiz raporları sunar. Çek oluşturma ve durum değişikliklerinde otomasyon (n8n) tetikleyicileri (CEK_OLUSTURULDU, CEK_DURUM_DEGISTI) çalışır.",
      "modul_iliskiler": [
        "cari",
        "kasa",
        "banka",
        "masraf",
        "proje",
        "otomasyon",
        "sys_parabirimi"
      ],
      "ekranlar": [
        {
          "id": "verilencekler",
          "baslik": "Verilen Evrak",
          "yol": "/ekran/ceksenet/islem/verilencekler",
          "sub": "islem",
          "amac": "Firmanızın tedarikçilere/iş ortaklarına verdiği (ödeyeceğiniz) çek ve senetleri liste halinde gösterir; buradan yeni evrak eklenir, düzenlenir, silinir, durumu (pozisyonu) değiştirilir ve yazdırılır.",
          "neden": "Ödeme yükümlülüklerinizi tek ekranda takip etmenizi sağlar. Vadesi yaklaşan çeki bankada karşılık hazırlamak, ödendi olarak işaretlemek veya geri almak için buradan yönetilir. Nakit planlaması ve borç takibinin merkezidir.",
          "nasil": [
            "Üst köşedeki 'Çek/Senet Ver' butonuyla yeni verilen çek/senet formunu açın (cari, tutar, vade, banka bilgilerini girip kaydedin)",
            "Listede her satırda vadeye kalan gün, pozisyon (Kendi Çekim/Senedim, Bankaya Verildi, Ödendi vb.), evrak no, cari ve tutar görünür",
            "Sağ üstteki Filtrele ile cari, evrak no, tarih, vade, tip (çek/senet), pozisyon, durum, banka ve tutar aralığına göre arama yapın",
            "Evrak no veya pozisyona tıklayarak evrakın işlem/bordro geçmişini modal olarak görün",
            "Satırdaki İŞLEMLER menüsünden Yazdır, Durum (pozisyon değiştir), Düzenle veya Sil işlemlerini yapın"
          ],
          "butonlar": [
            {
              "ad": "Çek/Senet Ver",
              "islev": "Yeni verilen çek/senet kayıt formunu açar",
              "sonuc": "verilencekform ekranına gider; kaydedince yeni evrak ve cari borç hareketi oluşur",
              "renk": "accent"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, tarih, vade, tip, pozisyon, banka, tutar kriterleriyle listeyi daraltır",
              "sonuc": "Sadece kriterlere uyan verilen evraklar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Tüm verilen evraklar yeniden listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Evrakın çıktısını (bordro/fiş) yazdırma modalını açar",
              "sonuc": "Çek/senet dökümü alınır",
              "renk": "ghost"
            },
            {
              "ad": "Durum",
              "islev": "Pozisyon değiştir modalını açar (Ödendi, Geri Aldım, Kayıp/İptal)",
              "sonuc": "pozisyondegistir olayı çalışır; seçime göre kasa/banka veya cari kaydı üretilir",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Mevcut evrakı düzenleme modunda açar (verilencekform)",
              "sonuc": "Evrak bilgileri güncellenir, cari hareket silinip yeniden yazılır",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Onay sorarak evrakı siler",
              "sonuc": "ceksil olayı çalışır; evrak pasif (DURUM=-1) olur, cari/kasa referans hareketleri geri alınır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "verilencekkaydet",
              "tetik": "Verilen çek formunda Kaydet",
              "etki": "ceksenet_fis (YON=0, CSTUR=2, başlangıç POZISYON=100 çek/101 senet) kaydı + ceksenet_hareket bordrosu (HAR_TIP=1) + cari_hareket borç kaydı (evrak tipi 601 çek / 603 senet) oluşturur; yeni kayıtta CEK_OLUSTURULDU otomasyonu tetiklenir. Düzenlemede eski cari hareket refDeleteDb ile silinip yeniden yazılır.",
              "neden_sonuc": "Verdiğiniz çek/senet kayıt altına alınır ve cari hesabınıza borç olarak işlenir. Yapmazsanız ödeme yükümlülüğünüz sistemde görünmez, cari bakiye yanlış olur. Bir evrakta birden fazla bordro (HAR_TIP=1) hareketi varsa düzenleme engellenir; silip yeniden oluşturmak gerekir."
            },
            {
              "ad": "ceksil",
              "tetik": "Satırda Sil",
              "etki": "ceksenet_fis DURUM=-1 yapılır (SILINDI_ID/SILINDI_TIME yazılır), silme bordrosu (HAR_TIP=2) eklenir; cari_hareket refSil ve ilgili kasa_fis (605/606) refFisSil ile geri alınır",
              "neden_sonuc": "Yanlış girilen evrak iptal edilir ve cari/kasa etkileri geri alınır. Silme yerine düzeltme gerekiyorsa Düzenle kullanılmalı; silmek tüm bağlı hareketleri geri aldığı için dikkatli olunmalıdır."
            },
            {
              "ad": "pozisyondegistir",
              "tetik": "Durum modalında Kaydet",
              "etki": "Verilen evrakta Ödendi (6) seçilirse kasa/banka çıkış fişi (605 çek / 606 senet) + kasa hareketi (borç) oluşur, ODEME_TARIH/ODEME_SURE yazılır; Geri Aldım (8) / Kayıp İptal (12) seçilirse aktif cari üzerinden ters cari kayıt (610 çek / 611 senet) oluşur. Her durumda CEK_DURUM_DEGISTI otomasyonu tetiklenir.",
              "neden_sonuc": "Verilen çekin gerçek akıbetini (ödendi, geri alındı, iptal) sisteme işler. Ödendi işaretleyince banka bakiyeniz düşer ve borç kapanır; işaretlemezseniz ödenmiş çek hâlâ açık borç görünür."
            },
            {
              "ad": "pozisyonliste",
              "tetik": "Satırda pozisyona tıklama",
              "etki": "ceksenet_hareket tablosundan HAR_TIP=1 bordroları çeker (salt okuma), pozisyon metinlerini çözer",
              "neden_sonuc": "Evrakın durum değişim (bordro) geçmişini görürsünüz; denetim ve mutabakat için kullanılır. Veri değişmez."
            },
            {
              "ad": "logliste",
              "tetik": "Satırda evrak no'ya tıklama",
              "etki": "ceksenet_hareket tablosundan tüm hareketleri (HAR_TIP fark etmeksizin) çeker (salt okuma)",
              "neden_sonuc": "Evrakın tam işlem geçmişini (oluşturma, güncelleme, pozisyon değişiklikleri, silme) görürsünüz. Veri değişmez."
            }
          ],
          "iliskiler": [
            "cari",
            "kasa",
            "banka",
            "proje",
            "otomasyon"
          ],
          "ipuclari": [
            "Bir evrakta birden fazla bordro (HAR_TIP=1) hareketi oluştuysa (ör. bankaya verildi) artık düzenlenemez; silip yeniden oluşturmanız gerekir",
            "Renk kodları: yeşil vadeye gün var, kırmızı vade geçti, gri tamamlandı anlamına gelir",
            "Verilen evrağın başlangıç pozisyonu Kendi Çekim (100) / Kendi Senedim (101)'dir; tamamlanmış pozisyonlar (5,6,7,8,9,12) 'Tamamlandı' rozetiyle gösterilir"
          ]
        },
        {
          "id": "alinancekler",
          "baslik": "Alınan Evrak",
          "yol": "/ekran/ceksenet/islem/alinancekler",
          "sub": "islem",
          "amac": "Firmanızın müşterilerden aldığı (tahsil edeceğiniz) çek ve senetleri listeler; yeni alınan evrak ekleme, düzenleme, silme, bankaya verme/tahsil/ciro/faktoring/karşılıksız gibi durum değişiklikleri ve yazdırma buradan yapılır.",
          "neden": "Alacaklarınızın en likit kısmı olan çek/senet portföyünü yönetir. Aldığınız çeki bankaya tahsile verme, ciro etme, faktoringe verme veya tahsil etme kararlarını buradan uygular; alacak takibinin ve nakit girişinin merkezidir.",
          "nasil": [
            "Üst köşedeki 'Çek/Senet Al' butonuyla alınan evrak formunu açıp müşteri, tutar, vade ve banka bilgilerini kaydedin",
            "Listede vadeye kalan gün, pozisyon (Portföyde, Bankaya Verildi, Ciro Edildi, Tahsil Edildi vb.), evrak no, cari ve tutar görünür",
            "Filtrele ile cari, evrak no, tarih, vade, tip, pozisyon, durum, banka ve tutar aralığında arama yapın",
            "İŞLEMLER menüsünden Durum'a tıklayıp Bankaya Verildi, Ciro, Faktoring, Tahsil, Karşılıksız, İade, Avukata Verildi gibi yeni pozisyonu seçin (gereken cari/banka/kasa alanı otomatik açılır)",
            "Gerektiğinde Yazdır, Düzenle veya Sil işlemlerini yapın"
          ],
          "butonlar": [
            {
              "ad": "Çek/Senet Al",
              "islev": "Yeni alınan çek/senet kayıt formunu açar",
              "sonuc": "alinancekform ekranına gider; kaydedince evrak ve cari alacak hareketi oluşur",
              "renk": "accent"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari, tarih, vade, tip, pozisyon, banka, tutar kriterleriyle listeyi daraltır",
              "sonuc": "Kriterlere uyan alınan evraklar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Tüm alınan evraklar yeniden listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Evrak dökümü yazdırma modalını açar",
              "sonuc": "Alınan çek/senet çıktısı alınır",
              "renk": "ghost"
            },
            {
              "ad": "Durum",
              "islev": "Pozisyon değiştir modalını açar (Bankaya Verildi, Ciro, Faktoring, Tahsil, Karşılıksız, İade, Avukata Verildi)",
              "sonuc": "pozisyondegistir olayı çalışır; seçime göre cari/kasa/banka kayıtları üretilir",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Mevcut evrakı düzenleme modunda açar (alinancekform)",
              "sonuc": "Evrak güncellenir, cari alacak hareketi silinip yeniden yazılır",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Onay sorarak evrakı siler",
              "sonuc": "ceksil olayı çalışır; evrak pasifleşir (DURUM=-1), cari/kasa hareketleri geri alınır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "alinancekkaydet",
              "tetik": "Alınan çek formunda Kaydet",
              "etki": "ceksenet_fis (YON=1, CSTUR=1, POZISYON=1 Portföyde) + ceksenet_hareket bordrosu (HAR_TIP=1) + cari_hareket alacak kaydı (602 çek / 604 senet) oluşturur; yeni kayıtta CEK_OLUSTURULDU otomasyonu tetiklenir. Düzenlemede eski cari hareket refDeleteDb ile silinip yeniden yazılır.",
              "neden_sonuc": "Müşteriden aldığınız çek/senet portföye girer ve cari hesabınıza alacak (tahsilat) olarak işlenir. Yapmazsanız müşterinin borcu kapanmış görünmez, cari bakiye yanlış kalır. Birden fazla bordrosu olan evrak düzenlenemez."
            },
            {
              "ad": "ceksil",
              "tetik": "Satırda Sil",
              "etki": "ceksenet_fis DURUM=-1, silme bordrosu (HAR_TIP=2) + cari_hareket refSil + ilgili kasa_fis (607/608) refFisSil ile geri alınır",
              "neden_sonuc": "Yanlış girilen alınan evrak iptal edilir ve etkileri geri alınır. Bankaya verilmiş/işlem görmüş evrakta dikkatli olunmalı; bağlı tüm hareketler geri alınır."
            },
            {
              "ad": "pozisyondegistir",
              "tetik": "Durum modalında Kaydet",
              "etki": "Bankaya Verildi (2) KASABANKA bilgisini yazar; Ciro (4)/Faktoring (13) aktif cariyi (AKTIF_CARI) değiştirip ciro edilen tarafa (B) yeni cari borç hareketi (602/604) ekler, A'nın orijinal kaydı korunur (refDeleteDb yok); Tahsil (5) seçili kasa/bankaya giriş fişi (607 çek / 608 senet) + kasa hareketi (alacak) üretir, ODEME_TARIH/SURE yazar; Karşılıksız (7)/İade (9)/Avukat (10)/İptal (12) ters kayıtlarla (610/611) tahsilatı geri alır — ciro yapılmışsa hem B'nin ciro borcunu hem A'nın tahsilatını iptal eden iki ters kayıt oluşur. Her durumda CEK_DURUM_DEGISTI otomasyonu tetiklenir.",
              "neden_sonuc": "Alınan çekin gerçek akıbetini işler. Örneğin ciro ederken A'nın borcu kapalı kalır, çeki verdiğiniz B'ye borçlanırsınız; tahsil ederken banka/kasa bakiyeniz artar. Yanlış pozisyon seçmek cari ve kasa bakiyelerini bozar."
            },
            {
              "ad": "pozisyonliste",
              "tetik": "Satırda pozisyona tıklama",
              "etki": "ceksenet_hareket HAR_TIP=1 bordroları çeker (salt okuma)",
              "neden_sonuc": "Evrakın durum değişim geçmişini gösterir; ciro/faktoring zincirini takip etmenizi sağlar. Veri değişmez."
            },
            {
              "ad": "logliste",
              "tetik": "Satırda evrak no'ya tıklama",
              "etki": "ceksenet_hareket tüm hareketleri çeker (salt okuma)",
              "neden_sonuc": "Evrakın tüm işlem geçmişini gösterir; anlaşmazlıkta kanıt niteliği taşır. Veri değişmez."
            }
          ],
          "iliskiler": [
            "cari",
            "kasa",
            "banka",
            "proje",
            "otomasyon"
          ],
          "ipuclari": [
            "Ciro ve Faktoring işleminde orijinal cari (A) hareketi korunur, ayrıca ciro/faktoring edilen tarafa (B) yeni borç hareketi eklenir; karşılıksız/iade/avukat olursa iki taraf da otomatik ters kayıtla düzeltilir",
            "Pozisyon seçimine göre modal otomatik olarak Cari, Banka veya Kasa alanını açar; boş bırakılan alanlar temizlenir",
            "Tahsil işlemi için hem banka hem kasa seçilebilir (KASALAR/BANKALAR gruplu liste)"
          ]
        },
        {
          "id": "bankadabekleyen",
          "baslik": "Bankadaki Evraklar",
          "yol": "/ekran/ceksenet/rapor/bankadabekleyen",
          "sub": "rapor",
          "amac": "Bankalara tahsile/teminata verilmiş ve hâlâ bekleyen (POZISYON=2) çek/senetleri listeler; buradan doğrudan tahsil etme veya portföye geri alma işlemi yapılabilir.",
          "neden": "Banka tahsil portföyünüzü sistemle mutabık tutmanızı sağlar. Vadesi gelen banka evraklarını takip edip tahsil etmek, kullanılmayacak teminatları geri çekmek ve nakit girişini planlamak için kritiktir.",
          "nasil": [
            "Performans için önce sağ üstteki Filtrele ile cari, banka, yön, belge tipi veya vade aralığı seçin (filtre zorunlu)",
            "Üstte KPI kartlarında toplam evrak, tahsile, teminata adet ve toplam tutar özetini görün",
            "Listede tür, yön, evrak no, tarih, vade, kalan gün, cari, banka ve tutar görünür",
            "Vadesi gelen evrakta İŞLEMLER > Tahsil ile banka hesabı, tahsil tarihi ve (varsa) masraf girip tahsil edin",
            "Kullanılmayacak evrakta İŞLEMLER > Portföye Al ile bankadan geri çekin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, banka, yön, belge tipi, vade aralığıyla raporu çalıştırır",
              "sonuc": "Bankada bekleyen evraklar listelenir ve KPI'lar hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre yeniden istenir (rapor filtresiz çalışmaz)",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Seçili evrakın dökümünü yazdırma modalını açar",
              "sonuc": "Evrak çıktısı alınır",
              "renk": "ghost"
            },
            {
              "ad": "Tahsil",
              "islev": "Satır menüsünden tahsil modalını açar (hesap, tarih, masraf, açıklama)",
              "sonuc": "Tahsil formu açılır",
              "renk": "accent"
            },
            {
              "ad": "Portföye Al",
              "islev": "Satır menüsünden geri alma modalını açar (tarih, açıklama)",
              "sonuc": "Geri alma formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Tahsil Et",
              "islev": "Tahsil modalını gönderir (banka hesabı seçili değilse uyarı verir)",
              "sonuc": "bankadantahsil olayı çalışır; evrak Tahsil Edildi (5) olur, banka bakiyesi artar",
              "renk": "accent"
            },
            {
              "ad": "Portföye Al (onay)",
              "islev": "Geri alma modalını gönderir",
              "sonuc": "bankadangerialma olayı çalışır; evrak tekrar Portföyde (1) olur",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "bankadantahsil",
              "tetik": "Tahsil modalında Tahsil Et",
              "etki": "ceksenet_fis POZISYON=5 (Tahsil Edildi) + ODEME_TARIH/SURE + bordro (HAR_TIP=1); seçili bankaya giriş kasa_fis (607 çek / 608 senet) tam tutarla; masraf girilirse masraf_fis (304) kaydı + bankadan masraf çıkış hareketi oluşur",
              "neden_sonuc": "Bankadaki çek tahsil edilip para banka hesabınıza girer; masrafı ayrıca gider olarak kaydedilir. Banka hesabı seçilmezse veya masraf tutarı girilip masraf kalemi seçilmezse işlem reddedilir; yanlış hesap seçmek banka bakiyesini bozar."
            },
            {
              "ad": "bankadangerialma",
              "tetik": "Portföye Al modalında onay",
              "etki": "ceksenet_fis POZISYON=1 (Portföyde) yapılır, KASABANKA bilgileri temizlenir, geri alma bordrosu (HAR_TIP=1) eklenir",
              "neden_sonuc": "Bankaya verdiğiniz ama tahsil edilmeyecek/geri çekilecek evrak portföye döner. Böylece tekrar ciro/tahsil için kullanılabilir; yapılmazsa evrak hatalı şekilde bankada bekliyor görünür."
            }
          ],
          "iliskiler": [
            "banka",
            "kasa",
            "masraf",
            "cari"
          ],
          "ipuclari": [
            "Rapor performans nedeniyle filtresiz açılmaz; en az bir kriter girip arama yapmanız gerekir",
            "Masraf tutarı girerseniz masraf kalemi seçmek zorunludur, aksi halde tahsil kaydı yapılmaz",
            "Kalan gün rozeti kırmızıysa vade geçmiş, sarıysa yakın, yeşilse daha uzaktır"
          ]
        },
        {
          "id": "vadesigecmisler",
          "baslik": "Vadesi Geçmişler",
          "yol": "/ekran/ceksenet/rapor/vadesigecmisler",
          "sub": "rapor",
          "amac": "Vadesi gelmiş ancak henüz tahsil/ödeme yapılmamış (açık pozisyondaki) çek ve senetleri gecikme gün sayısıyla birlikte listeler; tahsil edilecek ve ödenecek tutarları ayrı sütunlarda toplar.",
          "neden": "Eskiyen vadeler tahsili giderek zorlaşan paradır. Bu rapor 'tehlikedeki nakdi' gösterir; gecikme süresine göre hatırlatma, telefon, ihtar veya hukuki süreç aksiyonlarını önceliklendirmenizi sağlar.",
          "nasil": [
            "Sağ üstteki Filtrele ile cari, evrak no, tip (çek/senet), yön ve vade aralığı seçin (filtre zorunlu)",
            "KPI kartlarında toplam geçmiş, 1-30 gün, 31+ gün adetleri ve toplam risk tutarını görün",
            "Listede pozisyon/tip, gecikme günü (renk bandıyla), cari, evrak no, tarih ve vade görünür",
            "Alınan evraklar 'Tahsil' sütununda, verilen evraklar 'Ödeme' sütununda toplanır; alt toplam farkı net durumu gösterir",
            "Gecikme bandına göre aksiyon alın: 1-7 gün hatırlatma, 8-30 telefon, 31-90 ihtar, 90+ hukuki"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, evrak no, tip, yön, vade aralığıyla raporu çalıştırır",
              "sonuc": "Vadesi geçmiş açık evraklar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre yeniden istenir",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre formunu gönderir",
              "sonuc": "Rapor kriterlere göre çalışır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "yok",
              "tetik": "Bu ekranda kayıt değiştiren olay yoktur (salt rapor)",
              "etki": "ceksenet_fis üzerinden DATEDIFF ile vadesi geçmiş, DURUM=1 ve POZISYON IN (1,2,4,13,100,101) olan evrakları okur",
              "neden_sonuc": "Rapor veriyi değiştirmez; sadece görünürlük sağlar. Doğru okunması için evrak pozisyonlarının güncel tutulması gerekir, yoksa kapanmış evrak riskli görünebilir."
            }
          ],
          "iliskiler": [
            "cari",
            "banka"
          ],
          "ipuclari": [
            "Sadece açık pozisyonlar (portföy 1, bankada 2, ciro 4, faktoring 13, kendi çeki/senedi 100/101) listelenir; tahsil/ödeme/karşılıksız gibi kapanmış olanlar hariçtir",
            "Satır arka plan rengi gecikme şiddetini gösterir: yeşil 1-7, mavi 8-30, turuncu 31-90, pembe 90+ gün",
            "Tahsil ve Ödeme toplamlarının farkı net nakit pozisyonunuzu (alacak fazlası/borç fazlası) verir"
          ]
        },
        {
          "id": "yaslandirma",
          "baslik": "Klasik Yaşlandırma",
          "yol": "/ekran/ceksenet/rapor/yaslandirma",
          "sub": "rapor",
          "amac": "Açık çek/senet portföyünü vade bantlarına (Gecikenler, 0-30, 31-60, 61-90, 91-120, 121-180, 180+ gün) göre ayırıp Verilen ve Alınan evraklar için ayrı tablolarda adet, oran ve tutar dağılımını gösterir.",
          "neden": "Risk yönetimi ve nakit planlamasının temel analizidir. Hangi vade bandında ne kadar tutar olduğunu görerek gelecekteki nakit giriş/çıkışını öngörür, yoğunlaşan riski erken fark edersiniz.",
          "nasil": [
            "Sağ üstteki Filtrele ile cari, evrak yönü (alınan/verilen), belge tipi ve vade aralığı seçin (filtre zorunlu)",
            "KPI kartlarında gecikme/vade bantlarının tutar dağılımını görün",
            "VERİLEN EVRAKLAR ve ALINAN EVRAKLAR tablolarında her vade bandının adet, oran çubuğu ve toplam tutarını inceleyin",
            "Bir vade bandı satırına tıklayarak o banttaki evrakların detayını (AJAX ile) açıp kapatın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, yön, belge tipi, vade aralığıyla raporu çalıştırır",
              "sonuc": "Yaşlandırma tabloları hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre yeniden istenir",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre formunu gönderir",
              "sonuc": "Rapor çalışır",
              "renk": "primary"
            },
            {
              "ad": "Vade Bandı (satır)",
              "islev": "Bandın evrak detayını AJAX ile açar/kapatır",
              "sonuc": "yaslandirmadetay olayı o banttaki evrakları getirir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "yaslandirmadetay",
              "tetik": "Vade bandı satırına tıklama",
              "etki": "ceksenet_fis üzerinden DURUM=1, ilgili YON ve DATEDIFF gün aralığındaki (POZISYON NOT IN 5,6,7,9,10,12) evrakları HTML tablo olarak döner (salt okuma)",
              "neden_sonuc": "Bir vade bandındaki hangi evrakların olduğunu detayında görürsünüz; hangi cariden ne kadar beklendiğini analiz edersiniz. Veri değişmez."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Tahsil/ödenmiş/karşılıksız/iade/avukat/iptal pozisyonları (5,6,7,9,10,12) hariç tutulur; sadece açık portföy yaşlandırılır",
            "Oran çubuğu bandın toplam içindeki payını görselleştirir; büyük paylı bantlar dikkat gerektirir",
            "Verilen ve Alınan ayrı tablolarda olduğundan hem borç hem alacak vade profilini karşılaştırabilirsiniz"
          ]
        },
        {
          "id": "akilliyaslandirma",
          "baslik": "Akıllı Yaşlandırma",
          "yol": "/ekran/ceksenet/rapor/akilliyaslandirma",
          "sub": "rapor",
          "amac": "Çek/senetleri vade yaşına göre gruplara (Vadesi Gelmemiş, 0-30, 31-60, 61-90, 90+ gün) ayırır ve her evraka pozisyon riskine göre katsayı uygulayarak 'risk skoru' hesaplar; alınan/verilen matrisi, yaş grubu kartları ve detay tablolarıyla tahsilat önceliğini belirler.",
          "neden": "Klasik yaşlandırmadan farklı olarak pozisyon riskini (ör. karşılıksız x2.0, avukatta x2.5) hesaba katar. Böylece sadece gecikmeye değil, evrakın durumuna göre gerçek tahsilat önceliğini akıllıca sıralarsınız.",
          "nasil": [
            "Sağ üstteki Filtrele ile cari, evrak yönü, belge tipi, pozisyon ve vade aralığı seçin (filtre zorunlu)",
            "KPI kartlarında toplam evrak, yakında vadesi, vadesi geçmiş ve toplam tutarı görün",
            "Genel özet kutularında Alınan ve Verilen portföyün adet, tutar ve toplam riskini inceleyin",
            "Yaş grubu kartlarında her bandın adet, tutar ve A/V dağılımını görün",
            "Her yaş grubunun detay tablosunda tür, pozisyon, cari, evrak no, vade, gecikme, tutar, katsayı ve risk skorunu satır bazında değerlendirin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, yön, belge tipi, pozisyon, vade aralığıyla raporu çalıştırır",
              "sonuc": "Risk matrisi ve skorlar hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre yeniden istenir",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre formunu gönderir",
              "sonuc": "Rapor çalışır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "yok",
              "tetik": "Salt rapor; kayıt değiştiren olay yoktur",
              "etki": "ceksenet_fis (DURUM=1, POZISYON IN 1,2,4,13,7,9,10,100,101) evraklarını okur, PHP tarafında yaş grubu ve pozisyon katsayısıyla risk skoru hesaplar",
              "neden_sonuc": "Risk skoru = max(gecikme günü,0) × pozisyon katsayısı formülüyle hesaplanır ve hangi evrakın önce takip edilmesi gerektiğini gösterir. Veri değişmez; skor önceliklendirme aracıdır."
            }
          ],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Risk katsayıları pozisyona göre sabittir: Portföyde/Kendi çeki 1.0, Bankaya Verildi 1.2, Ciro 1.3, Faktoring 1.4, İade 1.8, Karşılıksız 2.0, Avukata 2.5",
            "Yüksek risk skorlu satırlar kırmızı/turuncu renklenir; en üste toplanan bantlara öncelik verin",
            "Alınan (A) ve Verilen (V) dağılımı her kartta ayrı gösterildiğinden borç ve alacak riskini birlikte görürsünüz"
          ]
        },
        {
          "id": "gercekrisk",
          "baslik": "Gerçek Riskteki Evraklar",
          "yol": "/ekran/ceksenet/rapor/gercekrisk",
          "sub": "rapor",
          "amac": "Açık pozisyonda (portföy, bankada, ciro, faktoring, kendi çeki/senedi) olan riskli evrakları gecikme gününe göre sıralı listeler; Rapor ve Özet (pozisyon bazlı) sekmeleriyle toplam risk pozisyonunu gösterir.",
          "neden": "Firmanın gerçek tahsil edilememe riskini tek ekranda toplar. Tek müşteride yoğunlaşan riski, vadesi yaklaşan büyük tutarları ve şüpheli alacakları görüp portföy çeşitlendirme/teminat/sigorta kararları almanızı sağlar.",
          "nasil": [
            "Sağ üstteki Filtrele ile cari, pozisyon ve vade aralığı seçin (filtre zorunlu)",
            "KPI kartlarında toplam riskli evrak, vadesi gelmemiş, vadesi geçmiş adet ve toplam risk tutarını görün",
            "Rapor sekmesinde pozisyon, tür, gecikme (renk bandı), cari, evrak no, vade, banka ve tutar listelenir",
            "Özet sekmesinde riski pozisyon bazında (kaç evrak, ne tutar) gruplu görün",
            "Çok kayıt varsa alttaki sayfalama ile gezin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, pozisyon, vade aralığıyla raporu çalıştırır",
              "sonuc": "Riskli evraklar listelenir ve KPI'lar hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre yeniden istenir",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre formunu gönderir",
              "sonuc": "Rapor çalışır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "yok",
              "tetik": "Salt rapor; kayıt değiştiren olay yoktur",
              "etki": "ceksenet_fis üzerinden DURUM=1 ve açık pozisyondaki (POZISYON IN 1,2,4,13,100,101) evrakları okur; özet sekmesi pozisyona göre GROUP BY yapar",
              "neden_sonuc": "Toplam risk pozisyonunuzu gösterir. Doğru olması için evrak pozisyonlarının güncel tutulması şarttır; tahsil edilmiş ama işaretlenmemiş evrak yanlışlıkla risk olarak görünür."
            }
          ],
          "iliskiler": [
            "cari",
            "banka"
          ],
          "ipuclari": [
            "Sadece açık pozisyondaki (1,2,4,13,100,101) evraklar gelir; problemli (karşılıksız/iade/avukat) evraklar ayrı raporda",
            "Gecikme renk bandı: 30 güne kadar yeşil, 60'a kadar mavi, 90'a kadar turuncu, üstü pembe",
            "Özet sekmesi banka mutabakatı ve yönetim raporlaması için hızlı pozisyon dağılımı sunar"
          ]
        },
        {
          "id": "problemli",
          "baslik": "Problemli Evraklar",
          "yol": "/ekran/ceksenet/rapor/problemli",
          "sub": "rapor",
          "amac": "Karşılıksız çıkan (7), iade edilen (9) veya avukata verilen (10) problemli çek/senetleri listeler; Rapor ve pozisyon bazlı Özet sekmeleriyle hukuki takip ve şüpheli alacak yönetimini destekler.",
          "neden": "Tahsil edilemeyen veya hukuki süreç gerektiren evraklar ayrı izlenmelidir. Karşılıksız çekler için icra takibi başlatmak, sürekli problemli müşterileri kara listeye almak ve vergisel şüpheli alacak ayırmak için kullanılır.",
          "nasil": [
            "Sağ üstteki Filtrele ile cari, pozisyon (Karşılıksız/İade/Avukat) ve vade aralığı seçin (filtre zorunlu)",
            "KPI kartlarında toplam problemli, karşılıksız, protestolu/iade adet ve toplam tutarı görün",
            "Rapor sekmesinde pozisyon, tür, gecikme, cari, evrak no, vade, banka ve tutar listelenir",
            "Özet sekmesinde problem tipine göre adet ve tutar dağılımını inceleyin",
            "Karşılıksız evraklar için hukuki süreç, sürekli problemliler için müşteri risk skoru güncelleme aksiyonlarını planlayın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Cari, pozisyon, vade aralığıyla raporu çalıştırır",
              "sonuc": "Problemli evraklar listelenir ve KPI'lar hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Filtre yeniden istenir",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre formunu gönderir",
              "sonuc": "Rapor çalışır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "yok",
              "tetik": "Salt rapor; kayıt değiştiren olay yoktur",
              "etki": "ceksenet_fis (DURUM=1, POZISYON IN 7,9,10) problemli evrakları okur; özet sekmesi pozisyona göre GROUP BY yapar",
              "neden_sonuc": "Hangi evrakların karşılıksız/iade/avukatta olduğunu ve toplam problemli tutarı gösterir. Bu evrakların pozisyonu Alınan/Verilen ekranından doğru işaretlenmezse rapora düşmez."
            }
          ],
          "iliskiler": [
            "cari",
            "banka"
          ],
          "ipuclari": [
            "Bir evrakın bu rapora düşmesi için Alınan/Verilen ekranından Durum ile Karşılıksız (7)/İade (9)/Avukat (10) pozisyonuna alınmış olması gerekir",
            "Şüpheli alacak ayırmak vergisel avantaj sağlayabilir; muhasebeci ile değerlendirin",
            "Sürekli problemli çıkan cariler için yeni çek kabulünü sınırlandırın veya kefil/teminat isteyin"
          ]
        }
      ]
    },
    {
      "slug": "personel",
      "title": "Personel & Puantaj",
      "icon": "👤",
      "modul": "personel",
      "ad": "Personel Yönetimi",
      "ozet": "Personel modülü; çalışan kartlarını (kimlik, iletişim, ehliyet/SRC/psikoteknik belgeleri, SGK, Maaş 1/Maaş 2, taşeron, vardiya ve isteğe bağlı sistem kullanıcısı) tutar, vardiya/çalışma düzeni ve personel gruplarını tanımlar. Günlük puantaj ile giriş-çıkış, mola, fazla mesai ve ceza dakikalarını vardiya planına göre hesaplar; maaş tahakkuku, prim tahakkuku, maaş ödemesi ve avans ödemesi işlemlerini yürütür. Ödemeler otomatik olarak kasa/banka fişine (kasa_fis + kasa_hareket) dönüşür, personel cari bakiyesi (tahakkuk=borç / ödeme=alacak) profil ekranında izlenir. Hareket ve puantaj raporlarıyla bordro ve devam takibi yapılır; kritik olaylarda (puantaj, tahakkuk, ödeme) otomasyon tetikleyicileri çalışır.",
      "modul_iliskiler": [
        "kasa",
        "banka",
        "cari",
        "proje",
        "kullanici",
        "yetki",
        "dosyaarsiv",
        "otomasyon"
      ],
      "ekranlar": [
        {
          "id": "puantaj",
          "baslik": "Puantaj İşleme (Liste)",
          "yol": "/ekran/personel/islem/puantaj",
          "sub": "islem",
          "amac": "Kaydedilmiş günlük puantajların (personel_devam kayıtlarının) listelendiği ekran. Her satırda personel, tarih, gün tipi, giriş-çıkış saatleri, çalışma/mola/ceza/fazla/net dakikalar ve varsa bağlı proje görünür. Buradan yeni günlük puantaj girişine geçilir ve hatalı kayıt silinir.",
          "neden": "Devam takibinin ana görünümüdür. Kimin hangi gün çalıştığı, geç kaldığı, fazla mesai yaptığı buradan izlenir; bordronun temelini oluşturan net dakikaların doğruluğu buradan kontrol edilir.",
          "nasil": [
            "Sağ üstteki 'Günlük Puantaj' butonuyla belirli bir güne toplu puantaj girişi yapın.",
            "'Filtrele' ile personel, proje, tarih aralığı veya gün durumuna göre süzün.",
            "Listede net dakika ve fazla mesaileri kontrol edin.",
            "Yanlış girilen bir kaydı satır sonundaki 'Sil' ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Günlük Puantaj",
              "islev": "Seçilen tarih için toplu puantaj giriş ekranını açar",
              "sonuc": "Günlük puantaj işleme ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Filtrele",
              "islev": "Personel, proje, tarih ve gün durumuna göre listeyi süzer",
              "sonuc": "Kriterlere uyan puantaj kayıtları listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Seçili puantaj (devam) kaydını siler",
              "sonuc": "Onaydan sonra kayıt fiziksel olarak silinir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "puantajsil",
              "tetik": "İşlemler menüsündeki 'Sil' + onay",
              "etki": "personel_devam tablosundan ilgili kayıt fiziksel olarak silinir (soft delete değil)",
              "neden_sonuc": "Yanlış girilen bir günün puantajını kaldırır; sildiğinizde o günün net/fazla dakikaları bordro hesabından çıkar, doğru değeri günlük puantajdan yeniden girmeniz gerekir."
            }
          ],
          "iliskiler": [
            "proje",
            "vardiyalar"
          ],
          "ipuclari": [
            "Proje sütunu doluysa o günün mesaisi ilgili projeye maliyet olarak bağlanmıştır.",
            "Ceza dakikası geç gelme/erken çıkmayı, fazla dakika ise planlanandan uzun çalışmayı gösterir."
          ]
        },
        {
          "id": "puantajgunluk",
          "baslik": "Günlük Puantaj İşleme",
          "yol": "/ekran/personel/islem/puantajgunluk",
          "sub": "islem",
          "amac": "Seçilen bir tarih için çalışan personelin toplu giriş-çıkış girişinin yapıldığı ekran. Personel kartındaki vardiyadan o günün planlı saatleri ve molası otomatik gelir; her personel için gün tipi (mesai, izin, rapor, devamsız vb.), mesai başlangıç/bitiş ve mola dakikası düzenlenip topluca kaydedilir. İsteğe bağlı olarak günün mesaisi bir projeye bağlanabilir.",
          "neden": "Bordronun ham verisini üretir. Fazla mesai, ceza ve net çalışma süresi bu ekranda vardiya planıyla karşılaştırılarak hesaplanıp kaydedilir; günü işlemezseniz personelin o gününe ait çalışma kaydı ve dolayısıyla bordro verisi oluşmaz.",
          "nasil": [
            "Puantaj tarihini seçin, isterseniz grup/ad-soyad ve proje ile süzün.",
            "LİSTELE ile o güne uygun personelleri getirin.",
            "Her satırda gün tipini seçin (çalıştıysa mesai, çalışmadıysa izin/rapor/devamsız).",
            "Vardiyadan gelen giriş-çıkış ve mola saatlerini gerekiyorsa düzeltin.",
            "KAYDET'e basıp onay verin; tüm liste tek seferde işlenir."
          ],
          "butonlar": [
            {
              "ad": "LİSTELE",
              "islev": "Filtreye uyan personelleri puantaj tablosunda getirir",
              "sonuc": "Personel satırları saatleriyle listelenir",
              "renk": "primary"
            },
            {
              "ad": "KAYDET",
              "islev": "Listedeki tüm personelin o güne ait puantajını kaydeder",
              "sonuc": "Onay sonrası tüm satırlar personel_devam'a yazılır",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "İşlemi iptal eder",
              "sonuc": "Kaydetmeden çıkılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "puantajkaydet",
              "tetik": "KAYDET butonu + onay dialogu",
              "etki": "Her personel için o tarihteki mevcut personel_devam kaydı önce silinip yeniden yazılır; giriş/çıkış/mola ile vardiya gününün planlı saatleri (personel_vardiya_gun) karşılaştırılarak hesap, net, fazla ve ceza dakikaları hesaplanıp kaydedilir; PUANTAJ_KAYDEDILDI otomasyonu tetiklenir",
              "neden_sonuc": "Günü kaydettiğinizde net ve fazla dakikalar bordroya hazır olur; aynı gün tekrar kaydedilirse eski kayıt silinip güncellenir (mükerrer olmaz). Bir personelin puantajı kaydedilemezse Exception fırlatılıp işlem durur; gün ya tümüyle işlenir ya hata verir."
            }
          ],
          "iliskiler": [
            "proje",
            "vardiyalar",
            "otomasyon"
          ],
          "ipuclari": [
            "Gün tipini mesai dışına (izin/rapor/tatil) çevirdiğinizde saat alanları anlamını yitirir; hesap sadece mesai günlerinde çalışır.",
            "Proje seçerseniz o günün mesaisi projeye maliyet olarak bağlanır (BAGLI_PROJE_ID); işçilik maliyeti takibi için kullanın.",
            "Aynı güne yeniden kaydetmek güvenlidir; sistem eski kaydı silip günceller."
          ]
        },
        {
          "id": "maas",
          "baslik": "Maaş & Prim & Avans (Hareket Listesi)",
          "yol": "/ekran/personel/islem/maas",
          "sub": "islem",
          "amac": "Personellere yapılan maaş tahakkuk, maaş ödeme, prim ve avans hareketlerinin (personel_hareket) listelendiği merkez ekran. Her satırda evrak no, evrak tipi, personel, açıklama ve tutar görünür. Sağ üstteki butonlardan dört ayrı işleme (avans ödeme, maaş ödeme, prim tahakkuk, maaş tahakkuk) geçilir.",
          "neden": "Personel bordro ve ödeme sürecinin giriş kapısıdır. Hem geçmiş hareketleri görürsünüz hem de yeni tahakkuk/ödeme işlemlerini buradan başlatırsınız. Hatalı bir ödeme kaydını silerek kasa etkisini de geri alabilirsiniz.",
          "nasil": [
            "Sağ üstteki 'Maaş Tahakkuk' ile hakedişi işleyin.",
            "'Maaş Ödeme' / 'Avans Ödeme' ile kasa/bankadan çıkış yaparak ödeyin.",
            "'Prim Tahakkuk' ile prim hakedişi girin.",
            "Bir kaydı 'Yazdır' ile fiş olarak yazdırın, gerekiyorsa 'Sil' ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Maaş Tahakkuk",
              "islev": "Toplu maaş hakediş girişi ekranını açar",
              "sonuc": "Maaş tahakkuk ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Prim Tahakkuk",
              "islev": "Toplu prim hakediş girişi ekranını açar",
              "sonuc": "Prim tahakkuk ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Maaş Ödeme",
              "islev": "Kasadan maaş ödeme ekranını açar",
              "sonuc": "Maaş ödeme ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Avans Ödeme",
              "islev": "Kasadan avans ödeme ekranını açar",
              "sonuc": "Avans ödeme ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Seçili hareketin fişini yazdırır",
              "sonuc": "Fiş yazdırma önizlemesi açılır",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Seçili hareketi siler",
              "sonuc": "Onaydan sonra hareket ve varsa kasa kaydı silinir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "hareketsil",
              "tetik": "İşlemler menüsündeki 'Sil' + onay",
              "etki": "personel_hareket kaydı fiziksel silinir; kayıt bir ödeme ise (ISLEM_TIP=1) ilgili kasa_hareket kayıtları EVRAK_NO+EVRAK_TIP ile silinir, o ana evrak numarasına ait başka kasa_hareket kalmadıysa kasa_fis de silinir",
              "neden_sonuc": "Yanlış maaş/avans/prim kaydını geri alır. Ödeme silindiğinde kasadan çıkmış tutar da otomatik geri döner, böylece kasa bakiyeniz tutarlı kalır; silmezseniz personelin cari bakiyesi ve kasa yanlış kalır. Tahakkuk (ISLEM_TIP=0) kayıtlarında kasaya dokunulmaz."
            }
          ],
          "iliskiler": [
            "kasa",
            "banka",
            "cari"
          ],
          "ipuclari": [
            "Evrak tipleri: 701 maaş (tahakkuk ve ödeme), 702 avans, 703 prim; ISLEM_TIP=0 tahakkuk/borç, ISLEM_TIP=1 ödeme/alacak.",
            "Bir ödeme kaydını silmek kasadaki karşı kaydı da sildiği için kasayı elle düzeltmenize gerek yoktur.",
            "Ödeme evrak numaraları ana no'ya '-sıra' eklenerek üretilir (ör. 701...-1, -2); silmede ana no ile eşleştirilir."
          ]
        },
        {
          "id": "maastahakkuk",
          "baslik": "Maaş Tahakkuk",
          "yol": "/ekran/personel/islem/maastahakkuk",
          "sub": "islem",
          "amac": "Seçilen döneme (tarihe) toplu maaş hakedişinin işlendiği ekran. Çalışan personel listelenir; her personelin Maaş 1 ve Maaş 2 tutarları gösterilir ve tahakkuk kutusuna önerilir. İstenen tutarlar düzenlenip toplu kaydedilir.",
          "neden": "Ödeme yapmadan önce personelin firmadan alacağını (hakedişini) kayda geçirir. Tahakkuk, personel cari hesabına borç (ISLEM_TIP=0) olarak yazılır; ödeme daha sonra bu borcu kapatır. Bordro-mahsup mantığının ilk adımıdır.",
          "nasil": [
            "Tahakkuk tarihini seçin, gerekiyorsa grup/anahtar kelime ile süzün.",
            "LİSTELE ile personelleri getirin.",
            "Her satırdaki tahakkuk tutarını kontrol edin/düzeltin.",
            "KAYDET'e basıp onay verin; tutarı sıfır/boş bırakılan personele işlem yapılmaz."
          ],
          "butonlar": [
            {
              "ad": "LİSTELE",
              "islev": "Filtreye uyan personelleri maaş tutarlarıyla getirir",
              "sonuc": "Personel + önerilen tahakkuk listelenir",
              "renk": "primary"
            },
            {
              "ad": "KAYDET",
              "islev": "Girilen tutarlarda toplu maaş tahakkuku işler",
              "sonuc": "Onay sonrası her personele 701/tahakkuk kaydı oluşur",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "İptal eder",
              "sonuc": "Kaydetmeden çıkılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "maastahakkuk",
              "tetik": "KAYDET butonu + onay dialogu",
              "etki": "Tutarı 0'dan büyük her personel için personel_hareket'e EVRAK_TIP=701, ISLEM_TIP=0 (borç/tahakkuk) kaydı ekler, her birine 701 seri evrak no üretir; MAAS_TAHAKKUK_YAPILDI otomasyonu tetiklenir",
              "neden_sonuc": "Personelin o ay hak ettiği maaşı cari borç olarak yazar; böylece profil bakiyesinde 'ne kadar ödenmeli' görünür. Tahakkuk yapmadan ödeme yaparsanız cari hesap ödeme lehine (alacaklı) görünür ve mahsup takibi bozulur."
            }
          ],
          "iliskiler": [
            "cari",
            "otomasyon"
          ],
          "ipuclari": [
            "Maaş 1 girilmemiş/sıfırsa sistem personel ayarlarındaki varsayılan maaşı (config personel defmaas) önerir; Maaş 2 kartta ne girildiyse odur.",
            "Tahakkuk kasayı etkilemez; para çıkışı sadece Maaş Ödeme ekranında olur.",
            "Tutarı sıfır bırakılan personel işleme dahil edilmez; sadece istediklerinize tahakkuk açabilirsiniz."
          ]
        },
        {
          "id": "primtahakkuk",
          "baslik": "Prim Tahakkuk",
          "yol": "/ekran/personel/islem/primtahakkuk",
          "sub": "islem",
          "amac": "Personellere prim/ikramiye hakedişinin toplu işlendiği ekran. Çalışan personel listelenir; her biri için serbest açıklama ve prim tutarı girilir, tutar girilenlere toplu tahakkuk yapılır.",
          "neden": "Performans primi, ikramiye, bayram parası gibi maaş dışı hakedişleri personel cari hesabına borç olarak yazmak için kullanılır. Açıklama alanı sayesinde primin nedeni kayıt altına alınır.",
          "nasil": [
            "Tahakkuk tarihini seçin, gerekiyorsa süzün ve LİSTELE'ye basın.",
            "Prim verilecek personellerin açıklamasını yazın (ör. 'Satış primi').",
            "Prim tutarını girin (boş bırakılanlara işlem yapılmaz).",
            "KAYDET'e basıp onaylayın."
          ],
          "butonlar": [
            {
              "ad": "LİSTELE",
              "islev": "Filtreye uyan personelleri getirir",
              "sonuc": "Personel listesi açılır",
              "renk": "primary"
            },
            {
              "ad": "KAYDET",
              "islev": "Girilen tutar ve açıklamalarla toplu prim tahakkuku işler",
              "sonuc": "Onay sonrası 703/tahakkuk kayıtları oluşur",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "İptal eder",
              "sonuc": "Kaydetmeden çıkılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "primtahakkuk",
              "tetik": "KAYDET butonu + onay dialogu",
              "etki": "Tutarı 0'dan büyük her personel için personel_hareket'e EVRAK_TIP=703, ISLEM_TIP=0 (tahakkuk) kaydı, satıra girilen açıklamayla birlikte eklenir; PRIM_TAHAKKUK_YAPILDI otomasyonu tetiklenir",
              "neden_sonuc": "Prim hakedişini cari borca ekler; profildeki aylık özet ve bakiyeye yansır. Açıklama girmezseniz primin nedeni takip edilemez; tutar girmezseniz o personel primden yararlanamaz."
            }
          ],
          "iliskiler": [
            "cari",
            "otomasyon"
          ],
          "ipuclari": [
            "Prim de tahakkuktur; parayı ödemek için ayrıca Maaş Ödeme ekranından bakiyeyi ödemeniz gerekir.",
            "Açıklamayı anlamlı yazın; profil ekstresinde bu metin görünür."
          ]
        },
        {
          "id": "maasodeme",
          "baslik": "Maaş Ödeme",
          "yol": "/ekran/personel/islem/maasodeme",
          "sub": "islem",
          "amac": "Personellere maaş ödemesinin kasa/bankadan yapıldığı ekran. Her personel için ödenecek tutar girilir; bir kasa/banka hesabı seçilerek toplu ödeme kaydedilir.",
          "neden": "Tahakkuk edilmiş maaş borcunun fiilen ödendiği ve paranın kasadan çıktığı adımdır. Bu işlem hem personel cari hesabını (alacak yönünde) hareketlendirir hem de kasa/banka bakiyesini azaltır; muhasebe ile kasa tutarlılığını sağlar.",
          "nasil": [
            "Ödeme tarihini seçin, gerekiyorsa grup/ad ile süzüp LİSTELE'ye basın.",
            "Her personel için ödenecek tutarı girin/kontrol edin.",
            "Alttan 'Ödeme Yeri' olarak kasa veya banka hesabını seçin.",
            "KAYDET'e basıp onaylayın; tutarı sıfır olanlar ödenmez."
          ],
          "butonlar": [
            {
              "ad": "LİSTELE",
              "islev": "Filtreye uyan personelleri getirir",
              "sonuc": "Personel + ödeme tutarı listelenir",
              "renk": "primary"
            },
            {
              "ad": "KAYDET",
              "islev": "Seçili kasadan toplu maaş ödemesi yapar",
              "sonuc": "Onay sonrası ödeme kayıtları + tek kasa çıkış fişi oluşur",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "İptal eder",
              "sonuc": "Kaydetmeden çıkılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "maasodeme",
              "tetik": "KAYDET butonu + onay dialogu",
              "etki": "Tutarı 0'dan büyük her personel için personel_hareket'e EVRAK_TIP=701, ISLEM_TIP=1 (ödeme/alacak) kaydı; ayrıca seçilen kasa için tek bir kasa_fis (alacak/çıkış) ve her personel için bir kasa_hareket satırı (borç) oluşturulur; seçilen kasa DURUM=1 değilse Exception fırlatılır; MAAS_ODEMESI_YAPILDI otomasyonu tetiklenir",
              "neden_sonuc": "Ödeme yaptığınızda personelin cari hesabına ödeme işlenir ve kasadan para çıkışı otomatik yazılır. Kasa seçmezseniz veya geçersiz/pasif kasa seçerseniz işlem hata verir ve hiçbir şey kaydedilmez; ödeme yapılmazsa personel cari borçlu kalmaya devam eder."
            }
          ],
          "iliskiler": [
            "kasa",
            "banka",
            "cari",
            "otomasyon"
          ],
          "ipuclari": [
            "Ödeme mutlaka bir kasa/banka hesabı gerektirir; doğru hesabı seçtiğinizden emin olun.",
            "Tutarı kısmi ödeme için düşürebilirsiniz; sıfır bıraktığınız personel ödemeden çıkar.",
            "Bu ekran para çıkışı yaratır; yanlışlıkla iki kez kaydetmeyin, gerekirse maaş listesinden silin (kasa da geri döner)."
          ]
        },
        {
          "id": "avansodeme",
          "baslik": "Avans Ödeme",
          "yol": "/ekran/personel/islem/avansodeme",
          "sub": "islem",
          "amac": "Personellere maaş öncesi avans ödemesinin kasa/bankadan yapıldığı ekran. Her personel için serbest açıklama ve avans tutarı girilir, bir kasa/banka seçilerek toplu ödenir.",
          "neden": "Maaş gününden önce personele verilen ön ödemeleri kayda alır. Avans, personelin cari hesabına ödeme (ISLEM_TIP=1) olarak işlenir; maaş tahakkuku/ödemesinde bakiyeden düşülerek çift ödemenin önüne geçilir.",
          "nasil": [
            "Ödeme tarihini seçin, gerekiyorsa süzüp LİSTELE'ye basın.",
            "Avans verilecek personellerin tutarını girin.",
            "'Ödeme Yeri' kasa/banka hesabını seçin.",
            "KAYDET'e basıp onaylayın; tutar girilmeyen personele avans verilmez."
          ],
          "butonlar": [
            {
              "ad": "LİSTELE",
              "islev": "Filtreye uyan personelleri getirir",
              "sonuc": "Personel listesi açılır",
              "renk": "primary"
            },
            {
              "ad": "KAYDET",
              "islev": "Seçili kasadan toplu avans ödemesi yapar",
              "sonuc": "Onay sonrası avans kayıtları + kasa çıkış fişi oluşur",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "İptal eder",
              "sonuc": "Kaydetmeden çıkılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "avansodeme",
              "tetik": "KAYDET butonu + onay dialogu",
              "etki": "Tutarı 0'dan büyük her personel için personel_hareket'e EVRAK_TIP=702, ISLEM_TIP=1 (ödeme) kaydı; seçilen kasa için kasa_fis ve her personel için kasa_hareket (borç/çıkış) oluşturulur; kasa DURUM=1 değilse Exception fırlatılır; AVANS_ODEMESI_YAPILDI otomasyonu tetiklenir",
              "neden_sonuc": "Avans verildiğinde kasadan para çıkar ve personelin cari hesabına ödeme işlenir. Maaş hesabında bu avans bakiyeden düşülür; avansı sisteme girmezseniz maaş gününde fazladan ödeme yapma riski doğar."
            }
          ],
          "iliskiler": [
            "kasa",
            "banka",
            "cari",
            "otomasyon"
          ],
          "ipuclari": [
            "Avans da kasadan gerçek para çıkışıdır; ödeme yerini doğru seçin.",
            "Açıklama alanına avansın nedenini yazmak profil ekstresinde takibi kolaylaştırır.",
            "Avans sonrası maaş hesabında bakiye zaten avansı düşülmüş gelir, ayrıca elle düşmeyin."
          ]
        },
        {
          "id": "liste",
          "baslik": "Personel Listesi",
          "yol": "/ekran/personel/tanim/liste",
          "sub": "tanim",
          "amac": "Firmadaki tüm çalışanların tek listede görüldüğü ana ekran. Her personelin fotoğrafı, T.C. kimlik no, adı soyadı, telefonları, e-postası ve çalışıyor/ayrıldı durumu listelenir; buradan yeni kart eklenir, profile girilir, düzenleme ve silme yapılır. Excel ve A4 yazdırma çıktısı alınır.",
          "neden": "İnsan kaynağınızın merkezi kaydıdır. Bordro, puantaj, maaş ve ödeme işlemlerinin tamamı bu listedeki personel kartlarına bağlıdır. Personel eklemeden puantaj veya maaş işlemi yapılamaz.",
          "nasil": [
            "Sağ üstteki 'Kart Ekle' butonuyla yeni personel kartı açın.",
            "Aradığınız personeli bulmak için 'Filtrele' ile anahtar kelime, kimlik no, ünvan, durum veya kayıt tarihi girin.",
            "Bir personelin satırından 'Profil' ile mali ve puantaj özetini görün.",
            "'Düzenle' ile kart bilgilerini güncelleyin, 'Sil' ile pasif hale getirin.",
            "Alttaki EXCEL veya YAZDIR butonuyla listeyi dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Kart Ekle",
              "islev": "Yeni personel kartı oluşturma ekranını açar",
              "sonuc": "Boş personel kartı formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Anahtar kelime, kimlik no, ünvan, durum ve kayıt tarihine göre listeyi süzer",
              "sonuc": "Kriterlere uyan personeller listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Profil",
              "islev": "Personelin detay/profil ekranına gider",
              "sonuc": "Mali özet, puantaj özeti ve hareketler açılır",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Personel kartını düzenleme modunda açar",
              "sonuc": "Kart formu mevcut bilgilerle dolu açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Personel kartını siler (soft delete)",
              "sonuc": "Onaydan sonra kart pasifleşir, listeden kalkar",
              "renk": "danger"
            },
            {
              "ad": "EXCEL",
              "islev": "Listeyi Excel dosyasına aktarır",
              "sonuc": "kartliste Excel dosyası indirilir",
              "renk": "ghost"
            },
            {
              "ad": "YAZDIR",
              "islev": "Listeyi A4 yazdırma çıktısına dönüştürür",
              "sonuc": "Yazdırılabilir kart listesi yeni sekmede açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "kartsil",
              "tetik": "İşlemler menüsündeki 'Sil' + onay dialogu",
              "etki": "personel_kart tablosunda DURUM=-1 yapılır, DELETE_TIME/DELETE_ID yazılır (fiziksel silme yok)",
              "neden_sonuc": "Ayrılan/yanlış girilen personeli listeden kaldırır ama geçmiş maaş ve puantaj kayıtları korunur; kalıcı silinmediği için mali geçmiş bozulmaz."
            }
          ],
          "iliskiler": [
            "kullanici",
            "proje",
            "kasa"
          ],
          "ipuclari": [
            "Silme işlemi kaydı yok etmez, sadece pasifleştirir; ayrılan personeli kart durumunda 'Ayrıldı' yapmak çoğu zaman silmekten daha doğrudur.",
            "'Kart Ekle' ve 'Profil' menüde ayrı sayfa değildir; personel listesinin alt sayfalarıdır (kart, profil)."
          ]
        },
        {
          "id": "kart",
          "baslik": "Personel Kartı (Ekle / Düzenle)",
          "yol": "/ekran/personel/tanim/kart",
          "sub": "tanim",
          "amac": "Tek bir personelin tüm bilgilerinin girildiği sekmeli form: Genel (grup, T.C., ad-soyad, çalışma düzeni/vardiya, fotoğraf ve isteğe bağlı sistem kullanıcısı), İletişim (adres, e-posta, iki telefon), Kişisel (medeni durum, kan grubu, doğum tarihi, ehliyet/SRC/psikoteknik belgeleri) ve Çalışma (taşeron firma, SGK no, Maaş 1/Maaş 2, çalışıyor/ayrıldı, işe başlama/ayrılma tarihi ve nedeni).",
          "neden": "Personelin sicil dosyasıdır. Buradaki vardiya seçimi puantaja, Maaş 1/Maaş 2 tutarları maaş tahakkukuna, durum bilgisi ise tüm işlem listelerinin süzgecine kaynak olur. Ayrıca istenirse personele ERP'ye giriş yapabileceği bir kullanıcı hesabı burada oluşturulur.",
          "nasil": [
            "Genel sekmesinde personel grubunu, T.C. kimlik no ve ad-soyadı girin, çalışma düzeni (vardiya) seçin.",
            "İsterseniz fotoğrafı yükleyin.",
            "Personelin sisteme girmesini istiyorsanız 'Kullanıcı Oluştur'u işaretleyip kullanıcı adı, rol ve şifre belirleyin.",
            "İletişim ve Kişisel sekmelerinde adres, telefon, belge bilgilerini doldurun.",
            "Çalışma sekmesinde taşeron, SGK no, Maaş 1/Maaş 2 ve çalışma durumunu girin.",
            "KAYDET ile kartı oluşturun veya güncelleyin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Formu gönderip personel kartını ekler/günceller",
              "sonuc": "Kart kaydedilir; yeni kullanıcı istendiyse birlikte oluşturulur",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Kaydetmeden çıkar",
              "sonuc": "Değişiklikler kaydedilmeden önceki ekrana dönülür",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "kartekle",
              "tetik": "KAYDET butonu (FTanim formu)",
              "etki": "personel_kart tablosuna yeni kayıt ekler ya da mevcut kaydı günceller; fotoğraf yüklenir, düzenlemede eski foto dosyadan silinir; 'Kullanıcı Oluştur' seçiliyse main veritabanında user kaydı ve seçilen role göre user_yetki satırları yazılır, karta KULLANICI_ID/ROL_ID bağlanır",
              "neden_sonuc": "Doğru girilen kart; puantaj, maaş ve ödeme ekranlarının çalışması için ön koşuldur. Vardiya seçilmezse günlük puantajda o günün planlı saatleri boş gelir; Maaş 1 girilmezse maaş tahakkukunda varsayılan maaş önerilir. Kullanıcı adı sistemde zaten varsa işlem hata verir ve durur (Exception)."
            }
          ],
          "iliskiler": [
            "kullanici",
            "yetki",
            "cari",
            "personelgrup",
            "vardiyalar",
            "dosyaarsiv"
          ],
          "ipuclari": [
            "Taşeron firma alanı cari/müşteri arama (musteriAdi) ile bağlanır; taşeron personeli takip ediyorsanız VKN/TCK veya ünvan ile seçin.",
            "Kullanıcı hesabı bir kez oluşturulduktan sonra bu ekrandan değil, Yönetim > Kullanıcılar menüsünden yönetilir.",
            "Maaş 1 ve Maaş 2 iki ayrı bileşen (ör. resmi + elden) gibi kullanılabilir; maaş tahakkukunda önerilen tutar bu alanlardan gelir."
          ]
        },
        {
          "id": "profil",
          "baslik": "Personel Profili",
          "yol": "/ekran/personel/tanim/profil",
          "sub": "tanim",
          "amac": "Tek personelin 360 derece kartıdır: fotoğraf ve kişisel bilgiler, tahakkuk (borç) / ödeme (alacak) / bakiye özeti, içinde bulunulan yılın puantaj özeti (normal/izin/rapor/devamsız gün, toplam/fazla/net çalışma süresi), aylık mali özet (maaş tahakkuk, maaş ödeme, prim, avans) ve son hareketler cari ekstresi ile (ayar açıksa) dosya arşivi.",
          "neden": "Bir çalışanın firmaya olan mali durumunu ve devam performansını tek ekranda görmek için kullanılır. 'Bu personele ne kadar borçluyum, ne kadar ödedim, bu ay kaç gün çalıştı' sorularının anlık cevabıdır.",
          "nasil": [
            "Personel listesinden 'Profil' ile bu ekrana girin.",
            "Sol kartta güncel tahakkuk(borç)/ödeme(alacak)/bakiye durumunu görün.",
            "Özet bölümünde yıllık puantaj ve aylık mali dökümü inceleyin.",
            "Hareketler bölümünde tarih sıralı cari ekstreyi görün ve fişleri yazdırın.",
            "Gerekirse Dosya Arşivi sekmesinden belge (sözleşme, kimlik vb.) yükleyin.",
            "Sağ üstteki 'Düzenle' ile karta geçip bilgi güncelleyin."
          ],
          "butonlar": [
            {
              "ad": "Düzenle",
              "islev": "Personel kartını düzenleme modunda açar",
              "sonuc": "Kart formu açılır",
              "renk": "accent"
            },
            {
              "ad": "Yazdır (Fiş)",
              "islev": "Hareketler listesinde ilgili maaş/avans/prim fişini yazdırır (helper.printModal)",
              "sonuc": "Seçilen evrakın yazdırma önizlemesi açılır",
              "renk": "ghost"
            },
            {
              "ad": "Yükle (Dosya)",
              "islev": "Personele belge/dosya ekler (dosya arşivi, YER=3)",
              "sonuc": "Dosya arşive kaydedilir ve listelenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa",
            "cari",
            "dosyaarsiv"
          ],
          "ipuclari": [
            "Bakiye pozitifse (kırmızı) personele borçlusunuz, negatifse (yeşil) fazla ödeme yapılmış demektir.",
            "Aylık mali özet ve puantaj özeti içinde bulunulan yıla aittir; geçmiş dönemler için Hareket/Puantaj Raporunu kullanın.",
            "Dosya Arşivi sekmesi yalnızca dosya arşivi ayarı (dosyaarsiv 'yer') açıksa görünür."
          ]
        },
        {
          "id": "personelgrup",
          "baslik": "Personel Grupları",
          "yol": "/ekran/personel/tanim/personelgrup",
          "sub": "tanim",
          "amac": "Personelleri kategorize etmek için grup (departman/kadro/ekip) tanımlarının eklendiği, düzenlendiği ve listelendiği ekran. Her grup ad ve aktif/pasif durumdan oluşur.",
          "neden": "Puantaj, maaş tahakkuku, ödeme ve raporlarda personeli grup bazında süzmeyi sağlar. Örneğin sadece 'Şoförler' veya 'Ofis' grubuna toplu maaş tahakkuku yapmak grup tanımı gerektirir.",
          "nasil": [
            "Ad alanına grup adını yazın, durumu Aktif seçin.",
            "KAYDET ile grubu ekleyin.",
            "Alt listeden bir grubu 'Düzenle' ile güncelleyin.",
            "Kullanılmayan grubu 'Sil' ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Grup tanımını ekler veya günceller",
              "sonuc": "Grup kaydedilir ve listeye eklenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu temizler/iptal eder",
              "sonuc": "Giriş sıfırlanır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili grubu düzenleme modunda açar",
              "sonuc": "Form grup bilgisiyle dolar",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Grubu siler (soft delete)",
              "sonuc": "Onaydan sonra grup pasifleşir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "personelgrupekle",
              "tetik": "KAYDET butonu",
              "etki": "personel_grup tablosuna yeni kayıt ekler ya da mevcut ID'yi (DURUM 0/1) günceller",
              "neden_sonuc": "Grup tanımlarsanız personeli kategorilere ayırıp toplu işlem yapabilirsiniz; tanımlamazsanız tüm işlemler tüm personel üzerinden yürür ve grup bazlı süzme yapılamaz."
            },
            {
              "ad": "personelgrupsil",
              "tetik": "Sil butonu + onay",
              "etki": "personel_grup tablosunda DURUM=-1 yapılır, DELETE_TIME/DELETE_ID yazılır",
              "neden_sonuc": "Yanlış/kullanılmayan grubu gizler; grup silinse de o gruba bağlı personel kartları etkilenmez, sadece grup referansı boşta kalır."
            }
          ],
          "iliskiler": [],
          "ipuclari": [
            "Grubu silmek personeli silmez; personel kartında grup yeniden atanana kadar grupsuz görünür.",
            "Pasif gruplar personel kartı formundaki grup seçim listesinde çıkmaz."
          ]
        },
        {
          "id": "vardiyalar",
          "baslik": "Vardiyalar (Çalışma Düzeni)",
          "yol": "/ekran/personel/tanim/vardiyalar",
          "sub": "tanim",
          "amac": "Haftanın 7 günü için çalışma düzeni tanımlanan ekran. Her vardiyaya kod ve ad verilir; her gün için gün tipi (Normal Gün / Hafta Tatili), başlangıç saati, bitiş saati ve mola dakikası girilir. Sistem normal günler için hedef çalışma süresini otomatik hesaplar.",
          "neden": "Günlük puantajın belkemiğidir. Personel kartına atanan vardiya, puantaj ekranında o günün beklenen giriş-çıkış saatlerini ve mola süresini otomatik doldurur; fazla mesai ve ceza (geç gelme/erken çıkma) hesabı bu tanıma göre yapılır.",
          "nasil": [
            "Vardiyaya bir kod ve ad verin (ör. GUNDUZ - Gündüz Vardiyası).",
            "Her gün için gün tipini seçin (çalışılıyorsa Normal, tatilse Hafta Tatili).",
            "Çalışılan günlere başlangıç-bitiş saati ve mola dakikasını girin.",
            "KAYDET ile vardiyayı oluşturun.",
            "Alt listeden vardiyayı 'Düzenle' veya 'Sil' ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Vardiya kartını ve 7 günün detayını kaydeder",
              "sonuc": "Vardiya ve gün planı kaydedilir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "İptal eder",
              "sonuc": "Giriş sıfırlanır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili vardiyayı düzenlemeye açar",
              "sonuc": "Form gün detaylarıyla dolar",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Vardiyayı siler",
              "sonuc": "Onaydan sonra vardiya ve günleri silinir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "vardiyaekle",
              "tetik": "KAYDET butonu",
              "etki": "personel_vardiya tablosuna kart, personel_vardiya_gun tablosuna 7 gün kaydı yazar; düzenlemede eski gün kayıtları önce silinip yeniden eklenir (mükerrer önleme); normal günlerde hedef süre \\Servis\\Hesapla::mesaiHesapla ile otomatik hesaplanır",
              "neden_sonuc": "Vardiya doğru tanımlanırsa puantajda saatler ve mola otomatik dolar, fazla mesai/ceza doğru hesaplanır; hatalı saat girilirse o vardiyadaki tüm personelin puantaj hesabı yanlış çıkar. Bir gün kaydı yazılamazsa Exception fırlatılır."
            },
            {
              "ad": "vardiyasil",
              "tetik": "Sil butonu + onay",
              "etki": "personel_vardiya ve personel_vardiya_gun kayıtları fiziksel silinir; bu vardiyayı kullanan personel_kart kayıtlarında VARDIYA_ID=0 yapılır",
              "neden_sonuc": "Kullanılmayan vardiyayı kaldırır ve bağlı personellerin referansını temizler; böylece silinmiş vardiyaya işaret eden bozuk kayıt kalmaz, ancak o personellere yeni vardiya atamanız gerekir."
            }
          ],
          "iliskiler": [],
          "ipuclari": [
            "Hafta Tatili seçilen günlerde saat girmeye gerek yoktur, hedef süre sıfır kabul edilir.",
            "Vardiya silindiğinde personellerin çalışma düzeni boşalır; puantaj öncesi yeni vardiya atamayı unutmayın.",
            "Mola dakikası net çalışmadan düşülür; yemek molasını mutlaka girin."
          ]
        },
        {
          "id": "hareketrapor",
          "baslik": "Hareket Raporu",
          "yol": "/ekran/personel/rapor/hareketrapor",
          "sub": "rapor",
          "amac": "Personellere yapılan tüm parasal hareketleri (maaş tahakkuk/ödeme, prim, avans) tek listede gösteren rapor. Üstte KPI kartları (toplam hareket, alacak/borç adedi, net tutar) ve tablo halinde evrak, işlem tipi, personel, açıklama ve tutar bulunur. Performans için filtre seçimi zorunludur.",
          "neden": "Personel bazlı ödeme geçmişini ve cari akışını raporlamak, ay sonu mutabakat yapmak, banka EFT'lerini evrak no ile eşleştirmek ve olası ödeme anlaşmazlıklarında belge göstermek için kullanılır.",
          "nasil": [
            "'Filtreleme Yap' ile personel, evrak no ve tarih aralığını girin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "KPI kartlarından net tutar ve hareket adetlerini okuyun.",
            "Gerekirse Excel veya Yazdır ile çıktı alın, satırdan fiş yazdırın."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Filtre modalını açar (rapor filtresiz çalışmaz)",
              "sonuc": "Filtre kriter ekranı açılır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen kriterlerle raporu getirir",
              "sonuc": "Hareketler ve KPI'lar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Kriterler temizlenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Excel dosyası indirilir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Raporu A4 çıktısına dönüştürür",
              "sonuc": "Yazdırma önizlemesi açılır",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır (Fiş)",
              "islev": "Satırdaki hareketin fişini yazdırır",
              "sonuc": "Fiş önizlemesi açılır",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Satırdaki hareketi siler",
              "sonuc": "Onaydan sonra hareket (ve varsa kasa kaydı) silinir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "hareketsil",
              "tetik": "Rapor satırındaki 'Sil' + onay",
              "etki": "personel_hareket kaydı silinir; ödeme kaydıysa (ISLEM_TIP=1) ilgili kasa_hareket ve gerekiyorsa kasa_fis de temizlenir",
              "neden_sonuc": "Rapordan doğrudan hatalı hareketi düzeltmenizi sağlar; ödeme silinince kasa etkisi de geri döner, böylece rapor ve kasa tutarlı kalır."
            }
          ],
          "iliskiler": [
            "kasa",
            "cari"
          ],
          "ipuclari": [
            "Net tutar = personele ödemeler (alacak) eksi tahakkuk/borç; ay sonu mutabakat için pratiktir.",
            "Kayıt sayısı yüksek olabileceğinden rapor filtre seçmeden çalışmaz, tarih aralığını mutlaka daraltın.",
            "Evrak no ile banka ekstresini eşleştirerek ödeme doğrulaması yapın."
          ]
        },
        {
          "id": "puantajrapor",
          "baslik": "Puantaj Raporu",
          "yol": "/ekran/personel/rapor/puantajrapor",
          "sub": "rapor",
          "amac": "Personellerin günlük giriş-çıkış ve çalışma sürelerini dakika bazında listeleyen devam raporu. KPI kartları (toplam kayıt, net çalışma, fazla mesai, ceza dakikası) ve gün tipi, giriş-çıkış, çalışma/mola/ceza/fazla/net dakikaları içeren tablo ile alt toplam satırı sunar. Filtre zorunludur.",
          "neden": "Aylık bordroyu doğru hesaplamak, fazla mesaiyi zamlı ödemek, devamsızlığı kesintiye çevirmek ve izin/rapor kullanımını takip etmek için kullanılır. Net dakika toplamı bordronun temel girdisidir.",
          "nasil": [
            "'Filtreleme Yap' ile personel, tarih aralığı ve gün durumunu seçin.",
            "'Arama Yap' ile raporu çalıştırın.",
            "KPI ve alt toplam satırından net/fazla/ceza dakikalarını okuyun.",
            "Excel veya Yazdır ile bordro ekine çıktı alın."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Filtre modalını açar (rapor filtresiz çalışmaz)",
              "sonuc": "Filtre kriter ekranı açılır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen kriterlerle puantajları getirir",
              "sonuc": "Puantaj kayıtları ve KPI'lar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Kriterler temizlenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel'e aktarır",
              "sonuc": "Excel dosyası indirilir",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Raporu A4 çıktısına dönüştürür",
              "sonuc": "Yazdırma önizlemesi açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "vardiyalar"
          ],
          "ipuclari": [
            "Alt toplam satırı seçili dönemin toplam net/fazla/ceza dakikalarını verir, doğrudan bordroya taşıyabilirsiniz.",
            "Gün durumu filtresiyle sadece izinli, raporlu veya devamsız günleri süzebilirsiniz.",
            "Fazla mesai dakikasını iş kanunu gereği zamlı hesaplamayı unutmayın."
          ]
        }
      ]
    },
    {
      "slug": "proje",
      "title": "Proje Yönetimi",
      "icon": "📊",
      "modul": "proje",
      "ad": "Proje Yönetimi",
      "ozet": "Proje Yönetimi modülü; işletmenin projelerini, bu projelere bağlı görevleri (Kanban listeleri, öncelik, personel atama, kontrol listesi, yorum ve özel alanlarla) tek yerde toplar. Projeye bağlanan fatura, irsaliye, sipariş, teklif, ödeme/tahsilat, masraf ve servis kayıtları proje detayında konsolide edilir; böylece her projenin hem iş akışı hem de kâr/zarar tablosu görülür. Personel iş yükü, verimlilik, süre sapması, Kanban yoğunluğu ve proje sağlığı gibi yönetimsel raporlarla karar desteği sağlar. Yeni görev oluşturma ve görev tamamlama olayları otomasyon (n8n) tetikleyicilerine bağlıdır.",
      "modul_iliskiler": [
        "cari",
        "fatura",
        "irsaliye",
        "siparis",
        "teklif",
        "kasa",
        "masraf",
        "servis",
        "personel",
        "stok",
        "otomasyon"
      ],
      "ekranlar": [
        {
          "id": "projeliste",
          "baslik": "Projeler",
          "yol": "/ekran/proje/islem/projeliste",
          "sub": "islem",
          "amac": "İşletmedeki tüm projelerin listelendiği ana ekran. Her projenin adı, süreli olup olmadığı, başlangıç/bitiş tarihi ve varsa bağlı olduğu müşteri (cari) burada görünür.",
          "neden": "Firmanın hangi işleri proje olarak yürüttüğünü tek listede görmek, yeni proje açmak, mevcut projeyi düzenlemek/silmek ve proje detayına (görevler + finansal özet) girmek için başlangıç noktasıdır.",
          "nasil": [
            "Listeden mevcut projeleri görüntüleyin; her satırda ad, süre ve cari bilgisi vardır",
            "Yeni proje için sağ üstteki 'Proje Oluştur' butonuna basın",
            "Açılan formda proje adı, süreli mi (tarih aralığı), müşteriye özel mi (cari seçimi), açıklama ve durum girip Kaydet'e basın",
            "Kayıttan sonra sistem projeyi ve 4 varsayılan Kanban listesini (Yapılacaklar, Devam Edenler, Kontrol, Tamamlandı) otomatik oluşturur",
            "Satır sonundaki İşlemler menüsünden Görüntüle ile proje detayına girin, Yazdır ile proje kartını yazdırın, Düzenle/Sil yapın",
            "Çok kayıt varsa alttaki sayfalama ile gezinin (sayfa başına 50 kayıt)"
          ],
          "butonlar": [
            {
              "ad": "Proje Oluştur",
              "islev": "Yeni proje tanım formunu açar",
              "sonuc": "Boş proje formu açılır; kayıt sonrası proje ve varsayılan Kanban listeleri oluşur",
              "renk": "primary"
            },
            {
              "ad": "Görüntüle",
              "islev": "Proje detay ekranına gider",
              "sonuc": "Projenin görevleri, Kanban panosu, grafikleri ve finansal sekmeleri (fatura/irsaliye/sipariş/teklif/ödeme-tahsilat/masraf/servis) açılır",
              "renk": "primary"
            },
            {
              "ad": "Yazdır",
              "islev": "Proje kartını yazdırma önizlemesi açar (evrak tip 803)",
              "sonuc": "Proje kartı çıktısı alınır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Proje tanım formunu dolu olarak açar",
              "sonuc": "Proje bilgileri güncellenebilir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Projeyi siler (onay ister)",
              "sonuc": "Proje silinmiş duruma (DURUM=-1) alınır, listeden kalkar",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "projeekle",
              "tetik": "Proje formunda Kaydet",
              "etki": "proje_kart tablosuna yeni kayıt ekler veya günceller; yeni projede proje_liste'ye 4 varsayılan Kanban kolonu ve evrak işlem logu (803) oluşturur, ANA_POSITION=1 ve ilk alt pozisyonu atar",
              "neden_sonuc": "Bu adımı yapınca işi bir proje olarak takip etmeye başlarsınız ve içine görev/finansal kayıt bağlayabilirsiniz. Yapmazsanız işler dağınık kalır, projeye masraf/fatura ilişkilendiremezsiniz."
            },
            {
              "ad": "projesil",
              "tetik": "Sil butonu (onay sonrası)",
              "etki": "proje_kart kaydını DURUM=-1 yapar (soft delete), silen kullanıcı ve zamanı yazar",
              "neden_sonuc": "Yanlış/iptal projeyi listeden temizler. Silmek geri dönüşü zorlaştırır; bağlı görev ve kayıtlar bağlamını kaybedebileceği için gerçekten iptal olan projelerde kullanın."
            },
            {
              "ad": "projelisteekle",
              "tetik": "Proje detayı/düzenleme > Listeler bölümünde Kaydet",
              "etki": "proje_liste tablosuna Kanban kolonu ekler/günceller; kolona bağlı durum (DURUM_ID) atanabilir",
              "neden_sonuc": "Projeye özel iş akışı kolonları tanımlarsınız. Doğru kurgulanmazsa Kanban akışı ve durum takibi şaşar."
            },
            {
              "ad": "projelistesil",
              "tetik": "Listeler bölümünde Sil",
              "etki": "proje_liste kaydını DURUM=-1 yapar",
              "neden_sonuc": "Gereksiz kolonu kaldırır; içinde görev varsa o görevler kolonsuz kalabilir, dikkatli silin."
            },
            {
              "ad": "projenotkaydet",
              "tetik": "Proje detayında not ekleme/güncelleme",
              "etki": "notlar tablosuna REL_TYPE=1 (proje) ile başlık+açıklama ekler/günceller",
              "neden_sonuc": "Projeyle ilgili serbest notları kalıcı tutarsınız. Yapmazsanız kurum hafızası kişilerde kalır."
            },
            {
              "ad": "projenotsiradegistir",
              "tetik": "Proje notlarını sürükle-bırak ile yeniden sıralama",
              "etki": "notlar kayıtlarının sıra bilgisini günceller",
              "neden_sonuc": "Notları önem/kronoloji sırasına dizersiniz; içerik değişmez, sadece görünüm sırası düzenlenir."
            },
            {
              "ad": "projenotsil",
              "tetik": "Not sil",
              "etki": "notlar kaydını kalıcı siler",
              "neden_sonuc": "Geçersiz notu kaldırır; bu işlem kalıcı silmedir, geri alınamaz."
            }
          ],
          "iliskiler": [
            "cari",
            "fatura",
            "irsaliye",
            "siparis",
            "teklif",
            "kasa",
            "masraf",
            "servis"
          ],
          "ipuclari": [
            "'Müşteriye özel' seçilirse projeye cari bilgisi bağlanır ve projeye açılan görevler bu cariyi taşır",
            "'Süreli proje' işaretlenmezse tarih alanları boş kalır ve proje süresiz sayılır",
            "Proje detayına girmeden fatura/masraf gibi finansal özetleri göremezsiniz; Görüntüle şart"
          ]
        },
        {
          "id": "gorevliste",
          "baslik": "Görevler",
          "yol": "/ekran/proje/islem/gorevliste",
          "sub": "islem",
          "amac": "Tüm projelere ait görevlerin kart görünümünde listelendiği ekran. Her kartta görev başlığı, atanan personel(ler), öncelik, bağlı liste, planlanan ve gerçekleşen başlangıç/bitiş zamanları ile durum rozeti gösterilir.",
          "neden": "Ekibin üzerinde çalıştığı işleri tek yerden takip etmek, yeni görev açmak, görev detayını (yorum, kontrol listesi, durum/öncelik değişimi) yönetmek için kullanılır. Görevler işin fiilen yapıldığı katmandır.",
          "nasil": [
            "Görev kartlarını inceleyin; renkli rozetler öncelik, liste ve durumu gösterir",
            "Yeni iş için 'Yeni Görev' butonuna basın",
            "Formda başlık, açıklama, proje, liste, plan başlangıç/bitiş tarih-saat, personel + yardımcı personeller, etiket, görev durumu, öncelik ve varsa özel alanları doldurup Kaydet'e basın",
            "Kart üzerindeki başlığa veya Görüntüle'ye tıklayarak görev detay modalını açın",
            "Modalda durumu/önceliği değiştirin, yorum yazın, kontrol listesi maddeleri ekleyip işaretleyin",
            "Düzenle ile görevi güncelleyin, Sil ile kaldırın"
          ],
          "butonlar": [
            {
              "ad": "Yeni Görev",
              "islev": "Görev tanım formunu açar",
              "sonuc": "Boş görev formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Görüntüle",
              "islev": "Görev detay modalını açar",
              "sonuc": "Yorumlar, kontrol listesi, durum ve öncelik seçimleri modalda gelir",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Görev tanım formunu dolu açar",
              "sonuc": "Görev bilgileri güncellenebilir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Görevi siler (onay ister)",
              "sonuc": "Görev DURUM=-1 yapılır ve log (804/90) atılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "gorevekle",
              "tetik": "Görev formunda Kaydet",
              "etki": "proje_gorev tablosuna görev ekler/günceller (plan süresi otomatik hesaplanır); yardımcı personelleri proje_gorev_personel'e, özel alanları kaydeder; proje/personel/etiket/durum/öncelik doğrulaması yapar; log 804 (10/20) atar; yeni görevde 'GOREV_OLUSTURULDU' otomasyonu tetiklenir",
              "neden_sonuc": "İşi kime, hangi projede, hangi süre ve önceliğe göre yapacağınızı netleştirir ve otomasyon bildirimini başlatır. Eksik/yanlış atarsanız kişi işi görmez, planlama ve raporlar bozulur."
            },
            {
              "ad": "gorevsil",
              "tetik": "Sil (onay sonrası)",
              "etki": "proje_gorev DURUM=-1; log 804/90",
              "neden_sonuc": "İptal edilen görevi kaldırır. Silinen görev raporlardan düşer; iptal yerine yanlışlıkla silmek geçmiş performans verisini eksiltir."
            },
            {
              "ad": "gorevmodal",
              "tetik": "Görüntüle / başlık tıklama",
              "etki": "Görevin tüm detayını (personel, durum, yorum, kontrol listesi) getirir, veri değiştirmez",
              "neden_sonuc": "Görevin son durumunu ve geçmişini görürsünüz; işlem yapmadan önceki inceleme adımıdır."
            },
            {
              "ad": "gorevdurumdegistir",
              "tetik": "Modalda görev durumu (alt durum) seçimi",
              "etki": "proje_gorev IS_DURUMU/IS_DURUMU_ALT günceller; aktif duruma geçişte GOREV_BASLANGIC ve SLA_DEADLINE yazar, pasife/bitişe geçişte GERCEK_SURE_DK hesaplar ve GOREV_BITIS yazar; log 804 (30/31/32/36); tamamlandıda (poz 5) 'GOREV_TAMAMLANDI' otomasyonu tetiklenir",
              "neden_sonuc": "Görevin ilerleyişini ve gerçek çalışma süresini kaydeder, SLA sayacını başlatır ve tamamlanınca bildirim üretir. Durum güncellenmezse süre/verimlilik ve sağlık raporları gerçeği yansıtmaz."
            },
            {
              "ad": "gorevoncelikdegistir",
              "tetik": "Modalda öncelik seçimi",
              "etki": "proje_gorev IS_ACILIYET günceller; log 804/55",
              "neden_sonuc": "İşin aciliyetini güncelleyerek ekibin sırasını doğru kurar. Yanlış öncelik kritik işlerin gecikmesine yol açar."
            },
            {
              "ad": "gorevlistevesiradegistir",
              "tetik": "Kanban'da görevi sürükle-bırak",
              "etki": "proje_gorev LISTE_ID ve POSITION günceller, listeleri yeniden sıralar; log 804 (40/41/42)",
              "neden_sonuc": "Görevi iş akışında ileri/geri taşır ve sırasını belirler. Doğru kolona taşımak akış raporlarını ve durum takibini tutarlı kılar."
            },
            {
              "ad": "gorevyorumekle",
              "tetik": "Modalde yorum gönder",
              "etki": "proje_gorev_yorum'a yorum ekler",
              "neden_sonuc": "İşle ilgili iletişimi göreve bağlı tutar. Yapmazsanız kararlar/geçmiş kaybolur."
            },
            {
              "ad": "gorevyorumduzenle",
              "tetik": "Kendi yorumunu düzenle",
              "etki": "proje_gorev_yorum günceller (sadece yorumu yazan)",
              "neden_sonuc": "Hatalı yorumu düzeltir; başkasının yorumunu değiştiremezsiniz."
            },
            {
              "ad": "gorevkontrollisteogekle",
              "tetik": "Kontrol listesine madde ekle",
              "etki": "proje_gorev_checklist'e madde ekler",
              "neden_sonuc": "Görevi alt adımlara böler; ilerleme yüzdesi çıkar. Yapmazsanız görev tek parça kalır, ilerleme ölçülmez."
            },
            {
              "ad": "gorevkontrollisteogecheck",
              "tetik": "Kontrol maddesi işaretleme",
              "etki": "proje_gorev_checklist IS_DONE günceller",
              "neden_sonuc": "Adım tamamlanınca ilerleme çubuğu artar; ekip nerede kaldığını görür."
            },
            {
              "ad": "gorevkontrollisteogesil",
              "tetik": "Kontrol maddesi sil",
              "etki": "proje_gorev_checklist kaydını siler",
              "neden_sonuc": "Geçersiz adımı kaldırır."
            }
          ],
          "iliskiler": [
            "proje",
            "personel",
            "cari",
            "otomasyon"
          ],
          "ipuclari": [
            "Görev durumu 'Başlandı/İnceleniyor' yapıldığında gerçek süre sayacı çalışır; iş bitince durumu 'Tamamlandı' yapmadan süre kilitlenmez",
            "Alt durum, seçilen ana durumun altına ait olmalı; aksi halde sistem uyarır",
            "Yardımcı personel çoklu seçilebilir; ana personel + yardımcılar iş yükü raporlarına yansır",
            "Tamamlandı (5. pozisyon) otomasyon bildirimini tetikler, e-posta/n8n akışı buna bağlanabilir"
          ]
        },
        {
          "id": "projedurum",
          "baslik": "Proje Durumları",
          "yol": "/ekran/proje/tanim/projedurum",
          "sub": "tanim",
          "amac": "Projelerin ve görevlerin iş akışı durumlarını (ör. Yapılacaklar, Devam Edenler, Kontrol, Tamamlandı ve bunların alt durumları) tanımlama ekranı. Her durumun kullanım yeri (ana grup/SABITGRUP), adı, sırası ve rengi belirlenir.",
          "neden": "Firmanın kendi iş akışına uygun durum etiketleri ve renkleri tanımlamak için kullanılır; bu durumlar proje/görev kartlarında ve Kanban akışında kullanılır.",
          "nasil": [
            "Üstteki formda 'Kullanım Yeri' (ana durum grubu / SABITGRUP) seçin",
            "Durum adını, sırasını ve rengini girin, durumu Aktif bırakın",
            "Kaydet'e basın; durum alttaki listeye eklenir (kullanım yeri ve sıraya göre gruplu)",
            "Var olan bir durumu düzenlemek için listeden Düzenle, kaldırmak için Sil kullanın"
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Durum tanımını kaydeder/günceller",
              "sonuc": "sys_durum tablosuna MODULE_KEY='proje_durum' kaydı eklenir/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler/iptal eder",
              "sonuc": "Girilen değerler sıfırlanır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili durumu forma yükler",
              "sonuc": "Durum güncellenebilir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Durumu siler (onay ister)",
              "sonuc": "sys_durum kaydı DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "projedurumekle",
              "tetik": "Kaydet",
              "etki": "sys_durum tablosuna MODULE_KEY='proje_durum' ile kayıt ekler/günceller (ad, sıra, arkaplan renk, SABITGRUP/kullanım yeri)",
              "neden_sonuc": "İş akışınıza uygun durum etiketleri oluşturur. Eksik/yanlış tanımlarsanız proje/görev durumları ve Kanban akışı anlamsızlaşır."
            },
            {
              "ad": "projedurumsil",
              "tetik": "Sil (onay sonrası)",
              "etki": "sys_durum kaydını DURUM=-1 yapar (silen kullanıcı/zaman kaydedilir)",
              "neden_sonuc": "Kullanılmayan durumu kaldırır; hâlâ görevlerce kullanılan durumu silmek kartlarda boş etiket bırakabilir."
            }
          ],
          "iliskiler": [
            "proje"
          ],
          "ipuclari": [
            "Renk ve sıra, kartlardaki rozet görünümünü doğrudan etkiler",
            "Kullanım yeri (ana durum grubu/SABITGRUP), alt durumların hangi ana akış adımına ait olduğunu belirler"
          ]
        },
        {
          "id": "gorevozelalan",
          "baslik": "Görev Özel Alanları",
          "yol": "/ekran/proje/tanim/gorevozelalan",
          "sub": "tanim",
          "amac": "Görev formuna firmaya özel ek alanlar (metin, sayı, seçim listesi, çoklu seçim vb.) tanımlama ekranı. Her alanın adı, tipi, sırası, zorunlu olup olmadığı ve seçenekleri belirlenir.",
          "neden": "Standart görev alanları yetmediğinde (ör. 'Cihaz Seri No', 'Onay Referansı', 'Departman') sektöre/işe özel bilgileri görevlerde toplamak için kullanılır.",
          "nasil": [
            "Alan adını ve sırasını girin",
            "Tip seçin; 'select' veya 'multiSelect' seçerseniz açılan Seçenekler bölümünden Ekle ile değerleri girin",
            "Zorunlu olacaksa 'Evet' yapıp zorunlu uyarı mesajını yazın",
            "Durumu Aktif bırakıp Kaydet'e basın",
            "Var olan alanı listeden Düzenle/Sil ile yönetin"
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Özel alan tanımını kaydeder/günceller",
              "sonuc": "ozel_alan_tanim tablosuna MODULE_KEY='proje_gorev' kaydı eklenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu iptal eder",
              "sonuc": "Girilen değerler sıfırlanır",
              "renk": "ghost"
            },
            {
              "ad": "Ekle (Seçenek)",
              "islev": "Seçim listesine yeni seçenek satırı ekler",
              "sonuc": "Yeni seçenek giriş alanı belirir",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili alanı forma yükler",
              "sonuc": "Alan güncellenebilir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Özel alanı siler (onay ister)",
              "sonuc": "ozel_alan_tanim kaydı DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "gorevozelalanekle",
              "tetik": "Kaydet",
              "etki": "ozel_alan_tanim tablosuna MODULE_KEY='proje_gorev' ile alan ekler/günceller; select/multiSelect için seçenekleri JSON olarak saklar",
              "neden_sonuc": "Görevlerde işletmeye özgü veriyi zorunlu/opsiyonel toplarsınız. Yanlış tip veya boş seçenek girilirse form doğrulaması hata verir, kullanıcılar veri giremez."
            },
            {
              "ad": "gorevozelalansil",
              "tetik": "Sil (onay sonrası)",
              "etki": "ozel_alan_tanim kaydını DURUM=-1 yapar",
              "neden_sonuc": "Gereksiz alanı kaldırır; geçmiş görevlerde girilmiş değerler artık formda görünmeyebilir."
            }
          ],
          "iliskiler": [
            "proje"
          ],
          "ipuclari": [
            "Zorunlu alan yaparsanız, o alan doldurulmadan görev kaydedilemez",
            "Seçim tipli alanlarda en az bir seçenek girilmelidir, aksi halde sistem uyarır",
            "Sıra alanı, alanların görev formunda hangi düzende görüneceğini belirler"
          ]
        },
        {
          "id": "personelgorevdagilim",
          "baslik": "Personel Görev Dağılımı",
          "yol": "/ekran/proje/rapor/personelgorevdagilim",
          "sub": "rapor",
          "amac": "Personel başına toplam, aktif ve tamamlanan görev sayıları ile SLA (süre taahhüdü) ihlallerini gösteren iş yükü dağılım raporu.",
          "neden": "İş yükünün adil dağılıp dağılmadığını görmek için; bir kişi işlerle boğulurken bir başkası boşta kalıyorsa motivasyon ve teslim süreleri bozulur. Süresi geçmiş açık görevleri (SLA ihlali) erken yakalar.",
          "nasil": [
            "Sağ üstteki Filtrele butonuna basın (performans için filtre zorunlu)",
            "İsterseniz personel ve kayıt tarih aralığı seçin",
            "Raporu çalıştırın; üstte KPI kartları (personel, toplam görev, aktif, SLA ihlal) gelir",
            "Tabloda kişi bazında dağılımı inceleyip aşırı yüklü veya SLA ihlali olan personele müdahale edin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve raporu çalıştırır",
              "sonuc": "Seçilen kriterlere göre dağılım tablosu ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "proje"
          ],
          "ipuclari": [
            "Aktif görev > 10 olan personele yeni iş atamak yerine mevcut işleri dağıtın",
            "SLA ihlali olan görevler önce kapatılmalı, gerekiyorsa müşteri bilgilendirilmeli",
            "Filtre seçmeden rapor çalışmaz; bu, çok kayıtta performansı korumak içindir"
          ]
        },
        {
          "id": "personelverimlilik",
          "baslik": "Personel Verimlilik",
          "yol": "/ekran/proje/rapor/personelverimlilik",
          "sub": "rapor",
          "amac": "Personeli tamamlama oranı (%40) ve zamanında bitirme oranı (%60) ağırlığıyla 0-100 arası puanlayan verimlilik skoru raporu. Ortalama görev süresini de gösterir.",
          "neden": "'Kim daha verimli?' sorusunu objektif ölçmek için; hem hızlı hem disiplinli çalışanı öne çıkarır, düşük skorda kök neden (eğitim, iş yükü, araç) araştırılır.",
          "nasil": [
            "Filtrele ile tarih aralığı ve/veya personel seçin",
            "Raporu çalıştırın; KPI kartları (personel, yüksek skor, orta skor, ortalama skor) gelir",
            "Tabloda tamamlama %, zamanında %, skor ve ortalama süreyi inceleyin",
            "Skora göre takdir/performans görüşmesi/eğitim planı yapın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve raporu üretir",
              "sonuc": "Verimlilik skor tablosu ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "proje"
          ],
          "ipuclari": [
            "Skor 80+ olan kişiyi mentor olarak kullanın, kritik işler verin",
            "Skor 50 altındaysa cezalandırmak yerine destek/eğitim planlayın",
            "Düşük tamamlama ama iyi zamanındalık, kişiye yeterli iş atanmadığına işaret olabilir"
          ]
        },
        {
          "id": "zamancizelge",
          "baslik": "Zaman Çizelgesi",
          "yol": "/ekran/proje/rapor/zamancizelge",
          "sub": "rapor",
          "amac": "Görevleri Gantt benzeri zaman çizelgesinde planlanan (mavi) ve gerçekleşen (turuncu) sürelerle karşılaştırıp süre sapmalarını görselleştiren rapor.",
          "neden": "Bir bakışta hangi görevin geciktiğini, hangisinin erken bittiğini görmek için; proje yöneticisinin plan-gerçek uyumunu izlemesini sağlar.",
          "nasil": [
            "Filtrele butonundan kriter seçin (performans için zorunlu)",
            "Raporu çalıştırın; KPI kartları (toplam görev, erken biten, zamanında, aşım) gelir",
            "Zaman çizelgesinde turuncu çubuk mavinin sağına taştıysa görev gecikmiştir",
            "Sürekli aşım/erken biten desenlerine göre plan sürelerini ve iş yükünü revize edin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve çizelgeyi üretir",
              "sonuc": "Plan-gerçek zaman çizelgesi ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "proje"
          ],
          "ipuclari": [
            "Turuncu çubuk mavinin sağına geçtiyse müşteriyi gecikme konusunda bilgilendirin",
            "Sürekli erken biten görevlerde plan süresi gerçekçi değildir, şablonları güncelleyin",
            "Timeline'daki boşluklar personelin boş kaldığını gösterir, atama planlamasına bakın"
          ]
        },
        {
          "id": "gorevtamamsureanaliz",
          "baslik": "Görev Tamamlanma Analiz",
          "yol": "/ekran/proje/rapor/gorevtamamsureanaliz",
          "sub": "rapor",
          "amac": "Tamamlanmış görevlerin planlanan vs gerçekleşen sürelerini, süre sapmasını ve SLA ihlal oranını analiz eden rapor.",
          "neden": "İşlerin gerçek maliyetini ve planın ne kadar tuttuğunu ölçmek için; sapma yüksekse fiyatlama, kapasite veya planlama hatalıdır. Saatlik fiyatlayan işletmeler için gerçek süre baz alınmalıdır.",
          "nasil": [
            "Filtrele ile kriter seçin",
            "Raporu çalıştırın; plan-gerçek süre ve SLA ihlal oranı KPI'ları gelir",
            "Süre sapması ve dağılımını inceleyin",
            "Sürekli sapma varsa plan sürelerini, personel bazında sapma varsa eğitim/iş yükünü gözden geçirin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve analizi üretir",
              "sonuc": "Süre analiz tablosu, dağılım ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "proje"
          ],
          "ipuclari": [
            "Sapma sürekli pozitifse plan süreleri gerçekçi değildir, şablon güncelleyin",
            "SLA ihlali yüksekse kapasite yetersiz veya önceliklendirme bozuktur",
            "Saatlik fiyatlamada gerçek süreyi baz alın, plan süresini değil"
          ]
        },
        {
          "id": "kanbangorevyogunluk",
          "baslik": "Liste Yoğunluk Raporu",
          "yol": "/ekran/proje/rapor/kanbangorevyogunluk",
          "sub": "rapor",
          "amac": "Kanban listeleri ve durum kombinasyonlarındaki görev yoğunluğunu (WIP/iş birikimi) gösteren, darboğazları renkle işaretleyen rapor.",
          "neden": "WIP limitini aşan listeler tüm akışı yavaşlatır; hangi kolonda iş biriktiğini görüp darboğaza erken müdahale etmek için kullanılır. Liste başına 7-10 aktif görev sağlıklı sayılır.",
          "nasil": [
            "Filtrele ile kriter seçin",
            "Raporu çalıştırın; KPI kartları (kombinasyon, sağlıklı <5, dikkat 5-9, darboğaz 10+) gelir",
            "Kırmızı işaretli (10+) listelere acil müdahale edin, işi dağıtın veya WIP limiti koyun",
            "'Beklemede' kolonu şiştiyse karar bekleyen işleri yöneticiye eskalasyon yapın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve yoğunluk tablosunu üretir",
              "sonuc": "Liste/durum yoğunluk tablosu ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje"
          ],
          "ipuclari": [
            "10+ görevli liste darboğaz demektir, önce mevcutları bitirin yeni iş açmayın",
            "5-9 aralığı takip gerektirir, günlük kısa toplantıda gözden geçirin",
            "Kanban dengesi için akış (flow) disiplini şarttır"
          ]
        },
        {
          "id": "gorevgecis",
          "baslik": "Görev Durum Geçiş",
          "yol": "/ekran/proje/rapor/gorevgecis",
          "sub": "rapor",
          "amac": "Görevlerin iş akışı pozisyonları arasındaki geçişlerini (ileri akış, ters/geri dönüş, adım atlama) ve geçiş matrisini gösteren süreç disiplini raporu.",
          "neden": "Sağlıklı süreçte geçişler tek yönde ilerler; ters akış ve atlamalar süreç disiplinsizliğine ve kalite düşüklüğüne işaret eder. Darboğaz oluşan adımları da ortaya çıkarır.",
          "nasil": [
            "Filtrele ile kriter seçin",
            "Raporu çalıştırın; KPI kartları (toplam geçiş, ileri akış, atlama, ters akış) gelir",
            "Görev/proje bazında önceki-sonraki pozisyon ve işlem tipini inceleyin",
            "Geçiş matrisinde yoğun/anormal geçişleri tespit edip süreç kurallarını netleştirin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve geçiş raporunu üretir",
              "sonuc": "Geçiş listesi, matris ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje"
          ],
          "ipuclari": [
            "Ters akış yüksekse görevler tamamlanmadan kapatılıyordur, kontrol adımı ekleyin",
            "Atlama varsa adımlar atlanıyordur, süreç tanımı eksik veya personel kuralları bilmiyor",
            "Belirli bir geçiş çok yoğunsa o adımda darboğaz vardır, kapasite/eğitim gerekli"
          ]
        },
        {
          "id": "saglikrapor",
          "baslik": "Proje Sağlık Skoru",
          "yol": "/ekran/proje/rapor/saglikrapor",
          "sub": "rapor",
          "amac": "Projeleri tamamlanma oranı + iptal cezası + süre sapma cezası formülüyle 0-100 arası puanlayan, riske giren projeleri renkle işaretleyen sağlık raporu.",
          "neden": "Aynı anda birçok proje yürürken hangisinin alarm verdiğini tek bakışta görmek için; kaynakları doğru projeye yönlendirmeyi sağlar.",
          "nasil": [
            "Filtrele ile kriter seçin",
            "Raporu çalıştırın; proje bazında tamamlanan/toplam, iptal, süre sapması ve sağlık skoru gelir",
            "Yeşil (75+) projeleri koruyun, turuncu (50-74) projeleri haftalık gözden geçirin",
            "Kırmızı (<50) projeler için acil eylem planı yapın (kapsam küçült veya kaynak ekle)"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve sağlık skorunu üretir",
              "sonuc": "Proje sağlık tablosu ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje",
            "personel"
          ],
          "ipuclari": [
            "50-74 arası projelerde kaynak takviyesini değerlendirin",
            "İptal sayısı yüksekse planlama hatası veya belirsiz brief vardır, analiz fazını güçlendirin",
            "Her iptal skoru -5 puan düşürür, gereksiz görev açıp iptal etmekten kaçının"
          ]
        },
        {
          "id": "verimlilik",
          "baslik": "Proje Verimlilik Analiz",
          "yol": "/ekran/proje/rapor/verimlilik",
          "sub": "rapor",
          "amac": "Projeleri PMI standardı endekslerle ölçen rapor: SPI (zaman performansı), CPI (maliyet/gelir performansı) ve THI (birleşik sağlık) ile genel skor.",
          "neden": "Proje yatırımının geri dönüşünü bilimsel ölçmek için; 1.00 üstü kazanç, altı kayıp anlamına gelir. Projenin para kazanıp kazanmadığını tek tabloda gösterir.",
          "nasil": [
            "Filtrele ile kriter seçin",
            "Raporu çalıştırın; KPI kartları (proje sayısı, iyi ≥1.00, risk 0.90-0.99, kritik <0.90) gelir",
            "SPI, CPI, THI ve genel skoru proje bazında inceleyin",
            "CPI<1.00 ise masraf, fiyatlama ve tahsilatı denetleyin; tüm endeksler düşükse projeyi durdurun/küçültün"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar ve endeksleri üretir",
              "sonuc": "SPI/CPI/THI tablosu ve KPI'lar gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje",
            "fatura",
            "masraf",
            "kasa"
          ],
          "ipuclari": [
            "SPI < 0.90 ise plan tutmuyordur, görev süreleri ve blokajları inceleyin",
            "CPI < 1.00 proje para yiyor demektir; masraf fişleri ve tahsilatı sırayla denetleyin",
            "CPI hesabı için projeye fatura/masraf/tahsilat kayıtlarının doğru bağlanmış olması gerekir"
          ]
        }
      ]
    },
    {
      "slug": "kesif",
      "title": "Kesif (Saha Tespit)",
      "icon": "🔍",
      "modul": "kesif",
      "ad": "Keşif Yönetimi",
      "ozet": "Keşif modülü, sahaya gidilerek yapılan yerinde inceleme/ölçüm sürecini uçtan uca yönetir. Bir keşif talebi kaydından başlayarak randevu/personel planlama, sahada malzeme tespiti, fotoğraf üzerine çizim ve müşteri imzası ile tamamlama, onay ve son olarak keşfin teklife dönüştürülüp kapatılması adımlarını 7 aşamalı bir pozisyon (durum) akışıyla ilerletir. Süreç boyunca her hareket evrak işlem loguna (evrak tip 801) yazılır; ayrıca pano ve raporlarla dönüşüm oranı, süreç darboğazları ve malzeme oynaklığı ölçülür.",
      "modul_iliskiler": [
        "cari (cari_kart / cari_kart_yetkililer)",
        "istakip/crm (crm_ilgilenen — lead'den keşif)",
        "stok (stok_birim, malzeme arama)",
        "teklif (teklif_fis / teklif_fis_detay — keşif teklife dönüşür, evrak tip 901)",
        "personel (personel_kart)",
        "araç/plaka (irsaliye_plaka)",
        "dosya arşivi (dosya_arsiv — Google Drive)",
        "otomasyon (KESIF_DURUM_DEGISTI tetikleyici)",
        "sys_durum (durum tanımları — MODULE_KEY='kesif_durum')"
      ],
      "ekranlar": [
        {
          "id": "dashboard",
          "baslik": "Keşif Panosu",
          "yol": "/ekran/kesif/rapor/dashboard",
          "sub": "rapor",
          "amac": "Keşif ve saha operasyonunuzun anlık genel görüntüsünü tek ekranda sunar: açık keşif sayıları, bugün/yarın randevuları, personel iş yükü, teklif dönüşüm oranı ve son 6 aylık trend.",
          "neden": "Sahada işlerin nerede biriktiğini, hangi ekiplerin dolu/boş olduğunu ve keşiflerin ne kadarının satışa (teklife) döndüğünü bir bakışta görmek için kullanılır. Günlük operasyon planlaması ve yönetici takibi için başlangıç ekranıdır.",
          "nasil": [
            "Sol menüden Keşif > Keşif Panosu'na girin.",
            "Performans nedeniyle rapor filtresizken boş gelir; 'Filtreleme Yap' butonuna basın.",
            "Açılan filtre penceresinde tarih aralığı seçip 'Arama Yap' deyin.",
            "Üstte KPI kartlarını (Açık Keşif, Bu Ay Oluşan, Bu Ay Tamamlanan, Teklif Dönüşüm) inceleyin.",
            "Pozisyon kutularından, bugün/yarın randevu listesinden ve personel dağılımından operasyonu okuyun.",
            "Bir randevu veya son keşif satırına tıklayarak ilgili keşif detayına gidin."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Tarih aralığı seçilen filtre penceresini açar",
              "sonuc": "Panonun verilerle dolması için kriter girilir",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Seçilen tarih filtresiyle panoyu çalıştırır",
              "sonuc": "KPI, randevu, trend verileri ekrana gelir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Pano yeniden boş/filtresiz duruma döner",
              "renk": "ghost"
            },
            {
              "ad": "Listeye Git",
              "islev": "Pozisyon kutusundan Keşif Kayıtları ekranına yönlendirir",
              "sonuc": "İlgili keşif listesine geçilir",
              "renk": "ghost"
            },
            {
              "ad": "Tüm Keşifler",
              "islev": "Son 10 keşif kartından tam listeye geçer",
              "sonuc": "Keşif Kayıtları ekranı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kesif_fis",
            "sys_durum",
            "personel",
            "teklif (dönüşüm oranı)"
          ],
          "ipuclari": [
            "Rapor bilinçli olarak filtre olmadan çalışmaz; kayıt çok olabileceği için önce tarih seçmelisiniz.",
            "Teklif dönüşümü %50'nin altındaysa keşif sonrası teklif hazırlama sürecini hızlandırmanız önerilir.",
            "Bugün/yarın randevusu boşsa saha ekipleri boş geçebilir; CRM/satıştan fırsat yönlendirin."
          ]
        },
        {
          "id": "kesifler",
          "baslik": "Keşif Kayıtları",
          "yol": "/ekran/kesif/islem/kesifler",
          "sub": "islem",
          "amac": "Açık (silinmemiş) tüm keşif fişlerini tek listede gösterir; buradan yeni keşif talebi girilir, mevcut keşif görüntülenir, düzenlenir, yazdırılır veya silinir.",
          "neden": "Keşif sürecinin ana giriş kapısıdır. Yeni bir müşteri/adres için keşif talebi buradan açılır ve tüm keşiflerin durumu (pozisyonu) renkli olarak izlenir.",
          "nasil": [
            "Keşif > Keşif Kayıtları ekranını açın.",
            "Yeni kayıt için sağ üstteki 'Keşif Talebi Girişi' butonuna basın ve 4 adımlı sihirbazı (Cari, İrtibat, Adres, Notlar) doldurun.",
            "Cari kaynağını seçin: Kayıtlı Cari, İş Takip'ten (CRM) veya Manuel Giriş.",
            "Adres adımında 'Haritada Bul' ile konumu ve firma-adres arası tahmini KM/dakikayı hesaplatın.",
            "Son adımda 'Formu Kaydet' deyin; kayıt Beklemede durumunda açılır.",
            "Listede bir satırın İşlemler menüsünden Görüntüle / Düzenle / Yazdır / Sil işlemlerini yapın."
          ],
          "butonlar": [
            {
              "ad": "Keşif Talebi Girişi",
              "islev": "Yeni keşif oluşturma sihirbazını açar (kesifform)",
              "sonuc": "Keşif talep formuna geçilir",
              "renk": "primary"
            },
            {
              "ad": "Görüntüle",
              "islev": "Keşif detay ekranını açar (kesifdetay)",
              "sonuc": "Kartın tüm bilgileri ve işlem geçmişi görülür",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Keşif formunu düzenleme modunda açar (yalnızca 1-4 pozisyonlarında; 5/6/7 kilitli)",
              "sonuc": "Kart bilgileri güncellenebilir",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Keşif fişini yazdırma penceresini açar (evrak tip 801)",
              "sonuc": "HTML/PDF çıktısı alınır",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Onay sorarak keşfi siler",
              "sonuc": "Keşif ve malzemeleri pasife alınır (soft delete, DURUM=-1)",
              "renk": "danger"
            },
            {
              "ad": "Formu Kaydet",
              "islev": "Sihirbazdaki keşif formunu kaydeder",
              "sonuc": "Yeni keşif Beklemede olarak oluşur ve detayına gidilir",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "kesifolustur",
              "tetik": "Keşif formunda 'Formu Kaydet' / düzenlemede kaydet",
              "etki": "kesif_fis tablosuna yeni kayıt ekler veya günceller; yeni kayıtta ANA_POSITION=1 (Beklemede) ve o grubun ilk sıralı alt durumunu atar, evrak numarası (evrakNo 801) ve işlem logu yazar",
              "neden_sonuc": "Keşif talebi sisteme girer ve süreç başlar. Teklife Dönüştürülecek/Kapatıldı/İptal (5,6,7) durumundaki kart bu event ile düzenlenemez (hata döner); Manuel kaynakta ünvan, CRM kaynakta iş takip kaydı zorunludur, boşsa hata verir."
            },
            {
              "ad": "kesifsil",
              "tetik": "Listede Sil butonu (onaylı)",
              "etki": "kesif_fis DURUM=-1 yapılır, silinme zamanı/kullanıcısı yazılır, bağlı kesif_fis_malzemeler DURUM=-1 (pasif) yapılır",
              "neden_sonuc": "Yanlış/iptal keşif listeden kaldırılır. Silinen kayıt geri gelmez; teklife dönmüş kayıtları silmek yerine iptal (reddet) etmek daha doğrudur."
            },
            {
              "ad": "cariyetkilisorgula",
              "tetik": "Formda kayıtlı cari seçildiğinde otomatik",
              "etki": "cari_kart_yetkililer tablosundan seçili carinin yetkililerini getirir",
              "neden_sonuc": "Yetkili listesi otomatik dolar; doğru irtibat kişisi hızlı seçilir."
            },
            {
              "ad": "kesifpozisyondegistir",
              "tetik": "Detayda durum kutusuna tıklayıp pozisyon değiştirme",
              "etki": "kesif_fis ANA/ALT_POSITION günceller ve işlem logu yazar; yalnızca izinli geçişlere (1→2/7, 2→3/7, 3→4/7, 4→5/7, 5→6/7; 6 ve 7 son durum) izin verir",
              "neden_sonuc": "Keşfin durumu elle ileri taşınır veya iptal edilir. İzinsiz geçiş denenirse istisna (hata) fırlatılır; bu kural süreç bütünlüğünü korur."
            },
            {
              "ad": "randevuolustur",
              "tetik": "Detayda (Beklemede) Randevu Oluştur",
              "etki": "kesif_fis'e personel, yardımcı personel, taşıt/plaka, randevu aralığı yazar ve ANA_POSITION=2 (Planlandı) yapar",
              "neden_sonuc": "Keşif takvime ve bir ekibe bağlanır. Yapılmazsa keşif planlanmadan bekler."
            },
            {
              "ad": "randevuguncelle",
              "tetik": "İşleme al / bekleyen kartında Randevu Değiştir",
              "etki": "kesif_fis randevu başlangıç/bitiş tarihlerini günceller (Planlandı/İşlemde durumunda)",
              "neden_sonuc": "Randevu ötelenir; müşteri/ekip uygunluğuna göre esneklik sağlar."
            },
            {
              "ad": "isebasla",
              "tetik": "İşleme al kartında (Planlandı) Keşife Başla",
              "etki": "kesif_fis ANA_POSITION=3 (İşlemde) yapar, görev başlangıç zamanını damgalar",
              "neden_sonuc": "Saha çalışması resmen başlar ve süre sayacı işler. Başlatılmadan sahada işlem yapılmış sayılmaz."
            },
            {
              "ad": "malzemesilofis",
              "tetik": "Detay/inceleme ekranında malzeme silme",
              "etki": "kesif_fis_malzemeler DURUM=-1 yapar, kesif_malzeme_log'a INCELEME kaynaklı SIL kaydı yazar",
              "neden_sonuc": "Ofis/inceleme aşamasında yanlış malzeme listeden çıkarılır; hareket loglandığı için oynaklık raporunda izlenir."
            },
            {
              "ad": "malzememiktarguncelle",
              "tetik": "Malzeme satırında miktar düzenleme",
              "etki": "kesif_fis_malzemeler MIKTAR günceller, kesif_malzeme_log'a GUNCELLE kaydı yazar",
              "neden_sonuc": "Tespit edilen malzeme adedi düzeltilir; eski/yeni miktar loglanır."
            },
            {
              "ad": "malzemeoynakdetay",
              "tetik": "Malzeme detayını genişletme",
              "etki": "kesif_malzeme_log'tan ilgili keşfin ekle/sil/güncelle hareketlerini tablo olarak döndürür",
              "neden_sonuc": "Bir malzemenin süreçte kaç kez değiştiği görülür; karar tutarsızlığı tespit edilir."
            },
            {
              "ad": "personeldegistir",
              "tetik": "İşleme al kartında Personel Değiştir",
              "etki": "kesif_fis ana/yardımcı personel atamasını günceller (Planlandı/İşlemde)",
              "neden_sonuc": "Sahaya giden ekip değiştirilir; müsaitlik/uzmanlık değişince atama güncellenir."
            },
            {
              "ad": "randevutakvimdata",
              "tetik": "Randevu takvimi (FullCalendar) yüklenirken",
              "etki": "kesif_fis'ten randevulu keşifleri takvim event'i olarak döndürür (JSON)",
              "neden_sonuc": "Randevular takvimde renkli görülür; çakışma ve boşluk planlaması kolaylaşır."
            }
          ],
          "iliskiler": [
            "cari",
            "istakip/crm",
            "personel",
            "araç/plaka",
            "stok",
            "teklif",
            "dosya arşivi"
          ],
          "ipuclari": [
            "Keşif ancak 1-4 pozisyonlarında düzenlenebilir; Teklife/Kapatıldı/İptal olanlar kilitlidir.",
            "Cari kaynağını 'Manuel' seçerseniz ünvan zorunludur; 'İş Takip'ten' seçimi ancak istakip/CRM kaydı seçilirse çalışır.",
            "Adres adımında Haritada Bul ile mesafe/süre otomatik hesaplanır; Google Maps anahtarı tanımlı değilse harita çalışmaz."
          ]
        },
        {
          "id": "bekleyenliste",
          "baslik": "Keşif Yapılacaklar",
          "yol": "/ekran/kesif/islem/bekleyenliste",
          "sub": "islem",
          "amac": "Planlandı (2) ve İşlemde (3) durumundaki, yani sahada yapılması beklenen keşifleri kart görünümünde listeler; buradan keşif işleme alınır (bekleyenform).",
          "neden": "Saha personelinin 'bugün gidilecek işler' listesidir. Randevu zamanına kalan süre/gecikme rozetiyle önceliklendirme sağlar; yönetici olmayan kullanıcı yalnızca ana personeli kendisi olan keşifleri görür.",
          "nasil": [
            "Keşif > Keşif Yapılacaklar ekranını açın.",
            "Her kartta randevuya kalan süre (yeşil) veya gecikme (kırmızı) rozetini görün.",
            "'Detay Göster' ile cari, adres ve randevu bilgilerini genişletin.",
            "'Yol Tarifi Al' ile konuma Google Maps üzerinden navigasyon açın.",
            "Sahaya gidince 'İşleme Al' butonuyla keşif işlem ekranına (bekleyenform) geçin.",
            "İşlem ekranında Keşife Başla / Tamamla, malzeme ekleme ve çizim/fotoğraf yükleme yapın."
          ],
          "butonlar": [
            {
              "ad": "İşleme Al",
              "islev": "Keşif işlem (bekleyenform) ekranını açar",
              "sonuc": "Sahada keşif başlatma/tamamlama işlemleri yapılır",
              "renk": "primary"
            },
            {
              "ad": "Detay Göster",
              "islev": "Kartta cari/adres/randevu bilgilerini açar-kapatır",
              "sonuc": "Ek bilgiler görünür olur",
              "renk": "ghost"
            },
            {
              "ad": "Yol Tarifi Al",
              "islev": "Keşif konumuna harita yol tarifi açar",
              "sonuc": "Navigasyon başlatılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "isebasla",
              "tetik": "İşleme al ekranında (Planlandı) 'Keşife Başla'",
              "etki": "kesif_fis ANA_POSITION=3 (İşlemde), görev başlangıç zamanı yazılır",
              "neden_sonuc": "Sahada çalışma başlar ve süre sayılmaya başlar."
            },
            {
              "ad": "kesiftamamla",
              "tetik": "İşlemde iken 'Keşif Tamamla' + müşteri imzası",
              "etki": "kesif_fis ANA_POSITION=4 (Onay Bekleniyor), görev bitişi ve GOREV_SURE_DK hesaplanır, ONAY_IMZA kaydedilir, KESIF_DURUM_DEGISTI otomasyonu tetiklenir",
              "neden_sonuc": "Saha işi bitirilir ve onay aşamasına geçer. İmza (imza modalı) müşteri onayının kanıtıdır ve tamamlama akışının parçasıdır."
            },
            {
              "ad": "randevuguncelle",
              "tetik": "Kartta 'Randevu Değiştir'",
              "etki": "kesif_fis randevu tarihlerini günceller",
              "neden_sonuc": "Randevu öteleme/erken alma; ekip veya müşteri uygunluğuna göre."
            },
            {
              "ad": "personeldegistir",
              "tetik": "Personel Değiştir butonu",
              "etki": "kesif_fis ana/yardımcı personel atamasını değiştirir",
              "neden_sonuc": "Sahaya giden ekip değişince atama güncellenir."
            },
            {
              "ad": "malzememiktarguncelle",
              "tetik": "Malzeme listesinde miktar düzenleme",
              "etki": "kesif_fis_malzemeler miktarını günceller ve kesif_malzeme_log'a yazar",
              "neden_sonuc": "Tespit edilen malzeme adedi düzeltilir."
            },
            {
              "ad": "malzemeoynakdetay",
              "tetik": "Malzeme hareket detayını görüntüleme",
              "etki": "kesif_malzeme_log hareketlerini döndürür",
              "neden_sonuc": "Malzeme değişikliklerinin izini sağlar."
            },
            {
              "ad": "malzemeekle",
              "tetik": "İşlemde iken malzeme arayıp 'Malzeme Ekle' (saha)",
              "etki": "kesif_fis_malzemeler'e satır ekler, kesif_malzeme_log'a SAHA/EKLE kaydı yazar",
              "neden_sonuc": "Sahada tespit edilen malzeme keşfe eklenir; bu liste ileride teklife aktarılır."
            },
            {
              "ad": "malzemesil",
              "tetik": "İşlemde malzeme satırında Sil (saha)",
              "etki": "kesif_fis_malzemeler DURUM=-1, kesif_malzeme_log'a SAHA/SIL kaydı",
              "neden_sonuc": "Sahada yanlış eklenen malzeme çıkarılır; hareket loglanır."
            },
            {
              "ad": "randevutakvimdata",
              "tetik": "İşleme al ekranındaki takvim yüklenirken",
              "etki": "Randevu event verisi döndürür (JSON)",
              "neden_sonuc": "Randevular takvimde görülür."
            }
          ],
          "iliskiler": [
            "personel",
            "araç/plaka",
            "stok",
            "dosya arşivi (Google Drive)",
            "otomasyon"
          ],
          "ipuclari": [
            "Yönetici (SA) değilseniz yalnızca ana personeli siz olan keşifleri görürsünüz.",
            "Kırmızı rozet randevunun geciktiğini gösterir; önce bunları kapatın.",
            "Keşif tamamlama müşteri imzasıyla bitirilir; imza ekranı modal olarak açılır."
          ]
        },
        {
          "id": "onaybekleyenliste",
          "baslik": "Onay Bekleyenler",
          "yol": "/ekran/kesif/islem/onaybekleyenliste",
          "sub": "islem",
          "amac": "Saha çalışması tamamlanmış (pozisyon 4 — Onay Bekleniyor) keşifleri listeler; buradan keşif değerlendirilerek teklife gönderilir (onaylanır) veya reddedilir (onayform).",
          "neden": "Sahadan gelen keşiflerin ofis/yönetici tarafından son kontrol ve karar noktasıdır. Onaylanan keşif teklife hazır hale gelir, uygun olmayanlar reddedilerek iptal edilir.",
          "nasil": [
            "Keşif > Onay Bekleyenler ekranını açın.",
            "Bir kartta 'Detay Göster' ile cari, adres, randevu ve tamamlanma bilgilerini inceleyin.",
            "'Değerlendir' butonuyla onay (onayform) ekranına geçin.",
            "Yüklenen dosyaları, malzeme listesini ve işlem geçmişini kontrol edin.",
            "Uygunsa 'Teklife Gönder' (Onay), değilse 'Reddet' butonuyla açıklama girip karar verin."
          ],
          "butonlar": [
            {
              "ad": "Değerlendir",
              "islev": "Keşif onay/değerlendirme ekranını açar (onayform)",
              "sonuc": "İnceleme sonrası onay/red kararı verilir",
              "renk": "primary"
            },
            {
              "ad": "Detay Göster",
              "islev": "Kart detay bilgilerini açar-kapatır",
              "sonuc": "Ek bilgiler görünür olur",
              "renk": "ghost"
            },
            {
              "ad": "İncelemeyi Sonlandır",
              "islev": "Onay ekranında onay/red modalını açar",
              "sonuc": "Teklife gönder veya reddet seçimi sunulur",
              "renk": "accent"
            },
            {
              "ad": "Teklife Gönder",
              "islev": "Keşfi onaylar",
              "sonuc": "Keşif Teklife Dönüştürülecek (5) duruma geçer",
              "renk": "accent"
            },
            {
              "ad": "Reddet",
              "islev": "Keşfi reddeder",
              "sonuc": "Keşif İptal (7) duruma geçer",
              "renk": "danger"
            },
            {
              "ad": "HTML / PDF",
              "islev": "Keşif fişini yazdırır (evrak tip 801)",
              "sonuc": "Çıktı alınır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "onayver",
              "tetik": "Değerlendirme modalında 'Teklife Gönder'",
              "etki": "kesif_fis ANA_POSITION=5 (Teklife Dönüştürülecek), INCELEME_BITIS ve SONUC_ACIKLAMA yazılır, işlem logu",
              "neden_sonuc": "Keşif teklife hazır listeye düşer. Onaylanmazsa keşif teklife dönüşemez ve süreç ilerlemez."
            },
            {
              "ad": "reddet",
              "tetik": "Değerlendirme modalında 'Reddet'",
              "etki": "kesif_fis ANA_POSITION=7 (İptal), SONUC_ACIKLAMA ve log yazılır (pozisyon 5 değilse INCELEME_BITIS de damgalanır)",
              "neden_sonuc": "Uygun olmayan keşif iptal edilerek arşive kaldırılır. Gerekçe açıklaması ileride raporlarda görünür."
            },
            {
              "ad": "malzememiktarguncelle",
              "tetik": "Malzeme miktarı düzenleme",
              "etki": "kesif_fis_malzemeler günceller ve loglar",
              "neden_sonuc": "Onay öncesi miktar düzeltmesi yapılabilir."
            },
            {
              "ad": "malzemeoynakdetay",
              "tetik": "Malzeme hareket detayı",
              "etki": "kesif_malzeme_log döndürür",
              "neden_sonuc": "Malzeme değişim izi görülür."
            },
            {
              "ad": "personeldegistir",
              "tetik": "Personel değiştirme (uygun durumda)",
              "etki": "kesif_fis personel atamasını günceller",
              "neden_sonuc": "Atama düzeltmesi sağlar."
            }
          ],
          "iliskiler": [
            "stok",
            "dosya arşivi",
            "teklif (sonraki adım)"
          ],
          "ipuclari": [
            "Onay ekranı açıldığında inceleme başlangıç zamanı damgalanır.",
            "Yönetici değilseniz yalnızca kendi keşiflerinizi görürsünüz.",
            "Reddetmeden önce açıklama girin; bu gerekçe iptal raporlarında değerlidir."
          ]
        },
        {
          "id": "teklifbekleyenliste",
          "baslik": "Teklif Bekleyenler",
          "yol": "/ekran/kesif/islem/teklifbekleyenliste",
          "sub": "islem",
          "amac": "Onaylanmış (pozisyon 5 — Teklife Dönüştürülecek) keşifleri listeler; buradan keşif tek tıkla resmi bir teklife dönüştürülüp süreç kapatılır (teklifform).",
          "neden": "Sahadaki eforun ticari karşılığa (satış teklifi) dönüştüğü son adımdır. Keşifte tespit edilen malzemeler otomatik olarak teklif fişine aktarılır, böylece elle yeniden giriş yapılmaz.",
          "nasil": [
            "Keşif > Teklif Bekleyenler ekranını açın.",
            "Bir satırda evrak no/müşteriyi kontrol edin.",
            "'Teklif Hazırla' ile keşfin teklife hazır detay ekranını (teklifform) açın.",
            "Teklife aktarılacak malzeme listesini gözden geçirin.",
            "'Teklife Gönder' butonuna basıp onaylayın; sistem teklif fişini oluşturur ve sizi teklif ekranına yönlendirir."
          ],
          "butonlar": [
            {
              "ad": "Teklif Hazırla",
              "islev": "Keşfin teklife hazır detay ekranını açar (teklifform)",
              "sonuc": "Malzeme listesi ve teklife gönderme seçeneği görülür",
              "renk": "primary"
            },
            {
              "ad": "Teklife Gönder",
              "islev": "Onay sorarak keşfi teklife dönüştürür",
              "sonuc": "teklif_fis (901) oluşturulur, keşif Kapatıldı (6) olur, teklif düzenleme ekranına gidilir",
              "renk": "accent"
            },
            {
              "ad": "Reddet",
              "islev": "Keşfi reddedip iptal eder",
              "sonuc": "Keşif İptal (7) duruma geçer",
              "renk": "danger"
            },
            {
              "ad": "HTML / PDF",
              "islev": "Keşif fişini yazdırır (evrak tip 801)",
              "sonuc": "Çıktı alınır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "teklifolustur",
              "tetik": "Teklife hazır ekranında 'Teklife Gönder' (onaylı)",
              "etki": "teklif_fis (evrak 901) master + teklif_fis_detay satırları oluşturur (KAYNAK_EVRAK_TIP=801, KAYNAK_ID=keşif), keşfin malzemelerini aktarır, kesif_fis ANA_POSITION=6 (Kapatıldı) yapar, her iki karta işlem logu yazar",
              "neden_sonuc": "Keşif resmi teklife dönüşür ve süreç kapanır. Keşif pozisyon 5'te değilse 'Aktarıma Uygun Değil' uyarısı verir; malzeme listesi boşsa teklif oluşturulamaz. Teklif geçerlilik tarihi keşif ayarındaki vade süresi (vadesure) kadar ileri hesaplanır."
            },
            {
              "ad": "reddet",
              "tetik": "Teklife hazır ekranında 'Reddet'",
              "etki": "kesif_fis ANA_POSITION=7 (İptal), SONUC_ACIKLAMA ve log",
              "neden_sonuc": "Teklife dönmeye değmeyen keşif iptal edilir."
            }
          ],
          "iliskiler": [
            "teklif (teklif_fis / teklif_fis_detay)",
            "stok",
            "cari"
          ],
          "ipuclari": [
            "Teklife dönüştürme sonrası keşif kalıcı olarak Kapatıldı (6) olur.",
            "Teklif geçerlilik tarihi, keşif ayarlarındaki vade süresi kadar ileri hesaplanır.",
            "Malzeme listesi boş keşif teklife gönderilemez; önce sahada/incelemede malzeme eklenmiş olmalıdır."
          ]
        },
        {
          "id": "kesifdurum",
          "baslik": "Keşif Durumları",
          "yol": "/ekran/kesif/tanim/kesifdurum",
          "sub": "tanim",
          "amac": "Keşif sürecindeki 7 ana pozisyonun (Beklemede, Planlandı, İşlemde, Onay Bekleniyor, Teklife Dönüştürülecek, Kapatıldı, İptal) altındaki alt durum etiketlerini renkleriyle birlikte tanımlar (sys_durum, MODULE_KEY='kesif_durum').",
          "neden": "Süreç adımlarının müşteriye/ekibe görünen adlarını ve renklerini firmaya özel hale getirmek için kullanılır. Alt durumlar liste ve raporlarda renkli rozet olarak görünür.",
          "nasil": [
            "Keşif > Keşif Durumları ekranını açın.",
            "Üstteki formda Kullanım Yeri (hangi ana pozisyon/sabitgrup), Ad, Sıra, arkaplan ve yazı rengini seçin.",
            "Durum Aktif/Pasif seçip 'Kaydet' deyin.",
            "Alttaki tabloda tanımlı durumları görün; İşlemler menüsünden Düzenle veya Sil yapın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Durum tanımını ekler/günceller",
              "sonuc": "sys_durum tablosuna kesif_durum kaydı yazılır",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "Düzenleme iptal edilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili durumu forma yükler",
              "sonuc": "Mevcut tanım güncellenebilir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Onay sorarak durumu siler",
              "sonuc": "Durum pasife alınır (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "kesifdurumekle",
              "tetik": "Formda 'Kaydet'",
              "etki": "sys_durum tablosuna MODULE_KEY='kesif_durum' ile kayıt ekler/günceller (ad, sıra, renkler, sabitgrup=ana pozisyon)",
              "neden_sonuc": "Alt durum etiketi tanımlanır; keşif kartlarında renkli olarak kullanılabilir. Sabitgrup (ana pozisyon) yanlış seçilirse durum akışın yanlış aşamasında görünür."
            },
            {
              "ad": "kesifdurumsil",
              "tetik": "Tabloda 'Sil'",
              "etki": "sys_durum DURUM=-1, silinme zaman/kullanıcı",
              "neden_sonuc": "Kullanılmayan durum listeden kaldırılır. Aktif keşiflerde kullanılan durumu silmek görünüm sorununa yol açabilir."
            }
          ],
          "iliskiler": [
            "sys_durum",
            "tüm keşif ekranları (durum rozetleri)"
          ],
          "ipuclari": [
            "Her ana pozisyonun (sabitgrup) en az bir alt durumu olmalı; yeni keşif otomatik olarak o grubun ilk sıralı (SIRA ASC) durumunu alır.",
            "Renkleri kontrast olacak şekilde seçin; okunabilirlik liste ve panolarda önemlidir."
          ]
        },
        {
          "id": "kesifkonu",
          "baslik": "Keşif Konuları",
          "yol": "/ekran/kesif/tanim/kesifkonu",
          "sub": "tanim",
          "amac": "Keşiflerin konu/kategori tanımlarını (kayit_gruplari, YER='KESIF') yönetir; ad, sıra ve aktiflik bilgisiyle liste tutar.",
          "neden": "Keşifleri konularına göre sınıflandırmak için kullanılan basit bir tanım listesidir. Firmaya özel konu başlıkları oluşturmayı sağlar.",
          "nasil": [
            "Keşif > Keşif Konuları ekranını açın.",
            "Formda Ad, Sıra ve Durum (Aktif/Pasif) girin.",
            "'Kaydet' ile konuyu ekleyin.",
            "Alttaki tablodan mevcut konuları Düzenle veya Sil yapın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Konu tanımını ekler/günceller",
              "sonuc": "kayit_gruplari tablosuna KESIF konusu yazılır",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu sıfırlar",
              "sonuc": "Düzenleme iptal edilir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili konuyu forma yükler",
              "sonuc": "Konu güncellenebilir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Onay sorarak konuyu siler",
              "sonuc": "Konu pasife alınır (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "kesifkonuekle",
              "tetik": "Formda 'Kaydet'",
              "etki": "kayit_gruplari tablosuna YER='KESIF' ile kayıt ekler/günceller",
              "neden_sonuc": "Keşif konusu tanımlanır ve seçilebilir hale gelir."
            },
            {
              "ad": "kesifkonusil",
              "tetik": "Tabloda 'Sil'",
              "etki": "kayit_gruplari DURUM=-1",
              "neden_sonuc": "Kullanılmayan konu listeden kaldırılır (soft delete)."
            }
          ],
          "iliskiler": [
            "kayit_gruplari"
          ],
          "ipuclari": [
            "Sıra alanı, konuların listede görünme sırasını belirler.",
            "Silinen konu pasife alınır; tamamen kaybolmaz."
          ]
        },
        {
          "id": "teklifdonusum",
          "baslik": "Teklif Dönüşüm",
          "yol": "/ekran/kesif/rapor/teklifdonusum",
          "sub": "rapor",
          "amac": "Yapılan keşiflerin ne kadarının teklife dönüştüğünü, ne kadarının iptal olduğunu ve hâlâ bekleyenleri; ayrıca keşiften kapanışa kadar geçen ortalama süreyi gösterir.",
          "neden": "Saha eforunun satışa (teklife) dönüşme oranı, keşif operasyonunun ticari verimini ölçen en kritik göstergedir. Düşük dönüşüm veya yüksek iptal, süreçte iyileştirme gerektiğine işaret eder.",
          "nasil": [
            "Keşif > Teklif Dönüşüm raporunu açın.",
            "'Filtreleme Yap' ile cari, evrak no ve tarih aralığı girip 'Arama Yap' deyin.",
            "Üstteki KPI kartlarından toplam, dönüşen (%), bekleyen ve iptal sayılarını okuyun.",
            "Rapor sekmesinde her keşfin durumu ve toplam süresini inceleyin.",
            "Özet sekmesinde dönüşüm oranlarını ve ortalama süreleri görün.",
            "Gerekirse 'Excel' ile listeyi dışarı aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Filtre penceresini açar",
              "sonuc": "Rapor kriterle çalıştırılır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Dönüşüm verileri listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtreyi sıfırlar",
              "sonuc": "Rapor boş duruma döner",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Rapor sonucunu Excel'e aktarır (excelExport kesif/teklifdonusum)",
              "sonuc": "Dosya indirilir",
              "renk": "accent"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kesif_fis",
            "sys_durum",
            "cari"
          ],
          "ipuclari": [
            "Filtre seçmeden rapor çalışmaz; performans için tarih aralığı verin.",
            "'Teklife Dönüştü' = Kapatıldı (6) pozisyonundaki keşiflerdir.",
            "Bekleyen sayısı yüksekse müşterileri arayıp teklif çıkarmaya yönlendirin."
          ]
        },
        {
          "id": "pozisyondagilim",
          "baslik": "Pozisyon Bazlı Dağılım",
          "yol": "/ekran/kesif/rapor/pozisyondagilim",
          "sub": "rapor",
          "amac": "Keşiflerin hangi ana pozisyon ve alt durumda biriktiğini ve her durumda ortalama ne kadar kaldığını gösterir.",
          "neden": "Süreçteki darboğazları (nerede yığılma var) tespit etmek için kullanılır. Bir durumda çok keşif birikmesi veya orada uzun süre kalınması, kaynak/planlama sorununa işaret eder.",
          "nasil": [
            "Keşif > Pozisyon Bazlı Dağılım raporunu açın.",
            "'Filtreleme Yap' ile cari ve tarih aralığı girip 'Arama Yap' deyin.",
            "KPI kartlarından toplam, açık, tamamlanan ve iptal sayılarını okuyun.",
            "Tabloda ana pozisyon > alt durum kırılımında sayı ve ortalama süreyi inceleyin.",
            "Birikmenin ve uzun sürenin olduğu satırlara odaklanın."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Filtre penceresini açar",
              "sonuc": "Rapor kriterle çalıştırılır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Pozisyon dağılımı listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtreyi sıfırlar",
              "sonuc": "Rapor boş duruma döner",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kesif_fis",
            "sys_durum"
          ],
          "ipuclari": [
            "'Planlandı'da birikme saha ekip yetersizliğine, 'Onay Bekliyor'da birikme onaycı darboğazına işaret eder.",
            "Ortalama süre, keşfin ilk kayıttan bugüne kadar o durumda geçirdiği süreyi yaklaşık verir.",
            "Bu raporun Excel dışa aktarımı yoktur."
          ]
        },
        {
          "id": "surecakis",
          "baslik": "Süreç Akış Analizi",
          "yol": "/ekran/kesif/rapor/surecakis",
          "sub": "rapor",
          "amac": "Keşiflerin pozisyondan pozisyona geçiş sıklığını ve iki durum arasındaki ortalama bekleme süresini, evrak işlem loguna (EVRAK_TIP=801) dayanarak gösterir.",
          "neden": "Keşiflerin hangi yollardan geçtiğini, hangi geçişlerde takıldığını veya geri döndüğünü görmek için kullanılır. Tekrarlayan geri dönüşler ve uzun geçiş süreleri süreç sorunlarını ortaya çıkarır.",
          "nasil": [
            "Keşif > Süreç Akış Analizi raporunu açın.",
            "'Filtreleme Yap' ile cari ve tarih girip 'Arama Yap' deyin.",
            "KPI kartlarından farklı geçiş, toplam keşif, toplam işlem ve ortalama geçiş süresini okuyun.",
            "Tabloda 'Nereden → Nereye', kaç keşif, toplam işlem ve ortalama dakikayı inceleyin.",
            "En uzun süren ve en sık tekrar eden geçişlere odaklanın.",
            "Gerekirse 'Excel' ile aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Filtre penceresini açar",
              "sonuc": "Rapor kriterle çalıştırılır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Geçiş analizi listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtreyi sıfırlar",
              "sonuc": "Rapor boş duruma döner",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Sonucu Excel'e aktarır (excelExport kesif/surecakis)",
              "sonuc": "Dosya indirilir",
              "renk": "accent"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "evrak_islem_log",
            "kesif_fis",
            "sys_durum"
          ],
          "ipuclari": [
            "Aynı geçişin tersi de listede varsa süreç geri-ileri gidiyor demektir; sebebini araştırın.",
            "Uzun süren bir geçiş hangi aşamada gecikme olduğunu gösterir; oraya otomasyon/hatırlatma ekleyin."
          ]
        },
        {
          "id": "malzemeoynak",
          "baslik": "Malzeme Oynaklık",
          "yol": "/ekran/kesif/rapor/malzemeoynak",
          "sub": "rapor",
          "amac": "Keşif sırasında bir malzemenin önce eklenip sonra silinmesi gibi 'oynak' hareketleri tespit eder ve keşifleri risk düzeyine (Düşük/Orta/Yüksek) göre sınıflandırır.",
          "neden": "Yüksek malzeme oynaklığı, sahada karar belirsizliği veya iletişim/standart eksikliğine işaret eder. Bu keşiflerin gözden geçirilmesi saha disiplinini artırır.",
          "nasil": [
            "Keşif > Malzeme Oynaklık raporunu açın.",
            "'Filtreleme Yap' ile cari ve tarih girip 'Arama Yap' deyin.",
            "KPI kartlarından düşük/orta/yüksek riskli keşif sayılarını okuyun.",
            "Tabloda her keşfin toplam hareket, eklenen, silinen ve oynak malzeme sayısını inceleyin.",
            "Keşif numarasına tıklayarak malzeme hareket detayını açın.",
            "Yüksek riskli keşifler için personeli arayıp nedenini sorun; gerekirse 'Excel' ile aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtreleme Yap",
              "islev": "Filtre penceresini açar",
              "sonuc": "Rapor kriterle çalıştırılır",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtreyi uygular",
              "sonuc": "Oynaklık listesi gelir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtreyi sıfırlar",
              "sonuc": "Rapor boş duruma döner",
              "renk": "ghost"
            },
            {
              "ad": "Keşif No (detay aç)",
              "islev": "Satırdaki malzeme hareket detayını açar",
              "sonuc": "Ekle/sil/güncelle log tablosu görünür",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Sonucu Excel'e aktarır (excelExport kesif/malzemeoynak)",
              "sonuc": "Dosya indirilir",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "malzemeoynakdetay",
              "tetik": "Keşif no bağlantısına tıklama",
              "etki": "kesif_malzeme_log'tan ilgili keşfin tüm malzeme hareketlerini tablo olarak döndürür",
              "neden_sonuc": "Hangi malzemenin ne zaman, kim tarafından, sahada mı incelemede mi değiştirildiği görülür; oynaklığın kaynağı anlaşılır."
            }
          ],
          "iliskiler": [
            "kesif_malzeme_log",
            "kesif_fis",
            "stok",
            "personel"
          ],
          "ipuclari": [
            "Oynak malzeme = aynı stok kaleminin hem eklenip hem silindiği durum; 4+ oynak Yüksek risktir.",
            "Tekrarlayan oynaklık için saha kontrol listesi/standart prosedür eklenmesi önerilir."
          ]
        }
      ]
    },
    {
      "slug": "servis",
      "title": "Teknik Servis",
      "icon": "🔧",
      "modul": "servis",
      "ad": "Servis Yönetimi",
      "ozet": "NetEsnaf Servis modülü; müşteri servis taleplerinin alınmasından iş emri açılışına, saha teknisyeninin GPS'li check-in/check-out'una, işçilik/parça/görev kaydına, kapanışta müşteri imzası + memnuniyet + OTP onayına ve nihayetinde faturaya/irsaliyeye aktarımına kadar tüm servis operasyonunu tek akışta yönetir. Ayrıca bakım anlaşmaları (hak/limit takibi), cihaz/ekipman kartları, kategori bazlı ücretlendirme (SLA süreleri), checklist şablonları ve 16 operasyonel/finansal rapor içerir. Kasa, cari, stok, fatura, irsaliye ve otomasyon (n8n/e-posta) modülleriyle entegre çalışır; kapsam (Bakım/Garanti/Ücretli/Ücretsiz/Anlaşmalı) faturalamayı doğrudan belirler.",
      "modul_iliskiler": [
        "cari",
        "kasa",
        "stok",
        "fatura",
        "irsaliye",
        "personel",
        "proje",
        "otomasyon",
        "dosyaarsiv"
      ],
      "ekranlar": [
        {
          "id": "talepliste",
          "baslik": "Servis Talepleri",
          "yol": "/ekran/servis/islem/talepliste",
          "sub": "islem",
          "amac": "Müşterilerden telefon, e-posta, web, WhatsApp veya B2B portal gibi kanallardan gelen servis taleplerinin toplandığı ve iş emrine dönüştürülmeden önce beklediği giriş kutusudur.",
          "neden": "Her arıza/istek doğrudan iş emri açmayı gerektirmez; önce kaydedip değerlendirmek talep kaybını önler, kaynağını (hangi kanaldan geldi) izlemenizi ve gerektiğinde tek tıkla servise dönüştürmenizi sağlar.",
          "nasil": [
            "Sağ üstteki 'Yeni Talep' ile talep formunu açın.",
            "Kaynak (telefon/e-posta/web...), müşteri ve konu alanlarını doldurup kaydedin (bu üç alan zorunludur).",
            "Listeden bir talebin 'İşlemler > Detay' menüsüne girip talebe not ekleyebilir veya servise dönüştürebilirsiniz.",
            "Yalnızca 'Yeni' durumundaki talepler düzenlenebilir veya iptal edilebilir; servise dönüşen talep kilitlenir.",
            "Üstteki Filtrele ile duruma (Yeni/Servise Dönüştü/İptal) ve kaynağa göre listeyi daraltın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Talep",
              "islev": "Boş talep formu açar",
              "sonuc": "Yeni servis talebi kaydı oluşturma ekranı gelir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Durum ve kaynağa göre listeyi süzer",
              "sonuc": "Sadece seçilen kriterlere uyan talepler listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Detay",
              "islev": "Talebin detay ekranını açar",
              "sonuc": "Talep içeriği, notlar ve servise dönüştürme seçeneği görüntülenir",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Yeni durumdaki talebi düzenler",
              "sonuc": "Talep bilgileri güncellenir",
              "renk": "accent"
            },
            {
              "ad": "İptal",
              "islev": "Talebi iptal durumuna alır",
              "sonuc": "Talep 'İptal' olarak işaretlenir, artık işleme alınamaz",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "talepekle",
              "tetik": "Talep formunda Kaydet",
              "etki": "servis_talep tablosuna yeni kayıt ekler veya Yeni durumundaki kaydı günceller; ilk kayıtta SERVIS_TALEBI_OLUSTURULDU otomasyonunu tetikler",
              "neden_sonuc": "Gelen isteği sisteme alır ve otomasyon kuruluysa müşteriye/ekibe bildirim gider; kaydetmezseniz talep unutulur ve takip edilemez"
            },
            {
              "ad": "talepnotekle",
              "tetik": "Talep detayında not ekleme",
              "etki": "servis_talep_not tablosuna kullanıcı ve zaman damgalı not yazar",
              "neden_sonuc": "Müşteriyle yapılan görüşmeler kalıcı iz bırakır; not eklemezseniz kim ne konuştu bilinmez, sorumluluk takibi zorlaşır"
            },
            {
              "ad": "talepiptal",
              "tetik": "İptal butonu",
              "etki": "servis_talep.DURUM='IPTAL' yapar (yalnız Yeni ise)",
              "neden_sonuc": "Geçersiz/mükerrer talebi kapatır ama kayıt izini korur; sadece Yeni talepler iptal edilebilir, işleme girmiş talep iptal edilemez"
            },
            {
              "ad": "talepsil",
              "tetik": "Silme aksiyonu",
              "etki": "servis_talep.DURUM=-1 (soft delete, yalnız Yeni ise)",
              "neden_sonuc": "Yanlış girilen talebi listeden kaldırır; veri fiziksel silinmez, gerektiğinde geri izlenebilir"
            }
          ],
          "iliskiler": [
            "cari",
            "otomasyon"
          ],
          "ipuclari": [
            "Servise dönüştürülmüş bir talep tekrar düzenlenemez veya silinemez; dönüştürmeden önce bilgileri doğrulayın.",
            "Kaynak alanı zorunludur çünkü Talep Dönüşüm Raporu bu kanal bilgisiyle hangi kanalın verimli olduğunu ölçer."
          ]
        },
        {
          "id": "servisliste",
          "baslik": "Servis İş Emirleri",
          "yol": "/ekran/servis/islem/servisliste",
          "sub": "islem",
          "amac": "Açılan tüm servis iş emirlerinin listelendiği ve her birinin detayından tüm saha/atölye operasyonunun (durum, ekip, parça, işçilik, check-in/out, kapanış, faturalama) yürütüldüğü modülün ana çalışma ekranıdır.",
          "neden": "Servisin can damarıdır; bir işin hangi aşamada olduğunu, kime atandığını, SLA'yı (plan bitişini) aşıp aşmadığını, maliyetini ve faturalanıp faturalanmadığını buradan yönetirsiniz. Kısıtlı personel (saha teknisyeni) yalnız kendine atanmış işleri görür.",
          "nasil": [
            "'Yeni Servis' ile iş emri formunu açın; müşteri, servis tipi (Yerinde/Atölye/Uzaktan/Destek), kapsam (Bakım/Garanti/Ücretli/Ücretsiz/Anlaşmalı) ve plan tarihlerini girin.",
            "Kaydettikten sonra iş emri detayına düşersiniz; buradan ekip atayın, parça/işçilik ekleyin, durumu ilerletin.",
            "Saha işinde teknisyen 'Geldim (Check-in)' ile başlar, iş sırasında not/parça/fotoğraf ekler, 'Ayrıldım (Check-out)' ile bitirir.",
            "İş bitince checklist ve (ayar açıksa) imza/OTP tamamlanır, 'İşi Kapat' ile durum Tamamlandı olur ve fatura/irsaliye kalemleri hazırlanır.",
            "Detaylı Filtre ile iş emri no, müşteri, personel, durum, kapsam, tip, öncelik, tarih aralığı ve 'sadece SLA riskliler' üzerinden arama yapın.",
            "İşlemler menüsünden servis fişini Yazdır ile çıktı alın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Servis",
              "islev": "Yeni iş emri formunu açar",
              "sonuc": "Boş servis iş emri oluşturma ekranı gelir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Çok kriterli detaylı filtre modalını açar",
              "sonuc": "İş emirleri seçilen kriterlere göre süzülür",
              "renk": "ghost"
            },
            {
              "ad": "Görüntüle",
              "islev": "İş emri detayına gider",
              "sonuc": "İşin tüm operasyon paneli (ekip/parça/işçilik/kapanış) açılır",
              "renk": "primary"
            },
            {
              "ad": "Yazdır",
              "islev": "Servis fişi yazdırma modalını açar",
              "sonuc": "İş emri çıktısı/PDF üretilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "servisekle",
              "tetik": "İş emri formunda Kaydet",
              "etki": "servis_is_emri kaydı açar/günceller, checklist şablonlarını yükler, kategori bazlı maliyeti hesaplar, YERINDE ise adresi yazar, anlaşma seçiliyse hak düşer",
              "neden_sonuc": "İşin resmi kaydı oluşur ve maliyet/anlaşma otomatik bağlanır; kapsamı yanlış (ör. ücretliyi garanti) seçerseniz fatura yanlış çıkar"
            },
            {
              "ad": "servisedonu",
              "tetik": "Talep detayında 'Servise Dönüştür'",
              "etki": "servis_talep'ten yeni servis_is_emri üretir, talebi SERVISE_DONUSTU işaretler",
              "neden_sonuc": "Talep tek tıkla iş emrine döner, çift veri girişi ortadan kalkar; dönüştürmezseniz talep beklemede kalır"
            },
            {
              "ad": "servisdurumguncelle",
              "tetik": "Durum değiştirme (Başlat/İncele/Tamamla)",
              "etki": "ANA_POSITION/ALT_POSITION değişir, başlangıç/bitiş zamanı damgalanır, Tamamlandı'da KM+işçilik+maliyet ve anlaşma hakkı işlenir; SERVIS_DURUM_DEGISTI otomasyonu tetiklenir",
              "neden_sonuc": "İşin aşaması güncellenir ve müşteriye durum bildirimi gidebilir; geçersiz geçiş (ör. iptalden tamamlandıya) engellenir"
            },
            {
              "ad": "servisiptal",
              "tetik": "İş emrini İptal Et",
              "etki": "ANA_POSITION=5, tüketilen malzeme stok çıkışı (stok_hareket DURUM=-1) ve seri no stoğa iade edilir, anlaşma hakkı geri verilir (hakIade)",
              "neden_sonuc": "Yapılmayan işin stok ve anlaşma etkisi geri alınır; iptal etmezseniz sahte stok tüketimi ve hak kaybı oluşur"
            },
            {
              "ad": "servisislmekle",
              "tetik": "İşlem/müdahale notu ekleme",
              "etki": "servis_islem'e müdahale/telefon/ziyaret/mail kaydı yazar",
              "neden_sonuc": "Yapılan işin kronolojik kaydı tutulur; saha personeli check-in yapmadan işlem ekleyemez"
            },
            {
              "ad": "servispersonelekle",
              "tetik": "Ekibe personel atama",
              "etki": "servis_personel'e personel + rol ekler (mükerrer engelli)",
              "neden_sonuc": "İşi kimin yaptığı ve işçilik maliyeti (saat ücreti) bağlanır; atamazsanız işçilik maliyeti ve performans raporu eksik kalır"
            },
            {
              "ad": "servismalzemeekle",
              "tetik": "Kullanılan parça ekleme",
              "etki": "servis_malzeme'ye stok+miktar+seri no yazar, stok_hareket(EVRAK_TIP=510) çıkışı üretir, maliyeti günceller; fiyat kilidi açık değilse sunucu stok satış fiyatını uygular",
              "neden_sonuc": "Harcanan malzeme faturaya ve stok çıkışına yansır; eklemezseniz malzeme ücretsiz gitmiş sayılır ve stok tutmaz"
            },
            {
              "ad": "servischeckin",
              "tetik": "Saha 'Geldim (Check-in)'",
              "etki": "servis_saha_hareket'e GPS'li varış kaydı, iş otomatik Başlandı'ya geçer, CHECKIN_ZAMAN damgalanır",
              "neden_sonuc": "Sahaya varış saati/konumu kanıtlanır ve saha kalem ekleme kapısı açılır; check-in yapmadan teknisyen parça/foto/imza ekleyemez"
            },
            {
              "ad": "servischeckout",
              "tetik": "Saha 'Ayrıldım (Check-out)'",
              "etki": "GPS'li ayrılış kaydı, SAHA_SURE_DK hesaplanır, ayar açıksa süre otomatik işçiliğe/KM'ye dönüşür, anlaşma süre hakkı düşer",
              "neden_sonuc": "Sahada geçen süre otomatik işçilik ve maliyet olur; clientUuid ile idempotenttir, ikinci check-out süreyi çift saymaz"
            },
            {
              "ad": "serviszamanekle",
              "tetik": "Manuel işçilik süresi girme",
              "etki": "servis_zaman'a süre kaydı ekler, maliyeti günceller",
              "neden_sonuc": "Atölye/uzaktan işlerde harcanan işçilik faturalanabilir hale gelir; girmezseniz emek ücretsiz kalır"
            },
            {
              "ad": "servisgorevekle",
              "tetik": "Personele görev atama",
              "etki": "servis_gorev'e 'Bekliyor' görev ekler",
              "neden_sonuc": "İş içi alt görevler personele dağıtılır; görev bitirilince süresi otomatik işçiliğe eklenir"
            },
            {
              "ad": "servisgorevbitir",
              "tetik": "Görevi Tamamla",
              "etki": "görev Tamamlandı olur, geçen süresi servis_zaman'a yazılır ve maliyet güncellenir",
              "neden_sonuc": "Görev süresi maliyete girer; bitirmezseniz emek ve süre kayda geçmez"
            },
            {
              "ad": "servischecklistguncelle",
              "tetik": "Checklist maddesi işaretleme",
              "etki": "servis_checklist maddesinin durumunu tamamlandı/bekliyor yapar",
              "neden_sonuc": "Yapılması gereken adımlar takip edilir; zorunlu maddeler tamamlanmadan iş kapatılamaz"
            },
            {
              "ad": "servisfotoekle",
              "tetik": "Saha fotoğrafı yükleme",
              "etki": "Fotoğrafı (client'ta küçültülmüş JPEG) S3/Google Drive'a yükleyip dosya_arsiv'e (YER=6) bağlar (offline kuyruk uyumlu)",
              "neden_sonuc": "İşin öncesi/sonrası görsel kanıtı saklanır; check-in şart ve dosya arşivi ayarlı olmalıdır"
            },
            {
              "ad": "servisimzakaydet",
              "tetik": "Müşteri imzası alma (canvas)",
              "etki": "İmzayı servis_is_emri.IMZA_DATA'ya base64 data URI olarak yazar",
              "neden_sonuc": "Müşterinin işi onayladığı ıslak imza dijital kanıtı olur; imza zorunlu ayarındaysa kapanış için gerekir"
            },
            {
              "ad": "servismemnuniyetkaydet",
              "tetik": "Kapanışta 1-5 yıldız",
              "etki": "servis_is_emri.MEMNUNIYET puanını yazar",
              "neden_sonuc": "Müşteri memnuniyeti ölçülür ve personel performans raporuna yansır"
            },
            {
              "ad": "servistahsilatekle",
              "tetik": "Sahada tahsilat alma",
              "etki": "kasa_fis(EVRAK_TIP=201)+kasa_hareket(giriş)+cari_hareket üretir, SAHA_TAHSILAT_TOPLAM'ı artırır (CLIENT_UUID ile mükerrer engelli)",
              "neden_sonuc": "Teknisyen sahada ödeme alır, müşterinin borcu anında düşer ve kasaya girer; saha tahsilat ayarı açık olmalıdır"
            },
            {
              "ad": "servissahakapat",
              "tetik": "Sahadan 'İşi Kapat'",
              "etki": "Zorunlu checklist/imza/OTP kapılarını denetleyip işi Tamamlandı yapar ve ayara göre fatura/irsaliye kalemlerini üretir",
              "neden_sonuc": "İş ayar akışına göre (fatura/irsaliye/yok) kapanır; zorunlu adım eksikse kapanış engellenir, böylece yarım iş faturalanmaz"
            },
            {
              "ad": "servisotpgonder",
              "tetik": "Kapanışta 'Onay Kodu Gönder'",
              "etki": "6 haneli tek kullanımlık kodu müşteri e-postasına SMTP ile yollar (sha256 hash'li, 10 dk geçerli)",
              "neden_sonuc": "Müşterinin işi onayladığı e-posta ile doğrulanır; kapanış OTP ayarı açıksa gerekir, spam koruması için 60 sn cooldown vardır"
            },
            {
              "ad": "servisfaturala",
              "tetik": "Faturaya Aktar",
              "etki": "Seçili kalemlerden 301 satış faturası + fatura_detay üretir, FATURA_ID'yi işler",
              "neden_sonuc": "Servis geliri resmi faturaya döner; çift-faturalama kilitle engellenir, kapsam garantiyse servis ücreti alınmaz"
            },
            {
              "ad": "servisirsaliyeaktar",
              "tetik": "İrsaliyeye Aktar",
              "etki": "Kalemlerden sevk irsaliyesi üretir, IRSALIYE_ID işler",
              "neden_sonuc": "Malzeme sevkiyatı belgelenir (fatura sonra kesilecekse); zaten aktarılmışsa tekrar edilmez"
            },
            {
              "ad": "servisefaturagonder",
              "tetik": "E-Faturayı Hemen Gönder",
              "etki": "Oluşmuş faturayı GİB'e iletir (\\Servis\\EFaturaGonder)",
              "neden_sonuc": "E-dönüşüm aktifse fatura anında resmileşir; süreç kapalıysa bekleyenlerde kalır"
            },
            {
              "ad": "cihazekle",
              "tetik": "İş emri formunda hızlı cihaz ekleme",
              "etki": "servis_cihaz'a müşteriye bağlı cihaz kaydeder",
              "neden_sonuc": "Servis edilen cihaz/ekipman iş emrine bağlanır, garanti ve geçmiş takibi mümkün olur"
            },
            {
              "ad": "sahabugun",
              "tetik": "Saha PWA 'İşlerim'",
              "etki": "Teknisyene atanmış açık işleri sayfalı döner (sadece kendi işleri)",
              "neden_sonuc": "Saha personeli günün işlerini telefonundan görür; kendine atanmamış işi göremez"
            },
            {
              "ad": "sahaisdetay",
              "tetik": "Saha PWA iş kartına dokunma",
              "etki": "İşin müşteri/adres/parça/işlem/checklist/foto/imza detayını döner",
              "neden_sonuc": "Teknisyen sahada tüm iş bilgisine ulaşır; iş kendisine atanmamışsa erişemez"
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "kasa",
            "fatura",
            "irsaliye",
            "personel",
            "proje",
            "otomasyon",
            "dosyaarsiv"
          ],
          "ipuclari": [
            "Kapsam seçimi faturalamayı belirler: Garanti/Ücretsiz ve hak dahilindeki Anlaşmalı işlerde servis ücreti otomatik sıfırlanır; yanlış kapsam çifte tahsilat veya gelir kaybı yaratır.",
            "Saha personeli (kısıtlı TIP) 'Geldim' yapmadan parça/foto/imza ekleyemez ve yalnızca kendine atanmış işleri görür.",
            "SLA riski (plan bitişi geçmiş açık işler) listede kırmızı satır ve rozetle işaretlenir; 'Sadece SLA Riskliler' filtresiyle bunları toplu görün.",
            "İş kapatıldıktan (Tamamlandı/İptal) sonra saha personeli o işe müdahale edemez; düzeltme yöneticide.",
            "Şube filtresi: Birden fazla şubesi olan işletmelerde filtre penceresine eklenen Şube seçiciyle, yalnız erişim yetkiniz olan şubeleri seçerek listeyi o şubeye ait kayıtlarla süzersiniz; tek şubeli işletmelerde bu seçici görünmez."
          ]
        },
        {
          "id": "dispatchpano",
          "baslik": "İş Dağıtım Panosu",
          "yol": "/ekran/servis/islem/dispatchpano",
          "sub": "islem",
          "amac": "Açık işleri (Yeni / Başlandı / İnceleniyor) kanban sütunlarında SLA aciliyetine göre gösterip teknisyene tek tıkla/dropdown ile hızlı atama yapılan iş dağıtım ekranıdır.",
          "neden": "Sabah gelen işleri en acil olandan (planı geçmiş/kısa süre kalmış) başlayarak dağıtmanızı sağlar; her işin detayına girmeden kimin nereye gideceğini saniyeler içinde belirlersiniz.",
          "nasil": [
            "Sütunlar iş durumlarını, kartlar tek tek işleri gösterir; kartlar SLA'ya göre sıralı ve renk kodludur (kırmızı=gecikme).",
            "Bir kartın altındaki personel açılır listesinden teknisyen seçerek işi anında atayın.",
            "Üstteki Teknisyen filtresiyle belirli bir personelin veya 'Atanmamış' işlerin yükünü görün.",
            "Kart başlığına tıklayarak işin detayına gidin."
          ],
          "butonlar": [
            {
              "ad": "Liste Görünümü",
              "islev": "Servis iş emirleri listesine döner",
              "sonuc": "Klasik tablo görünümü açılır",
              "renk": "ghost"
            },
            {
              "ad": "Filtrele",
              "islev": "Teknisyene/atanmamışa göre süzer",
              "sonuc": "Panoda sadece seçilen teknisyenin işleri kalır",
              "renk": "primary"
            },
            {
              "ad": "Personel Ata (dropdown)",
              "islev": "Karttan teknisyen seçer",
              "sonuc": "İş seçilen personele atanır (servisatapersonel)",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "servisatapersonel",
              "tetik": "Kart üzerindeki personel açılır listesi",
              "etki": "servis_is_emri.SORUMLU_PERSONEL_ID'yi günceller (0 = atamayı kaldırır)",
              "neden_sonuc": "İş anında sorumlu teknisyene bağlanır ve o kişinin saha ekranında görünür; atama yapılmazsa iş sahipsiz kalır ve kimse üstlenmez"
            }
          ],
          "iliskiler": [
            "personel",
            "cari"
          ],
          "ipuclari": [
            "Kırmızı kenarlı kartlar SLA'sı geçmiş acil işlerdir; önce onları dağıtın.",
            "Kısıtlı teknisyen bu panoda yalnız kendi işlerini görür ve atama yapamaz (dropdown pasiftir)."
          ]
        },
        {
          "id": "sahatakip",
          "baslik": "Saha Canlı Takip",
          "yol": "/ekran/servis/islem/sahatakip",
          "sub": "islem",
          "amac": "Teknisyenlerin gün içindeki check-in/check-out konumlarını harita üzerinde canlı gösteren yönetici izleme ekranıdır; kim nerede, hangi işte, ne zaman başladı bilgisini ve günün sıralı rotasını sunar.",
          "neden": "Patron/koordinatör masabaşından sahadaki ekibin nerede olduğunu ve günün ziyaret rotasını görür; müşteri 'teknisyen nerede kaldı' diye sorduğunda anlık cevap verilir, verimlilik ölçülür.",
          "nasil": [
            "Tarih seçip 'Göster' ile o günün saha hareketlerini haritada görüntüleyin.",
            "Sol listeden bir teknisyene tıklayın; günün sıralı durakları (numaralı) haritada çizilir.",
            "İşte/Boşta rozetinden anlık durumu, ziyaret sayısını ve son müşteriyi görün.",
            "Otomatik yenile (60 sn) açıkken ekran kendini günceller."
          ],
          "butonlar": [
            {
              "ad": "Göster",
              "islev": "Seçilen tarihin saha hareketlerini yükler",
              "sonuc": "Harita ve teknisyen listesi o güne göre gelir",
              "renk": "primary"
            },
            {
              "ad": "Otomatik yenile",
              "islev": "60 saniyede bir veriyi tazeler",
              "sonuc": "Canlı konum güncel kalır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "cari"
          ],
          "ipuclari": [
            "Harita için Ayar > Diğer > Konum'da başlangıç merkezi/Google Maps anahtarı tanımlı olmalıdır; yoksa anahtarsız Leaflet haritası kullanılır.",
            "Konum verisi ancak teknisyen GPS izinli check-in/out yaparsa oluşur; izin verilmezse harita boş kalır.",
            "Kısıtlı teknisyen yalnızca kendi konumunu görür (gizlilik)."
          ]
        },
        {
          "id": "anlasmaliste",
          "baslik": "Bakım Anlaşmaları",
          "yol": "/ekran/servis/islem/anlasmaliste",
          "sub": "islem",
          "amac": "Müşterilerle yapılan periyodik bakım/servis anlaşmalarının (yıllık bakım, X adet çağrı hakkı, saat bazlı süre hakkı vb.) tanımlandığı ve kalan hakların takip edildiği ekrandır.",
          "neden": "Anlaşmalı müşterilerin servis hakkını (adet/süre) otomatik düşerek limit aşımını erken görür, yenileme tarihini kaçırmaz ve anlaşma kapsamındaki işlerde çifte ücret almazsınız.",
          "nasil": [
            "'Yeni Anlaşma' ile müşteri, başlık, başlangıç/bitiş tarihi ve tutarı girin.",
            "Servis tipi bazlı limitleri (ör. Yerinde 12 adet, Uzaktan sınırsız) ve periyot/kapsam (Hepsi veya seçili kategoriler) tanımlayın.",
            "Listede her anlaşmanın hak kullanım çubuğunu (kullanılan/toplam, kalan) ve durumunu görün.",
            "Detaydan anlaşmayı yenileyin (parentID ile yeni dönem) veya iptal edin.",
            "Durum/müşteri filtresiyle listeyi daraltın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Anlaşma",
              "islev": "Anlaşma formunu açar",
              "sonuc": "Yeni bakım anlaşması oluşturma ekranı gelir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Durum/müşteriye göre süzer",
              "sonuc": "Liste seçilen kritere göre daralır",
              "renk": "ghost"
            },
            {
              "ad": "Detay",
              "islev": "Anlaşma detayına gider",
              "sonuc": "Hak kullanımı, kapsam ve yenileme/iptal seçenekleri açılır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "anlasmaekle",
              "tetik": "Anlaşma formunda Kaydet",
              "etki": "servis_anlasma kaydı açar/günceller, ANLASMA_NO üretir, tip limitlerini ve kapsamı yazar; yenilemede eski anlaşmayı pasifler",
              "neden_sonuc": "Müşterinin servis hakkı sisteme tanımlanır ve iş emirlerine otomatik bağlanır; limitleri doğru girmezseniz hak takibi yanlış işler"
            },
            {
              "ad": "anlasmahakdurum",
              "tetik": "Anlaşma seçiminde hak sorgusu (iş emri formu)",
              "etki": "Kalan hak/limit özetini döner (okuma)",
              "neden_sonuc": "İş açarken müşterinin kalan hakkını anında gösterir; limit dolmuşsa uyarır"
            },
            {
              "ad": "anlasmayenile",
              "tetik": "Yenile butonu",
              "etki": "Mevcut anlaşmayı parent alarak yeni dönem formuna yönlendirir",
              "neden_sonuc": "Biten anlaşma geçmişi koparak yeni döneme taşınır; yenilemezseniz müşteri kapsamsız kalır"
            },
            {
              "ad": "anlasmasil",
              "tetik": "İptal butonu",
              "etki": "servis_anlasma.DURUM=-1 (aktif servisi varsa engellenir)",
              "neden_sonuc": "Geçersiz anlaşmayı kapatır; üstünde açık iş varken iptal edilemez, böylece bağlı işler öksüz kalmaz"
            }
          ],
          "iliskiler": [
            "cari",
            "personel"
          ],
          "ipuclari": [
            "Bir iş emrini 'Anlaşmalı' kapsamla açtığınızda müşterinin tek aktif anlaşması varsa otomatik seçilir; birden fazla varsa elle seçmeniz gerekir.",
            "Hak kullanım çubuğu %90'ı geçince kırmızıya döner; yenileme hatırlatma gününü buna göre ayarlayın."
          ]
        },
        {
          "id": "sahatakvim",
          "baslik": "Saha Takvimi",
          "yol": "/ekran/servis/islem/sahatakvim",
          "sub": "islem",
          "amac": "Seçilen güne planlanmış yerinde (saha) servislerini kart görünümünde adres, saat, atanan personel ve iletişim bilgisiyle listeleyen günlük saha planlama ekranıdır.",
          "neden": "Bir günün saha programını tek bakışta görüp rotayı planlar, müşteriye gitmeden adres/iletişim ve yol tarifini hazır bulur; hangi teknisyenin nereye gideceğini netleştirir.",
          "nasil": [
            "Tarih ve (isteğe bağlı) personel seçip Filtrele deyin.",
            "O güne düşen açık yerinde servisleri kart kart görün (müşteri, saat, adres, ekip, iletişim).",
            "Kartın gözünden iş detayına gidin veya 'Yol Tarifi' ile haritada konumu açın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih/personele göre günün işlerini getirir",
              "sonuc": "Seçilen günün saha servisleri kartlarda listelenir",
              "renk": "primary"
            },
            {
              "ad": "Görüntüle",
              "islev": "İş detayına gider",
              "sonuc": "Servis iş emri detayı açılır",
              "renk": "ghost"
            },
            {
              "ad": "Yol Tarifi",
              "islev": "Konumu Google Maps'te açar",
              "sonuc": "Müşteri adresine navigasyon başlar",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "personel"
          ],
          "ipuclari": [
            "Yalnızca 'Yerinde' tipli ve açık (tamamlanmamış/iptal olmamış) işler takvimde görünür.",
            "Yol Tarifi butonu ancak iş emri adresinde konum (LAT/LON) varsa çıkar; adresi haritadan seçmek rota planını kolaylaştırır."
          ]
        },
        {
          "id": "serviskategori",
          "baslik": "Servis Kategorileri",
          "yol": "/ekran/servis/tanim/serviskategori",
          "sub": "tanim",
          "amac": "Servis türlerini (ör. Klima Bakım, Yazıcı Onarım) hiyerarşik olarak tanımlayıp her kategoriye SLA süresi, SLA aşım bildirim hedefi ve servis tipi bazlı ücretlendirme (sabit/saatlik + hizmet stok kartı) atadığınız tanım ekranıdır.",
          "neden": "Kategori, bir işin ne kadar sürede çözülmesi gerektiğini (SLA), ücretlendirmesini ve hangi checklist'in yükleneceğini belirler; doğru kurulduğunda ücretli servisler faturaya otomatik ve tutarlı yansır.",
          "nasil": [
            "Üst kategori ve kategori adını girin, gerekirse alt kategori ekleyin.",
            "SLA süresini (dakika) ve süre aşınca uyarının kime gideceğini (yönetici/personel/ikisi) seçin.",
            "Her servis tipi (Yerinde/Atölye/Uzaktan/Destek) için hizmet stok kartı, birim tipi (Sabit/Saatlik) ve birim fiyatı tanımlayın.",
            "Kaydedin; ücretli kapsamlı işlerde bu bedeller faturaya otomatik gelir."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Kategoriyi ve ücret tanımlarını yazar",
              "sonuc": "Kategori oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "Değişiklik kaydedilmez",
              "renk": "ghost"
            },
            {
              "ad": "Alt Kategori Ekle",
              "islev": "Seçili kategoriye alt kategori açar",
              "sonuc": "Hiyerarşide alt dal oluşturulur",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Kategoriyi düzenlemeye açar",
              "sonuc": "Bilgiler forma yüklenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Kategoriyi pasife/silinmişe çeker",
              "sonuc": "Kategori listeden kalkar (soft delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "serviskategoriekle",
              "tetik": "Kaydet butonu",
              "etki": "servis_kategori'ye kayıt yazar; servis tipi bazlı UCRET_TANIMLARI (fiyat/birim/stok/KDV) JSON'unu ve SLA ayarlarını saklar",
              "neden_sonuc": "Ücretli işlerin faturası ve SLA takibi bu tanıma dayanır; ücret girmezseniz ücretli servis faturasında servis bedeli çıkmaz"
            },
            {
              "ad": "serviskategorisil",
              "tetik": "Sil butonu",
              "etki": "servis_kategori.DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan kategoriyi gizler; geçmiş işlerin kategori bağı korunur"
            }
          ],
          "iliskiler": [
            "stok"
          ],
          "ipuclari": [
            "Garanti ve anlaşma kapsamlı işlerde bu ücretler uygulanmaz; ücretlendirme yalnız 'Ücretli' kapsamda devreye girer.",
            "Saat bazlı ücrette fatura miktarı işe girilen toplam işçilik süresinden (servis_zaman) otomatik hesaplanır."
          ]
        },
        {
          "id": "servisdurum",
          "baslik": "Servis Durumları",
          "yol": "/ekran/servis/tanim/servisdurum",
          "sub": "tanim",
          "amac": "Kanonik ana durumların (Yeni/Başlandı/İnceleniyor/Tamamlandı/İptal) altına firmaya özel alt durumlar (ör. 'Parça Bekliyor', 'Müşteri Onayında') tanımlayıp renklendirdiğiniz ekrandır.",
          "neden": "Standart 5 aşama çoğu işletmeye yetmez; kendi iş akışınıza göre ara durumlar ekleyerek bir işin tam olarak hangi noktada takıldığını renk koduyla görürsünüz.",
          "nasil": [
            "Kullanım yeri olarak bir ana durum grubu (Yeni/Başlandı...) seçin.",
            "Alt durum adını, sırasını, arka plan ve yazı rengini girin.",
            "Aktif/Pasif seçip Kaydet deyin; iş emri listesinde bu alt durumlar seçilebilir hale gelir."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Alt durumu yazar",
              "sonuc": "sys_durum'a servis alt durumu eklenir/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Alt durumu düzenler",
              "sonuc": "Bilgiler forma yüklenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Alt durumu siler",
              "sonuc": "sys_durum.DURUM=-1 (soft delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "servisdurumekle",
              "tetik": "Kaydet butonu",
              "etki": "sys_durum'a MODULE_KEY='servis_durum' ile alt durum yazar (SABITGRUP=ana durum, renkler)",
              "neden_sonuc": "İş emirlerinde detaylı aşama takibi mümkün olur; tanımlamazsanız yalnız 5 kanonik aşamayla sınırlı kalırsınız"
            },
            {
              "ad": "servisdurumsil",
              "tetik": "Sil butonu",
              "etki": "sys_durum.DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan alt durumu gizler; geçmiş kayıtların durum bağı bozulmaz"
            }
          ],
          "iliskiler": [],
          "ipuclari": [
            "Ana durum geçiş kuralları (ör. iptalden tamamlandıya dönülemez) sistemsel sabittir; alt durumlar bu ana aşamanın içinde bilgi amaçlıdır.",
            "Renkleri iş listesinde okunaklı olacak şekilde (arka plan/yazı kontrastı) seçin."
          ]
        },
        {
          "id": "cihazkart",
          "baslik": "Cihaz / Ekipman",
          "yol": "/ekran/servis/tanim/cihazkart",
          "sub": "tanim",
          "amac": "Müşterilere ait servis edilen cihaz/ekipmanların (marka, model, seri no, garanti başlangıç/bitiş, notlar) kayıt altına alındığı envanter ekranıdır.",
          "neden": "Bir cihazı iş emrine bağlayınca o cihazın tüm servis geçmişini ve garanti durumunu görürsünüz; garanti kapsamını doğru belirleyip haksız ücret almayı veya garantili işi ücretlendirmeyi önlersiniz.",
          "nasil": [
            "'Yeni Cihaz' ile modalı açın; müşteriyi seçin, cihaz adı/marka/model/seri no girin.",
            "Garanti başlangıç ve bitiş tarihlerini işleyin; liste garanti durumunu (Garantili/Bitti) renkli gösterir.",
            "Üstteki arama ile cihaz, marka, model, seri no veya müşteriye göre filtreleyin.",
            "İş emri açarken bu cihazı seçerek servisi cihaza bağlayın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Cihaz",
              "islev": "Cihaz kayıt modalını açar",
              "sonuc": "Boş cihaz formu gelir",
              "renk": "primary"
            },
            {
              "ad": "Ara/Filtrele",
              "islev": "Metne göre cihazları süzer",
              "sonuc": "Eşleşen cihazlar listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Kaydet",
              "islev": "Cihazı yazar",
              "sonuc": "servis_cihaz kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Cihazı düzenler",
              "sonuc": "Bilgiler modala yüklenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Cihazı siler",
              "sonuc": "servis_cihaz.DURUM=-1 (soft delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "cihazekle",
              "tetik": "Kaydet butonu",
              "etki": "servis_cihaz'a müşteriye bağlı cihaz yazar/günceller (garanti tarihleri dahil)",
              "neden_sonuc": "Cihaz geçmişi ve garanti takibi başlar; kaydetmezseniz servisleri belirli bir cihaza bağlayamaz, geçmişi izleyemezsiniz"
            },
            {
              "ad": "cihazdetayjson",
              "tetik": "Düzenle açılışı",
              "etki": "Cihaz bilgisini modala okur (okuma)",
              "neden_sonuc": "Mevcut bilgiler forma dolar, hatalı yeniden giriş önlenir"
            },
            {
              "ad": "cihazsil",
              "tetik": "Sil butonu",
              "etki": "servis_cihaz.DURUM=-1 (soft delete)",
              "neden_sonuc": "Hurdaya ayrılan/yanlış cihazı gizler; geçmiş servis bağı korunur"
            }
          ],
          "iliskiler": [
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Garanti bitiş tarihi geçmiş cihazlarda iş 'Garanti' kapsamıyla açılırsa ücret alınmaz; kapsamı bilinçli seçin.",
            "Seri no girildiğinde periyodik bakım ve cihaz bazlı servis geçmişi çok daha net izlenir."
          ]
        },
        {
          "id": "checklisttanim",
          "baslik": "Checklist Şablonları",
          "yol": "/ekran/servis/tanim/checklisttanim",
          "sub": "tanim",
          "amac": "Servislerde yapılması gereken kontrol maddelerini (ör. 'Filtre temizlendi', 'Test edildi') kategori bazlı veya genel şablon olarak tanımladığınız ekrandır; bu maddeler iş açılınca ilgili işe otomatik yüklenir.",
          "neden": "Standart kontrol listeleri işin eksiksiz yapılmasını garanti eder; 'Zorunlu' işaretlenen maddeler tamamlanmadan iş kapatılamaz, böylece kalite ve müşteri güveni korunur.",
          "nasil": [
            "'Yeni Madde' ile başlık girin, kategori seçin (veya Genel/tüm kategoriler).",
            "Sırasını ve Zorunlu olup olmadığını belirleyin.",
            "Kaydedin; bu kategoride açılan her yeni iş emrine madde otomatik eklenir.",
            "Kategori filtresiyle mevcut şablonları görüntüleyin."
          ],
          "butonlar": [
            {
              "ad": "Yeni Madde",
              "islev": "Checklist maddesi modalını açar",
              "sonuc": "Boş madde formu gelir",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Kategoriye göre şablonları süzer",
              "sonuc": "Seçilen kategorinin maddeleri listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Kaydet",
              "islev": "Maddeyi yazar",
              "sonuc": "servis_checklist_tanim kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Maddeyi düzenler",
              "sonuc": "Bilgiler modala yüklenir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Maddeyi siler",
              "sonuc": "servis_checklist_tanim.DURUM=-1 (soft delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "checklisttanimekle",
              "tetik": "Kaydet butonu",
              "etki": "servis_checklist_tanim'a kategori/sıra/zorunlu bilgili madde yazar",
              "neden_sonuc": "Yeni işlere otomatik kontrol listesi yüklenir; zorunlu maddeler kapanış kapısıdır, tanımlamazsanız iş kalite denetimi olmadan kapatılır"
            },
            {
              "ad": "checklisttanimsil",
              "tetik": "Sil butonu",
              "etki": "servis_checklist_tanim.DURUM=-1 (soft delete)",
              "neden_sonuc": "Gereksiz maddeyi kaldırır; daha önce açılmış işlerin checklist'i etkilenmez"
            }
          ],
          "iliskiler": [],
          "ipuclari": [
            "Kategorisiz (Genel) maddeler tüm işlere; kategoriye bağlı maddeler yalnız o kategorinin işlerine yüklenir.",
            "Zorunlu madde eksikken 'İşi Kapat' engellenir; teknisyen kapatamıyorsa önce eksik maddeleri işaretlemeli."
          ]
        },
        {
          "id": "servisozetrapor",
          "baslik": "Servis Özet Raporu",
          "yol": "/ekran/servis/rapor/servisozetrapor",
          "sub": "rapor",
          "amac": "Servis operasyonunun 360° fotoğrafını tek ekranda veren rapor: durum/tip/kapsam dağılımı, SLA aşım sayısı, ortalama çözüm süresi, toplam maliyet ve tamamlanma oranı.",
          "neden": "Operasyonun genel sağlığını hızlıca ölçmek için kullanılır; SLA aşımı yüksekse atama/önceliklendirmeyi, çözüm süresi uzunsa bilgi/parça sorununu, tamamlanma düşükse iptal nedenlerini incelersiniz.",
          "nasil": [
            "Sağ üstten Filtrele ile tarih aralığı ve kriterleri seçin (rapor performans için filtre zorunlu).",
            "KPI kartlarında toplam servis, SLA aşımı, tamamlanma oranı ve maliyeti görün.",
            "Durum/Tip/Kapsam dağılım tablolarını ve detay listesini inceleyin.",
            "Excel'e Aktar ile veriyi dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih/kriter filtre modalını açar",
              "sonuc": "Rapor seçilen aralığa göre hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Rapor verisini Excel dosyasına çıkarır",
              "sonuc": "İndirilebilir Excel oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Rapor birden çok sorgu çalıştırdığından filtre seçmeden veri gelmez; dar tarih aralığı daha hızlıdır.",
            "SLA aşımı, planı geçmiş ve hâlâ açık işleri sayar; bu sayının artması dağıtım/kapasite sorununa işarettir."
          ]
        },
        {
          "id": "personelperformans",
          "baslik": "Personel Performans",
          "yol": "/ekran/servis/rapor/personelperformans",
          "sub": "rapor",
          "amac": "Teknisyen/personel bazında tamamlanan iş sayısı, harcanan işçilik süresi, memnuniyet ve maliyet gibi metrikleri karşılaştıran performans raporudur.",
          "neden": "Kimin ne kadar iş kapattığını, ne kadar sürede çözdüğünü ve müşteri memnuniyetini ölçerek prim/eğitim/iş yükü dengesi kararlarını verilere dayandırırsınız.",
          "nasil": [
            "Filtrele ile tarih aralığı ve personel kriterlerini seçin.",
            "Personel bazlı iş adedi, süre ve memnuniyet metriklerini karşılaştırın.",
            "Excel'e Aktar ile listeyi dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih/personel filtresini uygular",
              "sonuc": "Rapor seçilen kapsama göre gelir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Performans verisini Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel"
          ],
          "ipuclari": [
            "İşçilik süresi check-in/out ve girilen zaman kayıtlarından gelir; teknisyen check-in yapmazsa performansı eksik görünür.",
            "Memnuniyet metriği ancak kapanışta müşteri puanı alınırsa dolar."
          ]
        },
        {
          "id": "kategoribazli",
          "baslik": "Kategori Bazlı Rapor",
          "yol": "/ekran/servis/rapor/kategoribazli",
          "sub": "rapor",
          "amac": "Servisleri kategoriye göre (adet, süre, maliyet, SLA) kırıp hangi servis türlerinin yoğun ve maliyetli olduğunu gösteren rapordur.",
          "neden": "Hangi iş tipinin en çok kaynağı tükettiğini görüp fiyatlandırma, stok ve uzmanlık kararlarını yönlendirirsiniz.",
          "nasil": [
            "Filtrele ile tarih ve kategori kriterlerini seçin.",
            "Kategori kırılımında adet/süre/maliyet metriklerini inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih/kategori filtresini uygular",
              "sonuc": "Rapor kapsama göre hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Kategori tanımı ve ücretlendirmesi doğru kuruluysa bu rapor gelir/maliyet analizinde çok değerlidir.",
            "Kategorisiz açılan işler bu raporda gruplanamaz; iş açarken kategori seçmeye özen gösterin."
          ]
        },
        {
          "id": "slatakip",
          "baslik": "SLA Takip Raporu",
          "yol": "/ekran/servis/rapor/slatakip",
          "sub": "rapor",
          "amac": "Servislerin plan bitişine (SLA) uyum durumunu; zamanında kapananlar ile geciken/aşılanları ölçen rapordur.",
          "neden": "Söz verilen sürelere ne kadar uyulduğunu ölçmek müşteri memnuniyeti ve sözleşme cezaları açısından kritiktir; gecikme trendini erken yakalarsınız.",
          "nasil": [
            "Filtrele ile tarih/kriter seçin.",
            "Zamanında vs. gecikmiş servis oranlarını ve gecikme sürelerini inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih/kriter filtresini uygular",
              "sonuc": "SLA metrikleri hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "SLA süresi kategori tanımından gelir; kategoriye SLA girmezseniz uyum ölçümü anlamsızlaşır.",
            "Açık ve planı geçmiş işler için SLA Risk Analizi ekranını da kullanın."
          ]
        },
        {
          "id": "musteribazli",
          "baslik": "Müşteri Bazlı Rapor",
          "yol": "/ekran/servis/rapor/musteribazli",
          "sub": "rapor",
          "amac": "Servisleri müşteriye göre (adet, maliyet, gelir, memnuniyet) kırarak hangi müşterinin ne kadar servis tükettiğini gösteren rapordur.",
          "neden": "En çok servis çağıran/maliyet üreten müşterileri belirleyip anlaşma teklifi, fiyat revizyonu veya öncelik kararları alırsınız.",
          "nasil": [
            "Filtrele ile tarih/müşteri kriterlerini seçin.",
            "Müşteri kırılımında servis adedi ve tutarları inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih/müşteri filtresini uygular",
              "sonuc": "Rapor kapsama göre gelir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Çok servis çağıran ama anlaşmasız müşteriler bakım anlaşması için iyi adaydır.",
            "Maliyeti sürekli yüksek müşterilerde fiyat/kapsam gözden geçirilmelidir."
          ]
        },
        {
          "id": "maliyetgelir",
          "baslik": "Maliyet & Gelir Raporu",
          "yol": "/ekran/servis/rapor/maliyetgelir",
          "sub": "rapor",
          "amac": "Servislerin maliyet (malzeme+işçilik+yol) ve gelir (faturalanan tutar) kalemlerini karşılaştırıp kârlılığını gösteren finansal rapordur.",
          "neden": "Servis operasyonunun para kazandırıp kazandırmadığını ölçmek için temel rapordur; zararına giden iş tiplerini/müşterileri tespit edersiniz.",
          "nasil": [
            "Filtrele ile tarih aralığı seçin.",
            "Maliyet vs. gelir ve kâr marjını inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih/kriter filtresini uygular",
              "sonuc": "Finansal rapor hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "fatura",
            "stok"
          ],
          "ipuclari": [
            "Maliyet doğruluğu için işlere işçilik süresi ve parça eksiksiz girilmelidir; girilmezse kâr olduğundan yüksek görünür.",
            "Yol ücreti yalnız Yerinde işlerde ve KM hesap ayarı açıkken maliyete girer."
          ]
        },
        {
          "id": "anlasmakullanim",
          "baslik": "Anlaşma Kullanım Raporu",
          "yol": "/ekran/servis/rapor/anlasmakullanim",
          "sub": "rapor",
          "amac": "Bakım anlaşmalarının hak kullanımını (kullanılan/kalan adet veya süre) anlaşma bazında gösteren rapordur.",
          "neden": "Hangi anlaşmanın limitine yaklaştığını veya boşa gittiğini görüp yenileme/ek satış ya da hizmet dengeleme kararı verirsiniz.",
          "nasil": [
            "Filtrele ile tarih/müşteri seçin.",
            "Anlaşma bazında kullanım oranlarını inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Rapor kapsama göre gelir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Limiti dolmuş anlaşmalarda yeni işler ücretli olarak faturalanır; müşteriyi önceden bilgilendirin.",
            "Hak kullanımı düşük anlaşmalar müşteri için değersiz görünebilir; yenilemede kapsamı gözden geçirin."
          ]
        },
        {
          "id": "sahahareket",
          "baslik": "Saha Hareket Raporu",
          "yol": "/ekran/servis/rapor/sahahareket",
          "sub": "rapor",
          "amac": "Teknisyenlerin check-in/check-out kayıtlarını, sahada geçirilen süreleri ve ziyaret sayılarını dökümleyen saha aktivite raporudur.",
          "neden": "Saha ekibinin gerçek çalışma süresini ve ziyaret verimini ölçmek, yol/saha süresini maliyetlendirmek için kullanılır.",
          "nasil": [
            "Filtrele ile tarih/personel seçin.",
            "Check-in/out bazlı süre ve ziyaret dökümünü inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Saha hareketleri listelenir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel"
          ],
          "ipuclari": [
            "Bu rapor yalnız GPS'li check-in/out yapılan işleri kapsar; teknisyen 'Geldim/Ayrıldım' yapmazsa saha süresi görünmez.",
            "Anlık konum için Saha Canlı Takip, dönemsel döküm için bu raporu kullanın."
          ]
        },
        {
          "id": "talepdonusum",
          "baslik": "Talep Dönüşüm Raporu",
          "yol": "/ekran/servis/rapor/talepdonusum",
          "sub": "rapor",
          "amac": "Gelen servis taleplerinin kaynağa göre kaçının iş emrine dönüştüğünü, kaçının iptal olduğunu ölçen dönüşüm hunisi raporudur.",
          "neden": "Hangi kanaldan (telefon/web/WhatsApp...) gelen taleplerin gerçek işe döndüğünü görüp pazarlama ve kanal önceliğini verilere dayandırırsınız.",
          "nasil": [
            "Filtrele ile tarih/kaynak seçin.",
            "Kaynak bazlı dönüşüm oranlarını inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Dönüşüm metrikleri hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Anlamlı dönüşüm ölçümü için taleplerde kaynak alanı doğru doldurulmalıdır.",
            "İptal oranı yüksek kanallar spam/niteliksiz talep üretiyor olabilir."
          ]
        },
        {
          "id": "kapsamdagilim",
          "baslik": "Kapsam Dağılımı",
          "yol": "/ekran/servis/rapor/kapsamdagilim",
          "sub": "rapor",
          "amac": "Servisleri kapsam türüne (Bakım/Garanti/Ücretli/Ücretsiz/Anlaşmalı) göre dağıtan rapordur.",
          "neden": "İşlerin ne kadarının gelir getirdiğini (ücretli/anlaşma) ne kadarının ücretsiz/garanti olduğunu görüp fiyat ve garanti politikanızı değerlendirirsiniz.",
          "nasil": [
            "Filtrele ile tarih seçin.",
            "Kapsam kırılımında adet/oran dağılımını inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Kapsam dağılımı hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Ücretsiz/garanti oranı beklenenden yüksekse kapsam seçimlerinde hata veya politikada kaçak olabilir.",
            "Anlaşmalı iş oranı, bakım anlaşması satışının operasyona yansımasını gösterir."
          ]
        },
        {
          "id": "anlasmadurum",
          "baslik": "Anlaşma Durum Raporu",
          "yol": "/ekran/servis/rapor/anlasmadurum",
          "sub": "rapor",
          "amac": "Bakım anlaşmalarını durum ve süre bakımından (aktif, süresi dolan/dolmuş, yenilenmesi gereken) listeleyen rapordur.",
          "neden": "Süresi bitmek üzere olan anlaşmaları önceden görüp yenileme sürecini başlatarak müşteri ve gelir kaybını önlersiniz.",
          "nasil": [
            "Filtrele ile durum/tarih seçin.",
            "Yakında bitecek/bitmiş anlaşmaları inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Anlaşma durumları listelenir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Yenileme hatırlatma gününe göre bu raporu düzenli izleyerek anlaşma sürekliliğini sağlayın.",
            "Süresi geçmiş anlaşmalı müşterinin yeni işleri artık ücretli faturalanır."
          ]
        },
        {
          "id": "acikservisler",
          "baslik": "Açık Servisler",
          "yol": "/ekran/servis/rapor/acikservisler",
          "sub": "rapor",
          "amac": "Henüz tamamlanmamış/iptal edilmemiş (açık) tüm iş emirlerini yaş, durum ve sorumluya göre listeleyen operasyonel takip raporudur.",
          "neden": "Sürüncemede kalan, unutulmuş açık işleri toplu görüp kapatılmasını sağlar; birikmiş açık iş operasyonel tıkanmanın işaretidir.",
          "nasil": [
            "Filtrele ile kriter seçin (gerekirse).",
            "Açık işleri yaş/durum sırasıyla inceleyin.",
            "Detaya giderek işi ilerletin veya kapatın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Açık işler listelenir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "personel"
          ],
          "ipuclari": [
            "Uzun süredir açık kalan işler genelde beklemede (parça/onay) takılmış işlerdir; alt durumla nedenini işaretleyin.",
            "SLA açısından riskli açık işler için SLA Risk Analizini birlikte kullanın."
          ]
        },
        {
          "id": "periyodikbakim",
          "baslik": "Periyodik Bakım Takibi",
          "yol": "/ekran/servis/rapor/periyodikbakim",
          "sub": "rapor",
          "amac": "Anlaşmalardaki periyot tanımlarına göre yaklaşan/gelmiş periyodik bakım tarihlerini listeleyip planlanmasını sağlayan rapordur.",
          "neden": "Sözleşmeli periyodik bakımların zamanında yapılmasını garanti eder; kaçırılan bakım hem müşteri güvenini hem sözleşme yükümlülüğünü zedeler.",
          "nasil": [
            "Filtrele ile tarih/müşteri seçin.",
            "Sonraki bakım tarihi yaklaşan anlaşmaları/cihazları inceleyin.",
            "İlgili iş emrini açarak bakımı planlayın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Yaklaşan bakımlar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari"
          ],
          "ipuclari": [
            "Sonraki bakım tarihi anlaşmanın periyot gün ayarından türetilir; periyodu doğru girmek raporun isabetini belirler.",
            "Anlaşmada otomatik iş emri açık ise sistem bakım işini kendi planlayabilir (_bakim_pilotu)."
          ]
        },
        {
          "id": "slarisk",
          "baslik": "SLA Risk Analizi",
          "yol": "/ekran/servis/rapor/slarisk",
          "sub": "rapor",
          "amac": "Plan bitişine az kalmış veya çoktan aşmış açık işleri risk seviyesine göre öne çıkaran erken uyarı raporudur.",
          "neden": "SLA ihlali oluşmadan müdahale etmenizi sağlar; en riskli işleri öne alıp ceza/memnuniyetsizlik yaşamadan kapatırsınız.",
          "nasil": [
            "Filtrele ile kriter seçin.",
            "Gecikmiş ve gecikmek üzere olan işleri risk sırasıyla görün.",
            "Detaya girip acil işleri önceliklendirin/atayın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Riskli işler listelenir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "cari"
          ],
          "ipuclari": [
            "SLA aşımı otomasyonu (SERVIS_SLA_ASILDI) kuruluysa yönetici/personel ayrıca uyarı alır (_sla_pilotu).",
            "Bu rapordaki işleri İş Dağıtım Panosunda önceliklendirerek hızla dağıtın."
          ]
        },
        {
          "id": "sahaperformans",
          "baslik": "Saha Performans",
          "yol": "/ekran/servis/rapor/sahaperformans",
          "sub": "rapor",
          "amac": "Saha operasyonunun verimini (ziyaret sayısı, ortalama saha süresi, yol/km, tamamlanma) teknisyen ve dönem bazında ölçen rapordur.",
          "neden": "Saha ekibinin gün içinde ne kadar üretken olduğunu, boş/yol süresini ve ziyaret yoğunluğunu görüp rota ve kapasite planını iyileştirirsiniz.",
          "nasil": [
            "Filtrele ile tarih/personel seçin.",
            "Ziyaret/süre/tamamlanma metriklerini karşılaştırın.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Saha performansı hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel"
          ],
          "ipuclari": [
            "Doğru saha süresi için teknisyenlerin check-in/out disiplinini oturtmak şarttır.",
            "Yüksek yol süresi/km, rota planlamasında iyileştirme fırsatına işaret eder."
          ]
        },
        {
          "id": "gorevraporu",
          "baslik": "Görev Raporu",
          "yol": "/ekran/servis/rapor/gorevraporu",
          "sub": "rapor",
          "amac": "İş emirleri içinde personele atanan alt görevlerin (bekliyor/devam/tamamlandı) durumunu ve sürelerini dökümleyen rapordur.",
          "neden": "İş içi görev dağılımının ne kadar tamamlandığını, hangi görevlerin takıldığını ve kişi başına görev yükünü izlersiniz.",
          "nasil": [
            "Filtrele ile tarih/personel seçin.",
            "Görev durumu ve süre dağılımını inceleyin.",
            "Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtreyi uygular",
              "sonuc": "Görev listesi hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Veriyi Excel'e çıkarır",
              "sonuc": "İndirilebilir dosya oluşur",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Yazdırılabilir çıktı üretir",
              "sonuc": "PDF/yazıcı çıktısı hazırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel"
          ],
          "ipuclari": [
            "Tamamlanan görevlerin süresi otomatik işçilik olarak maliyete girer; görevleri kapatmak maliyet doğruluğu için önemlidir.",
            "Uzun süre 'Bekliyor' kalan görevler atama/kaynak sorununu gösterir."
          ]
        },
        {
          "id": "bakimpilotu",
          "baslik": "Bakım Pilotu — Otomatik Periyodik Bakım",
          "yol": "/ekran/ayar/tanim/genel (Teknik Servis sekmesi)",
          "sub": "ayar",
          "amac": "Periyodik bakım anlaşmalarında sonraki bakım tarihi gelen kayıtlar için otomatik 'Bekliyor' durumunda periyodik bakım iş emri açar ve anlaşmanın sonraki bakım tarihini bir periyot ileri taşır.",
          "neden": "Sözleşmeli bakımların elle takibi kaçırmaya yol açar; kaçan bakım müşteri güvenini ve sözleşme yükümlülüğünü zedeler. Otomatik iş açma unutmayı önler ve saha planını önceden doldurur.",
          "nasil": [
            "Bakım Anlaşması'nda Periyot (Gün) > 0 girin; Sonraki Bakım Tarihi otomatik hesaplanır (OTOMATIK_IS_EMRI varsayılan açık).",
            "Ayarlar › Genel Ayarlar › Teknik Servis › Bakım Pilotu = 'Açık' yapıp kaydedin.",
            "Bir kullanıcı panele girdiğinde motor arka planda çalışır; ayrı cron/kurulum gerekmez."
          ],
          "butonlar": [
            {
              "ad": "Bakım Pilotu (Açık/Kapalı)",
              "islev": "Otomatik periyodik bakım motorunu açar/kapatır",
              "sonuc": "Açıkken vadesi gelen bakımlar için otomatik iş emri üretilir",
              "renk": "primary"
            }
          ],
          "eventler": [
            "Aktivasyon: sys_ayar BOLUM=servis AD=bakim_pilotu_aktif=1 (Servis Ayarları select adı: servis-bakim_pilotu_aktif).",
            "Motor: modul/servis/islem/_bakim_pilotu.php → servisBakimPilotuTara(); index.php bootstrap'ta login-tetikli (yalnız sayfa!=event).",
            "Kaynak sorgu: servis_anlasma (DURUM=1, OTOMATIK_IS_EMRI=1, PERIYOT_GUN>0, SONRAKI_BAKIM_TARIH<=bugün, süresi devam eden).",
            "Üretim: servis_is_emri SERVIS_KAPSAMI=5 (anlaşma/ücretsiz), ANA_POSITION=1 (Bekliyor), PLAN 09:00-18:00, OTO_BAKIM_VADE=vade.",
            "İdempotency: check-first + UNIQUE(FID,ANLASMA_ID,OTO_BAKIM_VADE); mükerrer iş emri açılmaz.",
            "Vade ilerletme: SONRAKI_BAKIM_TARIH += PERIYOT_GUN (kayan telafi; kaçırılan çok vade için tek iş, catch-up yok).",
            "Performans damgası: sys_ayar BOLUM=servis AD=bakim_son_tarama (günde bir tarama); doğruluk UNIQUE'e dayanır."
          ],
          "iliskiler": [
            "cari",
            "personel",
            "proje"
          ],
          "ipuclari": [
            "Periyot (Gün)=0 ise o anlaşma otomatik bakıma dahil edilmez.",
            "Aynı bakım vadesi için ikinci iş emri açılmaz (mükerrer koruması).",
            "Açılan periyodik bakım işleri Periyodik Bakım Takibi raporundan da izlenebilir."
          ]
        },
        {
          "id": "slapilotu",
          "baslik": "SLA Pilotu — Süre Aşımı Uyarısı",
          "yol": "/ekran/ayar/tanim/genel (Teknik Servis › SLA & Bildirim)",
          "sub": "ayar",
          "amac": "Taahhüt edilen çözüm süresini (SLA) aşan açık işler için ilgili kişilere tek seferlik otomatik uyarı gönderir.",
          "neden": "Fark edilmeden biriken süre ihlalleri ceza ve memnuniyetsizlik doğurur. Otomatik uyarı en kritik işlere zamanında dönmeyi sağlar.",
          "nasil": [
            "Ayarlar › Genel Ayarlar › Teknik Servis › SLA & Bildirim › 'Süre Aşımını Kime Bildir' = Yönetici / Servis Personeli / Her ikisi seçip kaydedin ('Kapalı' = uyarı yok).",
            "İsteğe bağlı: Servis Kategorileri'nde kategori bazlı hedef tanımlayın (genel ayarı ezer).",
            "Varsayılan SLA Süresi (gün) ayarını belirleyin; kategoriye özel süre de tanımlanabilir."
          ],
          "butonlar": [
            {
              "ad": "Süre Aşımını Kime Bildir",
              "islev": "SLA aşımı bildirim hedefini seçer (Kapalı/Yönetici/Personel/İkisi)",
              "sonuc": "Seçilen taraf süre aşan açık işlerde otomatik uyarı alır",
              "renk": "primary"
            }
          ],
          "eventler": [
            "Aktivasyon: sys_ayar BOLUM=servis AD=sla_bildirim_hedef ∈ {yonetici, personel, ikisi} (select: servis-sla_bildirim_hedef; 'kapali'/boş = kapalı).",
            "Motor: modul/servis/islem/_sla_pilotu.php → servisSlaPilotuTara($db,$fid,$oturum,$config,$saas); index.php login-tetikli.",
            "Tek-sefer: SLA_UYARI_GONDERILDI=0 filtre + koşullu set=1 (bildirim başarısız olsa da tekrar tetiklenmez).",
            "Throttle: sys_ayar BOLUM=servis AD=sla_son_tarama (10 dk, yalnız performans).",
            "Hedef çözümleme: kategori SLA_BILDIRIM_HEDEF doluysa onu, değilse genel ayar (yonetici/personel/ikisi).",
            "Bildirim kanalı: ServisOtomasyon motoru → SERVIS_SLA_ASILDI tetikleyicisi (alıcı başına 1 tetik)."
          ],
          "iliskiler": [
            "personel",
            "otomasyon",
            "iletisim"
          ],
          "ipuclari": [
            "Bildirimin ulaşması için e-posta (SMTP)/otomasyon ayarı kurulu olmalı.",
            "Yalnızca açık ve süresi aşılmış işler uyarılır; kapanan işler için bildirim gitmez.",
            "SLA Risk Analizi ve SLA Takip Raporu ekranlarıyla birlikte kullanılır."
          ]
        }
      ],
      "ozet_dupe_ignore": "n/a"
    },
    {
      "slug": "is-takip",
      "title": "Is Takip (CRM)",
      "icon": "🎯",
      "modul": "istakip",
      "ad": "Müşteri & İş Takibi (CRM)",
      "ozet": "İşletmeye telefon, WhatsApp, web, Instagram, Facebook, tanıdık gibi kanallardan gelen potansiyel müşterileri (ilgilenenleri) kaydeden, onlarla yapılacak/yapılan görüşmeleri takvimleyen ve teklif süreçlerini (fırsatları) aşama aşama yöneten satış takip modülüdür. İlgilenen kartı müşteriye dönüştüğünde otomatik cari kart, teklif süreci ve servis talebi açabilir; kaybedilen işleri nedeniyle arşivler. İletişim (mesajlaşma) modülündeki WhatsApp/Instagram/Facebook/e-posta konuşmaları da tek tıkla ilgilenen ya da fırsat kaydına dönüştürülebilir. Genel durum, kaynak analizi ve olmayan işler raporlarıyla satış performansını ölçer; n8n otomasyon tetikleyicileriyle (ilgilenen/fırsat oluşturma, durum/aşama değişimi, dönüşüm, kayıp) dış akışları besler.",
      "modul_iliskiler": [
        "cari (cari_kart / musteritedarikci)",
        "teklif (teklif_fis / verilenteklif)",
        "servis (servis_talep)",
        "kesif (kesif_fis - lisanslıysa)",
        "iletisim/mesaj (mesaj_konusma, mesaj_aksiyon - çapraz-modül ilgilenen/fırsat oluşturma)",
        "dosya arşivi (dosya_arsiv, YER=7)",
        "sys_durum (ilgilenen grupları, MODULE_KEY=ilgilenen_grup)",
        "evrak_islem_log (EVRAK_TIP 805 ilgilenen / 806 fırsat)",
        "otomasyon (n8n trigger)",
        "api (REST /api/v1/istakip/* — İş Takip + API/Entegrasyon lisansı; JWT + FID izolasyonu; ApiRouter)"
      ],
      "ekranlar": [
        {
          "id": "ilgilenenliste",
          "baslik": "İlgilenenler",
          "yol": "/ekran/istakip/islem/ilgilenenliste",
          "sub": "islem",
          "amac": "Size ulaşan tüm potansiyel müşterilerin (ilgilenenlerin) tek listede görüldüğü ana ekran. Ad/firma, geldiği kanal, ne istediği, son görüşme tarihi ve süreçteki durumu (Yeni Geldi, Görüşüldü, Teklif Konuşuluyor, Olmadı, Müşteri Oldu, Tekrar Aranacak) burada listelenir.",
          "neden": "Hiçbir potansiyel müşterinin unutulmaması ve takipsiz kalmaması için. Bekleyen (yapılmamış) görüşmesi olan kayıtlar kırmızı 'Bekleyen görüşme var' rozetiyle işaretlenir, böylece sıcak fırsatlar kaçırılmaz.",
          "neden_ek": "",
          "nasil": [
            "Listede kişi/firma adına tıklayarak detay kartına girin.",
            "Sağ üstteki 'Yeni Kayıt' ile yeni bir ilgilenen ekleyin.",
            "'Filtrele' ile anahtar kelime, durum, kaynak veya gruba göre daraltın.",
            "Satır sonundaki İŞLEMLER menüsünden Detay veya Düzenle'ye gidin.",
            "'Bekleyen görüşme var' rozetini gördüğünüz kayıtları öncelikli arayın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Kayıt",
              "islev": "Yeni ilgilenen ekleme formunu açar",
              "sonuc": "ilgilenenform ekranına gider",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Anahtar kelime/durum/kaynak/grup filtre modalını açar",
              "sonuc": "Liste seçilen kriterlere göre süzülür (GET filtre)",
              "renk": "ghost"
            },
            {
              "ad": "Detay (İşlemler menüsü)",
              "islev": "Kaydın detay kartını açar",
              "sonuc": "ilgilenendetay ekranına gider",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle (İşlemler menüsü)",
              "islev": "Kayıt bilgilerini düzenleme formunu açar",
              "sonuc": "ilgilenenform düzenleme modunda açılır; Müşteri Oldu (5) veya Olmadı (4) durumundaki kayıtlarda bu seçenek gizlidir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "sys_durum (grup)",
            "crm_gorusme (bekleyen görüşme sayısı alt sorgu ile)",
            "iletisim/mesaj (konusmadanilgilenen ile otomatik oluşan kayıtlar)"
          ],
          "ipuclari": [
            "Firma alanı doluysa listede firma adı, boşsa ad-soyad gösterilir.",
            "Grubu olan kayıtların satırı grup renginde (arkaplan+yazı) vurgulanır.",
            "Kaynak filtresi yalnızca tanımlı kanallardan (telefon, whatsapp, web, tanıdık, instagram, facebook, diğer) birini kabul eder; whitelist dışı değer yok sayılır.",
            "İletişim (mesajlaşma) modülünden bir WhatsApp/Instagram/Facebook/e-posta konuşması 'İş Takibe Aktar' ile ilgilenen kaydına dönüştürüldüğünde kayıt otomatik bu listeye düşer (kanal otomatik eşlenir)."
          ]
        },
        {
          "id": "ilgilenenform",
          "baslik": "İlgilenen Ekle / Düzenle",
          "yol": "/ekran/istakip/islem/ilgilenenform",
          "sub": "islem",
          "amac": "Yeni bir potansiyel müşteri kaydı oluşturmak veya var olanı düzenlemek için kullanılan giriş formu. Ad, soyad, firma, telefon, e-posta, adres, geldiği kanal, ne istediği, sorumlu kişi, genel not ve grup bilgileri girilir.",
          "neden": "Potansiyel müşteriyi eksiksiz kayıt altına almak; kaynağını ve ne istediğini net yazmak sonraki görüşme ve raporların (özellikle kaynak analizinin) doğruluğu için kritiktir.",
          "nasil": [
            "Kişi/firma bilgilerini doldurun (zorunlu alan yok; en az ad veya firma önerilir).",
            "'Nereden Geldi?' alanından kanalı seçin — kaynak analizi bu bilgiye dayanır.",
            "'Ne İstiyor?' kutusuna talebi kısaca yazın.",
            "İsterseniz sorumlu kişi (tenant kullanıcısı) ve grup atayın.",
            "'Kaydet' ile kaydı oluşturun; sistem sizi detay kartına yönlendirir."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Formu gönderir, kaydı ekler veya günceller",
              "sonuc": "crm_ilgilenen kaydedilir, ilgilenendetay kartına yönlenir",
              "renk": "primary"
            },
            {
              "ad": "Listeye Dön",
              "islev": "Kaydetmeden ilgilenen listesine döner",
              "sonuc": "ilgilenenliste ekranına gider",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "ilgilenenekle",
              "tetik": "Kaydet butonu",
              "etki": "recid varsa mevcut crm_ilgilenen kaydını günceller, yoksa yeni kayıt ekler (DURUM=1); her iki durumda evrak_islem_log'a (EVRAK_TIP 805) işlem düşer",
              "neden_sonuc": "Doğru doldurursanız potansiyel müşteri sisteme girer ve takip başlar; SADECE yeni kayıtta ILGILENEN_OLUSTURULDU otomasyonu tetiklenir (güncellemede tetiklenmez). Kaynağı boş/yanlış girerseniz kaynak analiz raporu yanıltıcı olur."
            }
          ],
          "iliskiler": [
            "sys_durum (grup)",
            "tenant kullanıcıları (sorumlu kişi / ATANAN_KULLANICI)"
          ],
          "ipuclari": [
            "Grup listesi boşsa grup alanı hiç görünmez; önce İlgilenen Grupları ekranından grup tanımlayın.",
            "Grup seçtiğinizde altında renkli önizleme rozeti anlık gösterilir."
          ]
        },
        {
          "id": "ilgilenendetay",
          "baslik": "İlgilenen Detay Kartı",
          "yol": "/ekran/istakip/islem/ilgilenendetay",
          "sub": "islem",
          "amac": "Tek bir potansiyel müşterinin 360° kartı: iletişim bilgileri, durumu, grubu, notları, tüm görüşme geçmişi, teklif süreçleri (fırsatlar), verilen teklifler, bağlı keşifler, yüklü dosyalar ve aktivite (audit) kaydı tek ekranda. Durum ve grubu buradan anlık değiştirir, görüşme ekler, müşteriye dönüştürürsünüz.",
          "neden": "Bir müşteri adayıyla ilgili her şeyi tek yerden görüp yönetmek, süreci ileri taşımak ve doğru zamanda doğru aksiyonu almak için ana çalışma ekranıdır.",
          "nasil": [
            "Sol koldan durumu (Yeni Geldi/Görüşüldü/Teklif Konuşuluyor/Olmadı/Tekrar Aranacak) açılır menüden değiştirin — anında kaydedilir (sayfa yenilenmez).",
            "Grup açılır menüsünden segment atayın; renkli rozet anında güncellenir.",
            "Sağ kolda 'Görüşme Ekle' ile yeni görüşme/hatırlatma planlayın.",
            "Bekleyen görüşmede yeşil tik ile 'Yapıldı' işaretleyip not girin, gerekirse aynı anda yeni görüşme oluşturun.",
            "Anlaşma sağlandıysa üstteki 'Müşteri Oldu' ile cari karta dönüştürün.",
            "Dosya bölümünden teklif/sözleşme gibi belgeleri yükleyin.",
            "Keşif lisansı varsa 'Keşif Oluştur' ile keşif fişi başlatın."
          ],
          "butonlar": [
            {
              "ad": "Düzenle",
              "islev": "İlgilenen bilgilerini düzenleme formunu açar",
              "sonuc": "ilgilenenform düzenleme modunda açılır",
              "renk": "primary"
            },
            {
              "ad": "Müşteri Oldu",
              "islev": "Müşteriye dönüşüm sihirbaz modalını açar (yalnızca durum 5 ve 4 değilken görünür)",
              "sonuc": "Cari kart + opsiyonel teklif süreci/servis talebi oluşturma akışı başlar",
              "renk": "accent"
            },
            {
              "ad": "Keşif Oluştur",
              "islev": "Bu lead için keşif fişi başlatır (keşif lisansı + keşif form yetkisi gerektirir)",
              "sonuc": "kesif modülünde yeni keşif formu (kaynak=crm) açılır",
              "renk": "accent"
            },
            {
              "ad": "Kaydı Sil",
              "islev": "Onay sorup kaydı siler (müşteri olmuş kayıtta gizli)",
              "sonuc": "crm_ilgilenen soft-delete (DURUM=-1) edilir",
              "renk": "danger"
            },
            {
              "ad": "Görüşme Ekle",
              "islev": "Yeni görüşme/hatırlatma modalını açar",
              "sonuc": "crm_gorusme kaydı oluşturulur",
              "renk": "primary"
            },
            {
              "ad": "Yapıldı (yeşil tik)",
              "islev": "Bekleyen görüşmeyi tamamlandı işaretleme modalını açar",
              "sonuc": "Görüşme YAPILDI=1 olur, not eklenir; istenirse yeni görüşme zincirlenir",
              "renk": "accent"
            },
            {
              "ad": "Görüşme Sil (çöp)",
              "islev": "Onay sorup görüşmeyi siler",
              "sonuc": "crm_gorusme soft-delete (DURUM=-1) edilir",
              "renk": "danger"
            },
            {
              "ad": "Cari Karta Git",
              "islev": "Müşteri olmuş kayıtta bağlı cari karta bağlantı (durum 5 iken durum alanında çıkar)",
              "sonuc": "musteritedarikci kart detayına gider",
              "renk": "ghost"
            },
            {
              "ad": "Teklifi/Keşfi Aç (satır bağlantıları)",
              "islev": "Verilen Teklifler ve Bağlı Keşifler tablolarındaki dış bağlantı ikonu",
              "sonuc": "İlgili teklif (teklifdetay) veya keşif (kesifdetay) ekranına gider",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "ilgilenendurumguncelle",
              "tetik": "Sol koldaki durum açılır menüsü değişimi",
              "etki": "crm_ilgilenen.DURUM güncellenir; evrak_islem_log'a (805, ISLEM_TIP 30) durum geçişi yazılır",
              "neden_sonuc": "Durumu güncel tutarsanız listeler/raporlar doğru olur ve ILGILENEN_DURUMU_DEGISTI otomasyonu çalışır; güncellemezseniz kayıt yanlış aşamada görünür ve takip bozulur. (Menüde 'Müşteri Oldu' ve keşif lisanslıysa 'Keşif Yapılacak' yer almaz; bunlar üst butonlarla yapılır.)"
            },
            {
              "ad": "ilgilenengrubguncelle",
              "tetik": "Sol koldaki grup açılır menüsü değişimi",
              "etki": "crm_ilgilenen.GRUP_ID güncellenir (sayfa yenilenmez)",
              "neden_sonuc": "Segment (VIP, potansiyel vb.) atayarak filtreleme/önceliklendirme yaparsınız; atamazsanız kayıt 'grupsuz' kalır."
            },
            {
              "ad": "musterioldugecis",
              "tetik": "Müşteri Oldu modalındaki 'Müşteri Olarak Kaydet'",
              "etki": "Yeni cari_kart oluşturulur veya mevcut cariye bağlanır; crm_ilgilenen.DURUM=5 ve CARI_ID set edilir; 'teklif var' seçilirse crm_firsat (ASAMA=1), 'servis var' seçilirse servis_talep açılır; bu lead'in görüşmeleri cari ile eşlenir; evrak_islem_log (805, ISLEM_TIP 34) yazılır",
              "neden_sonuc": "Adayı gerçek müşteriye çevirir ve satış/servis sürecini başlatır; MUSTERI_DONUSUMU_YAPILDI otomasyonu tetiklenir. Mevcut cariye bağlarken yanlış cari seçerseniz kayıtlar yanlış müşteriye bağlanır (kod, mevcut seçiminde cari seçilmesini zorunlu tutar)."
            },
            {
              "ad": "ilgilenensil",
              "tetik": "Kaydı Sil butonu",
              "etki": "crm_ilgilenen.DURUM=-1 (soft delete), silen kullanıcı/zaman yazılır",
              "neden_sonuc": "Yanlış/mükerrer kaydı listeden kaldırır; müşteri olmuş kayıtta (durum 5) buton görünmez, veri kaybı riski azalır. Bağlı görüşme/fırsat verisi fiziksel silinmez."
            },
            {
              "ad": "gorusmeekle",
              "tetik": "Görüşme Ekle modalında Kaydet",
              "etki": "crm_gorusme kaydı eklenir (YAPILDI=0) veya mevcut açık görüşme güncellenir; ilgilenenin SON_GORUSME_TARIH güncellenir",
              "neden_sonuc": "Yapılacak aramayı/ziyareti tarih-saatle takvime alır ve opsiyonel hatırlatma kurar; girmezseniz görüşme unutulur."
            },
            {
              "ad": "gorusmeyapildi",
              "tetik": "Görüşme satırındaki yeşil tik → Tamamlandı",
              "etki": "crm_gorusme.YAPILDI=1 ve YAPILDI_NOTU yazılır; 'Yeniden Görüşme Yapılacak' işaretliyse yeni crm_gorusme kaydı oluşturulur",
              "neden_sonuc": "Görüşmeyi kapatıp izini bırakır ve bir sonraki teması planlar; işaretlemezseniz geciken görüşme olarak görünmeye devam eder."
            },
            {
              "ad": "gorusmesil",
              "tetik": "Görüşme satırındaki çöp kutusu",
              "etki": "crm_gorusme.DURUM=-1 (soft delete)",
              "neden_sonuc": "Yanlış görüşme kaydını kaldırır; geçmiş bozulmaz."
            }
          ],
          "iliskiler": [
            "cari (cari_kart / musteritedarikci)",
            "teklif (teklif_fis - Verilen Teklifler, CRM_KAYIT_ID eşleşmesi)",
            "servis (servis_talep)",
            "kesif (kesif_fis - CRM_KAYIT_ID, lisanslıysa)",
            "dosya arşivi (dosya_arsiv, YER=7)",
            "evrak_islem_log (805)",
            "crm_firsat",
            "crm_gorusme"
          ],
          "ipuclari": [
            "Durum menüsünde 'Müşteri Oldu' (5) ve keşif lisanslıysa 'Keşif Yapılacak' (6) seçenekleri yer almaz; bunlar üstteki özel butonlarla yapılır.",
            "Müşteri olmuş kayıtta (durum 5) durum artık değiştirilemez, yerine 'Cari Karta Git' bağlantısı çıkar.",
            "Verilen Teklifler bölümü teklif modülünde bu lead için kesilen teklifleri otomatik gösterir; arşivlenmiş versiyon ve henüz cari yok durumları rozetle belirtilir.",
            "Dosyalar bölümü yalnızca dosya arşivi yapılandırılmışsa (config dosyaarsiv≠YOK) görünür ve dosyalar YER=7 altında saklanır."
          ]
        },
        {
          "id": "ilgilenengrupler",
          "baslik": "İlgilenen Grupları",
          "yol": "/ekran/istakip/tanim/ilgilenengrupler",
          "sub": "tanim",
          "amac": "İlgilenenleri renkli etiketlerle segmentlere ayırmak için grup tanımları (örn. VIP, Potansiyel, Soğuk) oluşturma ekranı. Her grubun adı, arkaplan ve yazı rengi belirlenir.",
          "neden": "Potansiyel müşterileri görsel olarak sınıflandırıp listede hızlı ayırt etmek ve önceliklendirmek için. Renk kodlaması ekipçe ortak dil sağlar.",
          "nasil": [
            "Sol formda grup adını yazın (zorunlu).",
            "Arkaplan ve yazı renklerini renk seçiciden belirleyin; önizleme anlık güncellenir.",
            "'Kaydet' ile grubu oluşturun.",
            "Sağdaki listede kalem ikonuyla düzenleyin, çöp ikonuyla silin.",
            "Düzenleme sırasında 'Yeni' ile boş forma dönüp başka grup ekleyin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Grup tanımını ekler veya günceller",
              "sonuc": "sys_durum (MODULE_KEY=ilgilenen_grup) kaydedilir",
              "renk": "primary"
            },
            {
              "ad": "Yeni",
              "islev": "Düzenleme modundayken formu temizleyip yeni grup girişine geçer",
              "sonuc": "Boş grup formu açılır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle (kalem)",
              "islev": "Seçili grubu düzenleme moduna alır",
              "sonuc": "Form grup verisiyle dolar (mode=duzenle)",
              "renk": "ghost"
            },
            {
              "ad": "Sil (çöp)",
              "islev": "Onay sorup grubu siler",
              "sonuc": "sys_durum kaydı soft-delete edilir",
              "renk": "danger"
            },
            {
              "ad": "İlgilenenler",
              "islev": "İlgilenen listesine geri döner",
              "sonuc": "ilgilenenliste ekranına gider",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "ilgilenengrubiekle",
              "tetik": "Kaydet butonu",
              "etki": "sys_durum tablosuna ilgilenen_grup kaydı ekler veya günceller",
              "neden_sonuc": "Yeni segment tanımlar; ad ve renkler zorunlu olduğundan boş bırakırsanız form gönderilmez."
            },
            {
              "ad": "ilgilenengrubisil",
              "tetik": "Sil (çöp) butonu",
              "etki": "sys_durum.DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan grubu kaldırır; silinen gruptaki ilgilenenler silinmez, sadece grupsuz görünür."
            }
          ],
          "iliskiler": [
            "sys_durum",
            "crm_ilgilenen (GRUP_ID)"
          ],
          "ipuclari": [
            "Grup silindiğinde o gruba bağlı ilgilenenler silinmez, sadece grupsuz kalır.",
            "Kontrast için arkaplan koyu ise yazı rengini açık seçin.",
            "Varsayılan renkler arkaplan #3498db, yazı #ffffff olarak gelir."
          ]
        },
        {
          "id": "gorusmeliste",
          "baslik": "Yapılacak Görüşmeler",
          "yol": "/ekran/istakip/islem/gorusmeliste",
          "sub": "islem",
          "amac": "Tüm ilgilenenlerle yapılacak görüşmelerin takvim/görev listesi. Bugün, Geciken, Yaklaşan ve son 30 günde Yapılanlar sekmeleriyle günlük arama/ziyaret planınızı yönetirsiniz.",
          "neden": "Hiçbir görüşmenin gecikmemesi ve günlük satış rutininin net olması için. Geciken sekmesi kaç gün geç kalındığını gösterir, böylece müşteri kaybı önlenir.",
          "nasil": [
            "Sekmelerden 'Bugün' ile günün görüşmelerini görün (sekme rozetinde adet).",
            "'Geciken' sekmesinde tarihi geçmiş görüşmeleri öncelikli tamamlayın.",
            "'Yeni Görüşme' ile ilgilenen seçip (opsiyonel) görüşme/hatırlatma ekleyin.",
            "Satırdaki 'Yapıldı' ile görüşmeyi kapatın ve not girin.",
            "'Detay' ile ilgili kişinin kartına gidin.",
            "'Filtrele' ile ilgilenen, tür veya konuya göre daraltın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Görüşme",
              "islev": "Yeni görüşme ekleme modalını açar",
              "sonuc": "crm_gorusme kaydı oluşturulur",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "İlgilenen/tür/konu filtre modalını açar",
              "sonuc": "Aktif sekme kriterlere göre süzülür (filtre sekmeyi korur)",
              "renk": "ghost"
            },
            {
              "ad": "Yapıldı",
              "islev": "Görüşmeyi tamamlandı işaretleme modalını açar",
              "sonuc": "Görüşme YAPILDI=1, not girilir, opsiyonel yeni görüşme",
              "renk": "accent"
            },
            {
              "ad": "Detay",
              "islev": "İlgilenenin detay kartına bağlantı (yalnızca ilgilenene bağlı görüşmelerde)",
              "sonuc": "ilgilenendetay ekranına gider",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "gorusmeekle",
              "tetik": "Yeni Görüşme modalında Kaydet",
              "etki": "crm_gorusme kaydı eklenir; ilgilenen bağlıysa SON_GORUSME_TARIH güncellenir",
              "neden_sonuc": "Aramayı/ziyareti tarih-saatle planlar, opsiyonel hatırlatma kurar; girmezseniz görev listenizde görünmez."
            },
            {
              "ad": "gorusmeyapildi",
              "tetik": "Satırdaki Yapıldı butonu → Tamamlandı",
              "etki": "crm_gorusme.YAPILDI=1 ve not; istenirse yeni görüşme oluşturulur",
              "neden_sonuc": "Görüşmeyi kapatır ve bir sonraki teması zincirler; kapatmazsanız Geciken sekmesinde birikir."
            },
            {
              "ad": "gorusmesil",
              "tetik": "Görüşme çöp butonu (detay/satır)",
              "etki": "crm_gorusme.DURUM=-1",
              "neden_sonuc": "Hatalı görüşmeyi listeden kaldırır."
            }
          ],
          "iliskiler": [
            "crm_ilgilenen",
            "crm_gorusme"
          ],
          "ipuclari": [
            "Sekme rozetlerindeki sayılar aktif filtreyi de dikkate alır.",
            "Yapıldı işaretlerken 'Yeniden Görüşme Yapılacak' kutusunu işaretleyerek aynı anda takip görüşmesi oluşturabilirsiniz (yeni görüşme için konu ve tarih zorunlu).",
            "Yapılanlar sekmesi yalnızca son 30 günde tamamlanan görüşmeleri gösterir."
          ]
        },
        {
          "id": "teklifbekleyenliste",
          "baslik": "Teklif Bekleyenler",
          "yol": "/ekran/istakip/islem/teklifbekleyenliste",
          "sub": "islem",
          "amac": "Aktif teklif/satış süreçlerinin (fırsatların) aşama bazlı yönetildiği pipeline ekranı. Her iş; İlk Konuşma, Teklif Hazırlanıyor, Teklif Gönderildi, Karar Bekleniyor, Anlaştık aşamalarında izlenir; ne kadar süredir beklediği gösterilir. Üstte açık iş / karar bekleyen / anlaşılan özet kutuları yer alır.",
          "neden": "Satış hunisini görüp hangi işin hangi aşamada takıldığını anlamak, uzun bekleyenleri (14/30 gün üstü sarı/kırmızı) canlandırmak ve teklif hazırlamayı hızlandırmak için.",
          "nasil": [
            "Üstteki özet kutularından genel tabloyu görün (açık iş, karar bekleyen, anlaşılan).",
            "'Yeni Kayıt' ile ilgilenen/mevcut müşteri seçip yeni teklif süreci açın.",
            "Satırdaki aşama açılır menüsünden işi ileri taşıyın; 'Olmadı' seçerseniz kayıp nedeni sorulur.",
            "Satır sonundaki İşlemler menüsünden 'Teklif Hazırla' ile teklif modülüne geçin.",
            "'Filtrele' ile anahtar kelime/aşamaya göre süzün.",
            "Bekleme süresi uzun (kırmızı) işleri öncelikli arayın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Kayıt",
              "islev": "Yeni teklif süreci (fırsat) ekleme modalını açar",
              "sonuc": "crm_firsat kaydı oluşturulur",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Anahtar kelime/aşama filtre modalını açar",
              "sonuc": "Liste kriterlere göre süzülür",
              "renk": "ghost"
            },
            {
              "ad": "Aşama Seçimi",
              "islev": "Satırdaki açılır menüyle fırsatın aşamasını değiştirir",
              "sonuc": "Aşama güncellenir; 'Olmadı' seçilirse neden modalı açılır",
              "renk": "accent"
            },
            {
              "ad": "Teklif Hazırla / Teklifi Aç",
              "islev": "Satır İşlemler açılır menüsünden teklif modülüne geçer (teklif yetkisi gerektirir)",
              "sonuc": "Fırsata bağlı teklif yoksa teklif/verilenteklif ekranına (kaynak CRM/KAYITLI/MANUEL) gider; teklif zaten varsa 'Teklifi Aç' olarak teklifdetay'a gider",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Satır İşlemler menüsünden onay sorup fırsatı siler (sil yetkisi gerektirir)",
              "sonuc": "crm_firsat soft-delete (DURUM=-1) edilir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "firsatekle",
              "tetik": "Yeni Kayıt modalında Kaydet",
              "etki": "crm_firsat kaydı eklenir (ASAMA=1, BASLANGIC_TARIH=bugün) veya mevcut kayıt güncellenir; yeni kayıtta evrak_islem_log (806) yazılır",
              "neden_sonuc": "Bir satış fırsatını hunide takibe alır; SADECE yeni kayıtta FIRSAT_OLUSTURULDU otomasyonu tetiklenir. Girmezseniz iş görünmez ve takipsiz kalır."
            },
            {
              "ad": "firsatasamaguncelle",
              "tetik": "Satırdaki aşama açılır menüsü (1-5)",
              "etki": "crm_firsat.ASAMA güncellenir; ASAMA=5 (Anlaştık) ise KAPANMA_TARIH set edilir; evrak_islem_log (806, ISLEM_TIP 30) yazılır",
              "neden_sonuc": "İşin gerçek durumunu yansıtır ve kazanma oranı raporlarını besler; FIRSAT_ASAMASI_DEGISTI otomasyonu çalışır. Güncellemezseniz pipeline yanıltıcı olur."
            },
            {
              "ad": "firsatolmadi",
              "tetik": "Aşama menüsünde 'Olmadı' seçimi → neden modalı Kaydet",
              "etki": "crm_firsat.ASAMA=6, OLMADI_NEDEN/OLMADI_ACIKLAMA ve KAPANMA_TARIH yazılır; fırsata bağlı ilgilenen varsa DURUM=4 olur; evrak_islem_log (806, ISLEM_TIP 35) yazılır",
              "neden_sonuc": "Kaybı nedeniyle kayıt altına alıp 'Olmayan İşler' raporuna taşır; FIRSAT_KAYBEDILDI otomasyonu tetiklenir. Neden zorunludur; girmezseniz kaydedilmez ve kayıp analizi yapılamaz."
            },
            {
              "ad": "firsatsil",
              "tetik": "İşlemler menüsünde Sil",
              "etki": "crm_firsat.DURUM=-1 (soft delete)",
              "neden_sonuc": "Hatalı/mükerrer fırsatı listeden kaldırır."
            }
          ],
          "iliskiler": [
            "crm_ilgilenen",
            "crm_firsat",
            "teklif (verilenteklif / teklifdetay)",
            "cari (cari_kart / musteritedarikci)",
            "evrak_islem_log (806)"
          ],
          "ipuclari": [
            "Bekleme süresi 30 günü aşan işler kırmızı, 14 günü aşanlar sarı gösterilir.",
            "Fırsata ilgilenen bağlıysa teklif CRM, mevcut cari bağlıysa KAYITLI, hiçbiri yoksa MANUEL kaynakla hazırlanır.",
            "'Olmadı' (ASAMA=6) kayıtlar bu listede gizlenir; Olmayan İşler raporunda görünür.",
            "Özet kutularındaki 'Karar Bekleyen', aşaması Teklif Gönderildi (3) veya Karar Bekleniyor (4) olan fırsatları sayar."
          ]
        },
        {
          "id": "olmayanisler",
          "baslik": "Olmayan İşler",
          "yol": "/ekran/istakip/rapor/olmayanisler",
          "sub": "rapor",
          "amac": "Kaybedilen fırsatları (ASAMA=6) neden ve tutar bazında gösteren rapor. Fiyat, rakip, zamanlama, vazgeçme, diğer kategorilerinde kaç iş ve ne kadar potansiyel ciro kaybedildiğini özetler.",
          "neden": "Müşterileri neden kaybettiğinizi görüp satış sürecini iyileştirmek için. En sık neden ve toplam kayıp ciro, fiyat/rakip stratejinizi gözden geçirmenizi sağlar.",
          "nasil": [
            "'Filtrele' ile neden ve kapanma tarihi aralığı seçip 'Arama Yap' ile raporu çalıştırın (filtre onayı zorunlu).",
            "Üstteki KPI kartlarından toplam kayıp iş ve neden çeşidini okuyun.",
            "Neden dağılım kartlarından hangi sebebin baskın olduğunu görün.",
            "Listede kaybedilen işleri müşteri, iş konusu, tutar, neden ve açıklamayla inceleyin.",
            "Liste üstündeki neden açılır menüsüyle listeyi hızlı süzün."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Neden ve kapanma tarih aralığı filtre modalını açar",
              "sonuc": "Rapor filtresi girilebilir hale gelir",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre modalında raporu çalıştırır",
              "sonuc": "KPI, neden dağılımı ve liste hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Boş filtreye döner",
              "renk": "ghost"
            },
            {
              "ad": "Neden Seçimi (liste üstü)",
              "islev": "Açılır menüyle nedene göre listeyi süzer",
              "sonuc": "Sayfa seçilen neden ve filtre işaretiyle yeniden yüklenir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "crm_firsat (ASAMA=6)",
            "crm_ilgilenen"
          ],
          "ipuclari": [
            "Performans için rapor, filtre onaylanmadan (filtre=işaret) çalışmaz; ilk açılışta boş gelir.",
            "Kayıp ciro, kaybedilen fırsatların tahmini tutarları toplamıdır — gerçek fatura değil potansiyeldir."
          ]
        },
        {
          "id": "geneldurum",
          "baslik": "Genel Durum Özeti",
          "yol": "/ekran/istakip/rapor/geneldurum",
          "sub": "rapor",
          "amac": "CRM iş takibinin tüm kritik metriklerini tek ekranda toplayan gösterge paneli: toplam ilgilenen, açık süreç, müşteri olan, kaybedilen; görüşme durumu (bugün/geciken), ilgilenen durum dağılımı, son 30 gün kazanma oranı ve son aktiviteler.",
          "neden": "İş takibinin anlık fotoğrafını görüp nereye odaklanmanız gerektiğini anlamak için. Geciken görüşmeler ve düşük kazanma oranı erken uyarı verir.",
          "nasil": [
            "'Filtrele' ile kayıt tarih aralığı ve kaynak seçip 'Arama Yap' ile raporu çalıştırın.",
            "Üstteki KPI kartlarından genel tabloyu okuyun.",
            "Görüşme Durumu kartından bugün/geciken görüşmeleri görüp 'Görüşmelere Git' ile ekrana geçin.",
            "Son 30 Gün kartından kazanma oranınızı izleyin.",
            "İlgilenen Durumları ve Aktiviteler kolonlarından süreç dağılımını ve son işlemleri inceleyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Kayıt tarihi ve kaynak filtre modalını açar",
              "sonuc": "Rapor filtresi girilebilir hale gelir",
              "renk": "primary"
            },
            {
              "ad": "Arama Yap",
              "islev": "Raporu çalıştırır",
              "sonuc": "KPI ve tablolar hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar",
              "sonuc": "Boş filtreye döner",
              "renk": "ghost"
            },
            {
              "ad": "Görüşmelere Git",
              "islev": "Görüşme listesine bağlantı",
              "sonuc": "gorusmeliste ekranına gider",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "crm_ilgilenen",
            "crm_gorusme",
            "crm_firsat",
            "evrak_islem_log"
          ],
          "ipuclari": [
            "Rapor filtre onaylanmadan çalışmaz (performans amaçlı).",
            "Kazanma oranı yalnızca son 30 günde sonuçlanan (kazanılan+kaybedilen) fırsatlar üzerinden hesaplanır.",
            "Aktiviteler kolonu ilgilenen (EVRAK_TIP 805) ve fırsat (806) log kayıtlarını birlikte gösterir."
          ]
        },
        {
          "id": "kaynakanaliz",
          "baslik": "Kaynak Analizi",
          "yol": "/ekran/istakip/rapor/kaynakanaliz",
          "sub": "rapor",
          "amac": "İlgilenenlerin hangi kanaldan geldiğini ve hangi kanalın gerçek müşteri/ciro ürettiğini gösteren rapor. Kaynak bazında toplam, aktif, müşteri olan, olmadı, dönüşüm oranı, kazanılan/beklenen tutar ve son 6 aylık aylık trend tablosu sunar.",
          "neden": "Reklam bütçesini ve zamanı en kazançlı kanala yönlendirmek, düşük dönüşümlü kanalları tespit etmek ve tek kaynağa bağımlılık riskini görmek için.",
          "nasil": [
            "'Filtrele' modalından raporu çalıştırın.",
            "KPI kartlarından aktif kaynak sayısı, toplam ilgilenen, dönüşüm ve kazanılan tutarı okuyun.",
            "Kaynak dağılım tablosunda her kanalın dönüşüm yüzdesini (progress bar) karşılaştırın.",
            "Kazanılan/Beklenen tutar sütunlarından hangi kanalın para getirdiğini görün.",
            "Aylık trend tablosundan kaynakların son 6 aydaki hareketini izleyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açar",
              "sonuc": "Rapor çalıştırılabilir hale gelir",
              "renk": "primary"
            },
            {
              "ad": "Raporu Çalıştır / Arama Yap",
              "islev": "Kaynak analizini üretir",
              "sonuc": "KPI, dağılım ve trend tabloları hesaplanır",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "crm_ilgilenen",
            "crm_firsat"
          ],
          "ipuclari": [
            "Dönüşüm oranı = müşteri olan / o kanaldan gelen toplam ilgilenen.",
            "Çok ilgilenen getirip az müşteriye dönüşen kanal, lead kalitesi veya satış sürecinde sorun işaret edebilir.",
            "Rapor filtre onayı olmadan çalışmaz."
          ]
        },
        {
          "id": "restapi",
          "baslik": "REST API ile Dışarıdan Yönetim",
          "yol": "/api/v1/istakip",
          "sub": "api",
          "amac": "İş Takip (CRM) modülünü ekranların yanı sıra REST API üzerinden dışarıdan yönetmek: web sitesi iletişim formu, WhatsApp botu, n8n pazarlama otomasyonu veya dış uygulama; adayları, görüşmeleri ve fırsatları panelde tekrar el ile girmeden doğrudan CRM'e yazar. Tüm uçlar /api/v1/istakip/... altında; JWT + firma (FID) izolasyonlu; OpenAPI 3.0.3 kataloğunda yayınlı. Uçlar hem İş Takip (CRM) hem API/Entegrasyon lisansını birlikte gerektirir (biri yoksa 403).",
          "neden": "Web formundan/reklamdan gelen aday elle giriliyor; unutuluyor ve mükerrer kayıt yaratıyor. API ile aday geldiği anda tekilleştirilerek sisteme düşer; satış ekibi gerçek liste üzerinde çalışır. Aynı telefon/e-posta ile gelen aday akıllı eşleştirmeyle mükerrer açılmaz, ilk geldiği kaynak korunur.",
          "nasil": [
            "API (Entegrasyon) lisansınızın tanımlı olduğundan emin olun; İş Takip uçları hem CRM hem API modülünü gerektirir.",
            "Kendi NetEsnaf adresinize POST /api/v1/auth/login ile giriş yapıp token alın (netesnaf.tr değil).",
            "GET /api/v1/istakip/durumlar ile geçerli kaynak/durum/aşama/görüşme türü kodlarını okuyun; değerleri tahmin etmeyin.",
            "POST /api/v1/istakip/ilgilenenkaydet ile adayı yazın (en az ad veya firma; telefon gönderirseniz mükerrer koruma çalışır). Yanıttaki olusturuldu true=yeni / false=güncellendi.",
            "POST /api/v1/istakip/gorusmekaydet ile görüşme, POST /api/v1/istakip/firsatkaydet ile fırsat açın.",
            "Takip için GET /api/v1/istakip/ilgilenenler, GET /api/v1/istakip/firsatlar, GET /api/v1/istakip/gorusmeler uçlarını kullanın."
          ],
          "butonlar": [
            {
              "ad": "ilgilenenkaydet (POST)",
              "islev": "Aday ekle/güncelle — UPSERT; telefon (yoksa e-posta) ile eşleştirir",
              "sonuc": "crm_ilgilenen; yeni=201 olusturuldu:true, güncelleme=200 olusturuldu:false; evrak_islem_log 805; yeni kayıtta ILGILENEN_OLUSTURULDU otomasyonu",
              "renk": "primary"
            },
            {
              "ad": "ilgilenenler / ilgilenendetay (GET)",
              "islev": "Aday listele (durum/grup_id/kaynak/telefon/baslangic/bitis/arama filtreli) veya detay (son 20 görüşme + fırsatlar)",
              "sonuc": "Liste meta ile; detay kayıt yoksa 404",
              "renk": "ghost"
            },
            {
              "ad": "ilgilenendurumguncelle (POST)",
              "islev": "Aday durumunu güncelle (1-5; 7 Tekrar Aranacak kabul edilmez)",
              "sonuc": "crm_ilgilenen.DURUM; evrak_islem_log 805/30; ILGILENEN_DURUMU_DEGISTI otomasyonu",
              "renk": "accent"
            },
            {
              "ad": "gorusmekaydet / gorusmeyapildi / gorusmeler / gorusmesil",
              "islev": "Görüşme kaydet (ilgilenen_id veya cari_id zorunlu), yapıldı işaretle, listele, sil",
              "sonuc": "crm_gorusme; kaydette SON_GORUSME_TARIH güncellenir; sil soft-delete",
              "renk": "primary"
            },
            {
              "ad": "firsatkaydet / firsatasamaguncelle / firsatolmadi / firsatlar / firsatsil",
              "islev": "Fırsat oluştur, aşama ilerlet (5=Anlaştık/kazanıldı), kaybedildi kapat (olmadi_neden zorunlu), listele, sil",
              "sonuc": "crm_firsat; FIRSAT_OLUSTURULDU/ASAMASI_DEGISTI/KAYBEDILDI otomasyonları; olmadıda bağlı aday DURUM=4",
              "renk": "accent"
            },
            {
              "ad": "durumlar / gruplar (GET)",
              "islev": "Kod sözlükleri (kaynak/durum/aşama/görüşme türü) ve ilgilenen grupları",
              "sonuc": "Panelden birebir kopya değerler; entegrasyon doğru kodları okur",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "crm_upsert",
              "tetik": "POST /api/v1/istakip/ilgilenenkaydet",
              "etki": "Telefon (7+ hane, son 10, biçim farkı gözetmez; yoksa e-posta) eşleşirse mevcut aday güncellenir, yoksa yeni açılır; yalnız gönderilen dolu alanlar yazılır",
              "neden_sonuc": "Aynı kişi tekrar tekrar yazsa bile tek kart kalır; olusturuldu alanı yeni/güncelleme ayrımını verir"
            },
            {
              "ad": "crm_kaynak_koruma",
              "tetik": "Mevcut adayın güncellenmesi",
              "etki": "KAYNAK doluysa ezilmez (ilk dokunuş kaynağı korunur); kaynak geçersiz/boşsa 'api' yazılır",
              "neden_sonuc": "Kaynak Analizi raporu bozulmaz"
            },
            {
              "ad": "firsat_kapanis",
              "tetik": "POST firsatasamaguncelle (asama=5) veya POST firsatolmadi",
              "etki": "asama=5 Anlaştık→KAPANMA_TARIH; firsatolmadi asama=6 + OLMADI_NEDEN (fiyat/rakip/zamanlama/vazgecti/diger) + bağlı aday DURUM=4",
              "neden_sonuc": "Kazanılan/kaybedilen iş kapanır; kayıp Olmayan İşler raporuna taşınır"
            }
          ],
          "iliskiler": [
            "auth (JWT token)",
            "crm_ilgilenen",
            "crm_gorusme",
            "crm_firsat",
            "sys_durum (gruplar)",
            "cari_kart (cari_id doğrulama)",
            "otomasyon (n8n)",
            "evrak_islem_log (805/806)"
          ],
          "ipuclari": [
            "Uçlar İş Takip (CRM) VE API/Entegrasyon lisansını birlikte gerektirir; biri yoksa 403.",
            "Telefonu 7 haneden kısa gönderirseniz eşleştirmede kullanılmaz (çöp değerlerin farklı kişileri birleştirmesini önler); numara yine kaydedilir.",
            "Boş string ile alan temizlenemez; boş/eksik alan mevcut değeri korur.",
            "Durum güncelleme yalnız 1-5 kabul eder; 7 (Tekrar Aranacak) panelde görünür ama API kabul etmez (durumlar ucunda guncellenebilir:false).",
            "Adayı cari karta dönüştürme API'de YOKTUR — bilerek panelde, insan kararına bırakılmıştır.",
            "Silme uçları (ilgilenensil/gorusmesil/firsatsil) kaydı tamamen silmez, pasife alır (DURUM=-1).",
            "API çağrılarını netesnaf.tr'ye değil kendi NetEsnaf adresinize yapın; ayrıntı ve örnekler API Entegrasyonu kılavuzunda (istakip-crm)."
          ],
          "sss": [
            {
              "soru": "Aynı müşteri web formunu birden fazla doldurursa CRM mükerrer aday ile dolar mı?",
              "cevap": "Hayır. ilgilenenkaydet ucu 'varsa güncelle, yoksa oluştur' mantığıyla çalışır: telefon numarası biçim farkı gözetmeksizin (boşluk, parantez, +90) tanınır ve mevcut aday güncellenir. Telefon yoksa e-posta ikincil anahtardır. Yanıttaki olusturuldu alanı yeni mi açıldığını söyler."
            },
            {
              "soru": "API ile adayı doğrudan müşteriye (cari karta) çevirebilir miyim?",
              "cevap": "Hayır, bu adım bilerek API dışında bırakılmıştır. Müşteriye dönüşüm insan kararı gerektirdiği için panelden 'Müşteri Oldu' sihirbazıyla yapılır."
            },
            {
              "soru": "Hangi lisanslar gerekir?",
              "cevap": "İş Takip (CRM) ve API/Entegrasyon modüllerinin ikisi birden. Biri eksikse uçlar 403 (yetkisiz) döner."
            },
            {
              "soru": "Fırsatı kazanıldı/kaybedildi olarak nasıl kapatırım?",
              "cevap": "Kazanıldı için firsatasamaguncelle ucuna asama=5 (Anlaştık) gönderin; kapanma tarihi otomatik yazılır. Kaybedildi için firsatolmadi ucuna id ve olmadi_neden (fiyat/rakip/zamanlama/vazgecti/diger) gönderin; iş Olmayan İşler raporuna taşınır ve bağlı aday 'Olmadı' durumuna çekilir."
            },
            {
              "soru": "Doğru durum ve aşama kodlarını nereden bulurum?",
              "cevap": "GET /api/v1/istakip/durumlar ucundan okuyun; kaynaklar, ilgilenen durumları, fırsat aşamaları ve görüşme türleri panelden birebir kopyalanmış olarak döner. Değerleri elle tahmin etmeyin."
            }
          ]
        }
      ]
    },
    {
      "slug": "iletisim",
      "title": "Mesajlasma (WhatsApp/SMS/Mail)",
      "icon": "💬",
      "modul": "iletisim",
      "ad": "İletişim (Çok Kanallı Mesajlaşma)",
      "ozet": "İletişim modülü; WhatsApp, Instagram, Facebook ve e-posta üzerinden gelen tüm müşteri mesajlarını tek bir gelen kutusunda toplayan, WhatsApp Web tarzı bir sohbet panelidir. Operatör mesajları yanıtlar, konuşmayı bir cariye (müşteri kartına) eşleştirir ve mesajdan doğrudan servis talebi, iş takibi (ilgilenen), teklif/fırsat süreci, takvim hatırlatması, cari not, dosya arşivi ve hesap ekstresi gibi aksiyonlar üretebilir. Mesajlardan doğan bu işlerin tümü Aksiyonlar raporunda izlenir.",
      "modul_iliskiler": [
        "cari",
        "servis",
        "istakip",
        "teklif",
        "takvim",
        "notlar",
        "dosya_arsiv",
        "ayar"
      ],
      "ekranlar": [
        {
          "id": "gelenkutusu",
          "baslik": "Gelen Kutusu",
          "yol": "/ekran/iletisim/rapor/gelenkutusu",
          "sub": "rapor",
          "amac": "WhatsApp, Instagram, Facebook ve e-posta kanallarından gelen tüm müşteri mesajlarını tek ekranda toplayan sohbet panelidir. Solda konuşma listesi, sağda seçilen konuşmanın mesajlaşma penceresi bulunur; buradan yanıt yazabilir ve konuşmayı bir müşteriye bağlayarak iş üretebilirsiniz.",
          "neden": "Müşterilerinizle farklı platformlarda dağınık yürüyen yazışmaları tek bir yerden takip etmenizi sağlar. Böylece hiçbir mesaj kaçmaz, yanıt süresi kısalır ve gelen her talebi (servis, iş takibi, teklif) doğrudan ERP kayıtlarına dönüştürebilirsiniz. Cari eşleştirme sayesinde müşterinin geçmişi ve bakiyesi de elinizin altında olur.",
          "nasil": [
            "Sol taraftaki listeden okunmamış (koyu/rozetli) bir konuşmayı tıklayın; sağda mesajlar açılır ve okunmadı sayacı sıfırlanır.",
            "Kanal filtresi (Tümü / WhatsApp / Instagram / Facebook / E-posta) veya üstteki arama kutusu (isme göre) ile istediğiniz konuşmaya ulaşın.",
            "Alt kısımdaki kutuya mesajınızı yazıp gönder (uçak) ikonuna basın ya da Enter'a basın; e-posta konuşmalarında 'E-posta Yanıtla' butonu ile zengin metin (Summernote) editörü açılır.",
            "Konuşma bir müşteriye bağlı değilse (turuncu 'zincir kırık' ikonu) sağ üstteki 'Aksiyonlar' menüsünden 'Yeni Cari Oluştur' veya 'Mevcut Cariye Eşle' ile bağlayın. Cari eşleşmeden de 'İş Takibe Kaydet' ve 'Teklif Sürecine Ekle' kullanılabilir.",
            "Cari eşleştikten sonra 'Aksiyonlar' menüsünden Servis Talebi Aç, Takvime Hatırlatma, Cariye Not Ekle veya Hesap Ekstresi Gönder işlemlerini kullanın.",
            "İşi biten konuşmayı 'Kapat' ile kapatabilirsiniz (eski konuşma detay sayfasından); kapalı konuşmaya mesaj gönderilemez.",
            "Yeni gelen mesajlar arka planda otomatik yenilenir: açık konuşmada 5 sn'de bir mesaj kontrolü, sol liste 10 sn'de bir, e-posta 2 dk'da bir IMAP kontrolü; e-posta konuşması açılışında anında kontrol tetiklenir."
          ],
          "butonlar": [
            {
              "ad": "Gönder (uçak ikonu)",
              "islev": "Alt kutuya yazılan mesajı seçili WhatsApp/Instagram/Facebook konuşmasına iletir (Enter de aynı işi yapar)",
              "sonuc": "Mesaj platform API'sine gönderilir ve sohbet geçmişine 'giden' olarak eklenir; kanal pasif/kapalıysa gönderim engellenir",
              "renk": "primary"
            },
            {
              "ad": "E-posta Yanıtla",
              "islev": "E-posta konuşmalarında zengin metin (Summernote) editörlü yanıt penceresini açar; kayıtlı konu varsa 'RE:' ile öneri getirir",
              "sonuc": "Konu ve HTML içerikli e-posta SMTP ile gönderilir ve konuşmaya kaydedilir",
              "renk": "primary"
            },
            {
              "ad": "Aksiyonlar",
              "islev": "Konuşma başlığındaki açılır menü; cari eşleştirme ve mesajdan iş üretme seçeneklerini listeler (cari eşli/eşsiz duruma göre değişir)",
              "sonuc": "Seçime göre ilgili işlem penceresi (modal) veya onay diyaloğu açılır",
              "renk": "accent"
            },
            {
              "ad": "Yeni Cari Oluştur",
              "islev": "Konuşmadaki isim/telefon/e-posta ile yeni müşteri kartı açar ve konuşmaya bağlar",
              "sonuc": "cari_kart oluşturulur, konuşma bu cariye eşleşir; ünvan boşsa kayıt açılmaz",
              "renk": "primary"
            },
            {
              "ad": "Mevcut Cariye Eşle",
              "islev": "Arama (autocomplete) ile bulunan mevcut bir müşteri kartına konuşmayı bağlar; eşliyken 'Eşleştirmeyi Değiştir' olarak görünür",
              "sonuc": "Konuşma seçilen cariye eşleşir, sayfa yenilenir ve müşteri geçmişi erişilir olur",
              "renk": "accent"
            },
            {
              "ad": "Servis Talebi Aç",
              "islev": "Mesajdan servis/destek talebi oluşturma penceresini açar (yalnız cari eşliyken)",
              "sonuc": "servis_talep kaydı ve mesaj_aksiyon logu oluşturulur",
              "renk": "accent"
            },
            {
              "ad": "Takvime Hatırlatma",
              "islev": "Konuşmayla ilgili takvim hatırlatması ekleme penceresini açar (yalnız cari eşliyken)",
              "sonuc": "Takvime HATIRLATMA tipi kayıt (konuşmaya referanslı) ve mesaj_aksiyon logu düşülür",
              "renk": "primary"
            },
            {
              "ad": "Cariye Not Ekle",
              "islev": "Müşteri kartına serbest metin not ekleme penceresini açar (yalnız cari eşliyken)",
              "sonuc": "notlar tablosuna cari (REL_TYPE=2) notu ve mesaj_aksiyon logu kaydedilir",
              "renk": "ghost"
            },
            {
              "ad": "Hesap Ekstresi Gönder",
              "islev": "Müşterinin son hareketlerini ve bakiyesini özetleyip önizler, mesaj olarak gönderir (yalnız cari eşliyken)",
              "sonuc": "cari_hareket'ten ekstre metni hesaplanır, önizlenir ve konuşmaya mesaj olarak iletilir",
              "renk": "primary"
            },
            {
              "ad": "İş Takibe Kaydet",
              "islev": "Konuşmayı iş takip modülüne 'ilgilenen' olarak kaydeder (cari eşli veya eşsiz her durumda)",
              "sonuc": "istakip modülünde ilgilenen kaydı oluşturulur ve varsa detayına yönlendirir",
              "renk": "ghost"
            },
            {
              "ad": "Teklif Sürecine Ekle",
              "islev": "İş konusu ve tahmini tutarla teklif/fırsat süreci başlatma penceresini açar",
              "sonuc": "istakip modülünde fırsat/teklif süreci kaydı oluşturulur ve varsa detayına yönlendirir",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "konusmaoku",
              "tetik": "Bir konuşmaya tıklanınca (ve yeni mesaj gelince)",
              "etki": "mesaj_konusma / mesaj_detay okunmadı sayacı sıfırlanır",
              "neden_sonuc": "Konuşma açıldığında okunmadı rozeti sıfırlanır; böylece hangi mesajları görmediğinizi net izlersiniz. Çalışmazsa okunmuş konuşmalar da okunmamış görünmeye devam eder."
            },
            {
              "ad": "konusmamesajlari",
              "tetik": "Konuşma açıldığında (otomatik AJAX)",
              "etki": "mesaj_detay kayıtları çekilir, operatör adları ve konu bilgisi eşlenir (salt-okuma)",
              "neden_sonuc": "Seçili konuşmanın tüm mesaj geçmişi (metin, medya, e-posta HTML) sohbet penceresinde gösterilir. Bu olmadan konuşma içeriğini göremezsiniz."
            },
            {
              "ad": "yenimesajkontrol",
              "tetik": "Açık konuşmada 5 sn'de bir otomatik",
              "etki": "mesaj_detay'da son ID sonrası yeni kayıt var mı sayılır (salt-okuma)",
              "neden_sonuc": "Müşteri yeni mesaj attığında sayfayı yenilemeden anında görürsünüz; yeni mesaj gelince liste yeniden yüklenir ve okundu işaretlenir. Canlı sohbet hissi bununla sağlanır."
            },
            {
              "ad": "konusmalisteguncelle",
              "tetik": "Sayfa açıkken 10 sn'de bir otomatik",
              "etki": "Açık konuşmaların listesi (son mesaj, okunmadı, sıra) çekilir (salt-okuma)",
              "neden_sonuc": "Sol liste otomatik güncellenir; yeni gelen konuşmalar en üste eklenir, rozetler tazelenir ve aktif kanal filtresi korunur. Kaçırılan yeni müşteri olmaz."
            },
            {
              "ad": "mesajgonder",
              "tetik": "Gönder butonu / Enter / E-posta Gönder / Ekstre Gönder",
              "etki": "Kanal API'si (WhatsApp/Instagram/Facebook veya SMTP) ile gönderilir, mesaj_detay'a giden mesaj yazılır, mesaj_konusma güncellenir",
              "neden_sonuc": "Müşteriye yanıtınız iletilir ve kayıt altına alınır. Konuşma kapalıysa veya kanal ayarı eksik/pasifse gönderim engellenir; API başarısız olursa mesaj kaydedilse bile 'gönderilemedi' uyarısı gösterilir."
            },
            {
              "ad": "epostakontrol",
              "tetik": "Gelen kutusu açılışı, e-posta konuşması açma ve 2 dk'lık zamanlayıcı",
              "etki": "IMAP ile yeni okunmamış mailler çekilir, konuşma bulunur/oluşturulur, mesaj_detay'a gelen mail ve ekleri yazılır",
              "neden_sonuc": "E-posta kutunuza düşen müşteri mailleri otomatik olarak gelen kutusuna aktarılır. IMAP ayarı yoksa veya php-imap kurulu değilse e-posta kanalı devre dışı kalır."
            },
            {
              "ad": "cariesle",
              "tetik": "'Mevcut Cariye Eşle' penceresinde Eşleştir",
              "etki": "mesaj_konusma'ya CARI_ID ve CARI_UNVAN yazılır",
              "neden_sonuc": "Konuşma bir müşteri kartına bağlanır; müşteri geçmişi, bakiye ve tüm aksiyonlar açılır. Servis/hatırlatma/not/ekstre aksiyonları eşleştirme olmadan çalışmaz."
            },
            {
              "ad": "yenicariekle",
              "tetik": "'Yeni Cari Oluştur' penceresinde Oluştur",
              "etki": "cari_kart oluşturulur ve konuşmaya eşlenir",
              "neden_sonuc": "Sistemde kaydı olmayan yeni bir müşteriyi tek adımda oluşturup konuşmaya bağlarsınız. Ünvan boşsa kayıt açılmaz."
            },
            {
              "ad": "aksiyonservistalep",
              "tetik": "'Servis Talebi Aç' penceresinde Talep Oluştur",
              "etki": "servis_talep kaydı ve mesaj_aksiyon logu (AKSIYON_TIP=SERVIS_TALEP) oluşturulur",
              "neden_sonuc": "Müşteri mesajı doğrudan servis/destek talebine dönüşür ve iş emri sürecine girer. Önce cari eşleştirme ve konu şart; eşleşme yoksa uyarı verir."
            },
            {
              "ad": "aksiyonhatirlatma",
              "tetik": "'Takvime Hatırlatma' penceresinde Kaydet",
              "etki": "takvim tablosuna HATIRLATMA tipi kayıt (KayitYer=11 İletişim, konuşmaya referanslı) ve mesaj_aksiyon logu oluşturulur",
              "neden_sonuc": "Konuşmayla ilgili yapılacak işi belirli tarih/saate takvime düşürürsünüz; unutulmaz. Başlık veya tarih boşsa ya da cari eşleşmemişse kaydedilmez."
            },
            {
              "ad": "aksiyoncarinot",
              "tetik": "'Cariye Not Ekle' penceresinde Kaydet",
              "etki": "notlar tablosuna cari (REL_TYPE=2, REL_ID=CARI_ID) notu ve mesaj_aksiyon logu (CARI_NOT) yazılır",
              "neden_sonuc": "Müşteriyle ilgili önemli bilgiyi kalıcı olarak müşteri kartının notlarına işlersiniz. Cari eşleşmemişse veya not boşsa kaydedilmez."
            },
            {
              "ad": "aksiyoncaridosya",
              "tetik": "Mesajdaki dosyada 'Dosyayı Kaydet' onayı (eski konuşma detay sayfası)",
              "etki": "dosya_arsiv'e müşteri kartı dosyası (YER=1, KART_ID=CARI_ID) ve mesaj_aksiyon logu (CARI_DOSYA) eklenir",
              "neden_sonuc": "Müşterinin gönderdiği fotoğraf/belgeyi müşteri kartının dosya arşivine kalıcı bağlarsınız. Dosya (medya) yoksa veya cari eşleşmesi yoksa işlem yapılmaz."
            },
            {
              "ad": "aksiyonekstrehesapla",
              "tetik": "'Hesap Ekstresi Gönder' penceresi açılınca",
              "etki": "cari_hareket'ten son 20 hareket ve toplam borç/alacak bakiyesi hesaplanır (salt-okuma)",
              "neden_sonuc": "Müşterinin güncel borç/alacak durumu ve son işlemleri özet metne dönüşür; önizleyip mesaj olarak gönderebilirsiniz. Cari eşleşmemişse hesaplanamaz."
            },
            {
              "ad": "konusmakapat",
              "tetik": "Konuşma detayında 'Kapat' onayı",
              "etki": "mesaj_konusma DURUM kapalı yapılır",
              "neden_sonuc": "Tamamlanan konuşmayı arşivler, gelen kutusunu sadeleştirir. Kapalı konuşmaya mesaj gönderilemez."
            },
            {
              "ad": "konusmaata",
              "tetik": "Konuşmayı bir operatöre atama aksiyonu",
              "etki": "mesaj_konusma ATANAN_USER_ID güncellenir",
              "neden_sonuc": "Konuşmadan sorumlu operatörü belirlersiniz; ekipte iş dağılımı netleşir. Geçersiz konuşmada işlem reddedilir."
            }
          ],
          "iliskiler": [
            "cari",
            "servis",
            "istakip",
            "teklif",
            "takvim",
            "notlar",
            "dosya_arsiv",
            "ayar"
          ],
          "ipuclari": [
            "Cari eşine bağlı aksiyonlar (servis, not, ekstre, hatırlatma) yalnızca konuşma bir cariye eşleştirildikten sonra çalışır; turuncu 'zincir kırık' ikonu gördüğünüzde önce eşleştirin. 'İş Takibe Kaydet' ve 'Teklif Sürecine Ekle' ise cari eşi olmadan da kullanılabilir.",
            "Gelen kutusunda yalnızca Ayarlar'da AKTİF edilmiş kanalların konuşmaları gelir; e-posta için IMAP (gelen) ve SMTP (giden) bilgilerinin İletişim Ayarları'nda dolu olması gerekir; php-imap kurulu değilse mail çekilmez.",
            "Mesaj gönderiminde 'kaydedildi ancak platformda gönderilemedi' uyarısı görürseniz kanal API token/ayarlarını kontrol edin — mesaj sohbete yazılır ama karşıya ulaşmamıştır.",
            "Medya dosyaları sunucuda tutulmaz, proxy üzerinden (download/iletisim/ID) gösterilir; eski kayıtlarda dosya erişilemeyebilir.",
            "Enter tuşu WhatsApp/Instagram/Facebook mesajını anında gönderir; uzun metinlerde dikkatli olun. E-posta yanıtı Enter ile değil editör penceresinden gönderilir.",
            "'Dosyayı Kaydet' aksiyonu yalnızca eski konuşma detay sayfasından (Aksiyonlar raporundaki 'Konuşmayı Aç' ile ulaşılan ekran) kullanılabilir."
          ]
        },
        {
          "id": "aksiyonlar",
          "baslik": "Aksiyonlar",
          "yol": "/ekran/iletisim/rapor/aksiyonlar",
          "sub": "rapor",
          "amac": "Müşteri mesajlarından oluşturulan tüm işleri (servis talebi, sipariş, teklif, müşteri notu, dosya, hatırlatma) tek bir liste ve KPI kartları halinde gösteren rapor ekranıdır. Hangi mesajdan ne aksiyon doğduğunu tarih, kanal ve müşteri bazında izlersiniz.",
          "neden": "Sosyal medya ve e-posta kanallarınızın gerçekten iş üretip üretmediğini ölçmenizi sağlar. Mesajdan doğan servis/sipariş/teklif sayısını görerek kanal etkinliğini değerlendirir, açık kalan talepleri ve müşteri notlarını takip eder, hiçbir müşteri isteğinin havada kalmadığından emin olursunuz.",
          "nasil": [
            "Üstteki KPI kartlarından Toplam Aksiyon, Servis Talebi, Sipariş ve Teklif sayılarına hızlı bakış atın (firmanın tüm geçmişini kapsar).",
            "Tabloda her satırı tarih, kanal, müşteri, aksiyon tipi ve açıklama ile inceleyin.",
            "İhtiyacınız olan satırda 'İŞLEMLER' menüsünden 'Konuşmayı Aç' ile ilgili konuşma detay ekranını görüntüleyin.",
            "Servis talebi satırlarında 'Talebi Aç' ile doğrudan ilgili servis talep detayına geçin.",
            "Sayfa altındaki sayfalama ile geçmiş aksiyonlar arasında gezinin (sayfa başına 50 kayıt)."
          ],
          "butonlar": [
            {
              "ad": "İŞLEMLER",
              "islev": "Satır bazlı açılır menü; konuşma ve aksiyon detay bağlantılarını sunar",
              "sonuc": "Seçilen hedefe (konuşma / servis talebi) yönlendiren menü açılır",
              "renk": "ghost"
            },
            {
              "ad": "Konuşmayı Aç",
              "islev": "Aksiyonun doğduğu konuşmanın detay ekranına gider",
              "sonuc": "İletişim konuşma detay ekranı açılır",
              "renk": "accent"
            },
            {
              "ad": "Talebi Aç",
              "islev": "Yalnızca Servis Talebi tipi aksiyonlarda görünür; ilgili servis talep detayına gider",
              "sonuc": "Servis modülü talep detay ekranı açılır",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "(rapor-listeleme)",
              "tetik": "Ekran açıldığında sunucu tarafı sorgu (bu ekranın kendi olay/case'i yoktur)",
              "etki": "mesaj_aksiyon ve mesaj_konusma tablolarından firmaya ait aksiyonlar listelenir, aksiyon tiplerine göre KPI toplanır (salt-okuma)",
              "neden_sonuc": "Mesajdan doğan işlerin tam envanterini görürsünüz. Bu ekran veriyi değiştirmez, yalnızca raporlar; aksiyonlar Gelen Kutusu'ndaki işlemlerle oluşur."
            }
          ],
          "iliskiler": [
            "cari",
            "servis",
            "teklif",
            "istakip"
          ],
          "ipuclari": [
            "KPI kartlarındaki sayılar sadece görüntülenen sayfayı değil, firmanın tüm aksiyon geçmişini kapsar (ayrı toplam sorgusuyla hesaplanır).",
            "'Talebi Aç' bağlantısı yalnızca Servis Talebi tipindeki aksiyonlarda görünür.",
            "Bu ekran salt rapordur; yeni aksiyon üretmek için Gelen Kutusu'ndaki Aksiyonlar menüsünü kullanın."
          ]
        }
      ]
    },
    {
      "slug": "sm-makbuzu",
      "title": "Serbest Meslek Makbuzu",
      "icon": "🧮",
      "modul": "serbestmeslek",
      "ad": "Serbest Meslek Makbuzu",
      "ozet": "Serbest meslek erbabının (avukat, doktor, mali müşavir, danışman vb.) tahsil ettikleri ücretler için Serbest Meslek Makbuzu (SMM / e-SMM) düzenlemesini sağlayan modüldür. Brüt ücret, gelir vergisi stopajı, KDV ve net tahsilat tutarlarını girilen tek bir alandan otomatik hesaplar; kaydedilen makbuz fatura tablosuna EVRAK_TIP=303 olarak yazılır ve müşterinin cari hesabına borç işlenir. İsteğe bağlı olarak entegratör üzerinden e-SMM olarak GİB'e gönderilir. Modül üç ekrandan oluşur: makbuz girişi/düzenleme, makbuz listesi (yazdır/düzenle/sil) ve toplu e-SMM gönderim kuyruğu.",
      "modul_iliskiler": [
        "cari",
        "stok",
        "fatura",
        "ebelge",
        "edonusum",
        "entegrator"
      ],
      "ekranlar": [
        {
          "id": "makbuz",
          "baslik": "Serbest Meslek Makbuzu Girişi",
          "yol": "/ekran/serbestmeslek/islem/makbuz",
          "sub": "islem",
          "amac": "Yeni serbest meslek makbuzu oluşturmaya veya var olan bir makbuzu düzenlemeye yarayan giriş ekranıdır. Cari (müşteri), evrak/vade tarihi, ürün/hizmet satırları ve tutarlar burada girilir; sistem her satırda stopaj, KDV ve net tahsilatı otomatik hesaplar, dip toplamları oluşturur.",
          "neden": "Serbest meslek erbabının tahsil ettiği ücret için yasal olarak makbuz düzenlemesi gerekir. Bu ekran, elle vergi hesabı yapmadan brüt/net/stopaj/KDV dengesini doğru kurar ve isteğe bağlı olarak e-SMM sürecini başlatır. Bir müşteriden tahsilat yapıldığında veya bir hizmet faturalandırılacağında kullanılır.",
          "nasil": [
            "Makbuz Listesi ekranındaki 'Makbuz Girişi' butonuna basarak bu ekrana gelin (düzenleme için listedeki 'Düzenle' ile açılır).",
            "Cari alanına müşterinin VKN/TCKN veya ünvanını yazıp açılan listeden seçin; gerekirse yanındaki (+) ile cari kartı modalını açıp yeni müşteri ekleyin.",
            "Evrak ve Vade tarihini belirleyin; birden fazla para birimi tanımlıysa para birimi ile kuru girin.",
            "Tablodaki (+) butonuyla ürün/hizmet satırı açın; stok kartı arayıp seçebilir veya serbest metinle hizmet yazabilirsiniz.",
            "Her satırda Brüt Ücret, Net Ücret veya Net Tahsilat alanlarından yalnızca birini girin; girdiğiniz alana göre stopaj, KDV ve kalan tutarlar otomatik hesaplanır.",
            "Sağ alttaki dip toplamları (Brüt Ücret, G.V. Stopajı, Net Ücret, KDV, Tahsilat Tutarı) kontrol edin.",
            "e-SMM gönderilecekse 'E-SMM Gönder' kutusunu işaretli bırakın (fatura ayarlarında e-SMM süreci aktif olmalıdır).",
            "KAYDET ile makbuzu kaydedin; kaydetmeden çıkmak için VAZGEÇ'e basın."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "FMakbuz formunu gönderip (smmekle) makbuzu oluşturur/günceller",
              "sonuc": "fatura (EVRAK_TIP=303), fatura_detay ve cari hareket kayıtları oluşur; stok kartı seçilen satırlarda stok hareketi de yazılır ve kullanıcı boş makbuz giriş ekranına döner",
              "renk": "info"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Kaydetmeden formdan çıkar (helper.formIptalBtn)",
              "sonuc": "Girilen bilgiler kaydedilmez, önceki ekrana dönülür",
              "renk": "ghost"
            },
            {
              "ad": "Satır Ekle (+)",
              "islev": "Fişe yeni ürün/hizmet satırı ekler (serbestMeslek.satirEkle)",
              "sonuc": "Şablondan yeni satır açılır; stopaj oranı ayarlardaki varsayılan e-SMM stopaj oranıyla dolar",
              "renk": "ghost"
            },
            {
              "ad": "Satır Sil (çöp kutusu)",
              "islev": "İlgili ürün/hizmet satırını kaldırır (serbestMeslek.satirSil)",
              "sonuc": "Satır formdan silinir, dip toplamlar yeniden hesaplanır",
              "renk": "danger"
            },
            {
              "ad": "Cari Ekle (+)",
              "islev": "Cari kartı seçim/ekleme modalını açar (#cari-modal)",
              "sonuc": "Yeni müşteri kartı eklenebilir veya mevcut cari seçilebilir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "smmekle",
              "tetik": "KAYDET butonu (FMakbuz form submit → serbestMeslek.kaydet → URL::islem serbestmeslek/smmekle)",
              "etki": "fatura tablosuna EVRAK_TIP=303 kartı, fatura_detay satırları, cari_hareket (borç, ISLEM_TIP=0) kaydı ve yalnızca stok kartı seçilen satırlar için stok_hareket/stok_fis oluşur; düzenleme modunda (recid mevcut ve firmaya ait) önce eski fatura/fatura_detay/stok_hareket/cari_hareket kayıtları silinip yeniden yazılır",
              "neden_sonuc": "Bunu yapınca makbuz sisteme resmi olarak işlenir ve müşterinin cari hesabına borç yazılır; kaydetmezseniz makbuz oluşmaz, tahsilat/cari bakiye takip edilemez ve e-SMM gönderilemez"
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "fatura"
          ],
          "ipuclari": [
            "Bir satırdaki üç tutar alanından (Brüt Ücret / Net Ücret / Net Tahsilat) sadece birini girmeniz yeterli; sistem stopaj oranı ve KDV oranına göre kalanları otomatik hesaplar.",
            "Stok kartı seçilen satırlarda ayrıca stok hareketi ve stok fişi oluşur; serbest metinle girilen hizmetlerde stok hareketi oluşmaz.",
            "Bir makbuz e-SMM olarak gönderildikten sonra (EFATURA_GONDERILECEK>=2) KAYDET butonu gizlenir ve makbuz düzenlenemez; evrak no yanında ETTN görünür.",
            "Yeni açılan satırlarda stopaj oranı, Fatura Ayarları'ndaki varsayılan e-SMM stopaj oranından gelir."
          ]
        },
        {
          "id": "makbuzliste",
          "baslik": "S.M. Makbuzu",
          "yol": "/ekran/serbestmeslek/rapor/makbuzliste",
          "sub": "rapor",
          "amac": "Düzenlenmiş tüm serbest meslek makbuzlarını cari, evrak no, makbuz tarihi, açıklama ve net tahsilat tutarıyla listeleyen ana ekrandır. Buradan makbuz yazdırma, düzenleme ve silme işlemleri yapılır.",
          "neden": "Kesilen makbuzları tek yerden görmek, geçmişe dönük arama yapmak ve bir makbuz üzerinde işlem (yazdır/düzenle/sil) yapmak için kullanılır. Denetim, mutabakat ve tahsilat takibinin ilk durağıdır.",
          "nasil": [
            "Menüden 'S.M. Makbuzu' ekranını açın; filtre yokken en yeni makbuzlar üstte listelenir.",
            "Yeni makbuz için sağ üstteki 'Makbuz Girişi' butonuna basın.",
            "Belirli bir makbuzu bulmak için başlıktaki filtre butonuyla açılan modalda cari, evrak no veya makbuz tarihi aralığı girip 'Arama Yap'a basın.",
            "Bir satırın sağındaki 'İŞLEMLER' menüsünü açın.",
            "Yazdır ile makbuz çıktısını (EVRAK_TIP=303) alın, Düzenle ile makbuz giriş ekranını düzenleme modunda açın, Sil ile makbuzu kaldırın.",
            "Çok kayıt varsa sayfa başına 50 kayıt gösterilir; alttaki sayfalama ile gezinin veya filtre kullanın."
          ],
          "butonlar": [
            {
              "ad": "Makbuz Girişi",
              "islev": "Yeni makbuz giriş ekranını açar (islem/makbuz)",
              "sonuc": "Boş makbuz formu açılır",
              "renk": "success"
            },
            {
              "ad": "Filtrele",
              "islev": "Cari/evrak no/makbuz tarihi filtre modalını açar",
              "sonuc": "Filtre kriterleri girilebilir hale gelir",
              "renk": "default"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre modalındaki kriterlerle listeyi süzer (helper.aramaBtn)",
              "sonuc": "Kriterlere uyan makbuzlar (eskiden yeniye) listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtre alanlarını sıfırlar (helper.formIptalBtn)",
              "sonuc": "Filtre kaldırılır, tüm liste döner",
              "renk": "ghost"
            },
            {
              "ad": "Yazdır",
              "islev": "Seçili makbuzun yazdırma modalını açar (helper.printModal, evraktip=303)",
              "sonuc": "Makbuz çıktısı/PDF hazırlanır",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Makbuzu düzenleme modunda açar (islem/makbuz?mode=duzenle)",
              "sonuc": "Makbuz giriş ekranı mevcut verilerle dolu açılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Onay sonrası makbuzu siler (helper.deleteButton → makbuzsil)",
              "sonuc": "Makbuz ve bağlı kayıtlar silinir, listeye dönülür",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "makbuzsil",
              "tetik": "İşlemler menüsündeki Sil (helper.deleteButton onayı → URL::islem serbestmeslek/makbuzsil)",
              "etki": "İlgili firmaya ait (FID, EVRAK_TIP=303, ISLEM_TIP=0) fatura, fatura_detay, stok_hareket ve cari_hareket kayıtları kalıcı (hard delete) olarak silinir",
              "neden_sonuc": "Bunu yapınca hatalı/iptal makbuz sistemden ve cari bakiyeden tamamen kalkar; silmezseniz yanlış makbuz cari hesabı ve raporları şişirir, silerseniz tahsilat kaydı geri alınamaz şekilde kaybolur. e-SMM olarak gönderilmiş makbuzlar da lokalde silinebilir; bu durumda GİB tarafındaki belgeyi ayrıca iptal etmek gerekir"
            },
            {
              "ad": "smmekle",
              "tetik": "İşlemler menüsündeki Düzenle ile makbuz giriş ekranı açılıp KAYDET'e basılması",
              "etki": "Var olan makbuzun fatura/fatura_detay/stok_hareket/cari_hareket kayıtları silinip güncel verilerle yeniden oluşturulur",
              "neden_sonuc": "Düzenleyip kaydedince makbuz güncel tutarlarla yenilenir; düzenlemezseniz eski/yanlış tutarlar cari hesapta kalır"
            }
          ],
          "iliskiler": [
            "fatura",
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Filtre yapılmadığında liste en yeni tarihten eskiye, filtre yapıldığında eskiden yeniye sıralanır.",
            "Silme ('makbuzsil' event) ve düzenleme ('page islem/makbuz') butonları yetkiye bağlıdır; yetki yoksa İŞLEMLER menüsünde görünmez.",
            "Sayfa başına 50 kayıt gösterilir; daha eski makbuzlar için sayfalama veya filtre kullanın.",
            "Net tahsilat sütunu yerel para birimi cinsinden (ODENECEK_TUTAR_YEREL) gösterilir."
          ]
        },
        {
          "id": "gonderimbekleyenler",
          "baslik": "Gönderim Bekleyenler",
          "yol": "/ekran/serbestmeslek/ebelge/gonderimbekleyenler",
          "sub": "ebelge",
          "amac": "Kaydedilirken 'E-SMM Gönder' işaretlenmiş (EFATURA_GONDERILECEK=1) ancak henüz GİB'e/entegratöre iletilmemiş (durum kodu 0/boş) makbuzları listeler ve bunların topluca gönderilmesini sağlar.",
          "neden": "Makbuzları kaydederken hemen göndermek yerine biriktirip toplu göndermek isteyen kullanıcılar için kuyruk ekranıdır. Bekleyen e-SMM'leri gözden kaçırmadan resmileştirmek için kullanılır.",
          "nasil": [
            "Menüden 'Gönderim Bekleyenler' ekranını açın; henüz gönderilmemiş e-SMM makbuzları tarihe göre listelenir.",
            "Göndermek istediğiniz makbuzları satır başındaki kutucuklardan seçin veya başlıktaki kutu ile tümünü seçin.",
            "'SEÇİLİ SMM GÖNDER' butonuna basın.",
            "Makbuzlar sırayla (tek tek ajax ile) gönderilir; başarılı olan satır yeşile döner ve listeden kalkar, hatalı olan kırmızı işaretlenir.",
            "Liste boşaldığında tüm bekleyen makbuzlar gönderilmiş demektir."
          ],
          "butonlar": [
            {
              "ad": "Tümünü Seç",
              "islev": "Başlıktaki kutu ile tüm makbuz kutucuklarını işaretler/kaldırır (eSerbestMeslekIslem.tumunuSec)",
              "sonuc": "Tüm makbuzlar toplu gönderime seçilir/seçim kaldırılır",
              "renk": "ghost"
            },
            {
              "ad": "SEÇİLİ SMM GÖNDER",
              "islev": "Seçili makbuzları tek tek entegratöre gönderir (eSerbestMeslekIslem.makbuzGonderBtn → sıralı ajax)",
              "sonuc": "Başarılı makbuzlar e-SMM'ye dönüşür ve listeden çıkar",
              "renk": "info"
            }
          ],
          "eventler": [
            {
              "ad": "esmmgonder",
              "tetik": "SEÇİLİ SMM GÖNDER butonu (eSerbestMeslekIslem.gonder → her makbuz için URL::event serbestmeslek/esmmgonder)",
              "etki": "Seçili makbuz için UBL/e-SMM belgesi (gönderici, alıcı, dip vergiler, satırlar) hazırlanıp entegratöre gönderilir; başarılıysa fatura kaydında EFATURA_GONDERILECEK=2, EFATURA_GUID, durum kodu/metni, UBL ve entegratörden dönen resmi EVRAK_NO güncellenir, fatura_detay ve stok_fis evrak numaraları da yeni resmi numaraya çekilir",
              "neden_sonuc": "Bunu yapınca makbuz resmi e-SMM olarak GİB'e iletilir ve yasal geçerlilik kazanır; göndermezseniz makbuz sadece kayıt olarak kalır ve e-belge yükümlülüğü yerine gelmez. EDönüşüm süreci aktif değilse veya entegratör seçili değilse gönderim hata verir"
            }
          ],
          "iliskiler": [
            "fatura",
            "ebelge",
            "edonusum",
            "entegrator",
            "cari",
            "stok"
          ],
          "ipuclari": [
            "Bu ekranda yalnızca 'E-SMM Gönder' işaretiyle kaydedilmiş ve henüz gönderilmemiş (EFATURA_STATUS_KOD 0/boş) makbuzlar görünür.",
            "Gönderim öncesi Ayarlar > Fatura Ayarları'ndan EDönüşüm sürecinin aktif ve entegratörün seçili olması gerekir; aksi halde gönderim başarısız olur.",
            "Gönderim satır satır yapılır; hata alan makbuz kırmızı işaretlenir, diğerleri etkilenmeden devam eder.",
            "Gönderim sonrası evrak numarası entegratörden gelen resmi numarayla değişebilir."
          ]
        }
      ]
    },
    {
      "slug": "uretim",
      "title": "Üretim",
      "icon": "🏭",
      "modul": "uretim",
      "ad": "Üretim (Basit Üretim / MRP)",
      "ozet": "Reçete (BOM) tabanlı basit üretim modülü. Mamul için hammadde/yarı mamul/işçilik reçetesi tanımlanır, buradan üretim emri açılır; hammadde stoktan çıkışı (506), üretim tamamlanınca mamul stok girişi (505) otomatik yapılır ve emir bazında gerçek maliyet (hammadde+işçilik+overhead) hesaplanır. Emir bir durum akışında (Bekliyor → Malzeme Hazırlandı → Üretimde → Kalite → Tamamlandı → Teslim, ayrıca İptal) ilerler; plan, hammadde ihtiyaç, maliyet, verimlilik ve karlılık raporlarıyla desteklenir.",
      "modul_iliskiler": [
        "stok",
        "depo",
        "siparis",
        "teklif",
        "personel",
        "otomasyon",
        "muhasebe"
      ],
      "ekranlar": [
        {
          "id": "emirliste",
          "baslik": "Üretim Emirleri",
          "yol": "/ekran/uretim/islem/emirliste",
          "sub": "islem",
          "amac": "Açılmış tüm üretim emirlerinin listelendiği ana ekran; her emrin numarası, mamulü, miktarı, önceliği, plan bitişi, durumu (renkli) ve maliyeti görünür. Gecikmiş emirler kırmızı 'Gecikti' rozetiyle işaretlenir.",
          "neden": "Atölyenin iş yükünü ve hangi emrin hangi aşamada olduğunu tek yerden takip etmek için. Buradan yeni emir açılır, emrin durumu ilerletilir veya (henüz başlamamışsa) silinir.",
          "nasil": [
            "Listede emir numarasına veya İşlemler > Detay'a tıklayıp emri açın",
            "Yeni üretim başlatmak için 'Yeni Emir' butonuna basın",
            "Sağ üstteki 'Filtrele' ile mamul, emir no, durum, kaynak depo, kaydeden/güncelleyen veya plan bitiş tarihine göre daraltın",
            "Bir emri ilerletmek için İşlemler > 'Durum Değiştir' ile açılan modaldan yeni durumu, (varsa) alt durumu ve zorunlu açıklamayı girin",
            "Sadece 'Bekliyor' durumundaki bir emri İşlemler > 'Sil' ile kaldırabilirsiniz"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Mamul, emir no, durum, kaynak depo, kaydeden/güncelleyen ve plan bitiş tarihi aralığına göre listeyi süzer",
              "sonuc": "Sadece kriterlere uyan emirler listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Yeni Emir",
              "islev": "Yeni üretim emri oluşturma ekranını açar",
              "sonuc": "Boş üretim emri formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Detay",
              "islev": "Seçili emrin detay/yönetim ekranına gider",
              "sonuc": "Emir detayı, malzeme tüketimi, hareket geçmişi ve durum ilerletme açılır",
              "renk": "ghost"
            },
            {
              "ad": "Durum Değiştir",
              "islev": "Emri iş akışında bir sonraki geçerli duruma taşıyan modalı açar (açıklama zorunlu)",
              "sonuc": "Onaylanınca emrin durumu güncellenir; 'Tamamlandı' seçilirse mamul stok girişi yapılır",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Yalnızca 'Bekliyor' durumundaki emri siler (onay ister)",
              "sonuc": "Emir ve kalemleri pasifleştirilir (soft delete)",
              "renk": "danger"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre modalındaki kriterleri uygulayarak listeyi yeniler",
              "sonuc": "Filtrelenmiş liste yüklenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "emirdurumdegistir",
              "tetik": "Durum Değiştir modalında 'Durumu Güncelle'",
              "etki": "uretim_emir.POZISYON güncellenir, uretim_fis'e durum log fişi ve evrak_islem_log kaydı yazılır; 'Tamamlandı'ya geçişte tüketilmemiş hammaddeler otomatik düşülür (backflush, stok_hareket 506) ve mamul stok girişi (stok_hareket 505) yapılır",
              "neden_sonuc": "Emri doğru aşamaya taşır ve tamamlamada üretilen malı stoğa alır. Açıklama girmezseniz işlem reddedilir; sadece izinli ileri geçişler kabul edilir, geri/atlama geçiş yapılamaz."
            },
            {
              "ad": "emirsil",
              "tetik": "İşlemler > Sil (Bekliyor durumunda)",
              "etki": "uretim_emir ve uretim_emir_kalem DURUM=-1 yapılır",
              "neden_sonuc": "Yanlış açılmış, henüz malzemesi tüketilmemiş emri kaldırır. Hammadde tüketimi başlamış emirde silme engellenir; bunun yerine 'İptal' kullanmanız gerekir."
            }
          ],
          "iliskiler": [
            "stok",
            "depo"
          ],
          "ipuclari": [
            "Satır rengi emrin durumunu (ve tanımlıysa alt durumu) gösterir; kırmızı 'Gecikti' rozeti plan bitişi geçmiş ve henüz tamamlanmamış emirlerde çıkar",
            "Liste sayfa başına 50 kayıt gösterir ve en yeni emir üsttedir",
            "Silme sadece hiç işlem görmemiş (Bekliyor) emirlerde mümkündür"
          ]
        },
        {
          "id": "emirdetay",
          "baslik": "Üretim Emri Detay",
          "yol": "/ekran/uretim/islem/emirdetay",
          "sub": "islem",
          "amac": "Tek bir üretim emrinin komuta merkezi: mamul/miktar/depo bilgileri, malzeme tüketim tablosu (planlanan-mevcut-kullanılan), maliyet özeti, hareket ve durum değişikliği geçmişi, notlar ve rehberli 'Sonraki Adım' butonları.",
          "neden": "Bir emri baştan sona (malzeme hazırlama, üretime başlama, kalite, tamamlama, teslim, iptal) yönetmek için. Rehberli akış kullanıcıya bir sonraki mantıklı adımı önerir ve stok/maliyet etkilerini burada gösterir.",
          "nasil": [
            "Üstte emrin mevcut durumunu ve alt durumunu rozetlerden görün",
            "'Malzeme Tüketimi' tablosunda her hammaddenin planlanan ve depodaki mevcut miktarını, tüketilip tüketilmediğini kontrol edin",
            "Gerekiyorsa 'Malzeme Hazırla / Tüket' ile hammadde çıkışını yapın",
            "Sağdaki 'Sonraki Adım' panelinden önerilen aksiyona (ör. 'Üretime Başla', 'Üretimi Tamamla') tıklayın, açılan onay panelinde açıklama (ve tamamlamada üretilen/red miktarı) girip 'Onayla'",
            "Notlar sekmesinden emre serbest not ekleyin/düzenleyin/silin",
            "Gerekirse sağ alttaki 'Emri İptal Et' ile emri iptal edip yapılmış stok hareketlerini geri alın"
          ],
          "butonlar": [
            {
              "ad": "Malzeme Hazırla / Tüket",
              "islev": "Malzeme hazırlama ekranına gider",
              "sonuc": "Hammadde tüketimi (stok çıkışı) ekranı açılır",
              "renk": "primary"
            },
            {
              "ad": "Sonraki Adım (ör. Üretime Başla / Üretimi Tamamla)",
              "islev": "Emri bir sonraki duruma taşıyan onay panelini açar",
              "sonuc": "Açıklama + gerekli alanlar girilip onaylanınca durum ilerler",
              "renk": "accent"
            },
            {
              "ad": "Onayla",
              "islev": "Seçilen durum geçişini gönderir",
              "sonuc": "Emir durumu güncellenir; tamamlamada mamul stoğa girer ve maliyet gerçek tüketime göre yeniden hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Not Ekle / Notu Güncelle",
              "islev": "Emre başlık+açıklamalı not kaydeder",
              "sonuc": "Not listeye eklenir/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Emri İptal Et",
              "islev": "İptal açıklama modalını açar",
              "sonuc": "Onaylanınca emir iptal edilir, hammadde çıkışları ve mamul girişleri geri alınır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "emirdurumdegistir",
              "tetik": "'Sonraki Adım' panelinde Onayla",
              "etki": "uretim_emir.POZISYON/POZISYON_ALT güncellenir; tamamlamada uretim_fis + stok_fis/stok_hareket (505 mamul giriş, gerekiyorsa 506 backflush) ve maliyet alanları yazılır; evrak_islem_log'a durum geçişi işlenir",
              "neden_sonuc": "Emri fiziksel iş akışıyla senkron tutar; tamamlamada üretilen mal stoğa girer ve birim maliyet üretilen miktara göre kesinleşir. Açıklama zorunludur; kalite zorunlu ayarı açıksa tamamlamadan önce kaliteye uğramış olmalıdır."
            },
            {
              "ad": "emiriptal",
              "tetik": "'Emri İptal Et' modalında onay",
              "etki": "Tüketilmiş hammadde ve mamul giriş stok_fis/stok_hareket kayıtları DURUM=-1 yapılır, kalem tüketim bayrakları sıfırlanır, uretim_emir.POZISYON=9 (İptal) olur, iptal log fişi + evrak_islem_log yazılır",
              "neden_sonuc": "Yanlış/iptal edilen üretimin stok ve maliyet etkilerini tümüyle geri alır. Açıklama zorunludur; zaten iptal edilmiş emir tekrar iptal edilemez."
            },
            {
              "ad": "emirhammaddetuket",
              "tetik": "'Malzeme Hazırla / Tüket' üzerinden tüketim",
              "etki": "Bekleyen hammadde kalemleri için stok_hareket 506 çıkışı üretilir, kalem TUKETILDI=1 olur, ilk tüketimde durum 'Malzeme Hazırlandı'ya (2) geçer",
              "neden_sonuc": "Reçetedeki hammaddeyi depodan düşer; böylece mamul, hammadde çıkışı olmadan stoğa girmez. Tüketim yapılmazsa tamamlamada otomatik backflush devreye girer."
            },
            {
              "ad": "uretimnotkaydet",
              "tetik": "Notlar sekmesinde 'Not Ekle/Güncelle'",
              "etki": "notlar tablosuna REL_TYPE=3 (uretim_emir), REL_ID=emir olarak kayıt eklenir/güncellenir",
              "neden_sonuc": "Emirle ilgili serbest açıklama/hatırlatma tutulur. Açıklama boşsa kaydedilmez."
            },
            {
              "ad": "uretimnotsil",
              "tetik": "Not kartında çöp kutusu",
              "etki": "İlgili notlar kaydı fiziksel silinir (FID+REL_TYPE=3 doğrulamalı)",
              "neden_sonuc": "Gereksiz notu kaldırır; yanlış emre ait not silinemez."
            }
          ],
          "iliskiler": [
            "stok",
            "depo",
            "otomasyon"
          ],
          "ipuclari": [
            "Tamamlarken 'Maliyeti güncel yöntemle yeniden hesapla' işaretlenirse tüketilen hammaddeler bugünkü stok hareketlerinden (FIFO/LIFO/Ort./Son Alış) yeniden fiyatlanır; manuel kalemler değişmez",
            "Tüketilmemiş hammadde varken tamamlarsanız sistem uyarır ve otomatik düşer (backflush); önce manuel 'Malzeme Hazırla' yapmak isteyebilirsiniz",
            "Maliyet özetindeki toplam ve birim maliyet, emir tamamlanınca gerçek tüketime göre güncellenir"
          ]
        },
        {
          "id": "malzemehazirlama",
          "baslik": "Malzeme Hazırlama",
          "yol": "/ekran/uretim/islem/malzemehazirlama",
          "sub": "islem",
          "amac": "Bir emrin henüz tüketilmemiş hammaddelerini tek ekranda listeleyip, her biri için kullanılacak miktarı girerek toplu stok çıkışı (üretime çıkış) yapmayı sağlar.",
          "neden": "Üretime fiilen başlarken hammaddeyi depodan düşmek için. Planlanan miktarları görüp gerçekte kullanılacak miktarı ayarlayabilir, stok yeterliliğini önceden kontrol edebilirsiniz.",
          "nasil": [
            "Tabloda her hammaddenin planlanan (brüt, fire dahil) ve mevcut stok miktarını inceleyin",
            "Yeterli olmayan satırlar kırmızı ve çarpı ikonuyla işaretlenir",
            "'Kullanılacak Miktar' alanına gerçekte harcanacak miktarı yazın (varsayılan planlanan gelir)",
            "'Tüketimi Onayla (Stok Çıkışı)' butonuna basıp onay verin"
          ],
          "butonlar": [
            {
              "ad": "Tüketimi Onayla (Stok Çıkışı)",
              "islev": "Girilen miktarlar için hammadde stok çıkışını oluşturur (onay ister)",
              "sonuc": "Seçili kalemler için stok_hareket 506 çıkışı yapılır ve kalemler tüketildi olarak işaretlenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "İşlem yapmadan emir detayına döner",
              "sonuc": "Değişiklik olmaz",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "emirhammaddetuket",
              "tetik": "'Tüketimi Onayla' onayı",
              "etki": "Bekleyen kalemler için stok_hareket 506 çıkışı + uretim_fis MALZEME_CIKIS fişi yazılır, kalem TUKETILDI=1 ve MIKTAR_KULLANILAN dolar, ilk tüketimde emir durumu 2'ye geçer",
              "neden_sonuc": "Hammaddeyi kaynak depodan düşer ve gerçek maliyet hesabına temel oluşturur. 'Stok yetersizse engelle' ayarı açıksa bakiyesi yetmeyen kalemde tüm işlem durur; çift tık/eşzamanlı istekte kilit (FOR UPDATE) sayesinde çift düşüş olmaz."
            }
          ],
          "iliskiler": [
            "stok",
            "depo"
          ],
          "ipuclari": [
            "Bu işlem geri alınamaz; tüketilen hammaddeyi geri almak için emrin iptal edilmesi gerekir",
            "Kaynak (hammadde) deposu emir açılışında seçilir; bakiye o depoya göre hesaplanır",
            "İşçilik/gider kalemleri burada listelenmez (stok hareketi üretmezler)"
          ]
        },
        {
          "id": "emir",
          "baslik": "Yeni Üretim Emri",
          "yol": "/ekran/uretim/islem/emir",
          "sub": "islem",
          "amac": "Üretilecek mamulü, miktarını, önceliğini, plan tarihlerini, kaynak/hedef depoyu ve sorumluyu seçerek yeni bir üretim emri açan form. Mamul seçilince reçetesi otomatik/modalla yüklenir ve kaydetmeden stok yeterliliği kontrol edilebilir.",
          "neden": "Üretimi başlatmanın giriş noktası; emir kaydedilince reçeteye göre hammadde kalemleri ve tahmini maliyet oluşturulur. Siparişten 'Üretime Al' ile de ön dolu gelebilir.",
          "nasil": [
            "'Mamul' kutusuna üretilecek ürünü arayıp seçin; reçetesi tek ise otomatik, birden çoksa açılan modaldan seçilir",
            "Üretim miktarını girin (birim mamulden gelir)",
            "Öncelik, plan başlama/bitiş tarihi ve not girin",
            "Hammadde deposu (kaynak) ve mamul deposu (hedef), varsa sorumlu personeli seçin",
            "İsterseniz 'Stok Kontrol' ile hammaddelerin yeterli olup olmadığını görün",
            "'Emri Oluştur' ile emri kaydedin; detay ekranına yönlendirilirsiniz"
          ],
          "butonlar": [
            {
              "ad": "Stok Kontrol",
              "islev": "Seçili mamul, miktar ve reçeteye göre hammadde yeterliliğini kaydetmeden hesaplar",
              "sonuc": "Yeterlilik tablosu açılır, her hammadde için ihtiyaç/mevcut/yeterli gösterilir",
              "renk": "ghost"
            },
            {
              "ad": "Emri Oluştur",
              "islev": "Formu doğrulayıp üretim emrini kaydeder",
              "sonuc": "uretim_emir + reçeteden hammadde kalemleri oluşur, maliyet hesaplanır, emir detayına gidilir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Kaydetmeden emir listesine döner",
              "sonuc": "Emir oluşmaz",
              "renk": "ghost"
            },
            {
              "ad": "Seç (reçete modalı)",
              "islev": "Birden fazla reçete varsa kullanılacak reçeteyi seçer",
              "sonuc": "Seçilen reçete forma yüklenir",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "emirreceteler",
              "tetik": "Mamul seçildiğinde (otomatik AJAX)",
              "etki": "Salt-okuma; mamulün tüm reçetelerini özetiyle döner (0 ise uyarı, 1 ise otomatik yükler, >1 ise modal listeler)",
              "neden_sonuc": "Doğru reçeteyi seçmenizi sağlar. Reçetesi olmayan mamul için emir açılamaz (önce reçete gerekir)."
            },
            {
              "ad": "emirreceteyukle",
              "tetik": "Reçete modalında 'Seç' (AJAX)",
              "etki": "Salt-okuma; seçilen reçete ve kalemlerini forma getirir",
              "neden_sonuc": "Üretimde hangi reçetenin kullanılacağını sabitler; yanlış reçete seçilirse maliyet ve hammadde ihtiyacı hatalı olur."
            },
            {
              "ad": "emirstokyeterlilik",
              "tetik": "'Stok Kontrol' butonu (AJAX)",
              "etki": "Salt-okuma; mamul+miktar+reçeteye göre her hammaddenin fire dahil ihtiyacını kaynak depo bakiyesiyle kıyaslar",
              "neden_sonuc": "Emri açmadan önce eksik malzemeyi görmenizi sağlar; kaydı engellemez, sadece bilgilendirir."
            },
            {
              "ad": "emirkaydet",
              "tetik": "'Emri Oluştur' butonu",
              "etki": "uretim_emir kaydı (yeni EMIR_NO, POZISYON=1) ve reçeteden uretim_emir_kalem satırları oluşur; kalem birim maliyetleri seçili yönteme göre hesaplanır, emrin hammadde/işçilik/overhead/toplam maliyeti yazılır; yeni kayıtta 'Üretim Emri Oluşturuldu' otomasyonu tetiklenir",
              "neden_sonuc": "Üretim planını sisteme alır ve tahmini maliyeti damgalar. Mamul/miktar boşsa veya varyantlı ana şablon seçilirse kayıt reddedilir; 'Stok yetersizse engelle' ayarı açıksa yetersiz stokta emir açılamaz. Tüketimi başlamış emir yeniden kaydedilemez (önce iptal gerekir)."
            }
          ],
          "iliskiler": [
            "stok",
            "depo",
            "personel",
            "siparis",
            "teklif",
            "otomasyon"
          ],
          "ipuclari": [
            "Kaynak/hedef depo varsayılanları üretim ayarlarından gelir; boş bırakılırsa depo ayrımsız bakiye kullanılır",
            "Varyantlı ana ürün üretilemez; alt varyantı (child) seçmelisiniz",
            "Sorumlu personel listesi ancak personel kartı tanımlıysa görünür",
            "Siparişten 'Üretime Al' ile gelindiğinde mamul, miktar ve sipariş bağlantısı ön dolu gelir"
          ]
        },
        {
          "id": "recete",
          "baslik": "Reçeteler (BOM)",
          "yol": "/ekran/uretim/tanim/recete",
          "sub": "tanim",
          "amac": "Bir mamulü üretmek için gereken hammadde, yarı mamul ve işçilik/gider kalemlerini (Bill of Materials) tanımlayan reçetelerin listesi; buradan yeni reçete eklenir, düzenlenir veya silinir.",
          "neden": "Üretim emri açmanın ön koşulu. Reçete olmadan emir açılamaz; reçete miktarları, fireleri ve maliyet yöntemleri emrin hammadde ihtiyacını ve maliyetini belirler.",
          "nasil": [
            "Listede tanımlı reçeteleri (mamul, versiyon, kalem sayısı, aktif/pasif) görün",
            "'Yeni Reçete' ile reçete formunu (ayrı sayfa) açın; mamulü seçin, üretim miktarını ve versiyonu girin",
            "Her kalem satırında stok/işçilik seçin, miktar, fire oranı, birim ve maliyet yöntemini belirleyin",
            "İşçilik/gider kalemleri için tip 'İşçilik' seçilir (maliyet manuel girilir)",
            "'Kaydet' ile reçeteyi kaydedin; İşlemler > Düzenle/Sil ile yönetin"
          ],
          "butonlar": [
            {
              "ad": "Yeni Reçete",
              "islev": "Reçete oluşturma formunu açar",
              "sonuc": "Boş reçete (BOM) formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili reçeteyi düzenleme formunda açar",
              "sonuc": "Reçete ve kalemleri düzenlenebilir gelir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Reçeteyi siler (onay ister)",
              "sonuc": "Reçete ve kalemleri pasifleştirilir (soft delete)",
              "renk": "danger"
            },
            {
              "ad": "Kaydet (form)",
              "islev": "Reçeteyi ve kalemlerini kaydeder",
              "sonuc": "Reçete oluşur/güncellenir; aktif işaretliyse aynı mamulün diğer reçeteleri pasifleşir",
              "renk": "primary"
            },
            {
              "ad": "Cikti Al",
              "islev": "Recetenin basilabilir dokumunu acar (kunye + malzeme listesi + net/fire/brut miktar)",
              "sonuc": "Yazdirilabilir recete cikti sayfasi acilir; maliyet BASILMAZ",
              "renk": "info"
            }
          ],
          "eventler": [
            {
              "ad": "recetekaydet",
              "tetik": "Reçete formunda 'Kaydet'",
              "etki": "uretim_recete kaydı ve uretim_recete_kalem satırları yazılır (düzenlemede eski kalemler silinip yeniden oluşturulur); aktif işaretliyse aynı mamulün diğer reçeteleri AKTIF=0 yapılır",
              "neden_sonuc": "Mamulün üretim tarifini belirler; bu tarif emir açılışında hammadde kalemlerine ve maliyete dönüşür. Mamul seçilmezse veya varyantlı ana şablon/varyantlı kalem seçilirse kayıt reddedilir."
            },
            {
              "ad": "recetesil",
              "tetik": "İşlemler > Sil onayı",
              "etki": "uretim_recete ve uretim_recete_kalem DURUM=-1 yapılır",
              "neden_sonuc": "Kullanılmayan reçeteyi kaldırır. Mamulün aktif reçetesi silinirse o mamul için yeni emir açmadan önce yeni reçete tanımlamak gerekir."
            }
          ],
          "iliskiler": [
            "stok"
          ],
          "ipuclari": [
            "Aynı mamulün birden çok reçetesi (versiyonu) olabilir ama yalnızca biri aktiftir; emir açarken hangisinin kullanılacağı seçilir",
            "Fire oranı brüt ihtiyacı artırır (planlanan = miktar × (1+fire/100))",
            "Maliyet yöntemi (Ort./FIFO/LIFO/Son Alış) hammadde kalemi için canlı maliyet hesaplar; İşçilik/Gider daima manuel tutar",
            "Ekleme/düzenleme formu ayrı bir sayfada (receteform) açılır"
          ]
        },
        {
          "id": "durum",
          "baslik": "Üretim Durumları",
          "yol": "/ekran/uretim/tanim/durum",
          "sub": "tanim",
          "amac": "Sabit ana iş akışı aşamalarının (Bekliyor, Malzeme Hazırlandı, Üretimde, Kalite Kontrol, Tamamlandı, Teslim, İptal) altına firmaya özel, renkli 'alt durumlar' tanımlamayı sağlayan ekran.",
          "neden": "Ana iş akışı sabittir ve değiştirilemez; ancak her aşamayı kendi süreçinize göre detaylandırmak (ör. 'Üretimde' altında 'Montaj', 'Boyama') isteyebilirsiniz. Alt durumlar emir listesinde ve detayında renkli rozet olarak görünür.",
          "nasil": [
            "Tabloda her ana durumu ve altındaki tanımlı alt durumları görün",
            "Bir ana durumun yanındaki 'Alt Durum Ekle' ile formu ön seçili açın",
            "Alt durum adını, sırasını, arkaplan ve yazı rengini girip 'Kaydet'",
            "Mevcut alt durumları İşlemler > Düzenle/Sil ile yönetin"
          ],
          "butonlar": [
            {
              "ad": "Alt Durum Ekle",
              "islev": "Seçili ana durum ön dolu olarak alt durum formunu açar",
              "sonuc": "Yeni alt durum formu hazır gelir",
              "renk": "accent"
            },
            {
              "ad": "Kaydet",
              "islev": "Alt durumu kaydeder",
              "sonuc": "sys_durum'a (MODULE_KEY='uretim') kayıt eklenir/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler/iptal eder",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Alt durumu düzenleme modunda açar",
              "sonuc": "Form mevcut değerlerle dolar",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Alt durumu siler (onay ister)",
              "sonuc": "Alt durum pasifleştirilir (soft delete)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "uretimdurumkaydet",
              "tetik": "Alt durum formunda 'Kaydet'",
              "etki": "sys_durum tablosuna MODULE_KEY='uretim', SABITGRUP=ana durum kodu ile kayıt eklenir/güncellenir",
              "neden_sonuc": "Emirlerde kullanılabilecek renkli alt durum seçeneği yaratır. Seçilen ana durum geçerli bir iş akışı kodu değilse kayıt reddedilir."
            },
            {
              "ad": "uretimdurumsil",
              "tetik": "İşlemler > Sil onayı",
              "etki": "İlgili sys_durum kaydı DURUM=-1 yapılır (FID+MODULE_KEY doğrulamalı)",
              "neden_sonuc": "Kullanılmayan alt durumu kaldırır; başka modülün durumu bu ekrandan silinemez."
            }
          ],
          "iliskiler": [],
          "ipuclari": [
            "Ana durumlar (1-9) sadece grup başlığıdır; buradan değiştirilemez veya silinemez",
            "Alt durum seçimi emir durumu değiştirilirken opsiyoneldir; ana durum değişince uyumsuz alt durum otomatik sıfırlanır",
            "Renkler emir listesinde emrin satır/rozet rengini belirler"
          ]
        },
        {
          "id": "uretimplani",
          "baslik": "Üretim Planı",
          "yol": "/ekran/uretim/rapor/uretimplani",
          "sub": "rapor",
          "amac": "Henüz tamamlanmamış (Bekliyor, Malzeme Hazırlandı, Üretimde, Kalite) tüm açık emirleri öncelik ve plan bitiş tarihine göre sıralı gösteren okuma raporu; açık emir, üretimde, bugün bitecek ve gecikmiş sayılarını KPI olarak verir.",
          "neden": "Atölye iş yükünü, sıradaki işleri ve gecikme risklerini tek ekranda görüp önceliklendirmek için. Gecikmiş emirler pembe satırla vurgulanır.",
          "nasil": [
            "KPI kartlarından açık/üretimde/bugün bitecek/gecikmiş sayılarını görün",
            "Sağ üstteki 'Filtrele' ile durum, öncelik ve plan bitiş tarihi aralığına göre daraltın",
            "Pembe satırlar plan bitişi geçmiş (gecikmiş) emirlerdir; önce bunlara odaklanın",
            "Alttaki mamul bazında toplam üretilecek miktar özetinden hangi mamulden ne kadar üretileceğini tek listede görün; 'Yazdır' ile bu özeti çıktı alın",
            "'Excel' ile listeyi dışa aktarın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Durum, öncelik ve plan bitiş tarihine göre raporu süzer",
              "sonuc": "Kriterlere uyan açık emirler listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel dosyası olarak indirir",
              "sonuc": "Liste Excel'e aktarılır",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Mamul bazında toplam üretilecek miktar özetini yazıcıya gönderir",
              "sonuc": "Hangi mamulden ne kadar üretileceğini gösteren özet liste çıktı olarak alınır",
              "renk": "ghost"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre kriterlerini uygular",
              "sonuc": "Filtrelenmiş rapor yüklenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Rapor yalnızca açık emirleri gösterir; tamamlanan/teslim/iptal emirler burada yer almaz",
            "Sıralama önce önceliğe, sonra en yakın plan bitişe göredir",
            "Filtredeki plan bitiş (teslim) tarihi aralığıyla, örneğin bu haftaya kadar teslim edilmesi gereken emirleri süzebilirsiniz; tarih seçici Stok Bazlı Üretim Raporu ile aynı davranır"
          ]
        },
        {
          "id": "hammaddeihtiyac",
          "baslik": "Hammadde İhtiyaç",
          "yol": "/ekran/uretim/rapor/hammaddeihtiyac",
          "sub": "rapor",
          "amac": "Tüm açık emirlerin henüz tüketilmemiş hammadde/yarı mamul ihtiyacını malzeme bazında toplayıp mevcut stok bakiyesiyle karşılaştıran okuma raporu; hangi malzemenin yetersiz olduğunu ve satın alınması gerektiğini gösterir.",
          "neden": "Üretimi durdurmadan tedarik planlamak için. Eksi 'Fark' olan malzemeler için satın alma yapılması gerekir; stok sıfır olanlar acil tedarik gerektirir.",
          "nasil": [
            "KPI kartlarından ihtiyaç duyulan malzeme çeşidi, yetersiz ve stok sıfır sayılarını görün",
            "Tabloda her malzemenin toplam ihtiyacı, mevcut stoğu ve farkını inceleyin",
            "Pembe satır yetersiz, koyu satır stok sıfır/eksi malzemedir",
            "'Filtrele' ile Hammadde / Yarı Mamul tipine ve depoya göre daraltın; depo seçtiğinizde mevcut stok yalnızca o deponun bakiyesine göre gösterilir",
            "'Excel' ile satın alma listesi olarak dışa aktarın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Malzeme tipine (Hammadde/Yarı Mamul) göre süzer",
              "sonuc": "Seçili tipteki malzemeler listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel olarak indirir",
              "sonuc": "İhtiyaç listesi Excel'e aktarılır",
              "renk": "accent"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre kriterini uygular",
              "sonuc": "Filtrelenmiş rapor yüklenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok"
          ],
          "ipuclari": [
            "İhtiyaç, açık emirlerin fire dahil planlanan ihtiyaçlarının toplamıdır; zaten tüketilmiş kalemler sayılmaz",
            "Mevcut stok varsayılan olarak tüm depolar toplamıdır; filtreden bir depo seçerseniz mevcut stok yalnızca o deponun bakiyesine göre gösterilir",
            "Aynı malzeme birden çok emirde geçiyorsa toplu alım maliyet avantajı sağlar"
          ]
        },
        {
          "id": "maliyetrapor",
          "baslik": "Üretim Maliyeti",
          "yol": "/ekran/uretim/rapor/maliyetrapor",
          "sub": "rapor",
          "amac": "Tamamlanmış/teslim edilmiş üretim emirlerinin maliyetini hammadde, işçilik ve genel gider (overhead) bileşenlerine ayırarak emir ve ürün bazında gösteren okuma raporu.",
          "neden": "Bir ürünün gerçek üretim maliyetini ve fiyatlama tabanını belirlemek için. Hammadde/işçilik payı ve birim maliyet eğilimi satış fiyatı kararlarını besler.",
          "nasil": [
            "Sağ üstteki 'Filtrele' ile dönem (gerçek bitiş tarihi) ve isteğe bağlı mamul seçin — rapor filtre uygulanınca hesaplanır",
            "KPI kartlarından biten emir, toplam hammadde, işçilik+gider ve toplam maliyeti görün",
            "'Emir Bazlı Maliyet' tablosunda her emrin kırılımını ve birim maliyetini inceleyin",
            "'Ürün Bazlı Özet' ile aynı mamulün dönem toplamını ve ortalama birim maliyetini görün",
            "'Excel' ile dışa aktarın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele / Filtreleme Yap",
              "islev": "Dönem ve mamula göre raporu çalıştırır",
              "sonuc": "Seçili dönemdeki tamamlanmış emirlerin maliyeti hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Emir bazlı maliyeti Excel olarak indirir",
              "sonuc": "Liste Excel'e aktarılır",
              "renk": "accent"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre kriterlerini uygular",
              "sonuc": "Filtrelenmiş rapor yüklenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok"
          ],
          "ipuclari": [
            "Rapor filtre uygulanmadan boş gelir; önce dönem seçmelisiniz",
            "Yalnızca tamamlanmış (5) ve teslim edilmiş (6) emirler maliyetlenir",
            "Birim maliyet = toplam maliyet / üretilen miktar; gerçek tüketime göre kesinleşmiş değerdir"
          ]
        },
        {
          "id": "verimlilik",
          "baslik": "Verimlilik",
          "yol": "/ekran/uretim/rapor/verimlilik",
          "sub": "rapor",
          "amac": "Tamamlanmış emirlerde planlanan süre ile gerçekleşen süreyi ve fire (red) oranını karşılaştıran okuma raporu; plan doğruluğunu ve kalite kayıplarını ölçer.",
          "neden": "Sürekli geç biten süreçleri ve yüksek fireli üretimleri tespit edip iyileştirmek için. Plan sürelerini gerçekçi güncellemeye ve kök neden analizine yön verir.",
          "nasil": [
            "'Filtrele' ile dönem (gerçek bitiş) seçip raporu çalıştırın",
            "KPI kartlarından biten emir, zamanında, geç biten ve ortalama fire oranını görün",
            "Tabloda plan gün / gerçek gün / sapma ve fire yüzdesini inceleyin",
            "Pembe satırlar geç biten veya yüksek fireli (%5+) emirlerdir",
            "'Excel' ile dışa aktarın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele / Filtreleme Yap",
              "islev": "Dönem seçerek verimlilik analizini çalıştırır",
              "sonuc": "Seçili dönemin plan/gerçek süre ve fire analizi gelir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel olarak indirir",
              "sonuc": "Liste Excel'e aktarılır",
              "renk": "accent"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre kriterlerini uygular",
              "sonuc": "Filtrelenmiş rapor yüklenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Sapma = gerçek gün - plan gün; artı değer plandan uzun sürdüğünü gösterir",
            "Fire oranı = red / (üretilen + red); %5 ve üzeri satırlar vurgulanır",
            "Süre hesabı için plan başlama/bitiş ve gerçek başlama/bitiş tarihlerinin dolu olması gerekir"
          ]
        },
        {
          "id": "karlilik",
          "baslik": "Karlılık Analizi",
          "yol": "/ekran/uretim/rapor/karlilik",
          "sub": "rapor",
          "amac": "Üretilen mamulün stok kartındaki satış fiyatını emirde oluşan birim üretim maliyetiyle karşılaştırıp birim kâr, kâr marjı ve toplam kazancı gösteren okuma raporu.",
          "neden": "Hangi ürünlerin kârlı, hangilerinin zararına üretildiğini görmek ve fiyatlama/maliyet kararları almak için. Zararlı ürünlerde satış fiyatı veya maliyet gözden geçirilmelidir.",
          "nasil": [
            "'Filtrele' ile dönem seçip analizi çalıştırın",
            "KPI kartlarından biten emir, kârlı, zararlı ve toplam kâr değerlerini görün",
            "Tabloda satış (birim), maliyet (birim), birim kâr, marj ve toplam kârı inceleyin",
            "Pembe satırlar zararına üretilen (maliyet > satış) emirlerdir; 'Fiyat yok' rozeti satış fiyatı tanımsız ürünleri işaret eder",
            "'Excel' ile dışa aktarın"
          ],
          "butonlar": [
            {
              "ad": "Filtrele / Filtreleme Yap",
              "islev": "Dönem seçerek karlılık analizini çalıştırır",
              "sonuc": "Seçili dönemin kâr/marj analizi gelir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel olarak indirir",
              "sonuc": "Liste Excel'e aktarılır",
              "renk": "accent"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre kriterlerini uygular",
              "sonuc": "Filtrelenmiş rapor yüklenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok"
          ],
          "ipuclari": [
            "Satış fiyatı stok kartından (SATIS_FIYAT) okunur; tanımlı değilse kâr hesaplanamaz ('Fiyat yok')",
            "Yalnızca birim maliyeti oluşmuş, tamamlanmış emirler analiz edilir",
            "Marj = birim kâr / satış fiyatı; düşük marjlı ürünlerde fiyat stratejisi gözden geçirilmelidir"
          ]
        },
        {
          "id": "stokbazliuretim",
          "baslik": "Stok Bazlı Üretim Raporu",
          "yol": "/ekran/uretim/rapor/stokbazliuretim",
          "sub": "rapor",
          "amac": "Açık iş emirlerini fiş bazında değil ürün bazında toplar: hangi mamulden toplam ne kadar üretilecek ve bunun için hangi hammaddeden ne kadar sarf edilecek, hammadde stok bakiyesiyle birlikte tek ekranda gösterir.",
          "neden": "İş emri listesi bugün ne üreteceğiz, neyi satın almalıyız sorusunu yanıtlamaz; her emri tek tek toplamak gerekir. Bu rapor mamul ve hammadde kırılımını hazır verir, hammadde bakiyesiyle karşılaştırarak eksik malzemeyi üretim durmadan önce görmenizi sağlar.",
          "nasil": [
            "Üretim menüsünden Stok Bazlı Üretim Raporu ekranını açın.",
            "Filtre penceresinden tarih aralığını ve üretim durumlarını seçin; rapor varsayılan olarak açık iş emirlerini getirir.",
            "Üstteki bölümden mamul bazında üretilecek miktarları, alttaki bölümden hammadde bazında sarf ihtiyacını ve mevcut stok bakiyesini inceleyin.",
            "Gerekirse EXCEL ile dışa aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı ve üretim durumu seçimini uygular",
              "sonuc": "Rapor seçilen kapsamla yeniden hesaplanır",
              "renk": "primary"
            },
            {
              "ad": "EXCEL",
              "islev": "Ekrandaki filtrelerle raporu Excel dosyası olarak indirir",
              "sonuc": "Mamul ve hammadde kırılımı tablo hâlinde indirilir",
              "renk": "success"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "siparis",
            "sevkiyat"
          ],
          "ipuclari": [
            "Hammadde bakiyesi ana birimde gösterilir; reçetede alt birim kullansanız da karşılaştırma ana birim üzerinden yapılır.",
            "Kârlılık, Maliyet, Üretim Planı ve Verimlilik raporlarında da sağ üst köşede EXCEL butonu bulunur.",
            "Filtredeki tarih aralığı emrin plan bitiş (teslim) tarihine göre çalışır; örneğin bu haftaya kadar bitmesi gereken üretimi ve gereken hammaddeyi ürün bazında çıkarabilirsiniz.",
            "Tarih seçici, Üretim Planı ve diğer üretim raporlarıyla aynı tutarlı davranışa sahiptir."
          ]
        },
        {
          "id": "fireanaliz",
          "baslik": "Fire / Red Analizi",
          "yol": "/ekran/uretim/rapor/fireanaliz",
          "sub": "rapor",
          "amac": "Bitmis uretim emirlerinde red edilen mamul miktarini ve bunun parasal karsiligini MAMUL BAZINDA toplayan okuma raporu.",
          "neden": "Red edilen mamul stoga girmez; bu rapor onun gorunur oldugu tek yerdir. Hangi urunde ne kadar kayip verdiginizi ve bunun size kaca mal oldugunu gosterir.",
          "nasil": [
            "'Filtrele' ile donem (gercek bitis tarihi) secip raporu calistirin",
            "Istege bagli olarak mamul kodu/adi yazarak tek urune daraltin",
            "'Kapsam' secimiyle yalniz fire verenleri ya da tum uretilen mamulleri listeleyin",
            "KPI kartlarindan islenen, red, fire orani ve fire maliyetini gorun",
            "Tabloda kirmizi satirlar fire orani %5 ve uzeri olan mamullerdir",
            "Liste en cok para kaybettiren mamulden baslar; 'Excel' ile disa aktarin"
          ],
          "butonlar": [
            {
              "ad": "Filtrele / Filtreleme Yap",
              "islev": "Donem, mamul ve kapsam secerek fire analizini calistirir",
              "sonuc": "Secili donemin mamul bazli fire analizi gelir",
              "renk": "primary"
            },
            {
              "ad": "Excel",
              "islev": "Raporu Excel olarak indirir",
              "sonuc": "Liste Excel'e aktarilir",
              "renk": "accent"
            },
            {
              "ad": "Arama Yap",
              "islev": "Filtre kriterlerini uygular",
              "sonuc": "Filtrelenmis rapor yuklenir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Islenen = uretilen + red (tezgahtan gecen toplam miktar)",
            "Fire orani = red / islenen; %5 ve uzeri satirlar kirmizi vurgulanir",
            "Fire maliyeti, toplam uretim maliyetinin red'e dusen payidir: EK GIDER DEGIL, satilabilir mamule donusmeyen kaynagin karsiligidir",
            "Fire maliyeti sağlam mamullerin birim maliyetine zaten yansimistir; ayrica gider yazilmaz",
            "Oran yuksek ama emir sayisi 1-2 ise once veri girisini dogrulayin; surec sorunu olmayabilir",
            "Rapor yalniz Tamamlandi ve Teslim Edildi durumundaki emirleri kapsar; yarim emirde red henuz girilmemistir"
          ]
        },
        {
          "id": "operasyon",
          "baslik": "Operasyon Tanimlari (Uretim Pro)",
          "yol": "/ekran/uretim/tanim/operasyon",
          "sub": "tanim",
          "amac": "Uretimin gectigi tezgah/istasyonlarin (kesim, zimpara, montaj, boya...) tanimlandigi ekran. Her operasyonun iscilik ve makine saat maliyeti burada girilir.",
          "neden": "Uretimi tek adimda degil istasyon istasyon yapan firmalarda iscilik maliyetinin gercege yakin hesaplanmasi icin. Rota tanimlandiginda maliyet bu tanimlardan turer.",
          "nasil": [
            "'Yeni Operasyon' ile kod ve ad girin (or. KESIM, ZIMPARA)",
            "Iscilik saat maliyeti ve makine saat maliyetini TL/saat olarak ayri ayri girin",
            "Istege bagli varsayilan depo ve sorumlu personel secin",
            "Kaydettikten sonra recete formundaki 'Rota' sekmesinden operasyonlari sirayla ekleyin",
            "Her operasyon icin hazirlik suresi, birim sure ve fire orani girin"
          ],
          "butonlar": [
            {
              "ad": "Yeni Operasyon",
              "islev": "Yeni istasyon tanimi acar",
              "sonuc": "Operasyon formu acilir",
              "renk": "primary"
            },
            {
              "ad": "Duzenle",
              "islev": "Mevcut operasyonu gunceller",
              "sonuc": "Degisiklik kaydedilir; acik emirlerin kopyalanmis rotasi ETKILENMEZ",
              "renk": "warning"
            },
            {
              "ad": "Sil",
              "islev": "Operasyonu pasife alir",
              "sonuc": "Yeni recetelerde secilemez; gecmis veriler korunur",
              "renk": "danger"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "recete"
          ],
          "ipuclari": [
            "Bu ekran Uretim Pro ek modulu lisansi olan firmalarda gorunur",
            "Rota tanimlanmamis mamuller bugunku basit yoldan uretilmeye devam eder; ayri bir 'rota kullan' ayari YOKTUR, rotanin varligi ayardir",
            "Iscilik ve makine saat maliyeti AYRI tutulur; maliyet raporundaki kirilim bu ayrima dayanir",
            "Rotada her operasyona fire orani girilirse sistem son adimda hedeflenen saglam adedi elde etmek icin ilk adima kac adet girilmesi gerektigini kendisi hesaplar",
            "Rota varken recetede ayrica Isçilik/Gider (TIP=3) satiri kullanmayin; iscilik iki kez sayilir"
          ]
        }
      ]
    },
    {
      "slug": "saha-satis",
      "title": "Saha Satış (Plasiyer)",
      "icon": "🚚",
      "modul": "sahasatis",
      "ad": "Saha Satış (Plasiyer / Van-Satış)",
      "ozet": "Saha Satış modülü, plasiyerlerin sahada yaptığı ziyaretleri baştan sona yönetir: yönetici rota planlar ve plasiyer aracına stok yükler; plasiyer mobil PWA ile bugünün rotasını görür, müşteriye check-in yapar, bakiye/ekstre ve tavsiye ürünleri inceler, sahada fatura/irsaliye/sipariş keser ve tahsilat alır, sonra check-out ile ziyareti kapatır. Modül kendi numaratörüyle evrak da yaratır ama bunu mevcut fatura(301), irsaliye(402), sipariş(904) ve kasa(201) altyapısını kullanarak yapar ve her evrağı ziyarete bağlar (ZIYARET_ID); stok/cari/kasa modüllerine gerçek hareket yazar. Yönetici saha takip ve hedef-performans ekranlarıyla ekibi izler.",
      "ozet_dogrulama": "KOD İLE DOĞRULANDI: index.php menu LISTE 7 backoffice sayfası (rota, aracyukle, sahatakip, performans, plasiyer + PAGE rotadetay/ziyaretdetay) + /saha PWA. event.php 23 case; hepsi envanterle birebir eşleşti. Buton etiketleri sayfa HTML'iyle doğrulandı.",
      "modul_iliskiler": [
        "cari",
        "stok",
        "depo",
        "fatura",
        "irsaliye",
        "siparis",
        "kasa",
        "personel",
        "e-belge (edonusum/eirsaliye)",
        "otomasyon",
        "ayar"
      ],
      "ekranlar": [
        {
          "id": "plasiyer",
          "baslik": "Plasiyerler",
          "yol": "/ekran/sahasatis/tanim/plasiyer",
          "sub": "tanim",
          "amac": "Sahada satış yapacak plasiyerleri tanımladığınız ekran. Her plasiyer bir personel kaydına bağlanır; ayrıca aracının (satış deposu) ve e-irsaliye için plakasının atandığı yerdir.",
          "neden": "Rota, araç yükleme, saha uygulaması ve tüm saha evrakları plasiyer kaydına dayanır. Plasiyer tanımlanmadan modülün hiçbir işlevi çalışmaz. Plasiyerin saha uygulamasına girebilmesi için bağlı personelin bir kullanıcı hesabı olması şarttır (kod bağlı KULLANICI_ID yoksa kaydı reddeder).",
          "nasil": [
            "Personel açılır listesinden plasiyer olacak kişiyi seçin (kullanıcı hesabı olmayan personelde 'kullanıcı hesabı yok' uyarısı görünür).",
            "Satış Deposu alanından plasiyerin aracına karşılık gelen depoyu seçin (araç yükleme ve van-satış bu depodan işler).",
            "Araç Plakası alanına e-irsaliye için plakayı arayıp seçin; listede yoksa 'Hızlı Ekle' ile yeni plaka tanımlayın.",
            "Nakit Kasası alanından plasiyerin sahadaki nakit tahsilat ve masraflarının işleneceği kasayı seçin (gün sonu teslim edilecek nakdin kaynağı budur).",
            "POS Cihazı alanından kartlı tahsilatların işleneceği POS'a bağlı hesabı seçin.",
            "Masraf yetkisi vermek isterseniz 'Masraf Girebilir' seçeneğini açın; varsayılan kapalıdır ve yalnız açık plasiyerler sahadan masraf girebilir.",
            "İsterseniz Bölge bilgisini girin ve Durum'u Aktif bırakın.",
            "KAYDET'e basın; kayıt alttaki listeye düşer.",
            "Listeden İŞLEMLER menüsüyle plasiyeri düzenleyebilir veya silebilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Formdaki plasiyer bilgilerini kaydeder/günceller",
              "sonuc": "Plasiyer eklenir veya güncellenir, liste tazelenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu temizler / düzenlemeyi iptal eder",
              "sonuc": "Değişiklik kaydedilmez",
              "renk": "ghost"
            },
            {
              "ad": "Hızlı Ekle (plaka)",
              "islev": "Yazılan yeni plakayı plaka tanımlarına ekler",
              "sonuc": "Yeni plaka kaydedilir ve forma otomatik seçilir",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili plasiyeri düzenleme moduyla açar",
              "sonuc": "Form mevcut bilgilerle dolar",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Plasiyeri pasifleştirir (soft-delete)",
              "sonuc": "Plasiyer listeden kalkar (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "plasiyerekle",
              "tetik": "KAYDET butonu",
              "etki": "sahasatis_plasiyer tablosuna insert/update (personel, depo, plaka, bölge, durum)",
              "neden_sonuc": "Plasiyeri sisteme tanıtır; bağlı kullanıcı hesabı yoksa veya aynı kullanıcı zaten plasiyerse engellenir. Doğru tanımlanmazsa plasiyer sahaya giriş yapamaz."
            },
            {
              "ad": "plasiyersil",
              "tetik": "Sil butonu",
              "etki": "sahasatis_plasiyer DURUM=-1 (soft-delete)",
              "neden_sonuc": "Ayrılan/pasif plasiyeri listeden çıkarır; geçmiş ziyaret ve evrak kayıtları korunur."
            },
            {
              "ad": "sahaplakaekle",
              "tetik": "Hızlı Ekle butonu",
              "etki": "irsaliye_plaka tablosuna yeni plaka insert (aynı plaka varsa mevcut ID döner)",
              "neden_sonuc": "E-irsaliye için gerekli plakayı ayrı ekrana gitmeden tanımlar; plaka olmadan e-irsaliye eksik kesilir."
            }
          ],
          "iliskiler": [
            "personel",
            "depo",
            "irsaliye (plaka)",
            "kullanıcı/oturum"
          ],
          "ipuclari": [
            "Plasiyerin saha uygulamasına girebilmesi için personelin bağlı kullanıcı hesabı olmalı.",
            "Satış deposu atanmamış plasiyer araç yükleyemez ve depo takibi açıkken fatura/irsaliye kesemez.",
            "Plaka boş bırakılırsa İrsaliye ayarındaki Varsayılan Plaka kullanılır.",
            "Nakit kasası, POS cihazı ve masraf yetkisi buradan atanır; sahadaki nakit/POS tahsilatı, masraf girişi ve gün sonu nakit teslimi bu atamalara dayanır.",
            "Masraf yetkisi varsayılan kapalıdır; nakit kasası seçilmeyen plasiyer gün sonu nakit teslim akışını kullanamaz."
          ]
        },
        {
          "id": "rota",
          "baslik": "Rota Planlama",
          "yol": "/ekran/sahasatis/islem/rota",
          "sub": "islem",
          "amac": "Yöneticinin bir plasiyer için belirli bir güne ait ziyaret rotası oluşturduğu ve mevcut rotaları listelediği ekran.",
          "neden": "Plasiyerin sahada göreceği 'Bugünün Rotası' bu ekranda oluşturulan rotalardan gelir. Rota olmadan plasiyerin ziyaret listesi boş kalır.",
          "nasil": [
            "Soldaki Yeni Rota kartında plasiyeri seçin.",
            "Tarih girin (varsayılan bugün) ve isterseniz rota adı/açıklama yazın (ad boşsa tarihten üretilir).",
            "OLUŞTUR'a basın; rota detay ekranına yönlendirilirsiniz.",
            "Sağdaki listede plasiyer/tarih filtresiyle mevcut rotaları görebilir, harita ikonuyla ziyaretleri düzenleyebilirsiniz.",
            "Gereksiz rotayı çöp ikonuyla silebilirsiniz (yalnız başlanmamış ziyaretler silinir)."
          ],
          "butonlar": [
            {
              "ad": "OLUŞTUR",
              "islev": "Yeni rota kaydeder",
              "sonuc": "Rota oluşur, rota detay ekranı açılır",
              "renk": "primary"
            },
            {
              "ad": "Filtrele",
              "islev": "Listeyi plasiyer ve tarihe göre süzer",
              "sonuc": "Seçime uyan rotalar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Filtreleri sıfırlar",
              "sonuc": "Tüm rotalar listelenir",
              "renk": "ghost"
            },
            {
              "ad": "Ziyaretler (harita ikonu)",
              "islev": "Rota detayını açar",
              "sonuc": "Ziyaret ekleme/düzenleme ekranına gider",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Rotayı pasifleştirir",
              "sonuc": "Rota ve başlanmamış ziyaretleri silinir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "rotakaydet",
              "tetik": "OLUŞTUR butonu",
              "etki": "sahasatis_rota insert/update; düzenlemede bağlı PLANLI (DURUM_POZ=1) ziyaretlerin plasiyer/PLAN_TARIH'i senkronlanır",
              "neden_sonuc": "Plasiyere günlük ziyaret programı tanımlar; plasiyer/tarih değişince henüz check-in yapılmamış ziyaretler de güncellenir."
            },
            {
              "ad": "rotasil",
              "tetik": "Sil butonu",
              "etki": "sahasatis_rota DURUM=-1 + yalnız DURUM_POZ=1 (planlı) ziyaretler DURUM=-1",
              "neden_sonuc": "Yanlış/iptal rotayı kaldırır; check-in yapılmış veya evrak bağlı ziyaretlere dokunmaz, geçmiş bozulmaz."
            }
          ],
          "iliskiler": [
            "plasiyer",
            "cari",
            "sahasatis_ziyaret"
          ],
          "ipuclari": [
            "Plasiyer yoksa önce Plasiyerler ekranından tanımlamanız gerekir (ekran uyarı verir).",
            "Rota adı boş bırakılırsa 'Rota gg.aa.yyyy' biçiminde otomatik üretilir."
          ]
        },
        {
          "id": "rotadetay",
          "baslik": "Rota Detay (Ziyaretler)",
          "yol": "/ekran/sahasatis/islem/rotadetay",
          "sub": "islem",
          "amac": "Bir rotaya hangi carilerin (müşterilerin) ziyaret edileceğini eklediğiniz, ziyaret sırasını düzenlediğiniz ekran.",
          "neden": "Plasiyerin sahada sırayla gideceği müşteri listesi burada oluşur. Ziyaret sırası (SIRA), sahada plasiyerin göreceği sırayı belirler.",
          "nasil": [
            "Üstte rotanın plasiyer, tarih ve durum bilgisini görürsünüz.",
            "Sol karttaki arama kutusundan cari (müşteri) arayıp seçin.",
            "Rotaya Ekle'ye basarak cariyi ziyaret listesine ekleyin.",
            "Sağdaki listede yukarı/aşağı oklarla ziyaret sırasını değiştirin.",
            "Yanlış eklenen cariyi çarpı ikonuyla çıkarın (yalnız başlanmamış ziyaret çıkarılabilir)."
          ],
          "butonlar": [
            {
              "ad": "Rotaya Ekle",
              "islev": "Seçili cariyi rotaya ziyaret olarak ekler",
              "sonuc": "Yeni ziyaret oluşur, sıra sonuna eklenir",
              "renk": "accent"
            },
            {
              "ad": "Yukarı / Aşağı",
              "islev": "Ziyaretin sırasını komşusuyla takas eder",
              "sonuc": "Ziyaret sırası değişir",
              "renk": "ghost"
            },
            {
              "ad": "Çıkar",
              "islev": "Ziyareti rotadan kaldırır",
              "sonuc": "Planlı ziyaret silinir (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "ziyaretekle",
              "tetik": "Rotaya Ekle butonu",
              "etki": "sahasatis_ziyaret insert (rota, cari, plasiyer, SIRA=son+1, PLAN_TARIH, DURUM_POZ=1)",
              "neden_sonuc": "Cariyi plasiyerin günlük programına ekler; aynı cari aynı rotada iki kez eklenemez."
            },
            {
              "ad": "ziyaretsil",
              "tetik": "Çıkar butonu",
              "etki": "sahasatis_ziyaret DURUM=-1 (yalnız DURUM_POZ=1 planlı ziyaret)",
              "neden_sonuc": "Yanlış cariyi rotadan çıkarır; check-in yapılmış (planlı olmayan) ziyaret silinemez, sistem engeller."
            },
            {
              "ad": "ziyaretsirala",
              "tetik": "Yukarı/Aşağı okları",
              "etki": "sahasatis_ziyaret SIRA alanı komşu kayıtla takas",
              "neden_sonuc": "Plasiyerin ziyaret güzergâhını optimize eder; sahadaki liste sırası buna göre görünür."
            }
          ],
          "iliskiler": [
            "cari",
            "plasiyer",
            "rota"
          ],
          "ipuclari": [
            "Sadece 'Planlı' durumdaki ziyaretler sıralanabilir veya çıkarılabilir; sahada başlanan ziyaretler kilitlenir.",
            "Aynı cari bir rotaya yalnızca bir kez eklenebilir."
          ]
        },
        {
          "id": "aracyukle",
          "baslik": "Araç Yükleme",
          "yol": "/ekran/sahasatis/islem/aracyukle",
          "sub": "islem",
          "amac": "Yöneticinin ana depodan plasiyerin aracına (satış deposu) ürün transfer ettiği ekran. Plasiyer sahada bu depodan satış yapar.",
          "neden": "Van-satışta plasiyer, aracındaki stoktan fatura/irsaliye keser. Araç yüklenmezse araç deposu boş kalır ve saha satışta stok tutarsızlığı (hayalet stok) oluşur.",
          "nasil": [
            "Plasiyer/Araç seçin (depo atanmamış plasiyerde uyarı görünür).",
            "Kaynak Depo (malın çıkacağı ana depo) seçin.",
            "Ürün Ekle kutusundan ürün arayıp listeye ekleyin, her satırda miktarı girin.",
            "İsterseniz açıklama yazın.",
            "ARACI YÜKLE'ye basın; kaynak depodan çıkış, araç deposuna giriş oluşur."
          ],
          "butonlar": [
            {
              "ad": "ARACI YÜKLE",
              "islev": "Seçili ürünleri kaynak depodan araç deposuna transfer eder",
              "sonuc": "Stok transfer fişi (500) + her ürün için çıkış/giriş hareketi oluşur",
              "renk": "primary"
            },
            {
              "ad": "Ürün Sil (satır çarpı)",
              "islev": "Sepetten ürün satırını çıkarır",
              "sonuc": "Ürün yükleme listesinden kalkar",
              "renk": "danger"
            },
            {
              "ad": "Siparişten Doldur",
              "islev": "Seçili plasiyerin bekleyen (kalanı olan) açık siparişlerini listeler; işaretlenenlerin ürünlerini toplayıp araç yükleme tablosuna ekler.",
              "sonuc": "Sipariş kalemleri yükleme satırlarına otomatik dolar (serili üründe seri ayrıca seçilir).",
              "renk": "mavi (outline)"
            }
          ],
          "eventler": [
            {
              "ad": "aracyukle",
              "tetik": "ARACI YÜKLE butonu",
              "etki": "stok_fis (EVRAK_TIP=500) + her satır için 2 stok_hareket (kaynak ISLEM_TIP=0 çıkış / araç ISLEM_TIP=1 giriş); kaynak deposu birim maliyeti (AVG, yoksa ALIS_FIYAT) araç girişine damgalanır ve maliyet motoruna işlenir",
              "neden_sonuc": "Araç deposuna stok yükler; iç transfer olduğu için cari/finansal hareket oluşmaz. Kaynak birim maliyeti araca miras kalır, böylece van-satış kârı (COGS) doğru hesaplanır. Aynı yükleme çift gönderilse bile (clientUuid) tekrar işlenmez."
            }
          ],
          "iliskiler": [
            "stok",
            "depo",
            "plasiyer",
            "maliyet motoru"
          ],
          "ipuclari": [
            "Kaynak depo ile araç deposu aynı olamaz.",
            "Plasiyere satış deposu atanmadan araç yüklenemez.",
            "Transfer finansal değildir; müşteri carisine hiçbir borç/alacak yazmaz.",
            "‘Siparişten Doldur’ ile araca ne yükleneceği açık siparişlerden tek tıkla hesaplanır; serili ürünlerde seriyi ayrıca seçin."
          ]
        },
        {
          "id": "sahatakip",
          "baslik": "Saha Takip",
          "yol": "/ekran/sahasatis/rapor/sahatakip",
          "sub": "rapor",
          "amac": "Yöneticinin seçtiği tarih aralığı ve plasiyer için saha performansını izlediği salt-okunur dashboard: ziyaret sayısı, satış, tahsilat, başarı oranı ve ziyaret listesi.",
          "neden": "Ekibin sahada ne yaptığını görmek, check-in/konum şüphesini denetlemek ve satış/tahsilat sonuçlarını takip etmek için kullanılır.",
          "nasil": [
            "Üstteki 4 KPI kartından günün özetini görün (ziyaret, satış, tahsilat, başarı %).",
            "Tarih aralığı ve plasiyer filtresini ayarlayıp Filtrele'ye basın (veya Bugün ile sıfırlayın).",
            "Plasiyer Özeti tablosunda kişi bazlı ziyaret/satış/tahsilat karşılaştırın.",
            "Ziyaretler tablosunda tek tek ziyaretlerin durum, sonuç, giriş/çıkış saati ve tutarını inceleyin.",
            "Konum şüpheli uyarısı olan ziyaretleri kontrol edin; büyüteç ile ziyaret detayına gidin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Tarih aralığı ve plasiyere göre raporu yeniler",
              "sonuc": "Seçime uyan veriler gösterilir",
              "renk": "primary"
            },
            {
              "ad": "Bugün",
              "islev": "Filtreyi bugüne sıfırlar",
              "sonuc": "Bugünün verileri listelenir",
              "renk": "ghost"
            },
            {
              "ad": "İncele (büyüteç)",
              "islev": "Seçili ziyaretin detayını açar",
              "sonuc": "Ziyaret Detay ekranına gider",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "sahasatis_ziyaret",
            "plasiyer",
            "cari"
          ],
          "ipuclari": [
            "Bu ekran salt-okunurdur; veri değiştirmez, yalnız raporlar (event tanımlı değil).",
            "Konum şüpheli işareti (müşteri konumuna 300 m'den uzak check-in) suistimali yakalamaya yardımcı olur.",
            "Kısıtlı yetkili plasiyer bu ekranda yalnız kendi ziyaretlerini görür."
          ]
        },
        {
          "id": "performans",
          "baslik": "Hedef & Performans",
          "yol": "/ekran/sahasatis/islem/performans",
          "sub": "islem",
          "amac": "Plasiyerlere aylık satış, tahsilat ve ziyaret hedefi girdiğiniz ve gerçekleşen değerlere göre yüzde ilerlemeyi gördüğünüz ekran.",
          "neden": "Ekibin hedeflerini belirleyip performansını dönemsel ölçmek, prim/motivasyon ve satış yönetimi için kullanılır. Gerçekleşenler ziyaret kayıtlarından otomatik hesaplanır.",
          "nasil": [
            "Üstten dönemi (ay) seçip Göster'e basın.",
            "Her plasiyer satırında Satış/Tahsilat/Ziyaret hedeflerini girin.",
            "Satır sonundaki Kaydet (disket) ile o plasiyerin hedefini kaydedin.",
            "Gerçekleşen sütunlarındaki ilerleme çubuklarından yüzde başarıyı takip edin."
          ],
          "butonlar": [
            {
              "ad": "Göster",
              "islev": "Seçili dönemin hedef/gerçekleşme tablosunu getirir",
              "sonuc": "O aya ait veriler listelenir",
              "renk": "primary"
            },
            {
              "ad": "Kaydet (disket)",
              "islev": "İlgili plasiyerin dönem hedefini kaydeder",
              "sonuc": "Hedef kaydedilir/güncellenir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "hedefkaydet",
              "tetik": "Satır Kaydet butonu",
              "etki": "sahasatis_hedef check-first upsert (FID+PLASIYER_ID+DONEM: satış/tahsilat/ziyaret hedefleri)",
              "neden_sonuc": "Plasiyerin aylık hedefini belirler; gerçekleşenle kıyas için temel oluşur. Kısıtlı yetkili plasiyer sunucu tarafında yalnız kendi hedefini yazabilir."
            }
          ],
          "iliskiler": [
            "plasiyer",
            "sahasatis_ziyaret (gerçekleşen)"
          ],
          "ipuclari": [
            "Gerçekleşen değerler ziyaretlerin planlanan ayına (PLAN_TARIH) göre toplanır.",
            "Hedef 0 girilirse o kalem için yüzde hesaplanmaz.",
            "Dönem YYYY-AA biçiminde olmalıdır."
          ]
        },
        {
          "id": "ziyaretdetay",
          "baslik": "Ziyaret Detayı",
          "yol": "/ekran/sahasatis/islem/ziyaretdetay",
          "sub": "islem",
          "amac": "Tek bir ziyaretin tam kaydını gösteren salt-okunur ekran: müşteri bilgisi, check-in/out saat ve konumu, satış/tahsilat tutarları, o ziyarette kesilen evraklar ve carinin finansal/risk durumu.",
          "neden": "Bir ziyareti derinlemesine denetlemek, sahada kesilen fatura/irsaliye/tahsilatı ve müşterinin risk profilini tek ekranda görmek için kullanılır (Saha Takip'ten büyüteçle açılır).",
          "nasil": [
            "Saha Takip listesinden bir ziyaretin İncele ikonuna basarak açın.",
            "Sol kartta müşteri, plasiyer, check-in/out saatleri ve sonucu inceleyin (konum şüpheli uyarısı ve harita bağlantısı burada).",
            "Sağ üstte Satış ve Tahsilat özet kutularını görün.",
            "Ziyaret Evrakları bölümünde o ziyarette oluşan sipariş/fatura/irsaliye/tahsilatı görün.",
            "Alt bölümde carinin güncel bakiyesi, risk limiti, risk/disiplin/sadakat skorları ve son hareket ekstresini inceleyin."
          ],
          "butonlar": [
            {
              "ad": "Harita",
              "islev": "Check-in konumunu haritada açar",
              "sonuc": "Harita yeni sekmede açılır",
              "renk": "ghost"
            },
            {
              "ad": "Telefon (ara)",
              "islev": "Müşteri telefonunu tel: bağlantısıyla açar",
              "sonuc": "Cihaz arama ekranı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "sahasatis_ziyaret",
            "cari",
            "fatura",
            "irsaliye",
            "siparis",
            "kasa",
            "CariKararMotor (risk skoru)"
          ],
          "ipuclari": [
            "Bu ekran salt-okunurdur; veri girişi yapılmaz (event tanımlı değil).",
            "Geçmiş hareketi olmayan carilerde risk skoru yerine 'YENİ' etiketi gösterilir (yanıltıcı STOP önlenir).",
            "Kısıtlı yetkili plasiyer yalnız kendi ziyaretinin detayını açabilir."
          ]
        },
        {
          "id": "saha",
          "baslik": "Plasiyer Saha Uygulaması (Mobil PWA)",
          "yol": "/saha",
          "sub": "saha",
          "amac": "Plasiyerin sahada telefondan kullandığı mobil uygulama (/saha rotası — sahasatis menüsünde değil, plasiyere özel PWA): bugünün rotası, müşteriye check-in, bakiye/ekstre ve tavsiye ürün görüntüleme, sahada fatura/irsaliye/sipariş kesme, tahsilat alma, evrak PDF paylaşımı, araç stoğu ve check-out ile ziyaret kapatma. Çevrimdışı çalışabilir (offline kuyruk). İşlem event'leri sahasatis modülünde tanımlıdır (sahabugun, sahacheckin, sahafatura...).",
          "neden": "Van-satış operasyonunun kalbi; plasiyer tüm saha işini bu ekrandan yapar. Check-in yapılmadan bakiye/tavsiye/satış/tahsilat ekranları açılmaz (konum ve ziyaret kanıtı zorunludur). Çevrimdışı destek sayesinde zayıf sahada bile işlem kaybolmaz.",
          "nasil": [
            "Uygulama açılır ve 'Bugünün Rotası' otomatik yüklenir; ziyaret kartına dokunun. Her müşteri kartında o müşterinin bekleyen açık sipariş sayısı rozet olarak görünür.",
            "Müşteriye ulaşınca 'Geldim (Check-in)' ile konumlu giriş yapın.",
            "Check-in sonrası açılan Bakiye ve Tavsiye ekranlarıyla müşteriyi tanıyın.",
            "Gerekirse Fatura/İrsaliye/Sipariş sepetine ürün ekleyip evrağı kesin, veya Tahsilat alın.",
            "Tahsilatta tipi seçin: Nakit ve POS plasiyerin kendi kasa/cihazına işlenir; Banka seçilince firma banka hesapları listelenir, seçilen hesabın adı ve IBAN'ı ekranda görünür ve 'IBAN Kopyala' ile tek dokunuşla kopyalanıp müşteriye WhatsApp/SMS ile gönderilir.",
            "Yetkiniz varsa İşlemler menüsünden Masraf girin (tür + tutar + açıklama); masraf nakit kasadan düşer ve gün sonu net nakde yansır.",
            "Kesilen Evraklar bölümünden PDF'i paylaşın/yazdırın.",
            "İşi bitirince sonucu seçip (satış yoksa sebep) 'İşi Bitir (Check-out)' ile ziyareti kapatın.",
            "Alt menüden 'Araç Stoğum' ile aracınızdaki güncel stoğu ve gün mutabakatını görün."
          ],
          "butonlar": [
            {
              "ad": "Geldim (Check-in)",
              "islev": "Konum alıp ziyareti başlatır",
              "sonuc": "Ziyaret 'Sahada' olur (DURUM_POZ=3), iç ekranlar açılır",
              "renk": "accent"
            },
            {
              "ad": "Bakiye",
              "islev": "Cari bakiye, ekstre ve risk skorunu gösterir",
              "sonuc": "Müşteri finansal durumu görüntülenir",
              "renk": "ghost"
            },
            {
              "ad": "Tavsiye",
              "islev": "Müşterinin geçmişte aldığı ürünleri listeler",
              "sonuc": "Sipariş önerileri gösterilir",
              "renk": "ghost"
            },
            {
              "ad": "Fatura",
              "islev": "Sepetten satış faturası (301) keser",
              "sonuc": "Taslak fatura oluşur, stok düşer, cari borçlanır",
              "renk": "primary"
            },
            {
              "ad": "İrsaliye",
              "islev": "Sepetten giden irsaliye (402) keser",
              "sonuc": "Taslak irsaliye oluşur, stok düşer (cari borç yok)",
              "renk": "primary"
            },
            {
              "ad": "Sipariş",
              "islev": "Sepetten alınan sipariş (904) oluşturur",
              "sonuc": "Sipariş oluşur, stok rezerve edilir",
              "renk": "ghost"
            },
            {
              "ad": "Tahsilat",
              "islev": "Tahsilat tipini (Nakit / POS / Banka) seçip tahsilat (201) alır",
              "sonuc": "Tahsilat kaydolur, müşteri borcu azalır; Nakit/POS plasiyer kasa/cihazına, Banka seçilen firma hesabına işlenir",
              "renk": "primary"
            },
            {
              "ad": "IBAN Kopyala",
              "islev": "Banka tahsilatında seçili firma hesabının IBAN'ını panoya kopyalar",
              "sonuc": "IBAN kopyalanır; müşteriye WhatsApp/SMS ile havale bilgisi gönderilir",
              "renk": "ghost"
            },
            {
              "ad": "Masraf Gir",
              "islev": "Yetkili plasiyerin İşlemler menüsünden masraf (tür + tutar + açıklama) girmesini sağlar",
              "sonuc": "Masraf nakit kasadan düşer, gün sonu net nakde yansır (yetki yoksa görünmez)",
              "renk": "primary"
            },
            {
              "ad": "PDF",
              "islev": "Kesilen evrağın çıktısını hazırlar/paylaşır",
              "sonuc": "E-belge veya tasarım PDF açılır/paylaşılır",
              "renk": "ghost"
            },
            {
              "ad": "Araç Stoğum",
              "islev": "Araç deposundaki güncel stoğu gösterir",
              "sonuc": "Kalan stok ve gün mutabakatı listelenir",
              "renk": "ghost"
            },
            {
              "ad": "İşi Bitir (Check-out)",
              "islev": "Sonuç seçip ziyareti tamamlar",
              "sonuc": "Ziyaret 'Tamamlandı' olur (DURUM_POZ=4), süre hesaplanır",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "sahabugun",
              "tetik": "Uygulama açılışı / liste yenileme",
              "etki": "Plasiyerin bugünkü ziyaretlerini (sahasatis_ziyaret, DATE(PLAN_TARIH)=bugün) okur",
              "neden_sonuc": "Plasiyere günün programını gösterir; plasiyer kaydı yoksa liste açılmaz. Ayrıca sonuç/no-sale listelerini ve PWA görünürlük ayarını (ciktiEvrak) döner."
            },
            {
              "ad": "sahacheckin",
              "tetik": "Geldim butonu",
              "etki": "sahasatis_ziyaret DURUM_POZ=3, CHECKIN_TIME/konum yazılır; ilk kez ise cari koordinatı doldurulur, cari-konum mesafesi >300m ise KONUM_SUPHELI=1",
              "neden_sonuc": "Ziyaretin fiilen yapıldığını kanıtlar ve satış/tahsilat ekranlarının kilidini açar. GPS zorunlu ayarı açıksa konumsuz check-in reddedilir. FOR UPDATE kilidi ile çift check-in önlenir."
            },
            {
              "ad": "sahacheckout",
              "tetik": "İşi Bitir butonu",
              "etki": "sahasatis_ziyaret DURUM_POZ=4, SONUC_POZ, SURE_DK, CHECKOUT bilgileri yazılır",
              "neden_sonuc": "Ziyareti kapatır ve süresini hesaplar; satış yoksa (sonuç 5/6) sebep zorunludur. Kapanınca (CHECKOUT_TIME dolunca) o ziyarete artık fatura/irsaliye/sipariş/tahsilat eklenemez."
            },
            {
              "ad": "sahacariekstre",
              "tetik": "Bakiye butonu",
              "etki": "cari_hareket'ten bakiye/ekstre (son 20 hareket) + CariKararMotor risk skoru okur (salt-okuma)",
              "neden_sonuc": "Plasiyerin müşteriyi tanıması ve riskli müşteride temkinli satış yapması için karar desteği verir. Check-in yapılmadan açılmaz. Geçmiş hareket yoksa skor 'YENİ' olarak gösterilir."
            },
            {
              "ad": "sahasiparistavsiye",
              "tetik": "Tavsiye butonu",
              "etki": "Carinin geçmiş satış faturası (301) kalemlerinden en sık/en son alınan ürünleri okur",
              "neden_sonuc": "Plasiyere hangi ürünleri önereceğini gösterir, satışı artırır. Check-in gerektirir."
            },
            {
              "ad": "sahasiparis",
              "tetik": "Siparişi Oluştur butonu",
              "etki": "siparis (904) + siparis_detay + stok rezerve hareketi (ISLEM_TIP=2) + stok_fis; ziyaret SATIS_TUTAR günceller, sonuç boşsa SONUC_POZ=2",
              "neden_sonuc": "Sonradan teslim edilecek malı sipariş olarak alır; stok rezerve edilir ama finansal borç oluşmaz (cari_hareket yok). Fiyat sunucuda hesaplanır (sahadan fiyat değiştirilemez). clientUuid ile çift sipariş önlenir."
            },
            {
              "ad": "sahafatura",
              "tetik": "Faturayı Kes butonu",
              "etki": "fatura (301) + fatura_detay + gerçek stok çıkışı (StokHareket ISLEM_TIP=0) + stok_fis + cari_hareket (ISLEM_TIP=1 müşteri borçlanır); ziyaret SATIS_TUTAR güncellenir (sonuç boşsa SONUC_POZ=1); SATIS_FATURA_KESILDI otomasyonu tetiklenir",
              "neden_sonuc": "Sahada gerçek satış faturası keser; araç deposundan stok düşer, müşteri borçlanır. E-belge bayrağı ayara (ebelge_mod) + cari mükellefiyetine (EFATURA_DURUM) göre yazılır, gönderim burada tetiklenmez. Depo takibi açıkken satış deposu yoksa engellenir (hayalet stok önlemi). Borç limiti ayarına göre uyarı/onay/blok uygulanır. clientUuid ile çift fatura önlenir."
            },
            {
              "ad": "sahairsaliye",
              "tetik": "İrsaliyeyi Kes butonu",
              "etki": "irsaliye_fis (402) + detay + gerçek stok çıkışı (ISLEM_TIP=0) + stok_fis; plaka/şoför (SOFOR_TC/SOFOR_ADSOYAD) damgalanır; ziyaret SATIS_TUTAR güncellenir",
              "neden_sonuc": "Teslim edilen malın sevk irsaliyesini keser; stok düşer ama cari borç oluşmaz (fatura kesilince oluşur, çift borç önlenir). E-irsaliye bayrağı ayara bağlı taslak/gönderim; plaka gerekir. Depo takibi açıkken satış deposu yoksa engellenir. clientUuid ile çift irsaliye önlenir."
            },
            {
              "ad": "sahatahsilat",
              "tetik": "Tahsilatı Al butonu",
              "etki": "kasa_fis (201) + kasa_hareket + cari_hareket (ISLEM_TIP=0 ALACAK → müşteri borcu düşer); ziyaret TAHSILAT_TUTAR günceller (sonuç boşsa SONUC_POZ=3)",
              "neden_sonuc": "Sahada nakit/banka tahsilatı alır ve müşteri borcunu azaltır; yalnız Kasa(1)/Banka(2) tipi hesaplar kullanılır. Aynı tahsilat çift gönderilse bile (clientUuid) tekrarlanmaz."
            },
            {
              "ad": "sahakasalar",
              "tetik": "Tahsilat ekranı açılışı",
              "etki": "Kullanılabilir Kasa/Banka (TIP IN 1,2) listesini okur",
              "neden_sonuc": "Plasiyerin tahsilatı hangi hesaba yazacağını seçmesini sağlar; POS/kredi kartı/aracı hesaplar saha kapsamı dışıdır."
            },
            {
              "ad": "sahaziyaretevraklar",
              "tetik": "Ziyaret detayı / Kesilen Evraklar açılışı",
              "etki": "Ziyarette kesilen fatura(301)+irsaliye(402) listesini ZIYARET_ID'ye göre okur",
              "neden_sonuc": "Plasiyerin o ziyarette kestiği evrakları görüp PDF'ine erişmesini sağlar."
            },
            {
              "ad": "sahaevrakpdf",
              "tetik": "PDF butonu",
              "etki": "Evrağın çıktı URL'ini karar matrisiyle üretir; e-belge açık+fatura+'hemen' modda entegratöre \\Servis\\EFaturaGonder ile gönderilebilir",
              "neden_sonuc": "Müşteriye belge sunar; e-belge gönderilmişse resmi /ebelge PDF, açık ama gönderilmemişse 'bekliyor', kapalıysa tasarım (A4/A5/termal) çıktısı döner. E-arşiv/e-fatura tipini EFATURA_DURUM'dan türeten emniyet kontrolleri vardır."
            },
            {
              "ad": "sahavanstok",
              "tetik": "Araç Stoğum butonu",
              "etki": "Araç deposu stok_hareket'lerinden kalan miktar (giriş−çıkış) + bugün yüklenen/satılan hesaplar (salt-okuma)",
              "neden_sonuc": "Plasiyerin aracında ne kaldığını ve gün içi mutabakatını görmesini sağlar; stok bitmeden sipariş/satış planlamaya yardımcı olur."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "depo",
            "fatura",
            "irsaliye",
            "siparis",
            "kasa",
            "e-belge",
            "otomasyon",
            "CariKararMotor"
          ],
          "ipuclari": [
            "Bakiye, Tavsiye, Fatura, İrsaliye, Sipariş ve Tahsilat ekranları yalnız check-in sonrası açılır.",
            "Fiyatlar her zaman sunucuda hesaplanır; plasiyer sahadan fiyat değiştiremez.",
            "Çevrimdışı yapılan işlemler kuyruğa alınır ve bağlantı gelince otomatik gönderilir; aynı işlem iki kez yazılmaz (clientUuid idempotency).",
            "Ziyaret check-out ile kapandıktan sonra o ziyarete yeni evrak eklenemez.",
            "Depo takibi açıkken satış deposu atanmamış plasiyer fatura/irsaliye kesemez.",
            "Sahada siparişten fatura/irsaliye keserken (Ayarlar → Kaynaktan Belge açıksa) satır ‘sip. kalanı’nı aşamaz; ‘Miktar + İade’ modunda satış+iade tek belgede girilir.",
            "Tahsilat tipi Nakit/POS plasiyerin kendi kasa/cihazına, Banka ise seçilen firma hesabına yazılır; nakit kasası veya POS tanımlı değilse ilgili tip seçilemez.",
            "Banka tahsilatında IBAN ekranda görünür ve 'IBAN Kopyala' ile tek dokunuşla kopyalanır; müşteriye anında havale talimatı verilir.",
            "Masraf girişi yalnız masraf yetkisi açık plasiyerlerde görünür; nakit masraf, nakit kasadan düşer ve gün sonu net nakdi azaltır.",
            "Rota listesindeki her müşteri kartında o müşterinin bekleyen açık sipariş sayısı rozet olarak görünür."
          ]
        },
        {
          "id": "gunsonu",
          "baslik": "Gün Sonu İşlemi",
          "yol": "/ekran/sahasatis/islem/gunsonuteslim",
          "sub": "islem",
          "amac": "Bir plasiyerin belirli bir gününe ait satış/iade özetini, tahsilatlarını (nakit/banka/POS ayrı) ve masraflarını gösteren; teslim edilecek net nakdi hesaplayıp tek tıkla plasiyerin nakit kasasından seçilen merkez kasaya aktaran (virman) ve yazdırılabilir teslim fişi üreten ekran.",
          "neden": "Sahadan dönen plasiyerin kasasını doğru ve kayıt altında kapatmak için kullanılır. Sistem nakit tahsilattan nakit masrafı düşerek net nakdi kendisi hesaplar; para plasiyer kasasından merkeze düzgün virmanlanır ve imzalı teslim fişi kalır, böylece kasa açığı ve karışıklık önlenir.",
          "nasil": [
            "Plasiyeri ve günü seçin; ekran o güne ait özeti getirir.",
            "Satış/iade özetini ve tahsilatları (Nakit/Banka/POS ayrı) inceleyin.",
            "O gün girilen masrafları görün; sistem nakit tahsilattan nakit masrafı düşerek net nakdi hesaplar.",
            "Nakdin aktarılacağı merkez kasayı seçin.",
            "'Gün Sonu / Aktar' ile net nakdi plasiyer kasasından merkez kasaya aktarın.",
            "Oluşan teslim fişini 'Yazdır' ile alıp imzalatın/arşivleyin."
          ],
          "butonlar": [
            {
              "ad": "Gün Sonu / Aktar",
              "islev": "Hesaplanan net nakdi plasiyerin nakit kasasından seçili merkez kasaya aktarır (virman)",
              "sonuc": "Plasiyer kasasından çıkış, merkez kasaya giriş yazılır; gün kapanır, mükerrer aktarım yapılmaz",
              "renk": "primary"
            },
            {
              "ad": "Yazdır",
              "islev": "Gün sonu teslim fişini yazdırılabilir belge olarak hazırlar",
              "sonuc": "Teslim fişi çıktısı açılır; imzalatıp arşivlenir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa",
            "cari"
          ],
          "ipuclari": [
            "Banka ve POS tahsilatları ilgili hesaplara zaten işlendiği için gün sonunda yalnız nakit teslim edilir (net nakit = nakit tahsilat − nakit masraf).",
            "Plasiyere nakit kasası atanmamışsa gün sonu nakit teslimi yapılamaz.",
            "Aynı gün ikinci kez aktarılmak istense bile mükerrer virman engellenir.",
            "Nakit masraf, nakit tahsilattan fazlaysa net nakit sıfır/eksiye düşebilir; fark merkezle ayrıca kapatılır."
          ]
        },
        {
          "id": "aracmutabakat",
          "baslik": "Araç Stok Mutabakatı",
          "yol": "/ekran/sahasatis/islem/aracmutabakat",
          "sub": "islem",
          "amac": "Bir plasiyerin aracındaki fiili stok ile sistem kaydını karşılaştırdığınız; gün sonunda aracı boşaltmak için araçta kalan tüm ürünleri tek işlemle seçilen merkez depoya geri aldığınız ve mutabakatı yazdırdığınız ekran.",
          "neden": "Gün sonunda araç deposunu gerçeğe uygun kapatmak için kullanılır. Araç boşaltılmazsa ertesi gün araç stoğu şişik görünür ve sayım tutmaz. Bu ekran kalan malı tek işlemle merkeze döndürerek araç stoğunu sıfırlar ve fiili sayımla sistem kaydını karşılaştırarak eksik/fazlayı erken yakalatır.",
          "nasil": [
            "Plasiyeri seçin; aracın deposunda kalan ürünler miktarlarıyla listelenir.",
            "Fiili (araçta gerçekten kalan) miktarlarla sistem kaydını karşılaştırın; varsa fark dikkatinizi çeker.",
            "İadenin gireceği merkez depoyu seçin.",
            "'Merkeze İade Al' ile araçta kalan tüm ürünleri tek işlemle seçili merkez depoya geri alın.",
            "Oluşan mutabakatı 'Yazdır' ile belge olarak alın."
          ],
          "butonlar": [
            {
              "ad": "Merkeze İade Al",
              "islev": "Araçta kalan tüm ürünleri tek işlemle seçilen merkez depoya geri aktarır",
              "sonuc": "Araç deposundan çıkış, merkez depoya giriş yazılır; araç boşalır (iç transfer, finansal etki yok)",
              "renk": "primary"
            },
            {
              "ad": "Yazdır",
              "islev": "Araç stok mutabakatını yazdırılabilir belge olarak hazırlar",
              "sonuc": "Mutabakat çıktısı açılır; imzalatıp arşivlenir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "depo",
            "stok"
          ],
          "ipuclari": [
            "İade işlemi finansal değildir; yalnız araç deposundan merkez deposuna mal aktarımıdır, müşteri hesabına borç/alacak yazmaz.",
            "Araç gün sonu boşaltılmazsa ertesi gün araç stoğu fazla görünür ve sayım tutmaz.",
            "Fiili sayım ile sistem farkı ekranda görünür; kayıp/fazla erken fark edilir."
          ]
        }
      ]
    },
    {
      "slug": "hizli-satis",
      "title": "Hızlı Satış",
      "icon": "🛒",
      "modul": "pos",
      "ad": "Hızlı Satış (Kasa / Perakende)",
      "ozet": "Hızlı Satış modülü, dükkânın kasa terminalini bilgisayara/tablete taşıyan dokunmatik ve barkodlu bir perakende satış ekranıdır. Kasiyer ürünü okutur veya dokunmatik ızgaradan seçer, tek dokunuşla nakit/kart/veresiye/parçalı ödemeyi alır. Her satış tamamlandığı anda arka planda gerçek satış faturası, stok çıkışı ve kasa kaydı oluşur; gün sonu toplu aktarım yoktur, kasa ile muhasebe tek sistemdir. Vardiya açma/kapama, gün içi X ve gün sonu Z raporu, fişli/fişsiz iade, internet kesilse bile çevrimdışı çalışma, kasiyer PIN'i ile kimin ne sattığının ayrışması ve yöneticiye özel iskonto/iade denetimi içerir. Telefonda değil tablet/bilgisayarda çalışır.",
      "modul_iliskiler": [
        "stok",
        "depo",
        "kasa (nakit/banka)",
        "cari",
        "şube",
        "personel",
        "fatura"
      ],
      "ekranlar": [
        {
          "id": "terminal",
          "baslik": "Kasa Terminalleri",
          "yol": "/ekran/pos/tanim/terminal",
          "sub": "tanim",
          "amac": "Dükkândaki her kasa noktasını (terminali) beş sekmeli formla tanıttığınız ekran. Terminalin şubesi/deposu, perakende carisi, nakit kasası, kart tahsilat noktası, fiş numaralandırması, ekran görünümü, satış ve yazıcı ayarları burada belirlenir.",
          "neden": "Satış ekranı bir terminale bağlı çalışır; terminal tanımlanmadan kasa açılmaz. Terminal, satılan malın hangi depodan düşeceği, paranın hangi kasaya gireceği, kartlı tahsilatın hangi hesaba gideceği ve fişin nasıl numaralanacağının tek merkezidir. Çok kasalı dükkânda her kasa ayrı numaralanır ve raporlanır.",
          "nasil": [
            "Genel sekmesinde Kod ve Ad girin; şube modülü açıksa Şube'yi, depo kullanımı açıksa Depo'yu seçin; Cari (perakende carisi), Kasa (nakit) ve Kart Tahsilat (kart) hesaplarını seçin, isterseniz cihazla eşleştirin, Durum'u Aktif bırakın.",
            "Fiş No sekmesinde önek/sonek/uzunluk ve tip (sıralı ya da günlük sıfırlanan) girin; bu sayaç terminalin kendisine aittir, ERP numaratörüne bağlanmaz.",
            "Ekran sekmesinde varsayılan mod, tema, ürün görünümü ve fiş tasarımını (58/80mm) seçin.",
            "Satış sekmesinde fiyat değiştirme (varsayılan Hayır), iskonto modu/limitleri ve fatura talebini ayarlayın.",
            "Ödeme sekmesinde bu kasada kartlı tahsilatta kullanılacak tahsilat noktalarını/banka hesaplarını (çoklu) seçin.",
            "Yazıcı sekmesinde yazıcı, otomatik yazdır ve kopya sayısını belirleyin.",
            "KAYDET'e basın; terminal listeye eklenir. Sonradan Düzenle/Sil ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Beş sekmedeki terminal ayarlarını kaydeder/günceller",
              "sonuc": "Terminal eklenir/güncellenir ve satış ekranında kullanılabilir olur",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu temizler / düzenlemeyi iptal eder",
              "sonuc": "Değişiklik kaydedilmez",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili terminali düzenleme moduyla açar",
              "sonuc": "Form mevcut ayarlarla dolar",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Terminali pasifleştirir",
              "sonuc": "Terminal listeden kalkar; geçmiş satış ve fişleri korunur",
              "renk": "danger"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa (nakit/banka)",
            "depo",
            "cari",
            "şube",
            "cihaz eşleşmesi"
          ],
          "ipuclari": [
            "Kasa kendi kasa/banka/depo/cari tanımını üretmez; bunları mevcut tanımlardan seçersiniz.",
            "Fiş numarası terminalin kendi sayacıdır; ERP numaratörüne bağlanmaz, her kasa kendi serisini tutar.",
            "Fiş No tipi 'günlük sıfırlanan' seçilirse her gün 1'den başlar; 'sıralı' seçilirse kesintisiz devam eder.",
            "Depo kullanımı açıkken depo seçilmezse satış stoktan düşemez."
          ]
        },
        {
          "id": "ayar",
          "baslik": "Hızlı Satış Ayarları",
          "yol": "/ekran/pos/ayar",
          "sub": "tanim",
          "amac": "Tüm kasa terminalleri için geçerli işletme geneli davranış kurallarını belirlediğiniz ekran: varsayılan perakende cari, vardiya kuralları, zorla kapatma yetkisi, stok yetersizinde davranış, X raporunda ciro gösterimi, fişsiz iade tavanı ve ses.",
          "neden": "Her terminale tek tek ayar girmek yerine işletme politikanızı merkezî uygularsınız. 'Vardiya açmadan satış yok' ya da 'fişsiz iade en fazla 1.000' gibi kurallar tüm kasalarda aynı anda geçerli olur; kasa disiplinini ve güvenliği artırır.",
          "nasil": [
            "Varsayılan perakende cariyi seçin (isimsiz satışlar bu hesaba yazılır).",
            "Vardiya zorunlu mu, bekleyen fişle vardiya kapanır mı ve kim 'zorla kapat' yetkisine sahip belirleyin.",
            "Stok yetersizde davranışı seçin.",
            "X raporunda cironun görünüp görünmeyeceğini ayarlayın.",
            "Fişsiz iade tavanını girin (varsayılan 1.000; 0 = sınırsız).",
            "Sesli geri bildirimi açıp kaydedin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "İşletme geneli Hızlı Satış ayarlarını kaydeder",
              "sonuc": "Ayarlar tüm kasa terminallerinde geçerli olur",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "kasa (nakit/banka)",
            "personel"
          ],
          "ipuclari": [
            "Vardiya zorunlu yapılırsa kasiyer vardiya açmadan satış yapamaz.",
            "Fişsiz iade tavanı varsayılan 1.000'dir; 0 yazılırsa sınırsız olur.",
            "X raporunda ciro gizlenirse beklenen nakit yalnız yetkiliye görünür; kasiyer kasasını körlemesine sayar."
          ]
        },
        {
          "id": "barkodmaske",
          "baslik": "Terazi Barkod Maskeleri",
          "yol": "/ekran/pos/tanim/barkodmaske",
          "sub": "tanim",
          "amac": "Manav/kasap/market terazisinin bastığı gramajlı/tutarlı barkodları (28/29 prefix) kasaya tanıttığınız ekran. Barkodun yapısı (önek, uzunluk, ürün ve değer konumu, değer tipi, ondalık) tanımlanır.",
          "neden": "Maske tanımlanmazsa kasa terazi barkodunu sıradan barkod sanar ve ürünü bulamaz. Maske sayesinde terazi etiketi okutulunca doğru ürün ve doğru miktar/tutar sepete otomatik düşer; elle tartı girme derdi kalkar.",
          "nasil": [
            "Yeni maske ekleyip önekini (ör. 28/29) girin.",
            "Barkodun toplam uzunluğunu yazın.",
            "Ürün kodunun konumunu ve hane sayısını belirtin.",
            "Değerin konumunu ve hane sayısını girin.",
            "Değer tipini (ağırlık/tutar) ve ondalık basamağı seçin.",
            "KAYDET'e basın; kasa bu formattaki barkodları çözer."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Terazi barkod maskesini kaydeder/günceller",
              "sonuc": "Kasa bu formattaki barkodlarda ürün+miktar/tutarı otomatik ayırır",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili maskeyi düzenler",
              "sonuc": "Form mevcut maske bilgileriyle dolar",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Maskeyi kaldırır",
              "sonuc": "O formattaki barkodlar artık çözülmez",
              "renk": "danger"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok"
          ],
          "ipuclari": [
            "Değer tipi 'ağırlık' ise barkoddaki sayı miktara, 'tutar' ise doğrudan satır tutarına dönüşür.",
            "Terazinizin bastığı örnek barkodu inceleyip önek ve konumları ona göre girin."
          ]
        },
        {
          "id": "kasiyer",
          "baslik": "Kasiyer ve PIN (Personel Kartında)",
          "yol": "/ekran/personel/tanim/personel",
          "sub": "tanim",
          "amac": "Ayrı ekran değildir: Hızlı Satış lisanslı işletmede personel kartında 'Hızlı Satış Kasiyeri: Evet + PIN' bölümü açılır; personeli kasiyer yapıp PIN belirlersiniz.",
          "neden": "Aynı kasayı birden çok kişi kullanır. PIN sayesinde her fişin, iskontonun ve iadenin hangi kasiyere ait olduğu ayrışır; sorumluluk ve denetim netleşir. Kasiyerin bir kullanıcı (giriş) hesabı olması şarttır.",
          "nasil": [
            "Kasiyer olacak personelin kartını açın.",
            "'Hızlı Satış Kasiyeri' seçeneğini Evet yapın (kullanıcı hesabı yoksa reddedilir; önce hesap açın).",
            "Kasiyere bir PIN belirleyin.",
            "Kaydedin; kişi kasa kilit ekranından PIN'iyle oturum açabilir."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Personel kartındaki kasiyer ve PIN bilgisini kaydeder",
              "sonuc": "Personel kasiyer olur ve PIN'iyle kasada oturum açar; kullanıcı hesabı yoksa reddedilir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "kullanıcı/oturum"
          ],
          "ipuclari": [
            "Kasiyerin mutlaka bir kullanıcı (giriş) hesabı olmalıdır; olmayan personel kasiyer yapılamaz.",
            "Yönetici ve sistem yöneticisi hesaplarına kasiyer PIN'i verilmez.",
            "Kasada kilit ekranından PIN girilince oturum o kasiyere geçer; kimin ne sattığı ayrışır."
          ]
        },
        {
          "id": "satis",
          "baslik": "Kasayı Aç / Satış Ekranı",
          "yol": "/hizlisatis",
          "sub": "islem",
          "amac": "Kasiyerin gün boyu kullandığı tam ekran kasa terminali: dokunmatik ürün ızgarası, kategori sekmeleri, arama ve barkod okutma ile sepet oluşturma; kilogramlı üründe miktar seçici; F1 fiyat sorgulama; kasayı kilitleme. Standart yönetim arayüzü değildir.",
          "neden": "Perakendede hız ve doğruluk esastır. Barkod arama kutusu odakta olmasa da yakalanır; terazi barkodları desteklenir; kilogramlı üründe miktar mutlaka sorulur (varsayılmaz); internet kesilse bile satış durmaz.",
          "nasil": [
            "Kasayı açın; kilit ekranından kasiyer PIN'inizle oturum açın (ayara göre vardiya gerekir).",
            "Ürünü barkoddan okutun ya da kategori/aramadan seçip sepete ekleyin (barkod arama kutusu odakta olmasa da yakalanır).",
            "Kilogramlı üründe KİLOGRAM/GRAM seçiciden miktarı girin (miktar mutlaka sorulur).",
            "Aynı üründen çok satıyorsanız çarpan (×) ile adedi verin.",
            "F1 ile fiyat sorgulayın (ürünü sepete eklemez).",
            "Sepet hazır olunca ödemeye geçin.",
            "Kasadan kalkarken 'Kasayı Kilitle' ile ekranı PIN'e kilitleyin."
          ],
          "butonlar": [
            {
              "ad": "Ürün Ekle (dokunmatik ızgara)",
              "islev": "Izgaradaki ürüne dokununca sepete ekler",
              "sonuc": "Ürün sepete girer; kilogramlı üründe önce miktar sorulur",
              "renk": "accent"
            },
            {
              "ad": "Barkod Okut",
              "islev": "Barkodu okutunca ürünü (terazi barkodunda miktar/tutarıyla) sepete ekler",
              "sonuc": "Ürün ve miktar otomatik gelir; arama kutusu odakta olmasa da yakalanır",
              "renk": "ghost"
            },
            {
              "ad": "F1 Fiyat Sorgula",
              "islev": "Bir ürünün fiyatını gösterir",
              "sonuc": "Fiyat görünür; ürün sepete eklenmez",
              "renk": "ghost"
            },
            {
              "ad": "Kasayı Kilitle",
              "islev": "Ekranı PIN kilidine alır",
              "sonuc": "Başka biri PIN girmeden satış yapamaz; oturum korunur",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "depo",
            "personel"
          ],
          "ipuclari": [
            "Kasa telefonda desteklenmez; tablet veya bilgisayarda (dokunmatik ekranda ideal) çalışır.",
            "Ürün kasadan tanımlanmaz; yeni ürünü Stok modülünden merkez ekler, kasa yalnızca satar.",
            "Kilogramlı üründe miktar mutlaka sorulur, varsayılmaz.",
            "İnternet kesilince satış durmaz; fişler cihazda kuyruklanır ve bağlantı gelince çift kayıt olmadan gönderilir."
          ]
        },
        {
          "id": "odeme",
          "baslik": "Ödeme ve İskonto",
          "yol": "/hizlisatis",
          "sub": "islem",
          "amac": "Sepeti tamamladıktan sonra ödemeyi aldığınız panel: tek dokunuşla Nakit (F4), Kart (F6), Veresiye, Parçalı; alınan tutardan para üstü ve hazır banknot butonları; satışa iskonto uygulama.",
          "neden": "Perakendede ödeme en sık tekrar eden işlemdir; kısayollar ve para üstü otomasyonu kuyruğu hızlandırır, yanlış para üstünü önler. Veresiye ile müşteri hesabına yazma, parçalı ile karma ödeme mümkündür.",
          "nasil": [
            "Ödeme tipini seçin: Nakit (F4), Kart (F6), Veresiye veya Parçalı.",
            "Nakitte alınan tutarı yazın ya da hazır banknot butonuna dokunun; kasa para üstünü gösterir.",
            "Veresiyede cari zorunludur; kayıtlıysa seçin, değilse kasadan yeni cari açın (ad + telefon; 'kasada açıldı' etiketiyle).",
            "İskonto için müşteriden alınacak tutarı yazın; kasa farkı iskonto olarak hesaplar ve satırlara adil dağıtır (KDV doğru).",
            "İskonto modu ayarınıza göre davranır: Serbest / Tavanlı / Onaylı / Kapalı.",
            "Ödemeyi onaylayın; satış tamamlanır ve fiş basılır."
          ],
          "butonlar": [
            {
              "ad": "Nakit (F4)",
              "islev": "Nakit ödemeyi alır, para üstünü hesaplar",
              "sonuc": "Satış kapanır, para nakit kasasına işlenir, fiş basılır",
              "renk": "primary"
            },
            {
              "ad": "Kart (F6)",
              "islev": "Kartlı ödemeyi alır",
              "sonuc": "Tutar terminale bağlı kart tahsilat noktasına/banka hesabına işlenir",
              "renk": "primary"
            },
            {
              "ad": "Veresiye",
              "islev": "Satışı müşteri hesabına (cari) yazar",
              "sonuc": "Cari seçimi zorunludur; tutar müşteri borcuna eklenir",
              "renk": "ghost"
            },
            {
              "ad": "Parçalı",
              "islev": "Ödemeyi birden çok tipe böler (nakit + kart)",
              "sonuc": "Her parça ilgili hesaba işlenir; toplam tamamlanınca satış kapanır",
              "renk": "ghost"
            },
            {
              "ad": "Yeni Cari (kasada aç)",
              "islev": "Veresiyede kayıtsız müşteriyi ad + telefonla açar",
              "sonuc": "Yeni müşteri 'kasada açıldı' etiketiyle oluşur ve satışa bağlanır",
              "renk": "accent"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa (nakit/banka)",
            "cari",
            "fatura"
          ],
          "ipuclari": [
            "Fiyat değiştirme ayrı yetkidir ve varsayılan kapalıdır; açık olsa bile kart fiyatının %20 altına inilemez.",
            "İskonto 4 modda çalışır: Serbest (sınırsız), Tavanlı (limitli), Onaylı (yetki ister), Kapalı (yok).",
            "Veresiye seçilip cari seçilmezse satış kapanmaz.",
            "İskontoda 'alınacak tutar' yazılır; fark satırlara adil dağıtılır ve KDV doğru kalır."
          ]
        },
        {
          "id": "vardiya",
          "baslik": "Vardiya, X ve Z Raporu",
          "yol": "/hizlisatis",
          "sub": "islem",
          "amac": "Kasa vardiyasını açtığınız, gün içi ara döküm (X raporu) aldığınız, kasaya nakit giriş/çıkışı yaptığınız ve vardiyayı kör sayımla kapatıp Z raporu ürettiğiniz ekran.",
          "neden": "Kasanın parasını disiplinle ve iz bırakarak yönetmek için kullanılır. Her vardiya bir Z raporuyla mühürlenir; kasa farkı gizlenemez, gün içi para hareketleri kayıt altına alınır, kasa açığı ve karışıklık en aza iner.",
          "nasil": [
            "Vardiyayı açın; devreden nakit otomatik yüklenir.",
            "Gün içinde ihtiyaç oldukça X raporu alın (kasa kapanmaz, ara döküm).",
            "Bozuk para/avans/ödeme için kasaya nakit giriş veya çıkış işleyin.",
            "Vardiya sonunda kapanışa geçin; kör sayımda kasadaki parayı sayıp girin.",
            "Kasa beklenenle sayımı karşılaştırıp farkı gösterir; Z raporu üretilir.",
            "Devir varsa tek adımda: kör sayım → devralan PIN → Z + yeni vardiya devralan adına."
          ],
          "butonlar": [
            {
              "ad": "Vardiya Aç",
              "islev": "Yeni vardiya başlatır; devreden nakdi yükler",
              "sonuc": "Kasa satışa hazır olur; satışlar bu vardiyaya bağlanır",
              "renk": "accent"
            },
            {
              "ad": "X Raporu",
              "islev": "Kasayı kapatmadan gün içi ara döküm verir",
              "sonuc": "O ana kadarki satış özeti görünür; beklenen nakit yalnız yetkiliye",
              "renk": "ghost"
            },
            {
              "ad": "Nakit Giriş/Çıkış",
              "islev": "Kasaya para koyma/çıkarma işler",
              "sonuc": "Kasa nakit hareketi kayıt altına alınır ve beklenen kasaya yansır",
              "renk": "ghost"
            },
            {
              "ad": "Vardiya Kapat (Z)",
              "islev": "Kör sayımı alır, farkı hesaplar ve Z raporu üretir",
              "sonuc": "Vardiya kapanır; kasa farkı ve Z raporu kayda geçer",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa (nakit/banka)",
            "personel"
          ],
          "ipuclari": [
            "Bir terminalde aynı anda yalnızca bir açık vardiya olabilir.",
            "Vardiya yoksa (zorunluysa) satış yapılamaz.",
            "Bekleyen (park) fiş varken vardiya kapanmaz.",
            "Kasa farkı gizlenmez; yöneticinin 'zorla kapat' işlemi iz bırakır ve denetimde görünür.",
            "Vardiya devri tek adımda: kör sayım → devralan PIN → Z + yeni vardiya devralan adına."
          ]
        },
        {
          "id": "park",
          "baslik": "Fiş Bekletme (Park)",
          "yol": "/hizlisatis",
          "sub": "islem",
          "amac": "Kararsız müşterinin fişini F7 ile bekletip (park) sıradaki müşteriye geçmenizi sağlayan işlev. Park edilen fiş sonra kaldığı yerden devam eder; otomatik etiket ve rakamla çağrılır.",
          "neden": "Kuyruğu tıkamadan hizmet verirsiniz; bir müşteri beklerken diğerlerini kaybetmezsiniz. Park fişi sunucuya senkronlandığı için başka kasadan da devralınabilir.",
          "nasil": [
            "Sepeti bekletmek için F7 (Park) tuşuna basın; kasa fişe otomatik etiket verir.",
            "Sıradaki müşteriyle yeni satışa başlayın.",
            "Park listesinden etikete/rakama göre fişi geri çağırıp kaldığı yerden tamamlayın.",
            "Uzun bekleyen fişlerde (15/60 dk) renk uyarısına dikkat edin."
          ],
          "butonlar": [
            {
              "ad": "Park (F7)",
              "islev": "Mevcut sepeti bekletir",
              "sonuc": "Fiş otomatik etiketle park edilir ve sunucuya senkronlanır; kasa yeni satışa hazır olur",
              "renk": "accent"
            },
            {
              "ad": "Park Listesi / Çağır",
              "islev": "Bekleyen fişleri listeler ve seçileni geri çağırır",
              "sonuc": "Park fişi kaldığı yerden açılır; başka kasadan da devralınabilir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "cari"
          ],
          "ipuclari": [
            "Park fişi sunucuya senkronlandığı için başka bir kasadan devralınabilir.",
            "Ödeme başlamış bir fiş park edilemez.",
            "Fiş 15/60 dakikayı aşarsa park listesinde rengi uyarıya döner."
          ]
        },
        {
          "id": "iade",
          "baslik": "İade (Fişli / Fişsiz)",
          "yol": "/hizlisatis",
          "sub": "islem",
          "amac": "Satılan malın geri alındığı ekran: son satışlardan fişi bulup satır seçerek kısmi iade; fiş bulunamıyorsa (ayrı yetki ve tavanla) fişsiz iade. Tutarın hangi ödeme tipinden döndüğü gösterilir; son satışlarda fiş yeniden yazdırılır.",
          "neden": "İadeyi doğru ve kayıt altında yapmak için kullanılır. Fişe bağlı iade hangi satışın geri döndüğünü net tutar; aynı satır ikinci kez iade edilemez (mükerrer iade önlenir). Fişsiz iade istisnadır: ayrı yetki ve tavan gerekir.",
          "nasil": [
            "İade ekranını açın ve son satışlardan ilgili fişi bulun.",
            "İade edilecek satır(lar)ı seçin (tamamı ya da bir kısmı).",
            "Tutarın hangi ödeme tipinden döneceğini onaylayın.",
            "İadeyi tamamlayın; mal stoğa geri girer, kasa/cari ters kayıt oluşur.",
            "Fiş yoksa fişsiz iadeyi kullanın (ayrı yetki, tavanı aşamaz).",
            "Gerekirse son satışlardan ilgili fişi yeniden yazdırın."
          ],
          "butonlar": [
            {
              "ad": "İade Et",
              "islev": "Seçili satırları iade eder",
              "sonuc": "Mal stoğa geri girer, tutar ilgili ödeme tipinden döner, kasa/cari ters kayıt oluşur",
              "renk": "primary"
            },
            {
              "ad": "Fişsiz İade",
              "islev": "Fiş bulunamayan iadeyi (yetkiyle) alır",
              "sonuc": "Ayrı yetki istenir ve tutar ayardaki fişsiz iade tavanını aşamaz",
              "renk": "ghost"
            },
            {
              "ad": "Fiş Yeniden Yazdır",
              "islev": "Son satışlardan seçilen fişi tekrar basar",
              "sonuc": "Fiş çıktısı yeniden alınır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "stok",
            "kasa (nakit/banka)",
            "cari"
          ],
          "ipuclari": [
            "Aynı satır yalnızca bir kez iade edilebilir; ikinci iade engellenir.",
            "Fişsiz iade ayrı yetkidir ve ayardaki tavana bağlıdır (varsayılan 1.000; 0 = sınırsız).",
            "İade edilen mal stoğa geri girer, kasa/cari ters kayıt yazılır.",
            "Fişsiz iadeler denetim ekranında ayrıca vurgulanır."
          ]
        },
        {
          "id": "satisraporu",
          "baslik": "Satış Raporu",
          "yol": "/ekran/pos/rapor/satisraporu",
          "sub": "rapor",
          "amac": "Kasa satışlarını özet ve kırılımlarla izlediğiniz salt-okunur rapor: net ciro, fiş sayısı, iade, iskonto (hepsi iade düşülmüş net) + ödeme tipi dağılımı, saatlik yoğunluk, kasiyer performansı ve en çok satan 20 ürün. Excel'e aktarılır.",
          "neden": "Dükkânın nabzını tutmak için kullanılır: hangi saatte yoğunsunuz, hangi kasiyer ne kadar sattı, hangi ürünler dönüyor, nakit-kart dengesi nasıl. Kararlar gerçek satış verisine dayanır.",
          "nasil": [
            "Tarih aralığını (ve varsa şube/kasiyer) seçip Filtrele'ye basın.",
            "Özet kartlardan net ciro, fiş sayısı, iade ve iskontoyu okuyun.",
            "Ödeme tipi dağılımı, saatlik yoğunluk ve kasiyer performansı tablolarını inceleyin.",
            "En çok satan 20 ürünü gözden geçirin.",
            "Gerekirse Excel'e Aktar ile dışa alın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Seçilen tarih/kritere göre raporu yeniler",
              "sonuc": "Seçime uyan satış verileri gösterilir",
              "renk": "primary"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Raporu Excel dosyası olarak indirir",
              "sonuc": "Veriler dışa aktarılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "fatura",
            "kasa (nakit/banka)",
            "stok",
            "personel"
          ],
          "ipuclari": [
            "Özet kartlardaki ciro, iade ve iskonto değerleri iade düşülmüş net tutarlardır.",
            "Rapor salt-okunurdur; veri değiştirmez."
          ]
        },
        {
          "id": "denetim",
          "baslik": "İskonto / İade Denetimi",
          "yol": "/ekran/pos/rapor/denetim",
          "sub": "rapor",
          "amac": "Kasadaki riskli işlemleri (yüksek iskonto, fişsiz iade, vardiya farkı, zorla kapatma) tek ekranda toplayan salt-okunur denetim raporu. İskontolu fişler %10 sarı / %20 kırmızı vurgulu; fişsiz iadeler vurgulu; Z detayına bağlantı verir. Excel'e aktarılır.",
          "neden": "Kasa suistimalini erken yakalamak için kullanılır: aşırı iskonto, açıklamasız fişsiz iade ya da sürekli kasa açığı veren kasiyer buradan görünür. Renkli vurgular dikkati riskli işleme çeker.",
          "nasil": [
            "Tarih aralığını (ve varsa kasiyer/şube) seçip Filtrele'ye basın.",
            "İskontolu fişleri inceleyin; %10 sarı, %20 kırmızı vurgu ve onaylayana bakın.",
            "İadeleri kontrol edin; fişsiz iadeler ayrıca vurguludur.",
            "Vardiya farkları ve zorla kapatmaları gözden geçirin; Z detayına bağlantıdan derinleşin.",
            "Gerekirse Excel'e aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Denetim listesini seçilen kritere göre yeniler",
              "sonuc": "Seçime uyan iskonto/iade/fark kayıtları gösterilir",
              "renk": "primary"
            },
            {
              "ad": "Z Detayı",
              "islev": "İlgili vardiya farkı/kapatma için Z raporu detayını açar",
              "sonuc": "O vardiyanın Z detayına gidersiniz",
              "renk": "ghost"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Denetim raporunu Excel olarak indirir",
              "sonuc": "Veriler dışa aktarılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "kasa (nakit/banka)",
            "fatura"
          ],
          "ipuclari": [
            "Renk kodları riski hızlı gösterir: %10 iskonto sarı, %20 iskonto kırmızı.",
            "Fişsiz iadeler ve zorla kapatmalar ayrıca vurgulanır.",
            "Rapor salt-okunurdur; kasa suistimalini yakalamaya yöneliktir."
          ]
        },
        {
          "id": "zrapor",
          "baslik": "Vardiya / Z Raporları",
          "yol": "/ekran/pos/rapor/zrapor",
          "sub": "rapor",
          "amac": "Geçmiş vardiyaları ve Z raporlarını listeleyen salt-okunur rapor: satış/iade ayrımı, ödeme kırılımı, kasa farkı ve kapatan kişi. Detay görünümü + Excel.",
          "neden": "Kasa kapanışlarının geçmiş kaydını tutmak ve incelemek için kullanılır. 'Şu gün şu vardiya nasıl kapandı, fark var mıydı, kim kapattı' sorularının cevabı buradadır; muhasebe ve denetim için sağlam arşivdir.",
          "nasil": [
            "Tarih aralığını (ve varsa kasa/kasiyer) seçip Filtrele'ye basın.",
            "Vardiya listesinde satış/iade, ödeme kırılımı, fark ve kapatan kişiyi görün.",
            "Bir vardiyanın Detay'ına inip Z raporunun tümünü inceleyin.",
            "Gerekirse Excel'e aktarın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Vardiya/Z listesini seçilen kritere göre yeniler",
              "sonuc": "Seçime uyan vardiyalar listelenir",
              "renk": "primary"
            },
            {
              "ad": "Detay",
              "islev": "Seçili vardiyanın Z rapor detayını açar",
              "sonuc": "O vardiyanın tam dökümü görünür",
              "renk": "ghost"
            },
            {
              "ad": "Excel'e Aktar",
              "islev": "Raporu Excel olarak indirir",
              "sonuc": "Veriler dışa aktarılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "kasa (nakit/banka)",
            "personel"
          ],
          "ipuclari": [
            "Rapor menüsünde ayrıca Gün Sonu / Kasa Teslim, Ödeme Tipi Dağılımı, İade / İptal Analizi, Ürün Grubu / Reyon Satış, Satış Yoğunluğu Analizi ve Fiyat Değişikliği Denetimi raporları vardır (hepsi salt-okunur).",
            "Yazarkasa/ÖKC cihaz entegrasyonu için ekran altyapısı hazırlık aşamasındadır."
          ]
        }
      ]
    },
    {
      "slug": "sevkiyat",
      "title": "Sevkiyat",
      "icon": "🚛",
      "modul": "sevkiyat",
      "ad": "Sevkiyat & Teslimat Yönetimi",
      "ozet": "Sevkiyat modülü, malın tedarikçiden depoya girişinden müşteriye araçla teslimine kadar tüm operasyonu tek omurgada yönetir. Verilen siparişten doğan malı barkodla okutarak kabul eder (kabul/ret/fark), alınan siparişi araca yükleyip müşteriye teslim eder ve teslimi SMS OTP + imza/foto (teslim kanıtı/POD) ile doğrular. Her operasyonun adım-adım günlüğü (kim, ne zaman, nerede) tutulur; durum Taslak → Hazır → Yolda → Tamamlandı akışıyla izlenir. Teslimatı kendi sevkiyatçınız ya da taşeron nakliyeci yapabilir; taşeron bedeli anlaşmalı fiyat listesinden hesaplanır, hakediş tahakkuk eder ve teslimat kârlılığı ölçülür. Fiziksel stok, modülün kendisi yerine mevcut StokFis (401) / DepoTransfer (513) altyapısıyla yürür; böylece hiçbir hareket paralel bir yerde tutulmadan tek gerçekle işlenir.",
      "ozet_dogrulama": "KOD İLE DOĞRULANDI: index.php menu LISTE — Sevk İşemri (islem/liste, PAGE detay/sevkform/malkabul/taseronliste) + Tanımlar: Sevkiyatçılar (tanim/sevkiyatci), Durumlar (tanim/durum), Anlaşmalı Fiyat Listesi (tanim/fiyatliste) + Raporlar: Teslimat Durum & Kanıt (rapor/teslimatdurum), Mal Kabul Farkı (rapor/malkabulfark), Taşeron Hakediş Raporu (rapor/taseronhakedis), Taşeron Karlılık (rapor/taseronkarlilik). Omurga \\DBModel\\Sevkiyat (TIP_MALKABUL=1 / TIP_TESLIMAT=2 / TIP_TRANSFER=3). MODUL='sevkiyat' lisans geçidi (CORE değil).",
      "modul_iliskiler": [
        "cari",
        "stok",
        "depo",
        "irsaliye",
        "siparis",
        "fatura",
        "personel",
        "kasa",
        "e-belge (e-irsaliye)",
        "otomasyon",
        "ayar"
      ],
      "ekranlar": [
        {
          "id": "liste",
          "baslik": "Sevk İşemri",
          "yol": "/ekran/sevkiyat/islem/liste",
          "sub": "islem",
          "amac": "Mal kabul (tedarikçiden barkodla depoya giriş) ve teslimat (müşteriye araçla sevk + SMS OTP) operasyonlarının tek listede izlendiği ve yönetildiği ana ekran. Her satırın durumu (Taslak → Hazır → Yolda → Kısmi → Tamamlandı) ve taşıyanı (kendi personeli / taşeron) görünür; satırdan operasyon detayına, barkodlu mal kabul okutmasına ve teslim formuna gidilir. Yeni Sevkiyat Emri butonuyla evrak-bağımsız operasyon açılır.",
          "neden": "Malın yolculuğunun (kabulden teslime) baştan sona tek yerden görüldüğü kalp ekrandır. Bekleyen kabuller, yoldaki teslimatlar ve her operasyonun adım-adım günlüğü buradan takip edilmezse sevkiyat körlemesine yürür; gecikme, atlanan teslimat ve mutabakatsızlık doğar."
        },
        {
          "id": "sevkiyatci",
          "baslik": "Sevkiyatçılar",
          "yol": "/ekran/sevkiyat/tanim/sevkiyatci",
          "sub": "tanim",
          "amac": "Teslimatı yapacak sevkiyatçıların tanımlandığı ekran: (a) Personel = kendi elemanınız (personel + kullanıcı hesabı), (b) Taşeron = dış nakliye firması (cari kart). Her sevkiyatçıya taşıt/plaka, satış deposu ve bölge atanır. Taşeron sevkiyatçı bir işemre seçildiğinde operasyon otomatik taşerona atanır (ayrı bir 'taşerona ver' adımı gerekmez).",
          "neden": "Teslimatın kim tarafından yapılacağı ve taşeron-personel ayrımı bu tanıma dayanır. Sevkiyatçı tanımlanmadan teslimat ataması, taşeron hakedişi ve sevkiyatçı bazlı raporlar çalışmaz; kendi eleman ile dış taşeron maliyeti ayrışamaz."
        },
        {
          "id": "durum",
          "baslik": "Durumlar",
          "yol": "/ekran/sevkiyat/tanim/durum",
          "sub": "tanim",
          "amac": "Sabit iş-akışı durumlarının (Taslak/Hazır/Yolda/Kısmi/Tamamlandı/İptal) altına, işletmenin kendi kullanım diline uygun renkli alt durum etiketleri tanımladığı ekran. Alt durumlar sys_durum üzerinde MODULE_KEY='sevkiyat' ile tutulur ve operasyona atanır.",
          "neden": "Her işletmenin teslimat süreci farklı ara adımlar içerir (ör. 'Randevu bekliyor', 'Montajda', 'Adreste bulunamadı'). Kendi alt durumları tanımlanmazsa operasyonlar yalnız kaba iş-akışı koduyla izlenir; saha gerçekliği ve raporlama zayıflar."
        },
        {
          "id": "fiyatliste",
          "baslik": "Anlaşmalı Fiyat Listesi",
          "yol": "/ekran/sevkiyat/tanim/fiyatliste",
          "sub": "tanim",
          "amac": "Taşerona ödenecek teslimat/nakliye bedelinin hesap kuralını tanımladığınız ekran. Hesap tipi sabit tutar, KM başına, desi başına, durak (teslimat) başına veya manuel olabilir; bölge ve para birimi ile birlikte tanımlanır. Taşerona iş verilince bedel bu listeden otomatik hesaplanır (gerekirse elle override edilir).",
          "neden": "Taşeron bedeli her seferinde elle pazarlıkla belirlenirse hakediş tutarsız kalır ve kârlılık ölçülemez. Anlaşmalı fiyat listesi bedeli standartlaştırır; hakediş tahakkuku ve teslimat kârlılığı bu kurala dayanarak tutarlı hesaplanır."
        },
        {
          "id": "teslimatdurum",
          "baslik": "Teslimat Durum & Kanıt",
          "yol": "/ekran/sevkiyat/rapor/teslimatdurum",
          "sub": "rapor",
          "amac": "Teslimat (TIP=2) operasyonlarının durumunu, teslim/ret miktarını ve teslim kanıtını (SMS OTP · imza · GPS konumu) tarih aralığı ve sevkiyatçı bazında gösteren salt-okuma rapor. Üstte tamamlanan/kısmi/bekleyen/iptal KPI kartları, altta teslim alanı, teslim zamanı ve kanıt sütunlarıyla operasyon listesi bulunur.",
          "neden": "Teslimatın gerçekten yapıldığını, kim tarafından ve hangi kanıtla (OTP/imza/konum) tamamlandığını ispatlamak için gereklidir. Teslim kanıtı izlenmezse 'teslim aldım/almadım' anlaşmazlıkları, kayıp teslimatlar ve tahsilat/iade tartışmaları çözülemez."
        },
        {
          "id": "malkabulfark",
          "baslik": "Mal Kabul Farkı",
          "yol": "/ekran/sevkiyat/rapor/malkabulfark",
          "sub": "rapor",
          "amac": "Mal kabul (TIP=1) operasyonlarında sipariş/irsaliyeyle beklenen miktar ile fiilen barkodla kabul edilen ve reddedilen miktar arasındaki farkı satır bazında ortaya koyan salt-okuma rapor. Tam/eksik/fazla/ret KPI'ları ve varsayılan olarak yalnız fark içeren satırlar listelenir.",
          "neden": "Tedarikçinin gönderdiği ile fiilen teslim alınan çoğu zaman tutmaz (eksik, fazla, hasarlı). Bu fark görülmezse yanlış miktar üzerinden borçlanılır, hatalı stok girer ve tedarikçiyle mutabakat yapılamaz; fark raporu tedarikçi uyumsuzluğunu kanıtlı biçimde ortaya çıkarır."
        },
        {
          "id": "taseronhakedis",
          "baslik": "Taşeron Hakediş Raporu",
          "yol": "/ekran/sevkiyat/rapor/taseronhakedis",
          "sub": "rapor",
          "amac": "Dış nakliyeci/taşeron bazında Hak Edilen · Faturalanan · Ödenen · Kalan (açık borç) tutarlarını, saf döviz takibiyle (her para birimi ayrı satır, kur farkı yok) ve Genel (TL) karşılığıyla gösteren rapor. Taşeronun alış faturasıyla eşleştirme (mutabakat), ödeme işaretleme ve cari ekstre/sevkiyat listesi linkleri bu ekrandadır.",
          "neden": "Taşerona teslimat başına ne kadar borçlanıldığı ve ne kadarının faturalanıp ödendiği takip edilmezse taşerona ya eksik ya fazla ödenir. Hakediş tahakkuku (beklenen borç) ile fiili alış faturasının eşleşmesi bu ekranda yapılır; açık borç net görülür."
        },
        {
          "id": "taseronkarlilik",
          "baslik": "Taşeron Karlılık",
          "yol": "/ekran/sevkiyat/rapor/taseronkarlilik",
          "sub": "rapor",
          "amac": "Taşerona ödenen teslimat maliyeti ile o teslimatın kaynak satış faturası/siparişinden gelen geliri (KDV hariç matrah) karşılaştırıp teslimat başına kâr ve marj yüzdesini gösteren salt-okuma rapor. Maliyet taşeronun kendi para biriminde, kâr/marj Genel (TL) olarak hesaplanır.",
          "neden": "Bir teslimatın gelirini aşan taşeron maliyeti sessizce zarar yazar. Kârlılık ölçülmezse hangi bölge/taşeron/teslimat türünün zararına çalıştığı fark edilmez; fiyatlama ve taşeron seçimi verisiz yapılır. Bu rapor teslimat operasyonunun gerçek kârını görünür kılar."
        },
        {
          "id": "planlama",
          "baslik": "Planlamadaki Teslimatlar",
          "yol": "/ekran/sevkiyat/islem/planlama",
          "sub": "islem",
          "amac": "Henüz plan tarihi ve aracı atanmamış teslimatların toplandığı ekran. Teslimat plansız (tarihsiz) açılabilir ve burada bekler; satır içinde tek tek ya da çoklu seçimle toplu olarak plan tarihi + araç ataması yapılır. Atanan kayıtlar Teslimat Takvimi ve Teslimat Aşama raporlarına düşer.",
          "neden": "Teslimat açılırken tarih çoğu zaman belli değildir; tarih zorunlu tutulursa kullanıcı uydurma tarih girer veya kaydı hiç açmaz. Bu ekran olmadan tarihsiz teslimatlar listelerde kaybolur, hafta içinde araç doluluğu planlanamaz ve müşteriye tarih verilemez."
        },
        {
          "id": "teslimokut",
          "baslik": "Teslimatta Barkod Okutma",
          "yol": "/ekran/sevkiyat/islem/teslimokut",
          "sub": "islem",
          "amac": "Malın müşteriye bırakılması sırasında fiilen teslim edilen ürünlerin barkodla okutulduğu ekran. Mal kabul ve araç yükleme okutmalarıyla aynı motoru kullanır; beklenen ve teslim edilen miktar yan yana görünür, teslim edilen miktarlar belgeye ayrı kolonlarda işlenir. Hem saha (telefon kamerası) hem masaüstü tarafında çalışır.",
          "neden": "Araca yüklenen ile müşteriye bırakılan her zaman aynı değildir. Teslim anında okutma yoksa eksik bırakılan veya yanlış adrese götürülen ürün ancak ay sonu sayımında fark edilir; o noktada kimin ne aldığı kanıtlanamaz ve fark firmanın üzerinde kalır."
        },
        {
          "id": "teslimatasama",
          "baslik": "Teslimat Aşama Raporu",
          "yol": "/ekran/sevkiyat/rapor/teslimatasama",
          "sub": "rapor",
          "amac": "Teslimatları planlamada / yüklemede / yolda / teslim edildi olmak üzere dört kovada gösteren rapor. Excel çıktısı ve yazdırma desteklenir. Sevkiyat Emri Formu (EVRAK_TIP=414) ve Araç Yükleme Listesi (EVRAK_TIP=413) resmi çıktıları bu operasyondan üretilir.",
          "neden": "Sevkiyat listesi tek tek kayıt gösterir; yöneticinin ihtiyacı olan yığın görüntüsü (kaç iş planlamada bekliyor, kaçı yolda) yoktur. Bu rapor olmadan darboğazın hangi aşamada olduğu görülmez, araç ve personel yanlış yere konumlandırılır."
        },
        {
          "id": "teslimattakvim",
          "baslik": "Teslimat Takvimi",
          "yol": "/ekran/sevkiyat/rapor/teslimattakvim",
          "sub": "rapor",
          "amac": "Seçilen tarih aralığındaki teslimatların günlere dağılmış hâlde görüldüğü takvim raporu; plan tarihi verilmemiş teslimatlar ayrı bir tarihsiz kovasında listelenir. Sevkiyat kayıtları ayrıca ERP genel takvimine etkinlik olarak düşer.",
          "neden": "Hangi gün kaç teslimat olduğu görünmeden araç kapasitesi planlanamaz; bir güne yığılma, ertesi güne boşluk çıkar. Tarihsiz kovası olmayan sistemlerde plansız teslimatlar hiç görünmez ve müşteri arayana kadar unutulur."
        }
      ]
    },
    {
      "slug": "gorev",
      "title": "Gorev Yonetimi",
      "icon": "✅",
      "modul": "gorev",
      "ad": "Görev ve Proje Yönetimi",
      "ozet": "Görev modülü teknik olarak \"proje\" modülü içinde yaşar: kendi index.php/event.php'si yoktur, ekranlar fiziksel olarak proje modülünde bulunur (menüde \"Proje Yönetimi\" başlığı altında, URL'ler /ekran/proje/... şeklinde çözülür). gorev/ klasöründe yalnızca Görev Kartı yazdırma şablonu (evrak tip 804) vardır. Kayıtlar proje_gorev tablosunda tutulur; projeler proje_kart, Kanban kolonları proje_liste tablosundadır. Ekipler işleri liste kartları veya Kanban panosu üzerinden takip eder, personel atar, durum/öncelik/kontrol listesi/yorum yönetir ve performans-verimlilik raporlarıyla iş yükünü dengeler. Görev oluşturma ve tamamlama olayları n8n/otomasyon tetikleyicilerini (GOREV_OLUSTURULDU, GOREV_TAMAMLANDI) çalıştırır.",
      "modul_iliskiler": [
        "personel (görev atama, verimlilik)",
        "cari/musteritedarikci (projeye/göreve müşteri bağlama)",
        "fatura",
        "irsaliye",
        "kasa (ödeme/tahsilat/masraf)",
        "siparis",
        "teklif",
        "servis (talep ve iş emri bağlama)",
        "otomasyon/n8n (görev tetikleyicileri)",
        "sys_durum (görev durumu/önceliği/proje durumu tanımları)",
        "ozel_alan (görev özel alanları)"
      ],
      "ekranlar": [
        {
          "id": "projeliste",
          "baslik": "Projeler",
          "yol": "/ekran/proje/islem/projeliste",
          "sub": "islem",
          "amac": "Firmadaki tüm projelerin listelendiği ana ekran. Her proje adı, süreli olup olmadığı, tarih aralığı ve bağlı müşterisiyle birlikte görünür.",
          "neden": "Görevler bir projeye bağlanabildiği için işe önce proje kurgusuyla başlanır. Süreli projelerde başlangıç-bitiş takibi, müşteriye özel projelerde cari bağı bu ekrandan yönetilir.",
          "nasil": [
            "Üstteki 'Proje Oluştur' butonuyla yeni proje tanımlarsınız.",
            "Listedeki bir projenin İşlemler menüsünden 'Görüntüle' ile detay/Kanban ekranına gidersiniz.",
            "'Düzenle' ile proje bilgilerini güncellersiniz.",
            "'Yazdır' ile proje kartını yazdırırsınız (evrak tip 803).",
            "'Sil' ile projeyi pasife çekersiniz (kayıt tamamen silinmez).",
            "Sayfa altındaki sayfalama ile 50'şerli listeyi gezersiniz."
          ],
          "butonlar": [
            {
              "ad": "Proje Oluştur",
              "islev": "Yeni proje tanımlama formunu açar",
              "sonuc": "Proje kartı ekleme ekranı açılır",
              "renk": "primary"
            },
            {
              "ad": "Görüntüle",
              "islev": "Projenin detay/Kanban ekranına gider",
              "sonuc": "Proje detayında görev panosu açılır",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Proje bilgilerini düzenleme moduna alır",
              "sonuc": "Proje formu dolu gelir",
              "renk": "accent"
            },
            {
              "ad": "Yazdır",
              "islev": "Proje kartı yazdırma önizlemesini açar (evrak tip 803)",
              "sonuc": "Yazdırma modalı açılır",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Onay sonrası projeyi pasife çeker",
              "sonuc": "Proje listeden kalkar (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "projesil",
              "tetik": "Sil butonu + onay",
              "etki": "proje_kart.DURUM=-1 yapılır (soft delete)",
              "neden_sonuc": "Projeyi listeden kaldırır; veriler saklandığı için yanlışlıkla silinse de teknik olarak geri dönülebilir, fakat kullanıcı arayüzünden geri getirme yoktur, dikkatli silin."
            }
          ],
          "iliskiler": [
            "cari",
            "fatura",
            "irsaliye",
            "kasa",
            "siparis",
            "teklif",
            "servis"
          ],
          "ipuclari": [
            "Proje oluşturulunca 4 varsayılan Kanban listesi (Yapılacaklar, Devam Edenler, Kontrol, Tamamlandı) otomatik açılır.",
            "Bir kayıt 50'den fazlaysa sayfalama devreye girer; arama alanı yoktur, en yeni kayıt üstte gelir."
          ]
        },
        {
          "id": "projedetay",
          "baslik": "Proje Detay (Görev Panosu)",
          "yol": "/ekran/proje/islem/projedetay",
          "sub": "islem",
          "amac": "Tek bir projenin 360 derece merkezi: Görev Liste, Görev Kanban panosu, notlar ve projeye bağlı fatura/irsaliye/ödeme-tahsilat/masraf/sipariş/teklif/servis sekmeleri bir arada. Menüde ayrı yer almaz; Projeler ekranındaki 'Görüntüle' ile açılır.",
          "neden": "Görevlerin sürükle-bırak ile durumdan duruma taşındığı asıl çalışma ekranıdır. Projenin hem operasyonel (görevler) hem finansal (evraklar) resmini tek yerden görmek yöneticiye zaman kazandırır.",
          "nasil": [
            "Genel sekmesinde görev durumu/öncelik/liste dağılım grafiklerini görürsünüz.",
            "'Görev Kanban' sekmesinde görev kartlarını kolonlar arası sürükleyip durumunu değiştirirsiniz.",
            "Her Kanban kolonu başlığındaki butonla o listeye doğrudan yeni görev eklersiniz.",
            "Bir görev kartına tıklayınca görev detay modalı açılır (yorum, kontrol listesi, durum/öncelik).",
            "Notlar sekmesinde proje notu yazar, sürükleyerek sıralarsınız.",
            "Faturalar/İrsaliyeler/Sipariş/Teklif/Servis vb. sekmeler tıklanınca ilgili evraklar AJAX ile yüklenir."
          ],
          "butonlar": [
            {
              "ad": "Yeni Görev (kolon başlığı)",
              "islev": "Seçili Kanban listesine görev ekleme formunu açar",
              "sonuc": "Liste ve durum önceden seçili görev formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Görev kartı (Görüntüle)",
              "islev": "Görev detay modalını açar",
              "sonuc": "Yorum/kontrol listesi/durum düzenlenebilir modal açılır",
              "renk": "ghost"
            },
            {
              "ad": "Kaydet (Not)",
              "islev": "Proje notunu kaydeder",
              "sonuc": "Not listesine eklenir/güncellenir",
              "renk": "accent"
            },
            {
              "ad": "Görüntüle (evrak)",
              "islev": "Fatura/irsaliye detay önizlemesini açar",
              "sonuc": "Evrak satırları modalda görünür",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "gorevlistevesiradegistir",
              "tetik": "Kanban'da görev kartını sürükle-bırak",
              "etki": "proje_gorev.LISTE_ID ve POSITION güncellenir, eski/yeni liste yeniden sıralanır, 804 evrak log (islem tip 40/41/42)",
              "neden_sonuc": "Görevin hangi aşamada olduğunu görsel olarak günceller; yanlış listeye bırakılırsa iş akışı yanlış görünür, geri sürükleyerek düzeltilir."
            },
            {
              "ad": "projenotkaydet",
              "tetik": "Not Kaydet",
              "etki": "notlar tablosuna REL_TYPE=1 kaydı ekler/günceller",
              "neden_sonuc": "Proje ile ilgili bilgileri kalıcı tutar; başlık veya not boşsa kaydetmez."
            },
            {
              "ad": "projenotsiradegistir",
              "tetik": "Notları sürükleyerek sıralama",
              "etki": "notlar.SIRA yeniden yazılır",
              "neden_sonuc": "Notların öncelik sırasını korur."
            },
            {
              "ad": "projenotsil",
              "tetik": "Not sil",
              "etki": "notlar kaydını fiziksel siler",
              "neden_sonuc": "Gereksiz notu kaldırır; bu silme kalıcıdır."
            },
            {
              "ad": "projelisteekle",
              "tetik": "Kanban listesi ekle/düzenle",
              "etki": "proje_liste ekler/günceller",
              "neden_sonuc": "Projeye özel iş akışı kolonları tanımlar."
            },
            {
              "ad": "projelistesil",
              "tetik": "Kanban listesi sil",
              "etki": "proje_liste.DURUM=-1",
              "neden_sonuc": "Kullanılmayan kolonu kaldırır; içindeki görevler ilişkisiz kalabilir, önce görevleri taşıyın."
            },
            {
              "ad": "projefaturalar / projefaturadetay / projeirsaliyeler / projeirsaliyedetay / projeodemetahsil / projemasraflar / projesiparisler / projeteklifler / projeservisler",
              "tetik": "İlgili sekmeye tıklama (detay eventleri satır önizleme açar)",
              "etki": "Bağlı proje ID'si ile ilişkili evrakları okur (salt görüntüleme)",
              "neden_sonuc": "Projenin gelir-gider ve evrak resmini gösterir; evrak kaydında proje seçilmemişse burada görünmez."
            }
          ],
          "iliskiler": [
            "fatura",
            "irsaliye",
            "kasa",
            "siparis",
            "teklif",
            "servis",
            "personel",
            "cari"
          ],
          "ipuclari": [
            "Kanban kolonları projeye özeldir; kolon silinmeden önce görevleri başka kolona taşıyın.",
            "Faturaların/masrafların bu ekranda çıkması için ilgili evrak kaydedilirken 'Bağlı Proje' seçilmiş olmalıdır."
          ]
        },
        {
          "id": "gorevliste",
          "baslik": "Görevler",
          "yol": "/ekran/proje/islem/gorevliste",
          "sub": "islem",
          "amac": "Tüm projelerdeki (veya bağımsız) görevlerin kart listesi. Her kartta başlık, atanan personel(ler), öncelik, liste, planlanan ve gerçekleşen tarih/saat ile durum rozeti görünür.",
          "neden": "Ekip liderinin 'bugün hangi işler açık, kim ne yapıyor, hangisi gecikti' sorusuna tek ekranda cevap verir. Görev detayına, düzenlemeye ve silmeye buradan erişilir.",
          "nasil": [
            "Üstteki 'Yeni Görev' butonuyla görev tanımlama formuna gidersiniz.",
            "Görev başlığına veya 'Görüntüle' butonuna tıklayıp detay modalını açarsınız.",
            "Modal içinden durum ve öncelik değiştirir, yorum yazar, kontrol listesi maddesi eklersiniz.",
            "'Düzenle' ile görevin tüm alanlarını güncellersiniz.",
            "'Sil' ile görevi pasife çekersiniz.",
            "Kartlarda +N rozetine tıklayıp yardımcı personellerin tamamını görürsünüz."
          ],
          "butonlar": [
            {
              "ad": "Yeni Görev",
              "islev": "Görev tanımlama formunu açar",
              "sonuc": "Boş görev formu açılır",
              "renk": "primary"
            },
            {
              "ad": "Görüntüle",
              "islev": "Görev detay modalını açar",
              "sonuc": "Yorum/kontrol listesi/durum-öncelik modalı açılır",
              "renk": "primary"
            },
            {
              "ad": "Düzenle",
              "islev": "Görevi düzenleme moduna alır",
              "sonuc": "Görev formu dolu gelir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Onay sonrası görevi pasife çeker",
              "sonuc": "Görev listeden kalkar (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "gorevmodal",
              "tetik": "Görev kartına / Görüntüle'ye tıklama",
              "etki": "Görev + yorum + kontrol listesi + durum/öncelik verilerini HTML modal olarak döner",
              "neden_sonuc": "Göreve dair her şeyi tek pencerede toplar; sayfa yenilemeden hızlı yönetim sağlar."
            },
            {
              "ad": "gorevdurumdegistir",
              "tetik": "Modalda görev durumu seçimi",
              "etki": "proje_gorev.IS_DURUMU (kanonik 1..5) güncellenir; aktife (poz 2/3) geçişte GOREV_BASLANGIC ve SLA_DEADLINE, pasife geçişte GERCEK_SURE_DK/GOREV_BITIS hesaplanır; 804 log",
              "neden_sonuc": "Görevin gerçek çalışma süresini otomatik ölçer. Durumu doğru güncellemezseniz süre ve SLA raporları hatalı çıkar; 'Tamamlandı' (poz 5) yapılınca GOREV_TAMAMLANDI otomasyonu tetiklenir."
            },
            {
              "ad": "gorevoncelikdegistir",
              "tetik": "Modalda öncelik seçimi",
              "etki": "proje_gorev.IS_ACILIYET güncellenir, 804 log",
              "neden_sonuc": "İşin aciliyetini belirler; yanlış öncelik ekip sıralamasını bozar."
            },
            {
              "ad": "gorevyorumekle / gorevyorumduzenle",
              "tetik": "Modaldaki yorum formu",
              "etki": "proje_gorev_yorum ekler/günceller",
              "neden_sonuc": "Görev üzerinde iletişim/kayıt tutar; sadece kendi yorumunu düzenleyebilir."
            },
            {
              "ad": "gorevkontrollisteogekle / gorevkontrollisteogecheck / gorevkontrollisteogesil",
              "tetik": "Modaldaki kontrol listesi",
              "etki": "proje_gorev_checklist ekler/işaretler/siler, ilerleme yüzdesi güncellenir",
              "neden_sonuc": "Görevi alt adımlara bölüp tamamlanma oranını takip eder."
            },
            {
              "ad": "gorevsil",
              "tetik": "Sil butonu + onay",
              "etki": "proje_gorev.DURUM=-1, 804 log",
              "neden_sonuc": "Görevi kaldırır; raporlardan da düşer, gerçekten iptal edilecekse durumu 'İptal' yapmak daha izlenebilirdir."
            }
          ],
          "iliskiler": [
            "personel",
            "proje",
            "cari",
            "otomasyon"
          ],
          "ipuclari": [
            "Sayfa 50 görev gösterir; alt kısımda toplam görev sayısı ve sayfalama vardır.",
            "Silmek yerine durumu 'İptal' yapmak, iptal/verimlilik raporlarında izlenebilirlik sağlar."
          ]
        },
        {
          "id": "gorev",
          "baslik": "Görev Tanımı (Ekle/Düzenle)",
          "yol": "/ekran/proje/tanim/gorev",
          "sub": "tanim",
          "amac": "Yeni görev oluşturma ve mevcut görevi düzenleme formu. Başlık, açıklama, proje/liste, plan başlangıç-bitiş tarih-saati, sorumlu personel, yardımcı personeller, etiket, görev durumu, öncelik ve özel alanlar burada girilir. Menüde ayrı yer almaz; 'Yeni Görev' / 'Düzenle' ile açılır.",
          "neden": "Görevin tüm iş kurallarının (kim, ne zaman, hangi öncelikte, hangi projede) tanımlandığı yerdir. Plan başlangıç/bitiş girildiği için sistem plan süresini ve SLA'yı otomatik hesaplar.",
          "nasil": [
            "Başlık ve açıklamayı girin.",
            "Proje seçin (otomatik tamamlama); proje seçilince o projenin listeleri gelir. Kanban kolonundan açıldıysa proje ve liste kilitli gelir.",
            "Plan başlangıç ve bitiş tarih/saatini girin (plan süresi otomatik hesaplanır).",
            "Sorumlu personeli ve varsa yardımcı personelleri seçin.",
            "Etiket, görev durumu (zorunlu) ve öncelik (zorunlu) seçin; tanımlı özel alanları doldurun.",
            "'Kaydet' ile görevi oluşturun; kayıt sonrası Görevler listesine dönersiniz."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Görev formunu gönderir (gorev.kaydet)",
              "sonuc": "Görev eklenir/güncellenir, Görevler ekranına döner",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "İşlemi iptal eder",
              "sonuc": "Form kapanır, değişiklik kaydedilmez",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "gorevekle",
              "tetik": "Kaydet butonu",
              "etki": "proje_gorev ekler/günceller; yardımcılar proje_gorev_personel'e, özel alanlar ozel_alan_deger'e yazılır; 804 log; yeni kayıtta GOREV_OLUSTURULDU otomasyonu tetiklenir",
              "neden_sonuc": "İşi sisteme sokar ve sorumluyu belirler. Görev durumu ve öncelik seçilmezse kayıt reddedilir; plan tarih/saat doğru girilmezse plan süresi ve SLA yanlış hesaplanır."
            }
          ],
          "iliskiler": [
            "proje",
            "personel",
            "cari (projeden gelen)",
            "ozel_alan",
            "otomasyon"
          ],
          "ipuclari": [
            "Görev durumu ve öncelik zorunludur; boş bırakılırsa kayıt hata verir.",
            "Proje seçilirse görev müşteri bilgisini projeden otomatik devralır.",
            "Kanban kolonundan 'Yeni Görev' ile gelindiğinde durum, projenin ana pozisyonuna göre süzülür."
          ]
        },
        {
          "id": "projedurum",
          "baslik": "Proje Durumları",
          "yol": "/ekran/proje/tanim/projedurum",
          "sub": "tanim",
          "amac": "Projelerin ve görevlerin kullanacağı durum/aşama tanımlarını (ad, kullanım yeri/sabit grup, sıra, renk, aktif-pasif) yönetmek.",
          "neden": "Kanban akışının kolon adları ve renkleri buradan beslenir. İş akışını firmanın kendi terminolojisine göre (ör. 'Teklif Aşaması', 'Sahada') özelleştirmeyi sağlar.",
          "nasil": [
            "Kullanım yeri (sabit grup) seçin.",
            "Durum adını, sırasını ve rengini girin.",
            "Durumu Aktif/Pasif yapın ve 'Kaydet'e basın.",
            "Alt listeden mevcut durumu düzenleyin veya silin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Durum tanımını kaydeder",
              "sonuc": "sys_durum kaydı eklenir/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "Değişiklik kaydedilmez",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili durumu forma yükler",
              "sonuc": "Form dolu gelir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Durumu pasife çeker",
              "sonuc": "Durum listeden kalkar (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "projedurumekle",
              "tetik": "Kaydet",
              "etki": "sys_durum'a proje/görev durum kaydı ekler/günceller (MODULE_KEY)",
              "neden_sonuc": "Akış aşamalarını tanımlar; sıra/renk yanlışsa Kanban görünümü karışır."
            },
            {
              "ad": "projedurumsil",
              "tetik": "Sil",
              "etki": "sys_durum.DURUM=-1",
              "neden_sonuc": "Kullanılmayan aşamayı kaldırır; aktif görevler o duruma bağlıysa görünürlük sorunları olur."
            }
          ],
          "iliskiler": [
            "proje",
            "sys_durum"
          ],
          "ipuclari": [
            "Renk seçimi Kanban ve rozetlerde birebir kullanılır; okunur kontrast seçin.",
            "Silmeden önce o durumu kullanan görev/proje olup olmadığını kontrol edin."
          ]
        },
        {
          "id": "gorevozelalan",
          "baslik": "Görev Özel Alanları",
          "yol": "/ekran/proje/tanim/gorevozelalan",
          "sub": "tanim",
          "amac": "Görev formuna firmaya özel ek alanlar (metin, sayı, tek/çok seçim vb.) tanımlamak; alan başlığı, tipi, sırası, zorunluluğu ve seçenek listesi belirlenir.",
          "neden": "Standart görev alanları yetmediğinde (ör. 'Referans No', 'Ekipman', 'Onay Kodu') süreç bilgisini yapılandırılmış tutmayı sağlar. Zorunlu yapılırsa eksik veri girişi engellenir.",
          "nasil": [
            "Alan adını ve sırasını girin.",
            "Alan tipini seçin; tip 'seçim/çoklu seçim' ise 'Ekle' ile seçenekleri girin.",
            "Zorunlu mu belirleyin; zorunluysa uyarı mesajını yazın.",
            "Durumu Aktif/Pasif yapıp 'Kaydet'e basın.",
            "Alt listeden mevcut özel alanı düzenleyin veya silin."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Özel alan tanımını kaydeder",
              "sonuc": "ozel_alan_tanim kaydı eklenir/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Ekle (seçenek)",
              "islev": "Seçim tipli alana yeni seçenek satırı ekler",
              "sonuc": "Seçenek girişi belirir",
              "renk": "accent"
            },
            {
              "ad": "Vazgeç",
              "islev": "Formu temizler",
              "sonuc": "Değişiklik kaydedilmez",
              "renk": "ghost"
            },
            {
              "ad": "Düzenle",
              "islev": "Seçili alanı forma yükler",
              "sonuc": "Form dolu gelir",
              "renk": "accent"
            },
            {
              "ad": "Sil",
              "islev": "Özel alanı pasife çeker",
              "sonuc": "Alan listeden kalkar (DURUM=-1)",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "gorevozelalanekle",
              "tetik": "Kaydet",
              "etki": "ozel_alan_tanim'a görev özel alanı kaydı ekler/günceller; seçim tipinde seçenekler saklanır",
              "neden_sonuc": "Görev formuna dinamik alan ekler; seçim tipinde en az bir seçenek girilmezse kayıt reddedilir."
            },
            {
              "ad": "gorevozelalansil",
              "tetik": "Sil",
              "etki": "ozel_alan_tanim.DURUM=-1",
              "neden_sonuc": "Alanı görev formundan kaldırır; geçmiş görevlerdeki değerler veride kalır."
            }
          ],
          "iliskiler": [
            "proje (görev formu)",
            "ozel_alan"
          ],
          "ipuclari": [
            "Zorunlu alanlar görev kaydında doğrulanır; gereksiz zorunluluk veri girişini yavaşlatır.",
            "Alan tipini sonradan değiştirmek eski değerlerle uyumsuzluk yaratabilir."
          ]
        },
        {
          "id": "personelgorevdagilim",
          "baslik": "Personel Görev Dağılımı",
          "yol": "/ekran/proje/rapor/personelgorevdagilim",
          "sub": "rapor",
          "amac": "Personel başına toplam, aktif ve tamamlanan görev sayısı ile SLA ihlallerini gösteren iş yükü dağılım raporu.",
          "neden": "İş yükünün adil dağılıp dağılmadığını görmek için. Bir kişi 30 görevle boğulurken başkası 5 görevle çalışıyorsa hem motivasyon hem teslim süresi bozulur.",
          "nasil": [
            "'Filtreleme Yap' butonuyla personel ve tarih aralığını seçin (performans için filtre zorunludur, filtresiz liste boş gelir).",
            "Filtreyi uygulayıp raporu çalıştırın.",
            "KPI kartlarından toplam/aktif/tamamlanan/SLA ihlal özetini okuyun.",
            "Aşırı yüklü veya SLA ihlali olan personeli tespit edip iş dağıtın."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp seçili kriterlerle raporu üretir",
              "sonuc": "Personel bazlı dağılım tablosu gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "proje"
          ],
          "ipuclari": [
            "Aktif görev > 10 olan personele yeni iş atamayın, mevcutları dağıtın.",
            "Bu ekranda yazdırma/dışa aktarma butonu yoktur; sadece filtreleyip ekranda görüntülenir."
          ]
        },
        {
          "id": "personelverimlilik",
          "baslik": "Personel Verimlilik",
          "yol": "/ekran/proje/rapor/personelverimlilik",
          "sub": "rapor",
          "amac": "Personeli tamamlama oranı (%40) ve zamanında bitirme oranı (%60) ağırlığıyla 0-100 arası skorlayan verimlilik raporu.",
          "neden": "'Kim daha verimli?' sorusunun objektif cevabı. Hem hızlı hem disiplinli olanı ortaya çıkarır; düşük skorda kök neden incelenir, ceza aracı değildir.",
          "nasil": [
            "'Filtreleme Yap' butonuyla tarih aralığı ve personeli seçin (filtre zorunludur).",
            "Filtreyi uygulayıp skorları hesaplatın.",
            "Yeşil (80+), mavi (50-79), kırmızı (<50) skor bantlarına göre değerlendirin.",
            "Ortalama süre ve tamamlama/zamanında oranlarını inceleyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp verimlilik skorlarını üretir",
              "sonuc": "Personel skor tablosu gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "proje"
          ],
          "ipuclari": [
            "Skor düşük tamamlama + iyi zamanında ise iş atanmamış olabilir, dağıtımı gözden geçirin.",
            "Skorun anlamlı olması için görevlerin durumlarının zamanında güncellenmiş olması gerekir."
          ]
        },
        {
          "id": "zamancizelge",
          "baslik": "Zaman Çizelgesi",
          "yol": "/ekran/proje/rapor/zamancizelge",
          "sub": "rapor",
          "amac": "Görevleri Gantt benzeri timeline üzerinde planlanan (mavi) ve gerçekleşen (turuncu) sürelerle karşılaştıran görsel rapor.",
          "neden": "Hangi görevin geciktiği, hangisinin erken bittiği tek bakışta görülür; proje yöneticisi için plan-gerçek sapmasını yönetmenin en görsel yoludur.",
          "nasil": [
            "'Filtreleme Yap' ile proje, personel ve tarih aralığı seçin (filtre zorunludur).",
            "Filtreyi uygulayıp timeline'ı oluşturun.",
            "Turuncu çubuğun mavinin sağına taşması gecikmeyi gösterir.",
            "Süre sapması pozitifse aşım, negatifse erken bitiş demektir."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp timeline'ı üretir",
              "sonuc": "Plan/gerçek çubuklu çizelge gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje",
            "personel"
          ],
          "ipuclari": [
            "Sadece plan başlangıç ve bitişi girilmiş görevler timeline'da görünür.",
            "Sürekli aşım yapan personelde iş yükü/eğitim ihtiyacını değerlendirin."
          ]
        },
        {
          "id": "gorevtamamsureanaliz",
          "baslik": "Görev Tamamlanma Analiz",
          "yol": "/ekran/proje/rapor/gorevtamamsureanaliz",
          "sub": "rapor",
          "amac": "Tamamlanmış görevlerin plan süresi ile gerçek süresini karşılaştıran, SLA ihlali dahil çok kriterli detay analiz raporu.",
          "neden": "Görevlerin gerçekte ne kadar sürdüğünü ölçüp gelecekteki planları gerçekçileştirmek ve SLA performansını denetlemek için.",
          "nasil": [
            "'Filtreleme Yap' ile tarih, proje, görev, personel, durum, öncelik, süre min/max ve SLA ihlal kriterlerini seçin.",
            "Filtreyi uygulayıp analizi çalıştırın.",
            "Plan-gerçek süre sapmasını ve SLA ihlallerini inceleyin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp analiz tablosunu üretir",
              "sonuc": "Tamamlanan görev süre tablosu gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje",
            "personel"
          ],
          "ipuclari": [
            "Yalnızca GOREV_BITIS dolu (tamamlanmış) görevler listelenir.",
            "SLA ihlal filtresiyle gecikmeli teslim edilen işleri hızlıca ayıklayabilirsiniz."
          ]
        },
        {
          "id": "kanbangorevyogunluk",
          "baslik": "Liste Yoğunluk Raporu",
          "yol": "/ekran/proje/rapor/kanbangorevyogunluk",
          "sub": "rapor",
          "amac": "Kanban listeleri ve durum kombinasyonlarındaki görev yoğunluğunu (kolon başına biriken iş adedi) gösteren rapor.",
          "neden": "WIP (aynı anda yapılan iş) limitini aşan listeler darboğaz oluşturup tüm akışı yavaşlatır. Liste başına 7-10 aktif görev sağlıklı sınır kabul edilir.",
          "nasil": [
            "'Filtreleme Yap' ile liste, durum, öncelik ve tarih aralığı seçin.",
            "Filtreyi uygulayıp yoğunluk tablosunu üretin.",
            "Renk uyarısına bakın: yeşil sağlıklı, turuncu dikkat, kırmızı darboğaz.",
            "10+ görevli listeleri dağıtın veya WIP limiti koyun."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp yoğunluk raporunu üretir",
              "sonuc": "Liste/durum bazlı görev sayısı tablosu gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje"
          ],
          "ipuclari": [
            "'Beklemede' kolonu şişmişse karar bekleyen işler birikmiş demektir, yöneticiye eskalasyon yapın.",
            "Yeni iş açmadan önce mevcutları bitirmek flow disiplinini korur."
          ]
        },
        {
          "id": "gorevgecis",
          "baslik": "Görev Durum Geçiş",
          "yol": "/ekran/proje/rapor/gorevgecis",
          "sub": "rapor",
          "amac": "Görevlerin durumdan duruma geçiş geçmişini (evrak_islem_log 804 kayıtları) kim, ne zaman, hangi aşamadan hangi aşamaya taşımış detayıyla gösteren denetim/iz raporu.",
          "neden": "İş akışındaki hareketleri denetlemek, kimin ne zaman durum değiştirdiğini kanıtlamak ve akış tıkanıklıklarını analiz etmek için.",
          "nasil": [
            "'Filtreleme Yap' ile tarih, görev, proje, personel, ana pozisyon/alt durum ve işlem tipi seçin.",
            "Filtreyi uygulayıp geçiş kayıtlarını listeleyin.",
            "Önceki -> sonraki durum sütunlarından geçiş yönünü okuyun.",
            "Çok sayfalı sonuçlarda sayfalama ile gezin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp geçiş kayıtlarını üretir",
              "sonuc": "Durum geçiş log tablosu gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje",
            "personel",
            "evrak_islem_log"
          ],
          "ipuclari": [
            "Sadece gerçek durum değişikliği olan (önceki ile sonraki pozisyon farklı) kayıtlar gösterilir.",
            "Bu rapor salt okumadır; kayıtlar durum değiştirme işlemleri sırasında otomatik oluşur."
          ]
        },
        {
          "id": "saglikrapor",
          "baslik": "Proje Sağlık Skoru",
          "yol": "/ekran/proje/rapor/saglikrapor",
          "sub": "rapor",
          "amac": "Projeleri tamamlanma oranı + iptal cezası + süre sapma cezası formülüyle 0-100 arası skorlayan bileşik KPI raporu.",
          "neden": "Aynı anda birden çok proje varken hangisinin alarm verdiğini tek bakışta görüp kaynakları doğru projeye yönlendirmek için.",
          "nasil": [
            "'Filtreleme Yap' ile proje ve tarih aralığı seçin.",
            "Filtreyi uygulayıp sağlık skorlarını hesaplatın.",
            "Yeşil (75+), turuncu (50-74), kırmızı (<50) bantlarına göre önceliklendirin.",
            "İptal sayısı yüksek projelerde planlama/brief kalitesini gözden geçirin."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp sağlık skorlarını üretir",
              "sonuc": "Proje skor tablosu gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje",
            "personel"
          ],
          "ipuclari": [
            "Her iptal edilen görev -5 puan, süre aşımı ise en fazla -30 puan ceza yazar.",
            "50 altı projeler için acil eylem planı (kapsam küçültme veya ek kaynak) gerekir."
          ]
        },
        {
          "id": "verimlilik",
          "baslik": "Proje Verimlilik Analiz",
          "yol": "/ekran/proje/rapor/verimlilik",
          "sub": "rapor",
          "amac": "Projeleri kazanılmış değer yönetimi mantığıyla CPI (maliyet), SPI (zaman/program) ve THI (toplam sağlık) endeksleriyle değerlendiren finansal-operasyonel verimlilik raporu.",
          "neden": "Bir projenin sadece zamanında değil, aynı zamanda kârlı ve verimli ilerleyip ilerlemediğini görmek için; görev süreleri ile projeye bağlı gelir/gider/masrafı birleştirir.",
          "nasil": [
            "'Filtreleme Yap' ile proje ve tarih aralığı seçin.",
            "Filtreyi uygulayıp endeksleri hesaplatın.",
            "SPI < 1 zaman geriliğini, CPI < 1 maliyet aşımını gösterir.",
            "THI (CPI x SPI) ile projenin genel sağlığını okuyun."
          ],
          "butonlar": [
            {
              "ad": "Filtrele",
              "islev": "Filtre modalını açıp verimlilik endekslerini üretir",
              "sonuc": "Proje CPI/SPI/THI tablosu gelir",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "proje",
            "cari (gelir/gider)",
            "kasa (masraf)",
            "personel"
          ],
          "ipuclari": [
            "Kazanılmış değer, IS_DURUMU=4 (Tamamlandı) görevlerin plan süresinden hesaplanır.",
            "CPI'nin anlamlı olması için gelir/gider ve masraf fişlerinde 'Bağlı Proje' seçilmiş olmalıdır."
          ]
        }
      ]
    },
    {
      "slug": "yonetim",
      "title": "Yönetim & Ayarlar",
      "icon": "⚙️",
      "modul": "ayar",
      "ad": "Yönetim / Ayarlar Modülü",
      "ozet": "Ayar modülü, işletmenin tüm ERP kurulum ve tanım ekranlarını tek çatı altında toplar: sistem/bildirim ayarları, kullanıcı ve rol yönetimi, firma bilgileri, fiş-kart numaralandırma, para birimi ve KDV tanımları, plaka/görev durum-öncelik/etiket/dosya tipi tanımları, otomasyonlar, stok maliyet yeniden hesaplama ve Excel'den toplu cari/stok içe aktarımı. Ayrıca API lisansı olan tenantlarda REST API kullanım kılavuzu burada gösterilir. Kısaca sistemin ilk kurulumu ve sürekli bakımı burada yapılır; diğer tüm modüller (fatura, kasa, stok, cari, servis, irsaliye) buradaki tanımları temel alır.",
      "modul_iliskiler": [
        "kullanici/yetki (user, user_role, user_yetki)",
        "cari (cari_kart, cari_grup, cari_hareket)",
        "stok (stok_kart, stok_grup, stok_birim, stok_hareket)",
        "fatura / irsaliye / kasa (numarator, fis_tasarim, sys_kdvoran, sys_parabirimi)",
        "irsaliye (irsaliye_plaka)",
        "servis / kesif / crm / proje (sys_durum - görev durum/öncelik)",
        "otomasyon (otomasyon, otomasyon_log)",
        "bildirim (SMS/İleti Merkezi, FCM/Firebase, Telegram, SMTP e-posta)",
        "dosya arşivi (Google Drive, Narbulut S3)",
        "Finekra e-belge entegrasyonu",
        "B2B müşteri paneli (musteri.netesnaf)",
        "REST API (api modülü / ApiKatalog)"
      ],
      "ekranlar": [
        {
          "id": "genel",
          "baslik": "Sistem Ayarları",
          "yol": "/ekran/ayar/tanim/genel",
          "sub": "tanim",
          "amac": "İşletmenin tüm sistem genel ayarlarını sekmeler halinde tek ekrandan yönetir: e-posta (SMTP), SMS (İleti Merkezi), Telegram, Push bildirim (Firebase FCM), görünüm/tema ve takvim renkleri, dosya arşivi (Google Drive / Narbulut S3), para hassasiyeti, konum-harita ve Google Maps API, B2B müşteri paneli, Finekra e-belge bağlantısı ve hızlı menü kısayolları. Ayrıca aktif modüllerin kendi ayar sekmeleri de burada gösterilir.",
          "neden": "Bildirim kanalları, arşiv, tema ve entegrasyon bilgileri burada tanımlanmadan sistem SMS/e-posta/push gönderemez, dosyaları buluta atamaz veya harita gösteremez. İlk kurulumda ve entegrasyon eklerken kullanılır.",
          "nasil": [
            "Üstteki sekmelerden (masaüstünde pill, mobilde açılır liste) ilgili ayar grubunu seçin (Bildirim, Görünüm, Dosya Arşivi, Diğer, Hızlı Menü, modül ayarları).",
            "İlgili alanları doldurun (ör. SMTP sunucu/port/kullanıcı/şifre veya SMS API anahtar/hash).",
            "Girdiğiniz bilgileri doğrulamak için ilgili 'Bağlantı Test Et' butonuna basın (E-Posta, SMS, Telegram, FCM, S3).",
            "Telegram için Bot Token'ı girip 'Otomatik Al' ile Chat ID'yi çekebilirsiniz; FCM için 'JSON Dosyasından Oku' ile Firebase servis hesabı dosyasını yükleyebilirsiniz.",
            "Görünüm sekmesinden tema rengi, dashboard düzeni ve takvim renklerini seçin.",
            "Dosya Arşivi sekmesinden Google Drive veya Narbulut S3 bağlantısını yapılandırın.",
            "En altta tek 'KAYDET' butonuna basarak tüm sekmelerdeki ayarları birlikte kaydedin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Formdaki tüm sekmelerin (BOLUM-AD biçimli) alanlarını topluca kaydeder",
              "sonuc": "sys_ayar tablosunda her ayar önce silinip BOLUM/AD/DEGER olarak yeniden yazılır; Finekra bilgisi girildiyse bağlantı doğrulanıp token saklanır",
              "renk": "primary"
            },
            {
              "ad": "E-Posta Bağlantı Test Et",
              "islev": "Girilen SMTP bilgileriyle sunucuya bağlanmayı dener (kaydetmeden)",
              "sonuc": "Bağlantı başarılı/başarısız mesajı gösterir, veri değişmez",
              "renk": "accent"
            },
            {
              "ad": "SMS Bağlantı Test Et",
              "islev": "İleti Merkezi API anahtar/hash ile kredi sorgular",
              "sonuc": "Kalan SMS kredisini veya hata mesajını gösterir",
              "renk": "accent"
            },
            {
              "ad": "Telegram Bağlantı Test Et",
              "islev": "Bot token/chat id ile test mesajı gönderir",
              "sonuc": "Bota erişim ve mesaj gönderimini doğrular",
              "renk": "accent"
            },
            {
              "ad": "Otomatik Al (Chat ID)",
              "islev": "Bot token ile getUpdates çağırıp ilk chat id'yi çeker",
              "sonuc": "Chat ID alanını otomatik doldurur",
              "renk": "accent"
            },
            {
              "ad": "FCM Bağlantı Test Et",
              "islev": "Firebase servis hesabı bilgileriyle bağlantı testi yapar",
              "sonuc": "Push altyapısının çalıştığını doğrular",
              "renk": "accent"
            },
            {
              "ad": "JSON Dosyasından Oku",
              "islev": "Firebase service account JSON dosyasını okuyup FCM alanlarını doldurur",
              "sonuc": "project_id/client_email/private_key alanları otomatik dolar",
              "renk": "accent"
            },
            {
              "ad": "Bağlantıyı Test Et (S3)",
              "islev": "Narbulut/S3 endpoint, key ve bucket bilgisiyle headBucket testi yapar",
              "sonuc": "Başarılıysa s3 BAGLANDI=1 kaydedilir ve mesaj gösterilir",
              "renk": "accent"
            },
            {
              "ad": "Google Drive Bağlantısını Yap / Kapat",
              "islev": "OAuth ile Drive'a bağlanır veya bağlantıyı keser",
              "sonuc": "Google Drive arşiv bağlantısı açılır/kapanır",
              "renk": "accent"
            },
            {
              "ad": "Kaydet / Sil (Hızlı Menü)",
              "islev": "Her modül sayfası için özel kısayol adı kaydeder veya siler",
              "sonuc": "hizli_menu tablosuna kayıt eklenir/silinir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "ayarkaydet",
              "tetik": "KAYDET butonu",
              "etki": "sys_ayar tablosunda ilgili FID'in her ayarı BOLUM/AD bazında silinip yeniden eklenir; Finekra e-posta girildiyse authenticate edilip TOKEN/TOKEN_EXPIRATION saklanır",
              "neden_sonuc": "Tüm sistem ayarları tek seferde güncellenir. Kaydetmezseniz test ettiğiniz bilgiler kalıcı olmaz; yanlış SMTP/SMS bilgisi kaydederseniz bildirimler gönderilemez."
            },
            {
              "ad": "epostasmptest",
              "tetik": "E-Posta Bağlantı Test Et",
              "etki": "Veri yazmaz; PHPMailer ile SMTP'ye bağlanır",
              "neden_sonuc": "Kaydetmeden e-posta ayarlarının doğruluğunu görürsünüz; test etmezseniz hatalı ayarı fark etmeden kaydedebilirsiniz."
            },
            {
              "ad": "smstest",
              "tetik": "SMS Bağlantı Test Et",
              "etki": "Veri yazmaz; İleti Merkezi bakiye sorgular",
              "neden_sonuc": "API bilgisinin geçerliliğini ve kredi durumunu doğrular."
            },
            {
              "ad": "telegramtest",
              "tetik": "Telegram Bağlantı Test Et",
              "etki": "Veri yazmaz; Telegram'a test mesajı gönderir",
              "neden_sonuc": "Bot ve chat id doğruysa mesaj ulaşır; yanlışsa otomasyon bildirimleri Telegram'a gitmez."
            },
            {
              "ad": "telegramchatidal",
              "tetik": "Otomatik Al",
              "etki": "Veri yazmaz; getUpdates ile chat id döner",
              "neden_sonuc": "Chat ID'yi elle bulmak yerine otomatik alırsınız; bota önce mesaj atılmamışsa boş döner."
            },
            {
              "ad": "fcmtest",
              "tetik": "FCM Bağlantı Test Et",
              "etki": "Veri yazmaz; Firebase bağlantısını test eder",
              "neden_sonuc": "Push bildirim altyapısının hazır olduğunu doğrular."
            },
            {
              "ad": "s3baglantitest",
              "tetik": "Bağlantıyı Test Et (S3)",
              "etki": "Başarılıysa config s3 BAGLANDI=1 yazar",
              "neden_sonuc": "Dosya arşivi buluta bağlanır; test geçmezse yüklenen dosyalar arşivlenemez."
            },
            {
              "ad": "hizlimenukaydet",
              "tetik": "Hızlı Menü satırındaki Kaydet",
              "etki": "hizli_menu tablosuna kayıt ekler",
              "neden_sonuc": "Sık kullanılan sayfaları kısayol menüsüne alırsınız."
            },
            {
              "ad": "hizlimenusil",
              "tetik": "Hızlı Menü satırındaki Sil",
              "etki": "hizli_menu kaydını siler",
              "neden_sonuc": "Kısayolu menüden kaldırır."
            }
          ],
          "iliskiler": [
            "bildirim (SMS/FCM/Telegram/SMTP)",
            "dosya arşivi (Google Drive/S3)",
            "Finekra e-belge",
            "servis (Google Maps API)",
            "B2B müşteri paneli",
            "tüm modüller (modül ayar sekmeleri + hızlı menü)"
          ],
          "ipuclari": [
            "Bir bilgiyi girmeden 'test' butonuna basmak yerine önce alanları doldurun; test kaydetmeden çalışır ama kalıcı olması için mutlaka KAYDET'e basın.",
            "Bildirim kurallarını (hangi olayda hangi kanaldan mesaj) bu ekran değil, Otomasyonlar ekranı yönetir; burada sadece kanal bağlantı bilgileri tutulur.",
            "Google Maps kullanımı ücretli olabilir; her firma kendi API key'ini kendi Google Cloud hesabından girer.",
            "'Kayıtları Etiketle' EVET yapılırsa menüde Kayıt Etiketleri ekranı görünür hale gelir."
          ]
        },
        {
          "id": "roller",
          "baslik": "Kullanıcı Rolleri",
          "yol": "/ekran/ayar/kullanici/roller",
          "sub": "kullanici",
          "amac": "Tanımlı kullanıcı rollerini (yetki şablonlarını) listeler; durumlarını gösterir, düzenleme ve silme imkanı sunar. Yeni rol ekleme rol formuna yönlendirir.",
          "neden": "Her kullanıcıya tek tek yetki vermek yerine rol şablonları oluşturup kullanıcılara atamak yönetimi kolaylaştırır. Personel işe alım/çıkışında yetkileri hızlı standartlaştırır.",
          "nasil": [
            "Ekranda mevcut roller ve aktif/pasif durumları listelenir.",
            "Yeni rol için sağ üstteki 'Yeni Rol' butonuna basın.",
            "Var olan rolü değiştirmek için satırdaki 'DÜZENLE' ile rol formunu açın, yetki ağacından ekran ve işlem yetkilerini seçin.",
            "Gereksiz rolü 'SİL' ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Rol",
              "islev": "Rol tanım formunu açar",
              "sonuc": "Rol ekleme/düzenleme ekranına gider",
              "renk": "primary"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili rolü düzenleme modunda açar",
              "sonuc": "Rolün yetkileri değiştirilebilir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Rolü siler (onay ister)",
              "sonuc": "user_role kaydı kaldırılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "rolekle",
              "tetik": "Rol formunda Kaydet",
              "etki": "user_role tablosuna rol adı (ROL_TANIM) ve ROL_DATA (JSON ekran+event yetki listesi) eklenir/güncellenir",
              "neden_sonuc": "Rolü ve içindeki ekran/işlem yetkilerini tanımlarsınız; eksik tanımlarsanız o role atanan kullanıcılar ilgili sayfaları göremez. Ekran yetkisi verince o ekranın alt sayfaları (PAGE) otomatik eklenir."
            },
            {
              "ad": "rolsil",
              "tetik": "SİL butonu (onaylı)",
              "etki": "İlgili user_role rol kaydı silinir",
              "neden_sonuc": "Kullanılmayan rolü sistemden çıkarır; role atanmış kullanıcılar varsa yetkileri etkilenebilir, önce kontrol edin."
            }
          ],
          "iliskiler": [
            "kullanici (user_yetki)",
            "tüm modüller (yetki ağacı)"
          ],
          "ipuclari": [
            "Rol silmeden önce o role atanmış kullanıcı olup olmadığını kontrol edin.",
            "Yetki ağacında ekran yetkisi verirken alt sayfalar (PAGE) otomatik eklenir."
          ]
        },
        {
          "id": "liste",
          "baslik": "Kullanıcılar",
          "yol": "/ekran/ayar/kullanici/liste",
          "sub": "kullanici",
          "amac": "Firmadaki tüm kullanıcıları (yetkili/personel) durum, iletişim bilgisi ve tipiyle listeler; şifre değiştirme, düzenleme ve silme kısayolları sunar.",
          "neden": "Personelin sisteme erişimini yönetmek için gereklidir. Yeni personel ekleme, işten ayrılanı pasife alma, şifre sıfırlama buradan yapılır.",
          "nasil": [
            "Listede kullanıcıların aktif/pasif durumu, adı, tipi ve iletişimi görünür.",
            "Yeni kullanıcı için 'Yeni Kullanıcı' butonuna basın ve bilgileri, yetkileri girin.",
            "Bir kullanıcının şifresini sıfırlamak için 'ŞİFRE DEĞİŞTİR'e basın.",
            "Bilgi/yetki güncellemek için 'DÜZENLE', erişimi kaldırmak için 'SİL' kullanın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Kullanıcı",
              "islev": "Kullanıcı ekleme formunu açar",
              "sonuc": "Yeni kullanıcı kaydı oluşturma ekranına gider",
              "renk": "primary"
            },
            {
              "ad": "ŞİFRE DEĞİŞTİR",
              "islev": "Seçili kullanıcının şifre sıfırlama ekranını açar",
              "sonuc": "Kullanıcıya yeni şifre atanır",
              "renk": "accent"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Kullanıcı bilgilerini ve yetkilerini düzenler",
              "sonuc": "user kaydı ve yetkileri güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Kullanıcıyı siler (onay ister)",
              "sonuc": "user DURUM=-1 yapılır, yetkileri temizlenir",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "kullaniciekle",
              "tetik": "Kullanıcı formunda Kaydet",
              "etki": "user tablosuna kullanıcı eklenir/güncellenir; user_yetki'ye seçilen ekran+işlem yetkileri yazılır",
              "neden_sonuc": "Personelin giriş bilgilerini ve hangi ekranları görebileceğini belirlersiniz. Yetki verilmezse kullanıcı hiçbir sayfayı açamaz."
            },
            {
              "ad": "kullanicisil",
              "tetik": "SİL (onaylı)",
              "etki": "user DURUM=-1 (soft delete, FID izolasyonlu); user_yetki kayıtları FID sınırlı silinir",
              "neden_sonuc": "Ayrılan personelin erişimi kesilir; kayıt tamamen silinmediği için geçmiş işlemler korunur."
            },
            {
              "ad": "sifredegistir",
              "tetik": "ŞİFRE DEĞİŞTİR ekranında Kaydet",
              "etki": "user SIFRE alanı yeni şifreyle güncellenir (FID izolasyonlu, kullanıcı bulunamazsa işlem yapılmaz)",
              "neden_sonuc": "Kullanıcı şifresini sıfırlarsınız; çapraz-firma şifre sıfırlama engellenir."
            }
          ],
          "iliskiler": [
            "kullanici/roller",
            "yetki sistemi (user_yetki)",
            "sube (şube yönetimi / şube izolasyonu)"
          ],
          "ipuclari": [
            "Sadece kendi kayıtlarını görebilsin isteniyorsa kullanıcı formunda 'Sadece Kendi' seçeneğini işaretleyin.",
            "Kullanıcıyı silmek yerine pasife almak geçmiş işlemleri korur.",
            "Şube izolasyonu: Çok şubeli ve şube lisansı olan işletmelerde kullanıcı formundaki 'yalnız kendi şubesini görsün' seçeneği o kullanıcıyı tamamen kendi şubesine kısıtlar; işaretli kullanıcı yalnız kendi şubesinin belgelerini, raporlarını, panolarını ve Hızlı Satış/kasa ekranını görür, başka şube verisi (yazdırma dahil) kapanır. Kullanıcı bazında opt-in; yöneticiler tüm şubeleri görür; tek şubeli işletmede seçenek görünmez."
          ]
        },
        {
          "id": "firmabilgileri",
          "baslik": "Firma Bilgileri",
          "yol": "/ekran/ayar/tanim/firmabilgileri",
          "sub": "tanim",
          "amac": "Firmanın ünvan, yetkili, adres, vergi dairesi/no, telefon/GSM, e-posta, web, ülke/şehir/ilçe ve logo bilgilerini düzenler. Bu bilgiler fatura, teklif ve diğer basılı evraklarda kullanılır.",
          "neden": "Fatura/irsaliye/teklif çıktılarında ve e-belge gönderiminde firma kimliği bu ekrandaki bilgilerden gelir. Yanlış/eksik olursa resmi evraklar hatalı basılır.",
          "nasil": [
            "Açılan formda mevcut firma bilgileri dolu gelir.",
            "Güncellemek istediğiniz alanları düzenleyin (ünvan, vergi no, adres, iletişim).",
            "İsterseniz 'Logo' alanından yeni logo dosyası seçin (çıktılarda görünür).",
            "KAYDET ile güncelleyin."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Firma bilgilerini kaydeder",
              "sonuc": "main_firma kaydı güncellenir, logo yüklendiyse saklanır",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Değişiklikleri iptal eder",
              "sonuc": "Form kapanır, kayıt yapılmaz",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "firmabilgiduzenle",
              "tetik": "KAYDET butonu",
              "etki": "main_firma tablosunda firmanın ünvan/ad-soyad/yetkili/adres/vergi/iletişim/ülke-şehir-ilçe alanları güncellenir; logo yüklendiyse dosya saklanıp LOGO alanı yazılır",
              "neden_sonuc": "Resmi belgelerdeki firma kimliği düzelir; yanlış vergi no/ünvan girilirse tüm faturalarda hatalı görünür."
            }
          ],
          "iliskiler": [
            "fatura / teklif / irsaliye (evrak başlığı)",
            "e-belge entegrasyonları"
          ],
          "ipuclari": [
            "Logo yüklerken net ve yüksek çözünürlüklü görsel kullanın; çıktı kalitesini etkiler.",
            "Vergi dairesi ve numarasını e-fatura gönderiminden önce mutlaka doğru girin."
          ]
        },
        {
          "id": "fisler",
          "baslik": "Fiş ve Kart No",
          "yol": "/ekran/ayar/tanim/fisler",
          "sub": "tanim",
          "amac": "Tüm evrak tiplerinin (fatura, irsaliye, kasa fişi, sipariş, teklif vb.) numaralandırma kurallarını yönetir: ön ek, son ek, uzunluk, numara tipi (genel/günlük sıra) ve son sıra no. Ayrıca evrak tasarımı, yeni tasarım ekleme ve fiş numaralayıcı kopyalama sağlar.",
          "neden": "Evrak numaralarının düzenli, tekrarsız ve firmaya özgü (ör. FT2026-000123) üretilmesi için gereklidir. Yanlış ayar mükerrer veya atlamalı numaralara yol açar.",
          "nasil": [
            "Listede her evrak tipi ve alt fişleri, mevcut numara ayarlarıyla görünür.",
            "Bir fişin numaralandırmasını değiştirmek için 'DÜZENLE'ye basın, açılan pencerede ön/son ek, uzunluk ve son sıra no'yu ayarlayıp kaydedin.",
            "Evrak baskı şablonunu düzenlemek için 'TASARIM' butonunu kullanın.",
            "Aynı evrak tipinden yeni bir numaralayıcı türetmek için 'KOPYALA'ya basın; başlık, ön/son ek ve isteğe bağlı baskı tasarımını seçin.",
            "'Kullanıcı' alanından bir veya birden fazla kullanıcı seçerseniz, seçtiğiniz her kullanıcı o evrak tipinde kendi seri ve sırasını tutar (ör. iki satış temsilcisinin faturaları ayrı serilerden ilerler). Zaten numaralayıcısı olan kullanıcı atlanır ve adıyla bildirilir. Kopyalanan serinin sayacı sıfırdan başlar."
          ],
          "butonlar": [
            {
              "ad": "DÜZENLE",
              "islev": "Fiş numarası ayar penceresini açar",
              "sonuc": "Numara ön/son ek, uzunluk, tip ve son sıra güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "TASARIM",
              "islev": "Evrak baskı tasarımcısını açar",
              "sonuc": "Fiş çıktı şablonu düzenlenir",
              "renk": "accent"
            },
            {
              "ad": "KOPYALA",
              "islev": "Mevcut numaralayıcıyı seçtiğiniz kullanıcılara çoğaltma penceresini açar",
              "sonuc": "Seçilen her kullanıcı için ayrı bir numaralayıcı (ve istenirse baskı tasarımı kopyası) oluşur; her biri kendi seri ve sırasını tutar",
              "renk": "accent"
            },
            {
              "ad": "SİL",
              "islev": "Alt fiş numaralayıcısını siler (onaylı)",
              "sonuc": "İlgili numarator kaydı kaldırılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "fisduzenle",
              "tetik": "Fiş Düzenleme penceresinde KAYDET",
              "etki": "numarator tablosunda NO_ONEK/NO_SONEK/NO_UZUNLUK/NO_TIP/NO_ENSON güncellenir",
              "neden_sonuc": "Evrak numara biçimini belirlersiniz. Son sıra no'yu yanlış ayarlarsanız mevcut evrakla çakışan numara üretilir."
            },
            {
              "ad": "yenitasarimekle",
              "tetik": "Tasarım ekleme aksiyonu",
              "etki": "fis_tasarim tablosuna, seçili numaratorun EVRAK_TIP'i ve mevcut tasarımın veri şablonu (DATAFILE/DATAMODULE) baz alınarak yeni bir baskı şablonu eklenir",
              "neden_sonuc": "Evrak için yeni bir baskı şablonu oluşturur; farklı format/kopya baskılar hazırlarsınız."
            },
            {
              "ad": "fisnokopyala",
              "tetik": "Fiş Kopyalama formunda KAYDET",
              "etki": "Kaynak numaralayıcıdan yeni numarator (ve seçilirse tasarım) türetilir",
              "neden_sonuc": "Farklı seri/kullanıcı için ayrı numara akışı kurarsınız."
            },
            {
              "ad": "fisnosil",
              "tetik": "SİL (onaylı)",
              "etki": "Seçili alt numarator kaydı kaldırılır",
              "neden_sonuc": "Gereksiz numara serisini kaldırır; kullanımdaki seriyi silerseniz o evrak tipi numara alamaz."
            }
          ],
          "iliskiler": [
            "fatura / irsaliye / kasa / sipariş / teklif (numarator)",
            "fis_tasarim (evrak tasarımı)",
            "kullanici (kopyalamada kullanıcı ataması)"
          ],
          "ipuclari": [
            "Yıl başında son sıra no'yu sıfırlamak/ayarlamak isterseniz dikkatli olun; mevcut evrak numaralarıyla çakışmasın.",
            "GENEL SIRA sürekli artar, GÜNLÜK SIRA her gün 1'den başlar.",
            "Masraf kartları kendi serisini kullanır: eskiden kasa & banka kartlarıyla aynı numara sırasını paylaşıyorlardı, artık MSR ile başlayan kendi serilerinden numara alırlar. Mevcut masraf kartlarının kodları değiştirilmedi. Bu seriye kendi ön ekinizi vermek için listedeki \"Masraf Kartı\" satırında DÜZENLE deyin."
          ]
        },
        {
          "id": "parabirimi",
          "baslik": "Para Birimleri",
          "yol": "/ekran/ayar/tanim/parabirimi",
          "sub": "tanim",
          "amac": "Kullanılacak para birimlerini (TL, USD, EUR vb.) kod, sembol, alt birim ve kur çarpanıyla tanımlar. Bir birim varsayılan (yerel) para birimi olur; diğerlerinin kuru TCMB'den güncellenebilir.",
          "neden": "Döviz cinsinden fatura/teklif kesmek ve yerel para karşılığını doğru hesaplamak için gereklidir. Yanlış kur, tüm döviz belgelerinin TL karşılığını bozar.",
          "nasil": [
            "Yeni birim için formda kod, ad, sembol, alt birim ve çarpanı girin.",
            "Yerel para birimini 'Varsayılan: EVET' yaparak belirleyin (çarpanı 1 olur).",
            "Döviz birimlerinin güncel kurunu çekmek için 'T.C.M.B Den Kur Güncelle'ye basın.",
            "KAYDET ile ekleyin; listeden mevcut birimleri DÜZENLE/SİL yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Para birimini ekler/günceller",
              "sonuc": "sys_parabirimi kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "T.C.M.B Den Kur Güncelle",
              "islev": "Varsayılan dışı tüm birimlerin kurunu TCMB satış kuruyla günceller",
              "sonuc": "İlgili birimlerin CARPAN ve kur güncelleme zamanı yenilenir",
              "renk": "accent"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu iptal eder",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili para birimini düzenler",
              "sonuc": "Birim bilgileri değiştirilir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Para birimini siler (onaylı)",
              "sonuc": "sys_parabirimi DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "parabirimiekle",
              "tetik": "KAYDET butonu",
              "etki": "sys_parabirimi'ye birim eklenir/güncellenir; varsayılan seçilirse eski varsayılan kaldırılır. Varsayılan değilse çarpan sıfır/negatif olamaz (kontrol edilir)",
              "neden_sonuc": "Döviz ve alt birim tanımlarını yaparsınız; yanlış çarpan döviz belgelerinin TL karşılığını hatalı hesaplar."
            },
            {
              "ad": "parabirimisil",
              "tetik": "SİL (onaylı)",
              "etki": "sys_parabirimi DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan birimi kaldırır; kullanımdaki birimi silmeyin, geçmiş evraklar etkilenir."
            },
            {
              "ad": "kurguncelle",
              "tetik": "T.C.M.B Den Kur Güncelle",
              "etki": "Varsayılan olmayan birimlerin CARPAN'ı TCMB satış kuruyla güncellenir",
              "neden_sonuc": "Güncel döviz kuru sisteme yansır; TCMB'ye ulaşılamazsa hata verir ve güncellenmez."
            }
          ],
          "iliskiler": [
            "fatura / teklif / sipariş / kasa (döviz tutarları)",
            "TCMB kur servisi"
          ],
          "ipuclari": [
            "Sadece bir para birimi varsayılan olabilir; varsayılanın çarpanı her zaman 1'dir.",
            "Kuru güncel tutmak için düzenli olarak TCMB güncellemesini kullanın."
          ]
        },
        {
          "id": "kdvorani",
          "baslik": "KDV Oranları",
          "yol": "/ekran/ayar/tanim/kdvorani",
          "sub": "tanim",
          "amac": "Kullanılacak KDV oranlarını (ör. %1, %10, %20) ad ve oranla tanımlar; bir oranı varsayılan yapar. Fatura/teklif satırlarında bu oranlar seçilir.",
          "neden": "Faturalarda doğru KDV hesabı için tanımlı oranlar gerekir. Varsayılan oran yeni satırlarda otomatik gelir, işlem hızını artırır.",
          "nasil": [
            "Formda KDV adı ve oranını girin.",
            "En sık kullandığınız oranı 'Varsayılan: EVET' yapın.",
            "Durumu Aktif bırakıp KAYDET'e basın.",
            "Listeden mevcut oranları DÜZENLE/SİL yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "KDV oranını ekler/günceller",
              "sonuc": "sys_kdvoran kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu iptal eder",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili oranı düzenler",
              "sonuc": "KDV oranı güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Oranı siler (onaylı)",
              "sonuc": "sys_kdvoran DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "kdvoraniekle",
              "tetik": "KAYDET butonu",
              "etki": "sys_kdvoran'a oran eklenir/güncellenir; varsayılan seçilirse diğerlerinin varsayılanı kaldırılır",
              "neden_sonuc": "Fatura satırlarında seçilebilen KDV oranını tanımlarsınız; yanlış oran vergi hesabını bozar."
            },
            {
              "ad": "kdvoranisil",
              "tetik": "SİL (onaylı)",
              "etki": "sys_kdvoran DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan oranı kaldırır; kullanımdaki oranı silmeyin."
            }
          ],
          "iliskiler": [
            "fatura / teklif / sipariş / stok (satır KDV)"
          ],
          "ipuclari": [
            "Her zaman bir varsayılan oran bırakın; yoksa yeni satırlarda oran boş gelebilir.",
            "Mevzuat değişikliklerinde eski oranı silmek yerine pasife almak geçmiş belgeleri korur."
          ]
        },
        {
          "id": "plaka",
          "baslik": "Plakalar",
          "yol": "/ekran/ayar/tanim/plaka",
          "sub": "tanim",
          "amac": "İrsaliyelerde kullanılacak taşıt plakalarını tanımlar. İrsaliye düzenlerken listeden plaka seçilir.",
          "neden": "Sevk irsaliyesinde taşıyıcı araç plakasının doğru ve hızlı seçilmesi için önceden tanımlanması gerekir.",
          "nasil": [
            "Formda taşıt plakasını girin ve durumu Aktif seçin.",
            "KAYDET ile ekleyin.",
            "Listeden mevcut plakaları DÜZENLE/SİL yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Plakayı ekler/günceller",
              "sonuc": "irsaliye_plaka kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu iptal eder",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili plakayı düzenler",
              "sonuc": "Plaka bilgisi güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Plakayı siler (onaylı)",
              "sonuc": "irsaliye_plaka DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "plakaekle",
              "tetik": "KAYDET butonu",
              "etki": "irsaliye_plaka tablosuna plaka eklenir/güncellenir",
              "neden_sonuc": "İrsaliyede seçilebilen araç plakasını tanımlarsınız."
            },
            {
              "ad": "plakasil",
              "tetik": "SİL (onaylı)",
              "etki": "irsaliye_plaka DURUM=-1 (soft delete, FID izolasyonlu)",
              "neden_sonuc": "Kullanılmayan plakayı kaldırır."
            }
          ],
          "iliskiler": [
            "irsaliye (taşıyıcı/plaka alanı)"
          ],
          "ipuclari": [
            "Sık kullandığınız araçların plakalarını önceden tanımlarsanız irsaliye kesme hızlanır."
          ]
        },
        {
          "id": "gorevdurum",
          "baslik": "Görev Durumları",
          "yol": "/ekran/ayar/tanim/gorevdurum",
          "sub": "tanim",
          "amac": "Servis/keşif/CRM/proje görevlerinin durumlarını (ör. Yeni, Devam Ediyor, Tamamlandı) ad, sıra, arkaplan/yazı rengi ve sabit grup eşlemesiyle tanımlar.",
          "neden": "Görev takip panolarında (kanban vb.) durumların renkli ve sıralı görünmesi iş akışını netleştirir. Bu ekran yalnızca servis/keşif/CRM lisansı olan tenantta menüde görünür.",
          "nasil": [
            "Kullanım yerini (sabit grup) seçin.",
            "Durum adını, sırasını ve renklerini girin.",
            "Aktif seçip KAYDET'e basın.",
            "Listeden mevcut durumları DÜZENLE/SİL yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Görev durumunu ekler/günceller",
              "sonuc": "sys_durum (MODULE_KEY=gorev_durum) kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu iptal eder",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili durumu düzenler",
              "sonuc": "Durum bilgisi güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Durumu siler (onaylı)",
              "sonuc": "sys_durum DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "gorevdurumekle",
              "tetik": "KAYDET butonu",
              "etki": "sys_durum tablosuna gorev_durum kaydı eklenir/güncellenir (ad, sıra, renk, sabit grup)",
              "neden_sonuc": "Görev panosundaki durum kolonlarını tanımlarsınız; sabit grup eşlemesi yanlışsa görev akışı hatalı sınıflanır."
            },
            {
              "ad": "gorevdurumsil",
              "tetik": "SİL (onaylı)",
              "etki": "sys_durum DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan durumu kaldırır; kullanımdaki durumu silerseniz o durumdaki görevler sahipsiz kalabilir."
            }
          ],
          "iliskiler": [
            "servis",
            "kesif",
            "crm",
            "proje (görev durumları)"
          ],
          "ipuclari": [
            "Sıra numarası pano kolon sırasını belirler.",
            "Renk kontrastına dikkat edin; yazı ve arkaplan rengi okunur olmalı."
          ]
        },
        {
          "id": "gorevoncelik",
          "baslik": "Görev Öncelikleri",
          "yol": "/ekran/ayar/tanim/gorevoncelik",
          "sub": "tanim",
          "amac": "Görevlerin öncelik seviyelerini (ör. Düşük, Normal, Yüksek, Acil) ad, sıra ve renklerle tanımlar. Servis/keşif/CRM/proje görevlerinde kullanılır.",
          "neden": "Görevlerin aciliyetine göre renkli ve sıralı gösterilmesi ekiplerin doğru önceliklendirme yapmasını sağlar. Bu ekran yalnızca ilgili modül lisansı olan tenantta menüde görünür.",
          "nasil": [
            "Öncelik adını, sırasını ve renklerini girin.",
            "Aktif seçip KAYDET'e basın.",
            "Listeden mevcut öncelikleri DÜZENLE/SİL yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Görev önceliğini ekler/günceller",
              "sonuc": "sys_durum (MODULE_KEY=gorev_oncelik) kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Formu iptal eder",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili önceliği düzenler",
              "sonuc": "Öncelik bilgisi güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Önceliği siler (onaylı)",
              "sonuc": "sys_durum DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "gorevoncelikekle",
              "tetik": "KAYDET butonu",
              "etki": "sys_durum tablosuna gorev_oncelik kaydı eklenir/güncellenir",
              "neden_sonuc": "Görevlerde seçilebilen öncelik seviyelerini tanımlarsınız."
            },
            {
              "ad": "gorevonceliksil",
              "tetik": "SİL (onaylı)",
              "etki": "sys_durum DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan önceliği kaldırır; kullanımdakini silmeyin."
            }
          ],
          "iliskiler": [
            "servis",
            "kesif",
            "crm",
            "proje (görev öncelikleri)"
          ],
          "ipuclari": [
            "Acil/yüksek öncelikleri dikkat çekici renklerle işaretleyin.",
            "Sıra alanı öncelik listesinin gösterim düzenini belirler."
          ]
        },
        {
          "id": "kayitgruplari",
          "baslik": "Kayıt Etiketleri",
          "yol": "/ekran/ayar/tanim/kayitgruplari",
          "sub": "tanim",
          "amac": "Kayıtları etiketlemek/gruplamak için genel etiketler (ad, sıra, durum) tanımlar. Yalnızca Genel Ayarlar'da 'Kayıtları Etiketle' EVET seçilince menüde görünür.",
          "neden": "Kayıtları renkli/isimli etiketlerle sınıflandırmak filtreleme ve raporlamayı kolaylaştırır.",
          "nasil": [
            "Etiket adını ve sırasını girin.",
            "Durumu Aktif seçin.",
            "KAYDET ile ekleyin; listeden DÜZENLE/SİL yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Etiketi ekler/günceller",
              "sonuc": "kayit_gruplari (YER=GENEL) kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Listeye geri döner",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili etiketi düzenler",
              "sonuc": "Etiket güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Etiketi siler (onaylı)",
              "sonuc": "kayit_gruplari DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "kayitgrupekle",
              "tetik": "KAYDET butonu",
              "etki": "kayit_gruplari tablosuna YER=GENEL etiket eklenir/güncellenir",
              "neden_sonuc": "Kayıtlara atanabilen etiketleri tanımlarsınız."
            },
            {
              "ad": "kayitgrupsil",
              "tetik": "SİL (onaylı)",
              "etki": "kayit_gruplari DURUM=-1 (soft delete)",
              "neden_sonuc": "Kullanılmayan etiketi kaldırır."
            }
          ],
          "iliskiler": [
            "kayıt etiketleme kullanan modüller (cari/stok vb.)"
          ],
          "ipuclari": [
            "Bu ekran menüde yoksa Genel Ayarlar > Diğer > 'Kayıtları Etiketle' seçeneğini EVET yapın."
          ]
        },
        {
          "id": "dosyatipleri",
          "baslik": "Dosya Tipleri",
          "yol": "/ekran/ayar/tanim/dosyatipleri",
          "sub": "tanim",
          "amac": "Dosya arşivinde kullanılacak dosya/evrak tiplerini (yer, ad, sıra) tanımlar. Yalnızca dosya arşivi aktif (arşiv türü YOK değil) olduğunda menüde görünür.",
          "neden": "Arşive yüklenen belgelerin türlere göre sınıflandırılması, aranması ve düzenli tutulması için gereklidir.",
          "nasil": [
            "Evrak yerini (dosyanın hangi ekrana/kategoriye ait olduğunu) seçin.",
            "Dosya tipi adını ve sırasını girin.",
            "Aktif seçip KAYDET'e basın.",
            "Listeden mevcut tipleri DÜZENLE/SİL yapabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "KAYDET",
              "islev": "Dosya tipini ekler/günceller",
              "sonuc": "dosya_tip kaydı oluşur/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Listeye geri döner",
              "sonuc": "Kayıt yapılmaz",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili tipi düzenler",
              "sonuc": "Dosya tipi güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Tipi siler (onaylı)",
              "sonuc": "İlgili kayıt pasife alınır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "dosyatipekle",
              "tetik": "KAYDET butonu",
              "etki": "dosya_tip tablosuna yer (YER)/ad (TANIM)/sıra ile tip eklenir/güncellenir",
              "neden_sonuc": "Arşivde belgeleri sınıflamak için kullanılan tipleri tanımlarsınız."
            },
            {
              "ad": "kayitgrupsil",
              "tetik": "SİL (onaylı)",
              "etki": "Silme işlemi paylaşılan 'kayitgrupsil' aksiyonu üzerinden çağrılır; ilgili tanım kaydı DURUM=-1 (pasif) yapılır",
              "neden_sonuc": "Kullanılmayan dosya tipini listeden kaldırır."
            }
          ],
          "iliskiler": [
            "dosya arşivi (Google Drive / S3)",
            "belge ekleme yapan modüller"
          ],
          "ipuclari": [
            "Bu ekran menüde yoksa Genel Ayarlar > Dosya Arşivi'nden bir arşiv türü seçin.",
            "Dosya tiplerini yerine (evrak kategorisine) göre gruplayarak tanımlayın."
          ]
        },
        {
          "id": "otomasyonlar",
          "baslik": "Otomasyonlar",
          "yol": "/ekran/ayar/tanim/otomasyonlar",
          "sub": "tanim",
          "amac": "Belirli olaylar (tetikleyiciler) gerçekleştiğinde koşullara göre otomatik aksiyonlar (In-App bildirim, Push/FCM, SMS, E-Posta, Telegram, Webhook) çalıştıran kuralları listeler ve yönetir. Her kural için çalışma sayısı ve son çalışma zamanı görünür.",
          "neden": "Manuel takip gerektiren işleri (ör. yeni fatura kesilince müşteriye SMS, stok azalınca yöneticiye bildirim) otomatikleştirerek zaman kazandırır ve unutulmayı önler. Bildirim kanallarının bağlantı bilgileri Genel Ayarlar'dan gelir.",
          "nasil": [
            "Listede tanımlı otomasyonlar; tetikleyici, modül, çalışma sayısı ve durumla görünür.",
            "Yeni kural için 'Yeni Otomasyon' butonuna basın; tetikleyici, koşullar ve aksiyonları tanımlayın.",
            "Bir kuralı açıp/kapatmak için soldaki aç-kapa (toggle) ikonuna tıklayın.",
            "Geçmiş çalışmaları görmek için 'Loglar' butonunu kullanın.",
            "Kuralı DÜZENLE/SİL ile yönetin."
          ],
          "butonlar": [
            {
              "ad": "Yeni Otomasyon",
              "islev": "Otomasyon tanım formunu açar",
              "sonuc": "Yeni kural oluşturma ekranına gider",
              "renk": "primary"
            },
            {
              "ad": "Loglar",
              "islev": "Otomasyon çalışma geçmişi ekranını açar",
              "sonuc": "otomasyon_log kayıtları listelenir",
              "renk": "accent"
            },
            {
              "ad": "Durum Aç/Kapa (toggle)",
              "islev": "Kuralı aktif/pasif yapar",
              "sonuc": "otomasyon DURUM 1/0 arası değişir",
              "renk": "ghost"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Seçili kuralı düzenler",
              "sonuc": "Otomasyon güncellenir",
              "renk": "ghost"
            },
            {
              "ad": "SİL",
              "islev": "Kuralı siler (onaylı)",
              "sonuc": "otomasyon DURUM=-1 yapılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "otomasyonkaydet",
              "tetik": "Otomasyon formunda Kaydet",
              "etki": "otomasyon tablosuna ad, tetikleyici, modül, koşullar (JSON) ve aksiyonlar (JSON) eklenir/güncellenir; ilk oluşturmada OLUSTURAN_ID ve OLUSTURMA_TARIH yazılır",
              "neden_sonuc": "Bir olay olduğunda otomatik yapılacak işi tanımlarsınız. Koşulları yanlış kurarsanız bildirim beklenmedik durumlarda gider/gitmez."
            },
            {
              "ad": "otomasyonsil",
              "tetik": "SİL (onaylı)",
              "etki": "otomasyon DURUM=-1 (soft delete, FID izolasyonlu)",
              "neden_sonuc": "Kuralı devre dışı bırakıp kaldırır."
            },
            {
              "ad": "otomasyondurumdegistir",
              "tetik": "Toggle ikonu",
              "etki": "otomasyon DURUM 1↔0 çevrilir",
              "neden_sonuc": "Kuralı silmeden geçici olarak durdurup tekrar başlatabilirsiniz."
            },
            {
              "ad": "otomasyonlogtemizle",
              "tetik": "Log ekranındaki temizleme aksiyonu",
              "etki": "otomasyon_log tablosundan seçilen günden eski (veya tüm) kayıtlar silinir",
              "neden_sonuc": "Log tablosunu küçültüp performansı korursunuz."
            }
          ],
          "iliskiler": [
            "bildirim kanalları (Genel Ayarlar: SMS/FCM/Telegram/SMTP)",
            "tetikleyen modüller (fatura, stok, servis vb. otomasyon_trigger üreten modüller)",
            "otomasyon_log"
          ],
          "ipuclari": [
            "Otomasyon çalışması için kullanılan kanalın (SMS/Telegram/FCM/SMTP) bağlantı bilgisi Genel Ayarlar'da tanımlı ve test edilmiş olmalı.",
            "Bir kuralı silmeden test için toggle ile pasife alabilirsiniz.",
            "Log tablosu büyürse düzenli temizleyin."
          ]
        },
        {
          "id": "stokmaliyethesapla",
          "baslik": "Stok Maliyet Hesapla",
          "yol": "/ekran/ayar/tanim/stokmaliyethesapla",
          "sub": "tanim",
          "amac": "Geçmiş stok çıkış (satış) hareketlerine tüketim bazlı AVG / FIFO / LIFO / Son Alış maliyet değerlerini toplu olarak yeniden hesaplayıp yazar. İlerleme, işlenen/hata sayısı ve canlı log ile takip edilir.",
          "neden": "Karlılık raporları bu maliyet değerlerini kullanır. Yeni kayıtlar otomatik hesaplanır; ancak geçmiş dönem düzeltmeleri, toplu içe aktarım sonrası veya hesap yöntemi değişiminde geçmişi yeniden hesaplamak gerekir.",
          "nasil": [
            "İsteğe bağlı başlangıç ve bitiş tarihi girin (boş bırakılırsa tüm kayıtlar).",
            "'HESAPLAMAYI BAŞLAT'a basın; sistem önce toplam kayıt sayısını sayar.",
            "İşlem paketler halinde ilerler; ilerleme çubuğu, istatistikler ve log akışını izleyin.",
            "Gerekirse 'DURDUR' ile duraklatıp 'DEVAM ET' ile kaldığınız yerden sürdürün."
          ],
          "butonlar": [
            {
              "ad": "HESAPLAMAYI BAŞLAT",
              "islev": "Seçili tarih aralığındaki stok çıkışlarını maliyet hesabı için işlemeye başlar",
              "sonuc": "Kayıtlar sayılır ve batch işleme başlar",
              "renk": "danger"
            },
            {
              "ad": "DURDUR",
              "islev": "Devam eden hesaplamayı duraklatır",
              "sonuc": "İşlem geçici durur",
              "renk": "accent"
            },
            {
              "ad": "DEVAM ET",
              "islev": "Duraklatılan hesaplamayı sürdürür",
              "sonuc": "Kaldığı offsetten devam eder",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "maliyetMigSay",
              "tetik": "HESAPLAMAYI BAŞLAT (ilk adım)",
              "etki": "stok_hareket üzerinde sayım yapar (veri değiştirmez)",
              "neden_sonuc": "Kaç kaydın işleneceğini belirler; ilerleme yüzdesi buna göre hesaplanır."
            },
            {
              "ad": "maliyetMigIsle",
              "tetik": "Batch işleme döngüsü",
              "etki": "Her stok çıkış satırına MALIYET_AVG/FIFO/LIFO/LAST birim yerel değerleri yazılır (StokTuketimMaliyet)",
              "neden_sonuc": "Satışların gerçek maliyeti hesaplanır; çalıştırmazsanız karlılık raporları hatalı (özellikle stok sıfırlanan üründe 0 maliyet) çıkabilir."
            }
          ],
          "iliskiler": [
            "stok (stok_hareket)",
            "karlılık / kâr-zarar raporları",
            "fatura (satış maliyeti)"
          ],
          "ipuclari": [
            "Yoğun saatlerde tüm veriyi yeniden hesaplamak sistemi yavaşlatabilir; büyük veri için tarih aralığı bölerek çalıştırın.",
            "İşlem kesilirse DEVAM ET ile kaldığı yerden sürdürülebilir; baştan başlamak zorunda değilsiniz."
          ]
        },
        {
          "id": "dashboardtasarim",
          "baslik": "Dashboard Tasarımı",
          "yol": "/ekran/ayar/tanim/dashboardtasarim",
          "sub": "tanim",
          "amac": "Açılış ekranını kart kart tasarlar: hazır kartlar (dönem cirosu, ciro/tahsilat trendi, net durum, vadesi geçen, yaklaşan tahsilat/ödeme, kasa & banka bakiye, dönem tahsilatı, gider dağılımı, son hareketler, ticari alacak/borç, stok değeri, en çok satanlar, bekleyen e-belge, uyarılar, hızlı işlemler) paletten sürüklenip yerleştirilir, boyutlandırılır, kaldırılır. Açık/koyu tema seçilir.",
          "neden": "Her işletmenin önceliği farklıdır; nakit akışına bakan ile stoğa bakan aynı açılış ekranını istemez. Kartlar seçilebildiği için ekran işletmeye göre şekillenir. Yeni kokpit VARSAYILAN KAPALIDIR — açılmadıkça mevcut açılış ekranı aynen çalışır.",
          "nasil": [
            "'Önizle' ile yeni kokpiti yeni sekmede açıp görün (yalnız yönetici) — açmadan önce denemeyi sağlar.",
            "Soldaki paletten kartı düzen alanına sürükleyin; köşesinden boyutlandırın, istemediğinizi kaldırın.",
            "Düzeni kaydedin; beğenmezseniz 'Varsayılana Dön' ile hazır düzene dönün.",
            "Kokpit temasını açık veya koyu seçin.",
            "Hazır olunca kokpiti açan anahtarı aktif edin; kapatmak için aynı anahtarı kapatın, eski açılış ekranına dönülür."
          ],
          "butonlar": [
            {
              "ad": "ÖNİZLE",
              "islev": "Yeni kokpiti yeni sekmede açar (yalnız yönetici)",
              "sonuc": "Kokpit açılmadan görülür; kimsenin ekranı değişmez",
              "renk": "ghost"
            },
            {
              "ad": "KAYDET",
              "islev": "Kart düzenini firma için kaydeder",
              "sonuc": "Kokpit açıldığında bu düzen gelir",
              "renk": "accent"
            },
            {
              "ad": "VARSAYILANA DÖN",
              "islev": "Firma düzenini silip hazır düzene döner",
              "sonuc": "Kartlar fabrika ayarındaki gibi dizilir",
              "renk": "danger"
            }
          ],
          "ipuclari": [
            "Kartların verisi ekran açıldıktan SONRA tek tek yüklenir; çok kart eklemek açılışı yavaşlatmaz.",
            "Yeni kokpit şimdilik \"Günlük İşlemler\" görünümü için çalışır; servis, saha satış ve sevkiyat görünümünü kullananlar kendi ekranlarında kalır.",
            "Kokpit anahtarı kapatılınca eski açılış ekranı aynen geri gelir, hiçbir veri etkilenmez."
          ]
        },
        {
          "id": "cari",
          "baslik": "Excelden Cari Al",
          "yol": "/ekran/ayar/aktarim/cari",
          "sub": "aktarim",
          "amac": "Müşteri ve tedarikçileri (cari kartları) hazır bir Excel şablonundan toplu olarak sisteme aktarır. İsteğe bağlı açılış borç/alacak bakiyeleri için otomatik açılış fişi keser.",
          "neden": "Başka programdan geçişte veya çok sayıda cari eklerken tek tek giriş yerine toplu aktarım büyük zaman kazandırır. Grup, il/ilçe eşlemesi ve açılış bakiyesi otomatik işlenir.",
          "nasil": [
            "'Örnek Excel Dosyasını İndir' ile şablonu alın ve doldurun.",
            "Excel dosyasını seçip 'YÜKLE'ye basın.",
            "Yüklenen dosya bilgisi görününce 'Excel Oku' ile aktarımı başlatın.",
            "Satırlar 100'lük paketler halinde işlenir; her satırın sonucu (aktarıldı/güncellendi/atlandı/hata) listelenir.",
            "İşlem bitince veya vazgeçmek isterseniz dosya temizlenir."
          ],
          "butonlar": [
            {
              "ad": "YÜKLE",
              "islev": "Seçili Excel dosyasını sunucuya yükler",
              "sonuc": "Dosya oturuma kaydedilir, okuma adımı açılır",
              "renk": "primary"
            },
            {
              "ad": "Örnek Excel Dosyasını İndir",
              "islev": "Doğru sütun düzenine sahip şablonu indirir",
              "sonuc": "cari_aktar_ornek_excel.xlsx indirilir",
              "renk": "accent"
            },
            {
              "ad": "Excel Oku",
              "islev": "Yüklenen dosyayı satır satır aktarır",
              "sonuc": "cari_kart kayıtları eklenir/güncellenir, bakiye fişleri kesilir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Yüklü dosyayı kaldırır",
              "sonuc": "Dosya ve önbellek silinir, yeni yükleme yapılabilir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "cariexcelyukle",
              "tetik": "YÜKLE butonu",
              "etki": "Excel dosyası yüklenip oturumda saklanır (ilk okumada satırlar JSON önbelleğe alınır)",
              "neden_sonuc": "Aktarım için kaynak dosya hazırlanır; hatalı dosya yüklenirse okuma başarısız olur."
            },
            {
              "ad": "cariexcelaktar",
              "tetik": "Excel Oku (paketli döngü)",
              "etki": "Her satır için cari_kart eklenir/güncellenir; grup (cari_grup) yoksa oluşturulur, il/ilçe/semt/mahalle eşlenir; açılış borç/alacak varsa cari_hareket'e açılış fişi (EVRAK_TIP=100, evrak no ACF-tarih) kesilir",
              "neden_sonuc": "Cariler toplu oluşturulur. KOD (A sütunu) boşsa veya ünvan/ad-soyad boşsa satır hata verir; yanlış açılış bakiyesi girilirse hatalı bakiye fişi oluşur."
            }
          ],
          "iliskiler": [
            "cari (cari_kart, cari_grup, cari_hareket)",
            "ptt adres tabloları (il/ilçe/semt/mahalle)",
            "para birimi (açılış fişi varsayılan para birimi)"
          ],
          "ipuclari": [
            "Mutlaka indirdiğiniz örnek şablonun sütun sırasını koruyun; sütunlar kayarsa veriler yanlış alanlara gider.",
            "KOD (A sütunu) her satırda dolu olmalı; aynı KOD varsa cari güncellenir, yoksa yeni oluşturulur.",
            "Açılış borç ve alacak ikisi de doluysa iki ayrı açılış fişi kesilir."
          ]
        },
        {
          "id": "stok",
          "baslik": "Excelden Stok Al",
          "yol": "/ekran/ayar/aktarim/stok",
          "sub": "aktarim",
          "amac": "Stok/ürün-hizmet kartlarını hazır Excel şablonundan toplu olarak sisteme aktarır. Grup ve birim adları mevcut tanımlarla eşlenir; açıklama HTML olarak korunur.",
          "neden": "Yeni kuruluşta veya ürün kataloğu güncellenirken yüzlerce ürünü tek tek girmek yerine toplu aktarım zaman kazandırır ve tutarlılık sağlar.",
          "nasil": [
            "'Örnek Excel Dosyasını İndir' ile şablonu alın; ekrandaki kolon sırası açıklamasına uyun (A:Kod ... L:Açıklama).",
            "Doldurulmuş Excel'i seçip 'YÜKLE'ye basın.",
            "'Excel Oku' ile aktarımı başlatın; satırlar paketler halinde işlenir.",
            "Her satırın sonucu (aktarıldı/güncellendi/atlandı+uyarı) listelenir.",
            "Bitince veya vazgeçince dosya temizlenir."
          ],
          "butonlar": [
            {
              "ad": "YÜKLE",
              "islev": "Seçili Excel dosyasını sunucuya yükler",
              "sonuc": "Dosya oturuma kaydedilir, okuma adımı açılır",
              "renk": "primary"
            },
            {
              "ad": "Örnek Excel Dosyasını İndir",
              "islev": "Doğru kolon düzenine sahip şablonu indirir",
              "sonuc": "stok_aktar_ornek_excel.xlsx indirilir",
              "renk": "accent"
            },
            {
              "ad": "Excel Oku",
              "islev": "Yüklenen dosyayı satır satır aktarır",
              "sonuc": "stok_kart kayıtları eklenir/güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Vazgeç",
              "islev": "Yüklü dosyayı kaldırır",
              "sonuc": "Dosya ve önbellek silinir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "stokexcelyukle",
              "tetik": "YÜKLE butonu",
              "etki": "Excel dosyası yüklenip oturumda saklanır",
              "neden_sonuc": "Aktarım için kaynak dosya hazırlanır."
            },
            {
              "ad": "stokexcelaktar",
              "tetik": "Excel Oku (paketli döngü)",
              "etki": "Her satır için stok_kart eklenir/güncellenir; grup/birim adları stok_grup/stok_birim ile eşlenir; fiyat, KDV, açıklama (HTML korunur) yazılır",
              "neden_sonuc": "Ürün/hizmet kartları toplu oluşturulur. Birim adı sistemde tanımlı değilse satır ATLANIR; grup bulunamazsa uyarı verilir ama kart yine de eklenir (grupsuz)."
            }
          ],
          "iliskiler": [
            "stok (stok_kart, stok_grup, stok_birim)",
            "KDV oranları"
          ],
          "ipuclari": [
            "Excel'deki birim adları sistemde önceden tanımlı olmalı; yoksa o satır atlanır. Önce birimlerinizi tanımlayın.",
            "Aynı KOD varsa kart güncellenir, yoksa yeni oluşturulur.",
            "Tip sütunu 1=Ürün, 0=Hizmet olarak girilmelidir."
          ]
        },
        {
          "id": "apikilavuz",
          "baslik": "API Kullanım Kılavuzu",
          "yol": "/ekran/ayar/aktarim/apikilavuz",
          "sub": "aktarim",
          "amac": "NetEsnaf REST API v1 için geliştirici kılavuzu: kimlik doğrulama (JWT Bearer token), yanıt yapısı ve kuralları, tüm modüllerin endpoint referansı ve uçtan uca örnek (fatura kesme) sunar. OpenAPI 3.0 JSON şemasına bağlantı verir. Yalnızca API lisansı olan tenantta görünür.",
          "neden": "Dış uygulamaların (mobil, e-ticaret, entegrasyon) firma verisine güvenli erişimi için gereklidir. Geliştiriciler/entegratörler buradan endpoint'leri ve kullanım biçimini öğrenir; salt bilgilendirme ekranıdır.",
          "nasil": [
            "Temel adresi ve kimlik doğrulama akışını (auth/login ile token alma) inceleyin.",
            "Endpoint Referansı bölümünde modül başlıklarına tıklayarak uçları (metod, yol, parametreler) açın.",
            "'OpenAPI 3.0 JSON' bağlantısını bir yapay zeka/agent'a vererek otomatik entegrasyon yapabilirsiniz.",
            "Uçtan uca örnekten (token al > cari bul > fatura kes > tahsilat) akışı takip edin."
          ],
          "butonlar": [
            {
              "ad": "OpenAPI 3.0 JSON",
              "islev": "Makine-okunur API şema bağlantısını açar",
              "sonuc": "Yeni sekmede OpenAPI şeması gösterilir",
              "renk": "accent"
            },
            {
              "ad": "Tümünü Aç / Kapat",
              "islev": "Tüm endpoint panellerini açar/kapatır",
              "sonuc": "Endpoint listesi genişler/daralır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "api modülü (ApiKatalog)",
            "auth (JWT token)",
            "fatura / kasa / musteritedarikci vb. API endpoint'leri"
          ],
          "ipuclari": [
            "Bu ekran yalnızca lisansınızda 'api' modülü tanımlıysa görünür; yoksa satış temsilcinizle iletişime geçin.",
            "Token 12 saat geçerlidir; süresi dolmadan auth/refresh ile yenileyebilirsiniz.",
            "Temel adres tenant'ın kendi host'undan dinamik üretilir (sabit değildir)."
          ]
        }
      ]
    },
    {
      "slug": "dashboard",
      "title": "Gösterge Paneli",
      "icon": "📈",
      "modul": "main",
      "ad": "Çekirdek / Ana Modül (Giriş, Dashboard, Profil, Asistan, Tasarım)",
      "ozet": "main modülü NetEsnaf ERP'nin çekirdeğidir: kullanıcı girişi ve lisans doğrulaması, ana kontrol panelleri (dashboard), profil ve şifre yönetimi, bildirim/push altyapısı, \"Asistan\" hatırlatma ekranı, sorun/destek bildirimi, haberler ve fiş (evrak) tasarım editörü burada yaşar. Ayrıca tüm ERP'nin ortak kullandığı arama servislerini (cari, stok, personel, proje, il/ilçe, döviz, hava durumu), takvim/etkinlik yönetimini ve dosya arşivleme işlemlerini bu modülün event.php dosyası sağlar. Bir işlem modülü değil, diğer 23 modülü besleyen altyapı katmanıdır.",
      "modul_iliskiler": [
        "cari",
        "stok",
        "fatura",
        "irsaliye",
        "ceksenet",
        "teklif",
        "siparis",
        "proje",
        "kesif",
        "personel",
        "kasa",
        "ayar",
        "servis"
      ],
      "ekranlar": [
        {
          "id": "login",
          "baslik": "Giriş Yap",
          "yol": "/ekran/main/login",
          "sub": "",
          "amac": "Kullanıcının kullanıcı adı ve şifresiyle sisteme giriş yaptığı ekran. Girişte firmanın lisansı da arka planda doğrulanır.",
          "neden": "Sisteme her giriş buradan başlar. Lisansı biten firmaları yönlendirir, hatalı/pasif kullanıcıyı engeller; verinin firma (FID) bazında izole kalmasını sağlayan oturumu başlatır.",
          "nasil": [
            "Kullanıcı adınızı yazın (tarayıcı hatırladıysa otomatik gelir).",
            "Şifrenizi girin.",
            "İsterseniz 'Beni Hatırla' kutusunu işaretleyin.",
            "'Giriş Yap' butonuna basın.",
            "Bilgiler doğruysa dashboard'a yönlendirilirsiniz; lisans bittiyse yenileme/satın alma sayfasına gidersiniz."
          ],
          "butonlar": [
            {
              "ad": "Giriş Yap",
              "islev": "Kullanıcı adı ve şifreyi kontrol eder, lisansı doğrular, oturumu açar",
              "sonuc": "Doğruysa dashboard'a girer; yanlışsa uyarı gösterir",
              "renk": "primary"
            },
            {
              "ad": "Şifremi Unuttum",
              "islev": "Şifre sıfırlama ekranına yönlendirir",
              "sonuc": "Şifre kurtarma akışı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "dologin",
              "tetik": "'Giriş Yap' butonu (genel/dologin işlemi)",
              "etki": "user tablosunda kullanıcı adı + türetilen şifre hash'i eşleşen aktif (DURUM=1) kayıt BIND parametreli sorguyla aranır; bulunursa main_firma üzerinden LicenceHub ile lisans doğrulanır ve oturum bilgileri (ID, kullanıcı, firma, tip) kaydedilir",
              "neden_sonuc": "Doğru bilgiyle güvenli giriş sağlanır ve tüm veriler firmanıza göre filtrelenir. Yanlış bilgi veya pasif hesapta giriş reddedilir; lisans süresi dolduysa çalışma durur ve yenileme sayfasına yönlendirilirsiniz."
            }
          ],
          "iliskiler": [
            "ayar",
            "lisans"
          ],
          "ipuclari": [
            "Demo paketinde (PAKDEMO) lisans bitince satın alma sayfasına, normal pakette yenileme sayfasına yönlendirilirsiniz.",
            "Hatalı giriş denemesi 'Kullanıcı Bilgileri Hatalı veya Kullanıcı Pasif Durumda' uyarısı verir; büyük/küçük harf ve boşluğa dikkat edin.",
            "Giriş sorgusu güvenlik için parametreli (BIND) çalışır; kullanıcı adı doğrudan SQL'e eklenmez."
          ]
        },
        {
          "id": "dashboard",
          "baslik": "Güncel Durum (Finansal Dashboard)",
          "yol": "/ekran/main/dashboard",
          "sub": "",
          "amac": "Firmanın son günlerdeki finansal özetini tek ekranda gösteren ana kontrol paneli: satış/alış faturası, kasa, çek-senet gibi tutar ve adet özet kutuları, haber şeridi ve döviz kuru.",
          "neden": "Güne başlarken 'nerede duruyorum' sorusunun hızlı yanıtı. Ayrı raporlara girmeden ciro, gider ve nakit hareketini bir bakışta görmek için kullanılır.",
          "nasil": [
            "Giriş sonrası otomatik olarak bu ekran açılır.",
            "Üstteki tarih aralığına göre (ayardan belirlenen gün) özet kutularını inceleyin.",
            "Satış Faturası, Alış Faturası vb. kutulardaki tutar ve adetleri okuyun.",
            "Üstteki haber şeridinden NetEsnaf duyurularına tıklayarak habere gidin.",
            "Döviz kuru bölümünden güncel USD/EUR alış-satışını görün."
          ],
          "butonlar": [
            {
              "ad": "Finansal Durum",
              "islev": "Finansal özet sekmesini gösterir",
              "sonuc": "Özet kutuları listelenir",
              "renk": "primary"
            },
            {
              "ad": "NetEsnaf Haberler",
              "islev": "Haber listesine gider",
              "sonuc": "Haberler ekranı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "dovizkur",
              "tetik": "Dashboard döviz alanı yüklenince",
              "etki": "Seçili kaynaktan (ör. TCMB) USD/EUR alış-satış kuru çekilip tabloya basılır; veritabanına yazma yapmaz",
              "neden_sonuc": "Güncel kuru görüp fiyatlama/tahsilat kararı verirsiniz. Kaynağa ulaşılamazsa kur boş gelebilir, karar öncesi doğrulayın."
            }
          ],
          "iliskiler": [
            "fatura",
            "kasa",
            "ceksenet",
            "stok"
          ],
          "ipuclari": [
            "Özet kutularının kapsadığı gün aralığı ayarlardan belirlenir.",
            "Rakamlar yalnızca aktif (DURUM=1) evrakları kapsar; silinmiş/iptal kayıtlar sayılmaz.",
            "Haber şeridindeki başlıklar tıklanabilir."
          ]
        },
        {
          "id": "dashboard_servis",
          "baslik": "Servis Kontrol Paneli",
          "yol": "/ekran/main/dashboard_servis",
          "sub": "",
          "amac": "Servis/teknik operasyon odaklı özet panel; servis işlerine göre uyarlanmış gösterge ekranı.",
          "neden": "Servis ağırlıklı çalışan firmaların ana ekranı finans yerine servis operasyonuna odaklansın diye kullanılır.",
          "nasil": [
            "Firma profili servis odaklıysa giriş sonrası bu panel açılır.",
            "Servis operasyon özetlerini inceleyin.",
            "İlgili karta tıklayarak detay ekranına geçin."
          ],
          "butonlar": [
            {
              "ad": "Detaya Git",
              "islev": "İlgili servis kaydına/listesine yönlendirir",
              "sonuc": "Servis detay ekranı açılır",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "servis",
            "kesif",
            "personel"
          ],
          "ipuclari": [
            "Hangi dashboard'un açılacağı firma/kullanıcı profiline göre belirlenir.",
            "Panel yalnızca özet gösterir; işlem servis modülünde yapılır."
          ]
        },
        {
          "id": "dashboard_personel",
          "baslik": "Personel Kontrol Paneli",
          "yol": "/ekran/main/dashboard_personel",
          "sub": "",
          "amac": "Personel rolündeki kullanıcıya sadeleştirilmiş, kendi işine odaklı özet panel.",
          "neden": "Yetkisi sınırlı personelin, yönetici finans verilerini görmeden kendi görev/işlerine odaklanması için kullanılır.",
          "nasil": [
            "Personel tipindeki kullanıcı giriş yapınca bu panel gelir.",
            "Kendinize atanmış iş/özetleri görün.",
            "İlgili bağlantıya tıklayıp işleme geçin."
          ],
          "butonlar": [
            {
              "ad": "Detaya Git",
              "islev": "İlgili kayıt/listeye yönlendirir",
              "sonuc": "Detay ekranı açılır",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "personel",
            "proje",
            "servis"
          ],
          "ipuclari": [
            "Personel paneli firma geneli finansal rakamları göstermez.",
            "Görülen içerik kullanıcının yetkisine göre sınırlanır."
          ]
        },
        {
          "id": "asistan",
          "baslik": "Asistan — Dikkatinizi Bekleyenler",
          "yol": "/ekran/main/islem/asistan",
          "sub": "islem",
          "amac": "Firmanın gözden kaçan işlerini tek listede toplayan akıllı hatırlatma ekranı: geciken görevler, vadesi yaklaşan/geçen çek-senet ve faturalar, hareketsiz keşifler, süresi dolan teklifler ve teslimatı geçen siparişler. Panel yalnız açık ve aksiyon bekleyen kayıtları toplar; servis SLA/talep/bakım anlaşması, e-belge gönderim bekleyen faturalar, risk limitini aşan cariler, yaşlı (vadesi geçmiş) alacaklar, negatif kasa/stok, biten abonelikler ve geciken üretim/saha/CRM kaynaklarını da sade, profesyonel bir görünümde gösterir; ödenmiş fatura veya tamamlanan iş gibi kapanmış kayıtlar görünmez.",
          "neden": "Vade kaçırmamak, unutulan görev ve teklifleri yakalamak için 'bugün neye bakmalıyım' sorusunu yanıtlar. Sadece okur, hiçbir kaydı değiştirmez; erken uyarı verir.",
          "nasil": [
            "Menüden Asistan'ı açın (veya dashboard'dan geçin).",
            "Listeyi yukarıdan aşağı okuyun; en eski/en kritik tarihli kayıtlar üstte.",
            "Her satırdaki renkli rozetten türü (Görev, Çek, Fatura, Keşif, Teklif, Sipariş) anlayın.",
            "Sağdaki 'X gün geçti / Bugün / X gün sonra' etiketiyle aciliyeti görün.",
            "İlgilendiğiniz satıra tıklayarak doğrudan ilgili kaydın düzenleme/detay ekranına gidin.",
            "Liste boşsa 'Her şey yolunda görünüyor' mesajını görürsünüz."
          ],
          "butonlar": [
            {
              "ad": "Dashboard'a Dön",
              "islev": "Ana panele geri gider",
              "sonuc": "Dashboard açılır",
              "renk": "ghost"
            },
            {
              "ad": "Kayıt Satırı (bağlantı)",
              "islev": "Satırdaki kaydın ilgili modüldeki düzenleme/detay ekranını açar",
              "sonuc": "İlgili fatura/çek/görev/teklif/sipariş/keşif ekranına gidilir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "asistan_sayfa_yukleme",
              "tetik": "Ekran açılışı — veriler sunucuda sayfa oluşturulurken çekilir (ayrı bir AJAX olayı/case yoktur)",
              "etki": "proje_gorev, ceksenet_fis, fatura, kesif_fis, teklif_fis, siparis tablolarından tarih/durum kriterine uyan kayıtlar SADECE okunur (hiçbir tabloya yazma yok), birleştirilip hedef tarihe göre sıralanır",
              "neden_sonuc": "Vadesi/teslimatı yaklaşan işleri tek yerde görüp önlem alırsınız. Bu ekranı takip etmezseniz vade, teklif geçerliliği veya teslimat tarihini kaçırma riski artar."
            }
          ],
          "iliskiler": [
            "proje",
            "ceksenet",
            "fatura",
            "kesif",
            "teklif",
            "siparis",
            "personel",
            "cari"
          ],
          "ipuclari": [
            "Ekran bilgi amaçlıdır; buradan kayıt oluşturulmaz/silinmez, sadece ilgili kayda yönlendirir.",
            "Çek-senet 7 gün, teklif 3 gün önceden uyarır; fatura yalnızca -7/+7 gün penceresini gösterir.",
            "Keşifler 7 günden fazla güncellenmediyse 'ilerleme yok' olarak listelenir.",
            "Kapanan/tamamlanan/iptal siparişler ve aktarılmış teklifler listeye alınmaz.",
            "Panelde yalnız açık ve aksiyon bekleyen kayıtlar çıkar; ödenmiş fatura, tamamlanan iş, kapanan servis gibi biten kayıtlar otomatik düşer.",
            "Kaynaklar genişletildi: servis SLA/talep/bakım anlaşması, e-belge gönderim bekleyen faturalar, risk limitini aşan cariler, vadesi geçmiş (yaşlı) alacaklar, negatif kasa/stok bakiyesi, süresi biten abonelikler ve geciken üretim/saha/CRM görevleri de panele düşer."
          ]
        },
        {
          "id": "profil",
          "baslik": "Profilim",
          "yol": "/ekran/main/islem/profil",
          "sub": "islem",
          "amac": "Kullanıcının kendi bilgilerini görüntülediği, şifresini değiştirdiği ve kendi bildirimlerini tarih filtresiyle incelediği ekran.",
          "neden": "Şifre güvenliğini kullanıcının kendi elinde tutmak ve geçmiş bildirimleri (okundu/okunmadı) takip etmek için kullanılır.",
          "nasil": [
            "Sağ üst menüden Profilim'i açın.",
            "Sol kartta ad-soyad, kullanıcı adı, e-posta, telefon ve kayıt tarihinizi görün.",
            "'Şifre Değiştir' sekmesinde mevcut şifreyi, ardından yeni şifreyi iki kez girin.",
            "'Şifreyi Güncelle' butonuna basın.",
            "'Bildirimler' sekmesine geçip tarih aralığı seçin ve 'Ara' deyin.",
            "'Temizle' ile filtreyi sıfırlayabilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "Şifreyi Güncelle",
              "islev": "Eski şifreyi doğrulayıp yeni şifreyi kaydeder",
              "sonuc": "Şifre değişir, başarı mesajı gösterilir",
              "renk": "warning"
            },
            {
              "ad": "Ara",
              "islev": "Seçilen tarih aralığındaki bildirimleri listeler",
              "sonuc": "Bildirim tablosu güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Temizle",
              "islev": "Tarih filtresini sıfırlar ve tümünü yeniden listeler",
              "sonuc": "Filtre kalkar",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "sifredegistir",
              "tetik": "'Şifreyi Güncelle' butonu",
              "etki": "user tablosunda mevcut şifre hash'i doğrulanır, doğruysa yeni şifre hash'lenip SIFRE, UPDATE_TIME, UPDATE_ID alanlarına yazılır",
              "neden_sonuc": "Şifrenizi güvenle yenilersiniz. Eski şifre yanlışsa veya yeni şifreler uyuşmuyorsa/6 karakterden kısaysa işlem reddedilir; böylece hatalı değişiklik önlenir."
            },
            {
              "ad": "profilbildirimler",
              "tetik": "'Ara' butonu / Bildirimler sekmesi ilk açılışı",
              "etki": "user_notification tablosundan kullanıcıya ait bildirimler tarih aralığına göre okunur",
              "neden_sonuc": "Geçmiş bildirimlerinizi tarihe göre görürsünüz. Filtre boşsa en son bildirimler gelir; okunmamışlar kalın gösterilir."
            }
          ],
          "iliskiler": [
            "bildirim"
          ],
          "ipuclari": [
            "Yeni şifre en az 6 karakter olmalı ve iki alanda birebir aynı yazılmalı.",
            "Okunmamış bildirim sayısı 'Bildirimler' sekme başlığında kırmızı rozette görünür.",
            "Profil bilgileri (ad, e-posta, telefon) buradan salt görüntülenir; değişiklik için yöneticinize başvurun."
          ]
        },
        {
          "id": "sorunbildir",
          "baslik": "Sorun Bildir / Destek Talebi",
          "yol": "/ekran/main/sorunbildir",
          "sub": "",
          "amac": "Kullanıcının bir hata, soru veya talebini destek türü, konu, mesaj, öncelik ve opsiyonel dosya ekiyle ilettiği açılır pencere.",
          "neden": "Yaşanan sorunu doğrudan ekrandan destek ekibine iletmek için. Talep otomatik kayıt numarası alır ve Discord/Telegram üzerinden destek ekibine anında düşer.",
          "nasil": [
            "Herhangi bir ekranda 'Sorun Bildir'e tıklayın; pencere açılır.",
            "Destek Türünü seçin.",
            "Konu ve mesaj alanını doldurun.",
            "Öncelik seçin (Düşük/Normal/Yüksek/Acil).",
            "İsterseniz ekran görüntüsü veya dosya ekleyin (maks. 10 MB).",
            "'Destek Kaydı Aç' butonuna basın; talep numaranızı görün."
          ],
          "butonlar": [
            {
              "ad": "Destek Kaydı Aç",
              "islev": "Talebi kaydeder, dosyayı yükler, destek ekibine bildirim gönderir",
              "sonuc": "Talep numarası ile kayıt oluşur ve onay mesajı çıkar",
              "renk": "primary"
            },
            {
              "ad": "Kapat",
              "islev": "Pencereyi kaydetmeden kapatır",
              "sonuc": "Talep oluşmaz",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "destekkaydi",
              "tetik": "'Destek Kaydı Aç' butonu",
              "etki": "destek_kart tablosuna yeni talep kaydı, dosya varsa uploads/destek altına yüklenip destek_kart_cevap'a ilk mesaj eklenir; Discord ve (aktifse) Telegram'a bildirim gönderilir",
              "neden_sonuc": "Sorununuz numaralı bir talebe dönüşür ve destek ekibi anında haberdar olur. Alanları eksik/yanlış doldurursanız talep açılmaz veya ekip sorunu anlayamaz; ekran görüntüsü eklemek çözümü hızlandırır."
            }
          ],
          "iliskiler": [
            "destek"
          ],
          "ipuclari": [
            "Hangi ekranda olduğunuz otomatik kaydedilir; sorunu tarif ederken kolaylık sağlar.",
            "İzinli dosya türleri: jpg, png, pdf, doc, xls, txt, zip, rar; üst sınır 10 MB.",
            "Acil öncelik gerçekten kritik durumlar için kullanılmalı."
          ]
        },
        {
          "id": "haberliste",
          "baslik": "Haberler",
          "yol": "/ekran/main/haberliste",
          "sub": "",
          "amac": "NetEsnaf tarafından yayınlanan duyuru ve haberlerin kart görünümünde, sayfalı olarak listelendiği ekran.",
          "neden": "Yeni özellikler, güncellemeler ve duyurulardan haberdar olmak için. Dashboard'daki haber şeridinin tam listesidir.",
          "nasil": [
            "Dashboard haber şeridinden veya menüden Haberler'i açın.",
            "Kartlardaki görsel, başlık ve özeti inceleyin.",
            "İlgili habere tıklayıp detayını okuyun.",
            "Alttaki sayfalama ile eski haberlere geçin."
          ],
          "butonlar": [
            {
              "ad": "Haber Kartı",
              "islev": "Seçilen haberin detay ekranını açar",
              "sonuc": "Haber detayı görüntülenir",
              "renk": "primary"
            },
            {
              "ad": "Sayfalama",
              "islev": "Sonraki/önceki haber sayfasına geçer",
              "sonuc": "Farklı haber grubu listelenir",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Sayfada 50 haber gösterilir; daha eskiler sayfalamadadır.",
            "Yalnızca yayında (DURUM=1) olan haberler listelenir, yayın tarihine göre en yeni üstte sıralanır."
          ]
        },
        {
          "id": "haberdetay",
          "baslik": "Haber Detayı",
          "yol": "/ekran/main/haberdetay",
          "sub": "",
          "amac": "Seçilen tek bir haberin/duyurunun tam içeriğini gösteren ekran.",
          "neden": "Bir duyurunun ayrıntısını (tam metin, görsel) okumak için kullanılır.",
          "nasil": [
            "Haber listesinden veya dashboard şeridinden bir habere tıklayın.",
            "Başlık, görsel ve tam metni okuyun.",
            "Haber listesine geri dönün."
          ],
          "butonlar": [
            {
              "ad": "Geri",
              "islev": "Haber listesine döner",
              "sonuc": "Haberler ekranı açılır",
              "renk": "ghost"
            }
          ],
          "eventler": [],
          "iliskiler": [],
          "ipuclari": [
            "Yalnızca yayında (DURUM=1) olan haberler açılır."
          ]
        },
        {
          "id": "designer_index",
          "baslik": "Fiş Tasarımları (Tasarım Listesi)",
          "yol": "/ekran/main/designer/index",
          "sub": "designer",
          "amac": "Bir numaratöre (evrak türüne) ait yazdırma/çıktı tasarımlarının listelendiği, yeni tasarım oluşturulan, aktif/pasif yapılan ve silinen ekran. Sistem varsayılan tasarımları (FID=0) ile firmaya özel tasarımlar bir arada gösterilir.",
          "neden": "Fatura, irsaliye, teklif gibi evrakların çıktısının nasıl görüneceğini firma kendi belirlesin diye. Hazır 'Sistem' şablonlarından başlayıp kendi tasarımınızı kopyalayarak özelleştirebilirsiniz.",
          "nasil": [
            "Ayarlar > Fiş İşlemleri'nden ilgili numaratörün tasarımlarına gelin.",
            "'Yeni Tasarım Oluştur' kartına tıklayıp ad verin ve oluşturun.",
            "Firma tasarımınızda 'Düzenle' ile editöre geçin.",
            "Sistem (kilitli) tasarımı için 'Kopyala ve Düzenle' ile kendi kopyanızı oluşturun.",
            "Bir tasarımı 'Aktif Yap/Pasif Yap' ile devreye alın veya durdurun.",
            "Gereksiz firma tasarımını 'Sil' ile kaldırın."
          ],
          "butonlar": [
            {
              "ad": "Yeni Tasarım Oluştur",
              "islev": "Numaratöre bağlı yeni boş tasarım kaydı açar",
              "sonuc": "Yeni tasarım oluşur, editöre hazırlanır",
              "renk": "accent"
            },
            {
              "ad": "Düzenle",
              "islev": "Firma tasarımını editörde/basit ekranda açar",
              "sonuc": "Tasarım editörü açılır",
              "renk": "primary"
            },
            {
              "ad": "Kopyala ve Düzenle",
              "islev": "Kilitli sistem tasarımının firma kopyasını oluşturup editöre yönlendirir",
              "sonuc": "Düzenlenebilir firma kopyası oluşur",
              "renk": "primary"
            },
            {
              "ad": "Aktif Yap / Pasif Yap",
              "islev": "Tasarımın kullanımda olup olmadığını değiştirir",
              "sonuc": "Tasarımın durumu değişir",
              "renk": "ghost"
            },
            {
              "ad": "Sil",
              "islev": "Firma tasarımını siler",
              "sonuc": "Tasarım kaldırılır",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "yenitasarimekle",
              "tetik": "'Tasarım Oluştur' butonu",
              "etki": "fis_tasarim tablosuna numaratöre bağlı yeni tasarım kaydı eklenir",
              "neden_sonuc": "Kendi çıktı şablonunuzu sıfırdan oluşturmaya başlarsınız. Ad girmezseniz kayıt açılmaz."
            },
            {
              "ad": "sistemkopyala",
              "tetik": "'Kopyala ve Düzenle' butonu",
              "etki": "FID=0 sistem tasarımı, firmaya ait (FID=firma) yeni bir kopya olarak fis_tasarim'e yazılır",
              "neden_sonuc": "Hazır şablonu bozmadan kendinize özel düzenlenebilir bir sürüm elde edersiniz. Sistem şablonu her zaman salt-okunur kalır."
            },
            {
              "ad": "durumdegistir",
              "tetik": "'Aktif Yap/Pasif Yap' butonu (firma tasarımı)",
              "etki": "fis_tasarim.DURUM firma tasarımı için 1/0 arasında değiştirilir (FID guard ile yalnızca kendi kaydınız)",
              "neden_sonuc": "Bir tasarımı geçici olarak devre dışı bırakır veya devreye alırsınız; yanlış aktif tasarım evrak çıktısını etkiler."
            },
            {
              "ad": "sistempasifdegistir",
              "tetik": "Sistem tasarımı 'Aktif/Pasif Yap' butonu",
              "etki": "fis_tasarim_tenant_pasif tablosuna kayıt eklenir/kaldırılır (global fis_tasarim.DURUM'a dokunmadan sadece bu firma için gizler)",
              "neden_sonuc": "İhtiyaç duymadığınız sistem şablonunu listenizden gizlersiniz; diğer firmaları etkilemez."
            },
            {
              "ad": "tasarimsil",
              "tetik": "'Sil' butonu",
              "etki": "fis_tasarim kaydı DURUM=-1 ile soft-silinir; yalnızca firmaya ait (FID guard) tasarımlar silinebilir",
              "neden_sonuc": "Kullanmadığınız firma tasarımını kaldırırsınız. Sistem tasarımları bu yolla silinemez; soft-silme olduğu için gerektiğinde teknik olarak geri getirilebilir."
            }
          ],
          "iliskiler": [
            "ayar",
            "fatura",
            "irsaliye",
            "teklif",
            "ceksenet"
          ],
          "ipuclari": [
            "[Sistem] etiketli tasarımlar kilitlidir; değiştirmek için önce kopyalayın.",
            "Teklif tasarımları (901/902) 'Basit' canlı önizleme ekranında, diğerleri WYSIWYG editörde düzenlenir.",
            "Numaratör seçili değilse Fiş İşlemleri ekranına geri yönlendirilirsiniz."
          ]
        },
        {
          "id": "editor",
          "baslik": "Tasarım Editörü (WYSIWYG / XSLT)",
          "yol": "/ekran/main/designer/editor",
          "sub": "designer",
          "amac": "Evrak çıktısını element bazlı düzenleyen gelişmiş tasarım editörü; alan yerleşimi, önizleme ve ileri seviye XSLT dönüşüm katmanı burada yönetilir.",
          "neden": "Faturanın/irsaliyenin çıktısındaki logo, alanlar, sütunlar ve düzenin firmaya özel şekillendirilmesi için. e-Belge XML'ini istenen görünüme çevirmek için XSLT desteği sunar.",
          "nasil": [
            "Tasarım listesinden bir firma tasarımında 'Düzenle'ye basın.",
            "Alanları/elementleri düzenleyip yerleşimi ayarlayın.",
            "Kullanılabilir XML alanlarını ekleyin.",
            "Önizleyip sonucu kontrol edin.",
            "İleri kullanım için XSLT katmanını düzenleyip üretin.",
            "'Kaydet' ile tasarımı saklayın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Tasarım içeriğini kaydeder",
              "sonuc": "Tasarım güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Önizle",
              "islev": "Tasarımın çıktı görünümünü gösterir",
              "sonuc": "Önizleme açılır",
              "renk": "ghost"
            },
            {
              "ad": "XSLT Üret / Kaydet",
              "islev": "XSLT dönüşümünü oluşturur veya saklar",
              "sonuc": "XSLT katmanı güncellenir",
              "renk": "accent"
            }
          ],
          "eventler": [
            {
              "ad": "tasarimgetir",
              "tetik": "Editör açılışı",
              "etki": "fis_tasarim'den seçili tasarımın veri/element içeriği okunur",
              "neden_sonuc": "Mevcut tasarım editörde yüklenir; düzenlemeye kaldığınız yerden devam edersiniz."
            },
            {
              "ad": "tasarimkaydet",
              "tetik": "'Kaydet' butonu",
              "etki": "fis_tasarim kaydının içeriği (element/JSON) güncellenir",
              "neden_sonuc": "Yaptığınız düzenleme kalıcı olur ve evrak çıktısına yansır. Kaydetmezseniz değişiklik kaybolur."
            },
            {
              "ad": "xmlalanlari",
              "tetik": "Alan ekleme paneli",
              "etki": "İlgili evrak XML şemasındaki kullanılabilir alanlar listelenir (okuma)",
              "neden_sonuc": "Tasarıma hangi verilerin (tutar, cari, kalem vb.) konulabileceğini görürsünüz."
            },
            {
              "ad": "xsltgetir",
              "tetik": "XSLT sekmesi açılışı",
              "etki": "Tasarıma ait XSLT içeriği okunur",
              "neden_sonuc": "Mevcut dönüşüm kodunu görüp düzenlersiniz."
            },
            {
              "ad": "xsltkaydet",
              "tetik": "XSLT 'Kaydet' butonu",
              "etki": "Tasarımın XSLT içeriği kaydedilir",
              "neden_sonuc": "e-Belge/çıktı dönüşümü isteğinize göre saklanır; hatalı XSLT çıktıyı bozabilir."
            },
            {
              "ad": "xsltgenerate",
              "tetik": "XSLT 'Üret' butonu",
              "etki": "Element tasarımından otomatik XSLT üretilir",
              "neden_sonuc": "Elle kod yazmadan dönüşüm oluşturulur, zaman kazandırır."
            }
          ],
          "iliskiler": [
            "fatura",
            "irsaliye",
            "ceksenet",
            "ayar"
          ],
          "ipuclari": [
            "Karmaşık çıktılarda önce 'Önizle' ile kontrol edin, sonra kaydedin.",
            "XSLT ileri seviyedir; emin değilseniz element/WYSIWYG katmanında kalın.",
            "Yalnızca firma (kopya) tasarımları düzenlenebilir."
          ]
        },
        {
          "id": "basit",
          "baslik": "Basit Tasarım (Teklif Canlı Önizleme)",
          "yol": "/ekran/main/designer/basit",
          "sub": "designer",
          "amac": "Özellikle teklif evraklarının (901/902) canlı önizlemeli, sadeleştirilmiş seçeneklerle hızlıca düzenlendiği tasarım ekranı.",
          "neden": "Teknik detaya girmeden teklif çıktısını hızlıca biçimlendirmek isteyenler için. Değişiklikler anında önizlemede görünür.",
          "nasil": [
            "Teklif tasarımında 'Düzenle'ye basınca bu ekran açılır.",
            "Seçenekleri (renk, alanlar, düzen) değiştirin.",
            "Sağdaki canlı önizlemede sonucu anında görün.",
            "Gelişmiş/XSLT katmanına üstteki sekmeden geçebilirsiniz.",
            "'Kaydet' ile tasarımı saklayın."
          ],
          "butonlar": [
            {
              "ad": "Kaydet",
              "islev": "Basit tasarım ayarlarını kaydeder",
              "sonuc": "Teklif tasarımı güncellenir",
              "renk": "primary"
            },
            {
              "ad": "Önizle",
              "islev": "Değişikliği canlı önizlemede yeniler",
              "sonuc": "Önizleme güncellenir",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "basitonizle",
              "tetik": "Seçenek değişikliği / 'Önizle'",
              "etki": "Girilen seçeneklerle teklif çıktısının önizlemesi üretilir (okuma/derleme)",
              "neden_sonuc": "Kaydetmeden sonucu görüp doğru düzeni seçersiniz."
            },
            {
              "ad": "basitkaydet",
              "tetik": "'Kaydet' butonu",
              "etki": "fis_tasarim kaydına basit tasarım ayarları yazılır",
              "neden_sonuc": "Teklif çıktınız seçtiğiniz görünümle kalıcılaşır. Kaydetmezseniz eski görünüm kalır."
            }
          ],
          "iliskiler": [
            "teklif",
            "ayar"
          ],
          "ipuclari": [
            "Bu ekran özellikle teklif (901/902) evrakları içindir.",
            "Canlı önizleme sayesinde deneme-yanılma hızlıdır."
          ]
        },
        {
          "id": "cekirdek_servisler",
          "baslik": "Çekirdek Servisler (Arama, Takvim, Bildirim, Dosya Arşivi)",
          "yol": "/ekran/main/event",
          "sub": "",
          "amac": "Kendi başına bir sayfası olmayan ama tüm ERP'nin ortak kullandığı arka plan servisleri: cari/stok/personel/proje/taşıyıcı/şoför arama (otomatik tamamlama), il-ilçe-semt-mahalle sorgulama, döviz ve hava durumu, takvim etkinlikleri, bildirim/push (FCM) ve dosya arşivleme. Bunlar diğer ekranların içinde çağrılır.",
          "neden": "Fatura, irsaliye, teklif gibi ekranlarda cari veya ürün seçerken çıkan hızlı arama kutuları, ana ekrandaki takvim ve bildirim zili, dosya yükleme hep bu çekirdek servislerle çalışır. Bunlar olmadan veri girişi ve hatırlatmalar çalışmaz.",
          "nasil": [
            "Bir evrak ekranında cari/ürün alanına yazmaya başlayın; otomatik öneri listesi bu servisten gelir.",
            "Adres alanlarında il seçince ilçe/semt/mahalle otomatik dolar.",
            "Ana ekrandaki takvimden etkinlik ekleyin/düzenleyin/silin.",
            "Zil ikonundan bildirimleri görün; okundu işaretleyin.",
            "Kart ekranlarında dosya ekleyerek arşive (Google Drive/S3) yükleyin."
          ],
          "butonlar": [
            {
              "ad": "Etkinlik Ekle",
              "islev": "Takvime yeni etkinlik/hatırlatma ekler",
              "sonuc": "Takvim kaydı oluşur",
              "renk": "primary"
            },
            {
              "ad": "Dosya Yükle",
              "islev": "Seçilen dosyayı bulut arşive yükler ve karta bağlar",
              "sonuc": "Dosya arşive eklenir",
              "renk": "accent"
            },
            {
              "ad": "Tümünü Okundu İşaretle",
              "islev": "Okunmamış bildirimleri okundu yapar",
              "sonuc": "Bildirim rozeti sıfırlanır",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "carisorgula",
              "tetik": "Cari arama kutusuna yazma",
              "etki": "cari_kart tablosunda kod/ad/unvan/VKN ile en fazla 10 sonuç okunur ve öneri olarak döner",
              "neden_sonuc": "Evrakta cariyi hızlı seçersiniz; e-fatura/e-irsaliye durumu, vade ve iskonto bilgisi de gelir. Servis çalışmazsa cari seçimi yapılamaz."
            },
            {
              "ad": "stoksorgula",
              "tetik": "Ürün/stok arama kutusuna yazma",
              "etki": "stok_kart okunur; cari seçiliyse cari/grup fiyat listesi uygulanarak fiyat, KDV, birim, barkod döner",
              "neden_sonuc": "Doğru ürünü ve müşteriye özel fiyatı otomatik getirirsiniz; elle fiyat girme hatası azalır."
            },
            {
              "ad": "stokserinosorgula",
              "tetik": "Seri no takipli üründe seri arama",
              "etki": "stok_seri_no tablosundan ürünün seri kayıtları okunur",
              "neden_sonuc": "Seri/garanti takipli üründe doğru seriyi seçersiniz."
            },
            {
              "ad": "stokdetaygetir",
              "tetik": "Üründe detay/bakiye görüntüleme",
              "etki": "stok_hareket'ten depo bazlı bakiye hesaplanıp gösterilir",
              "neden_sonuc": "Satış öncesi hangi depoda ne kadar stok olduğunu görürsünüz."
            },
            {
              "ad": "personelsorgula",
              "tetik": "Personel arama kutusu",
              "etki": "personel_kart tablosundan ada/TC/telefon/e-postaya göre öneri döner",
              "neden_sonuc": "İş atama, servis vb. ekranlarda personeli hızlı seçersiniz."
            },
            {
              "ad": "projesorgula / projekartsorgula",
              "tetik": "Proje arama kutusu",
              "etki": "proje_kart (ve proje listeleri) okunur, öneri döner",
              "neden_sonuc": "Evrak/görevi doğru projeye bağlarsınız."
            },
            {
              "ad": "tasiyicisorgula / tasitsorgula / soforsorgula",
              "tetik": "İrsaliye taşıma alanlarında arama",
              "etki": "irsaliye_tasiyici / irsaliye_plaka / irsaliye_sofor tablolarından öneri döner",
              "neden_sonuc": "İrsaliye sevkiyat bilgilerini hızlı ve tutarlı doldurursunuz."
            },
            {
              "ad": "ilcesorgula / semtsorgula / mahallesorgula",
              "tetik": "Adres alanında üst seçim değişince",
              "etki": "ptt_ilceler/ptt_semtler/ptt_mahalleler okunur, alt liste ve posta kodu döner",
              "neden_sonuc": "Adresi kademeli ve doğru girersiniz; posta kodu otomatik gelir."
            },
            {
              "ad": "takvimeventlist",
              "tetik": "Takvim görünümü açılışı",
              "etki": "takvim tablosu + lisanslı modüllerin takvim/liste.php dosyaları okunup birleşik etkinlik listesi döner",
              "neden_sonuc": "Görev, randevu ve modül olaylarını tek takvimde görürsünüz; yönetici herkesinkini, personel kendininkini görür."
            },
            {
              "ad": "eventekle",
              "tetik": "'Etkinlik Ekle'",
              "etki": "takvim tablosuna yeni etkinlik (ve seçilen kullanıcılara kopyaları) eklenir",
              "neden_sonuc": "Hatırlatma/görev oluşturursunuz; birden çok kullanıcıya atayabilirsiniz."
            },
            {
              "ad": "eventguncelle",
              "tetik": "Etkinlik düzenleme",
              "etki": "takvim kaydı güncellenir (yalnızca sahibi)",
              "neden_sonuc": "Etkinlik tarih/başlığını değiştirirsiniz; başkasının etkinliğini değiştiremezsiniz."
            },
            {
              "ad": "eventsil",
              "tetik": "Etkinlik silme",
              "etki": "takvim kaydı DURUM=-1 ile soft-silinir (yalnızca sahibi)",
              "neden_sonuc": "Gereksiz etkinliği kaldırırsınız; kayıt geri getirilebilir şekilde işaretlenir."
            },
            {
              "ad": "takvimmoduldetay",
              "tetik": "Takvimde bir modül etkinliğine tıklama",
              "etki": "İlgili modülün takvim detay dosyasından etkinliğin ayrıntısı okunur",
              "neden_sonuc": "Takvimdeki görev/randevunun detayını açarsınız."
            },
            {
              "ad": "fcmtokenkaydet",
              "tetik": "Tarayıcı/uygulama push izni",
              "etki": "user_fcm_token tablosuna cihaz token'ı eklenir/güncellenir",
              "neden_sonuc": "Anlık push bildirim alabilir hale gelirsiniz; token kaydolmazsa bildirim gelmez."
            },
            {
              "ad": "listennotification / bildirimliste",
              "tetik": "Bildirim zili / arka plan yoklaması",
              "etki": "user_notification okunur (okunmamışlar/son kayıtlar)",
              "neden_sonuc": "Yeni bildirimler anlık listelenir."
            },
            {
              "ad": "bildirimokundu",
              "tetik": "Bildirim zili menüsünden bir bildirimi veya 'Tümünü Okundu İşaretle'yi tıklama",
              "etki": "user_notification tablosunda ilgili kaydın/kayıtların OKUNDU alanı 1 yapılır",
              "neden_sonuc": "Okunmamış rozet sayısı düşer; hangi bildirime baktığınızı sistem hatırlar."
            },
            {
              "ad": "arsivedosyayukle",
              "tetik": "'Dosya Yükle'",
              "etki": "Dosya Google Drive veya S3'e yüklenir, dosya_arsiv tablosuna kaydedilir",
              "neden_sonuc": "Evrak/karta belge (sözleşme, görsel, PDF) bağlarsınız. Arşiv sistemi aktif değilse yükleme yapılamaz."
            },
            {
              "ad": "arsivedosyasil",
              "tetik": "Arşiv dosyası silme",
              "etki": "dosya_arsiv kaydı ve mümkünse bulut dosyası silinir",
              "neden_sonuc": "Yanlış/gereksiz belgeyi kaldırırsınız."
            },
            {
              "ad": "dovizkur / ilhavadurumu",
              "tetik": "Dashboard widget'ları",
              "etki": "Dış servislerden döviz kuru ve hava durumu okunur (yazma yok)",
              "neden_sonuc": "Güncel kur ve hava bilgisini panelde görürsünüz."
            },
            {
              "ad": "firebasesw",
              "tetik": "PWA/servis worker isteği",
              "etki": "Firebase yapılandırmasıyla dinamik service-worker JS üretilir",
              "neden_sonuc": "Uygulama arka planda push bildirim alabilir ve PWA olarak çalışır."
            }
          ],
          "iliskiler": [
            "cari",
            "stok",
            "personel",
            "proje",
            "irsaliye",
            "fatura",
            "ceksenet",
            "teklif",
            "siparis",
            "kesif",
            "bildirim"
          ],
          "ipuclari": [
            "Arama kutularında en az birkaç harf yazın; sonuçlar 10 kayıtla sınırlıdır.",
            "Cari seçiliyken ürün eklerseniz müşteriye özel fiyat listesi otomatik uygulanır.",
            "Takvimde başkasının etkinliğini silip düzenleyemezsiniz; yalnızca kendi kayıtlarınız.",
            "Dosya arşivi için Ayarlar'dan Google Drive veya S3 aktif edilmiş olmalıdır."
          ]
        }
      ]
    },
    {
      "slug": "entegrasyon",
      "title": "Dosya Arşivi (Drive)",
      "icon": "☁️",
      "modul": "entegrasyon",
      "ad": "Entegrasyon (Google Drive Dosya Arşivi Bağlantısı)",
      "ozet": "Entegrasyon modülü, NetEsnaf ERP'yi dış servislere bağlayan köprü katmanıdır. Mevcut sürümde tek entegrasyonu Google Drive'dır: işletmenin kendi Google hesabını OAuth ile sisteme bağlayarak fatura, servis fişi, keşif fotoğrafı gibi belge eklerinin Google Drive'da (NetEsnaf klasörü) saklanmasını sağlar. Bu modülün kendi menü ekranı, liste sayfası veya event.php işlemleri YOKTUR; klasik index.php + event.php deseni yerine yalnızca üç doğrudan URL uç noktası barındırır (bağlan / OAuth geri dönüşü / bağlantıyı kaldır). Bu uç noktalar sayfa olarak ekranda listelenmez; tarayıcı adres satırından çağrılan işlevsel adreslerdir. Bağlantı yönetimi ise Ayarlar > Genel > Dosya Arşivi ekranından (ayar modülü) yürütülür; oradaki 'Google Drive Bağlantısını Yap' ve 'Bağlantısını Kapat' bağlantıları bu modülün uç noktalarına yönlendirir. Google Drive'a alternatif olarak S3 uyumlu depolama (Narbulut NOSS vb.) da aynı Dosya Arşivi ekranından seçilebilir. Entegrasyon katmanı ayrıca e-belge entegratörlerini de kapsar: e-Fatura, e-Arşiv, e-İrsaliye ve e-Müstahsil belgeleri için mevcut EDM entegratör akışına ek olarak İzibiz de bir entegratör seçeneği olarak eklenmiştir; entegratör Ayarlar > Genel > E-Belge (Entegratör) ekranından seçilir, İzibiz kullanıcı adı/şifresiyle bağlanılır ve belge düzenleme akışı (Fatura ekranı 'E-Belge Gönder', Gelen Kutusu, durum sorgu) aynen korunur.",
      "modul_iliskiler": [
        "ayar (sys_ayar - dosya arşivi tercihi ve googledrive OAuth token/ayarları burada tutulur; ayrıca e-belge entegratör seçimi ve İzibiz kullanıcı bilgileri de bu ekranda tutulur; bağlan/kapat butonları ayar/tanim/genel.php ekranındadır)",
        "servis (servis fişi belge/fotoğraf ekleri Drive'a yüklenebilir)",
        "kesif (keşif form ve fotoğrafları)",
        "istakip (ilgilenen kayıt ekleri)",
        "musteritedarikci (cari kart belge ekleri)",
        "personel (personel profil belgeleri)",
        "fatura (e-Fatura/e-Arşiv gönderimi seçili entegratör (EDM/İzibiz) üzerinden yapılır)",
        "irsaliye (e-İrsaliye seçili entegratör üzerinden)",
        "serbestmeslek (e-Müstahsil / serbest meslek makbuzu seçili entegratör üzerinden)",
        "S3Storage / Narbulut NOSS (Google Drive'a alternatif S3 uyumlu arşiv seçeneği)"
      ],
      "ekranlar": [
        {
          "id": "connect",
          "baslik": "Google Drive Bağlantısını Yap (Yetkilendirme Başlat)",
          "yol": "/ekran/entegrasyon/googledrive/connect",
          "sub": "googledrive",
          "amac": "İşletmenin Google hesabıyla NetEsnaf arasında yetkilendirme (OAuth) sürecini başlatan doğrudan URL uç noktasıdır. Çağrıldığında hiçbir sayfa göstermeden, kayıtlı OAuth bilgileriyle bir Google izin adresi üretip kullanıcıyı otomatik olarak Google'ın onay ekranına yönlendirir.",
          "neden": "Belge eklerini (servis fişi, keşif fotoğrafı, fatura vb.) kendi Google Drive alanınızda saklamak istediğinizde, sistemin Drive'a dosya yükleyebilmesi için önce bu iznin verilmesi gerekir. İzin verilmeden Drive'a hiçbir dosya yüklenemez. Bu uç nokta o iznin ilk adımını (Google'a gitme) başlatır.",
          "nasil": [
            "Ayarlar > Genel > Dosya Arşivi bölümüne girin.",
            "Depolama tipi olarak GOOGLE DRIVE KULLAN seçeneğini işaretleyin.",
            "Google OAuth Client ID, Client Secret ve Redirect URI alanlarını doldurup kaydedin (Redirect URI olarak ekranda gösterilen .../ekran/entegrasyon/googledrive/auth adresini Google Console'a birebir tanımlayın).",
            "Bağlantı durumu 'Yok' iken görünen 'Google Drive Bağlantısını Yap' butonuna tıklayın (yeni sekmede açılır).",
            "Açılan Google ekranında hesabınızı seçip istenen tüm izinleri onaylayın.",
            "Onay sonrası sistem sizi otomatik olarak Ayarlar ekranına geri getirir ve bağlantı durumu 'Aktif' olur."
          ],
          "butonlar": [
            {
              "ad": "Google Drive Bağlantısını Yap",
              "islev": "Ayarlar > Dosya Arşivi ekranındaki, durum 'Yok' iken görünen bir bağlantı butonudur; bu connect uç noktasına gider ve Google izin ekranına yönlendirir",
              "sonuc": "Kullanıcı yeni sekmede Google onay sayfasına gider",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "googledrive_connect (uç nokta çağrısı — event.php case'i değil, doğrudan sayfa yükleme işlevidir)",
              "tetik": "Ayarlar > Dosya Arşivi ekranındaki 'Google Drive Bağlantısını Yap' bağlantısına tıklanması (yeni sekme)",
              "etki": "GoogleDrive servisi, sys_ayar'daki googledrive Client ID/Secret/Redirect URI ile bir Google OAuth yetkilendirme adresi üretir (offline erişim ve consent istenerek) ve tarayıcı doğrudan Google'a yönlendirilir; bu adımda henüz hiçbir kayıt değişmez",
              "neden_sonuc": "Bu adım Drive bağlantısının ilk kapısıdır. Yapılınca Google izin ekranına gidersiniz. Client ID/Secret girilmemişse sistem 'Google OAuth bilgileri eksik' hatası verir, izni başlatamaz ve dosyalarınız Drive'a yüklenemez."
            }
          ],
          "iliskiler": [
            "ayar",
            "S3Storage (alternatif arşiv)"
          ],
          "ipuclari": [
            "Google Cloud Console'da OAuth istemcisi oluştururken Redirect URI'yi ekranda yazan adresle (.../ekran/entegrasyon/googledrive/auth) birebir aynı girin; farklıysa Google 'redirect_uri_mismatch' hatası verir.",
            "Buton yeni sekmede açılır; işlemi tamamlamadan sekmeyi kapatmayın.",
            "Client ID ve Secret girilmeden bu uç nokta çalışmaz; 'Google OAuth bilgileri eksik' uyarısı alırsınız.",
            "Buton yalnızca bağlantı durumu 'Yok' iken görünür; 'Aktif' durumda yerine 'Bağlantıyı Kapat' butonu çıkar."
          ]
        },
        {
          "id": "auth",
          "baslik": "Google Drive Yetkilendirme Geri Dönüşü (OAuth Callback)",
          "yol": "/ekran/entegrasyon/googledrive/auth",
          "sub": "googledrive",
          "amac": "Google'ın izin ekranından sonra kullanıcıyı geri gönderdiği adrestir (Redirect URI). Google'dan gelen yetki kodunu (?code=) alıp erişim token'ına çevirir, token'ı şifreleyerek ayarlara kaydeder ve Drive'da 'NetEsnaf' kök klasörünü oluşturur. Bu adımın kendi görsel ekranı yoktur; işi bitince Ayarlar ekranına yönlendirir.",
          "neden": "Bağlantının fiilen kurulduğu ve kalıcı hale geldiği adımdır. Bu adım tamamlanmadan sistemin Drive'a dosya yükleme/indirme yetkisi olmaz. Kullanıcı bu adrese elle girmez; Google izin onayından sonra otomatik yönlendirir.",
          "nasil": [
            "Google onay ekranında izinleri onayladıktan sonra bu adrese otomatik dönülür (elle girilmez).",
            "URL'de yetki kodu (?code=) yoksa işlem başlamaz, 'Authorization code missing' uyarısı verilir.",
            "Sistem Google'dan gelen yetki kodunu erişim token'ına çevirir.",
            "Token AES-256-GCM ile şifrelenir; kapsam (SCOPE), token bitiş zamanı (TOKEN_EXPIRE_AT) ve Drive kök klasör kimliği (DRIVE_ROOT_FOLDER_ID) ile birlikte sys_ayar > googledrive'a kaydedilir ve BAGLANDI=1 yapılır.",
            "Drive'da 'NetEsnaf' adlı kök klasör yoksa oluşturulur.",
            "Başarılıysa 'Bağlantı Sağlandı' bildirimi verilir ve Ayarlar ekranına dönülür; hata olursa 'Hata Oluştu' mesajı gösterilip yine Ayarlar ekranına dönülür."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "googledrive_auth_callback (uç nokta çağrısı — event.php case'i değil, Google'ın çağırdığı geri dönüş sayfasıdır)",
              "tetik": "Google izin onayı sonrası otomatik yönlendirme (URL'de ?code= parametresiyle)",
              "etki": "Yetki kodu erişim token'ına çevrilir; sys_ayar > googledrive bölümüne SCOPE, ACCESS_TOKEN (AES-256-GCM ile şifreli), TOKEN_EXPIRE_AT, DRIVE_ROOT_FOLDER_ID yazılır ve BAGLANDI=1 yapılır; Drive'da 'NetEsnaf' kök klasörü oluşturulur",
              "neden_sonuc": "Bu callback başarıyla dönerse bağlantı 'Aktif' olur ve artık dosya arşivi GOOGLEDRIVE seçili tüm modüller belgeleri Drive'a yükleyebilir. Kod gelmezse 'Authorization code missing', Google hata dönerse (invalid_grant vb.) 'Hata Oluştu' uyarısı verilir; bağlantı kurulmaz ve Drive kullanımı açılmaz."
            }
          ],
          "iliskiler": [
            "ayar"
          ],
          "ipuclari": [
            "Token yenilenebilmesi için Google'ın 'offline' erişim ve 'consent' izni istenir; bu yüzden ilk bağlantıda tüm izinleri onaylamak gerekir. Aksi halde refresh_token gelmez ve token süresi dolunca sistem yeniden bağlanmanızı ister (ReconnectRequired).",
            "Erişim token'ı düz metin değil AES-256-GCM ile şifreli saklanır; güvenlik için sys_ayar'daki bu değeri elle düzenlemeyin.",
            "Bağlantı sonrası dosyalar Google Drive'daki 'NetEsnaf' klasörüne yüklenir; bu klasörü Drive'da silmeyin.",
            "Bu adres Google Console'a tanımladığınız Redirect URI ile birebir aynı olmalıdır."
          ]
        },
        {
          "id": "disconnect",
          "baslik": "Google Drive Bağlantısını Kapat",
          "yol": "/ekran/entegrasyon/googledrive/disconnect",
          "sub": "googledrive",
          "amac": "İşletmenin Google Drive bağlantısını kaldıran doğrudan URL uç noktasıdır; giriş yapılan firmaya (FID) ait kayıtlı googledrive OAuth ayarlarını ve şifreli token'ı sys_ayar tablosundan siler, ardından Ayarlar ekranına döner.",
          "neden": "Google hesabını değiştirmek, entegrasyonu iptal etmek veya sıfırdan yeniden bağlanmak istediğinizde kullanılır. Bağlantı kaldırıldığında sistem artık Drive'a yeni dosya yükleyemez.",
          "nasil": [
            "Ayarlar > Genel > Dosya Arşivi bölümüne girin (bağlantı durumu 'Aktif' olmalı; buton yalnızca bu durumda görünür).",
            "'Google Drive Bağlantısını Kapat' butonuna tıklayın (aynı sekmede çalışır).",
            "Sistem bu firmaya ait tüm googledrive ayarlarını siler ve 'Bağlantı Kaldırıldı' bildirimi verir.",
            "Ayarlar ekranına dönülür ve durum tekrar 'Yok' olarak görünür."
          ],
          "butonlar": [
            {
              "ad": "Google Drive Bağlantısını Kapat",
              "islev": "Ayarlar > Dosya Arşivi ekranındaki, durum 'Aktif' iken görünen bir bağlantı butonudur; bu disconnect uç noktasına gider ve kayıtlı Drive ayarlarını siler",
              "sonuc": "Bağlantı kaldırılır, durum 'Yok' olur",
              "renk": "danger"
            }
          ],
          "eventler": [
            {
              "ad": "googledrive_disconnect (uç nokta çağrısı — event.php case'i değil, doğrudan sayfa yükleme işlevidir)",
              "tetik": "Ayarlar > Dosya Arşivi ekranındaki 'Google Drive Bağlantısını Kapat' bağlantısına tıklanması",
              "etki": "sys_ayar tablosundan giriş yapılan firmaya (FID) ait BOLUM='googledrive' kayıtlarının tamamı silinir (şifreli token, kök klasör kimliği, bağlı durumu dahil)",
              "neden_sonuc": "Bunu yapınca entegrasyon tamamen sıfırlanır ve yeni belgeler artık Drive'a gitmez. Yanlışlıkla yaparsanız tekrar 'Bağlantıyı Yap' ile baştan yetkilendirmeniz gerekir. Daha önce Drive'a yüklenmiş dosyalar Drive'da olduğu gibi kalır; yalnızca sistemin erişim yetkisi kaldırılır."
            }
          ],
          "iliskiler": [
            "ayar"
          ],
          "ipuclari": [
            "Bağlantıyı kaldırmak Drive'daki mevcut dosyaları silmez; yalnızca sistemin erişim yetkisini (token'ı) kaldırır.",
            "Google hesabını değiştirecekseniz önce burada bağlantıyı kapatın, sonra yeni hesapla yeniden bağlanın.",
            "Bu işlem yalnızca giriş yapılan firmayı (FID) etkiler; diğer firmaların bağlantısına dokunmaz."
          ]
        },
        {
          "id": "izibiz",
          "baslik": "İzibiz e-Belge Entegratörü Bağlantısı",
          "yol": "ayar/tanim/genel.php (E-Belge / Entegratör seçimi)",
          "sub": "izibiz",
          "amac": "NetEsnaf'ın e-Fatura, e-Arşiv, e-İrsaliye ve e-Müstahsil belgelerini gönderip sorgulaması için İzibiz entegratörünü aktif eden seçenektir. Mevcut EDM akışına ek bir entegratör seçeneği olarak eklenir: Ayarlar > Genel > E-Belge ekranından entegratör olarak İzibiz seçilir ve İzibiz kullanıcı adı/şifresiyle bağlanılır. Fatura/irsaliye/serbest meslek makbuzu düzenleme ve 'E-Belge Gönder' akışı aynen korunur; yalnızca belgeyi GİB'e ileten entegratör kanalı değişir.",
          "neden": "İşletmeler e-belge entegratörünü serbestçe seçmek ister; kimi EDM, kimi İzibiz ile çalışır. Tek entegratöre bağımlılık, sözleşme/fiyat değişiminde geçiş zorluğu yaratır. İzibiz seçeneği, belge ekranları ve kullanıcı alışkanlıkları hiç değişmeden e-belge sağlayıcısını İzibiz'e taşımayı sağlar. Bağlantı kurulmadan İzibiz kanalından belge gönderilemez.",
          "nasil": [
            "Ayarlar > Genel > E-Belge (Entegratör) bölümüne girin.",
            "Entegratör olarak İZİBİZ seçeneğini işaretleyin.",
            "İzibiz'in verdiği kullanıcı adı ve şifreyi ilgili alanlara girip kaydedin.",
            "Sistem bu bilgilerle güvenli bir oturum (JWT/token) açarak bağlantıyı doğrular; başarılıysa aktif entegratör İzibiz olur.",
            "Faturalarınızı her zamanki gibi kesip 'E-Belge Gönder' ile gönderin; belge İzibiz üzerinden iletilir. e-Fatura/e-Arşiv ayrımı cari mükellefiyetine göre otomatik yapılır.",
            "Gelen kutusu, durum sorgu ve kabul/red yanıtları aynı ekranlardan yürür; e-İrsaliye ve e-Müstahsil de İzibiz kanalıyla desteklenir."
          ],
          "butonlar": [
            {
              "ad": "Kaydet / Bağlan",
              "islev": "Ayarlar > E-Belge ekranında İzibiz kullanıcı bilgilerini kaydeder ve bağlantıyı doğrular; aktif entegratörü İzibiz yapar",
              "sonuc": "Entegratör İzibiz olarak aktif olur; e-belgeler artık İzibiz üzerinden gönderilir",
              "renk": "primary"
            }
          ],
          "eventler": [
            {
              "ad": "izibiz_entegrator_baglan (ayar kaydı — e-belge entegratör seçimi ve İzibiz kimlik bilgilerinin yazılması)",
              "tetik": "Ayarlar > Genel > E-Belge ekranında entegratör olarak İzibiz seçilip kullanıcı adı/şifre kaydedilmesi",
              "etki": "sys_ayar'a e-belge entegratör tercihi İZİBİZ ve İzibiz kullanıcı bilgileri (şifre güvenli saklanır) yazılır; sonraki e-belge gönderim/sorgu istekleri İzibiz REST servisine (JWT oturumu ile) gider",
              "neden_sonuc": "Doğru kullanıcı/şifre ile bağlantı kurulunca kesilen e-Fatura/e-Arşiv/e-İrsaliye/e-Müstahsil belgeleri İzibiz üzerinden iletilir; belge ekranları değişmez. Bilgiler hatalıysa oturum açılamaz, sistem uyarı verir ve belge gönderimi açılmaz."
            }
          ],
          "iliskiler": [
            "ayar",
            "fatura",
            "irsaliye",
            "serbestmeslek",
            "musteritedarikci"
          ],
          "ipuclari": [
            "İzibiz kullanıcı adı ve şifresi, İzibiz'in size verdiği e-belge portal bilgileridir; kaydettikten sonra küçük bir test faturasıyla gönderimi doğrulayın.",
            "Entegratör seçimi tüm e-belge türlerini (e-Fatura, e-Arşiv, e-İrsaliye, e-Müstahsil) etkiler; EDM'den İzibiz'e geçişte belge akışı değişmez, yalnızca ileten kanal değişir.",
            "Aktif entegratörü değiştirdiğinizde yalnızca yeni belgeler seçilen entegratör üzerinden gider; geçmiş belgeler olduğu gibi kalır.",
            "Bağlantı yalnızca giriş yapılan firmayı (FID) etkiler; entegratör ve kullanıcı bilgileri firma bazında ayrı tutulur."
          ]
        }
      ]
    },
    {
      "slug": "destek",
      "title": "Destek Talepleri",
      "icon": "🎧",
      "modul": "destek",
      "ad": "Destek Talepleri",
      "ozet": "Destek modulu, firmanin acmis oldugu destek taleplerini (ticket) takip etmesini ve destek ekibiyle mesajlasmasini saglar. Talepler durum (Acik/Kapali) ve oncelik (Dusuk/Normal/Yuksek/Acil) bazinda filtrelenir; her talebin altinda kronolojik mesaj gecmisi tutulur, acik taleplere dosya ekli yanit gonderilebilir. Talep detayi mesajlari karsilikli sohbet balonu duzeninde gosterir; ekran acikken destek ekibinden gelen yeni yanitlar sayfa yenilenmeden canli olarak belirir. Kapanmis bir talebe yeniden yazildiginda talep otomatik yeniden acilir. Talep detayi acildiginda destek ekibinin son yaniti otomatik okundu isaretlenir.",
      "modul_iliskiler": [
        "cari (FIRMA_ID uzerinden firma bazli talep sahipligi; her talep yalnizca kendi firmasina gorunur)",
        "kullanici/oturum (talebi bildiren USER_ADSOYAD ve yaniti gonderen FIRMA_KULLANICI_ID)",
        "main modulu (Yeni Talep, main/destekkaydi islemi ve sorunbildir modali uzerinden olusturulur)"
      ],
      "ekranlar": [
        {
          "id": "taleplerim",
          "baslik": "Taleplerim",
          "yol": "/ekran/destek/islem/taleplerim",
          "sub": "islem",
          "amac": "Firmanin actigi tum destek taleplerini tek bir tabloda gorur; her talebin numarasi, konusu, kategorisi (turu), onceligi, durumu, cevap sayisi, acilma ve son guncelleme tarihi bir bakista okunur.",
          "neden": "Bir sorun bildirdikten sonra taleplerinizin nerede kaldigini, destek ekibinin cevap verip vermedigini takip etmeniz gerekir. Destek ekibi yanit verdiginde (SON_CEVAP_TARAF=2) talep 'Yeni Yanit' rozetiyle ve kalin yazi ile one cikar; boylece hangi talebe bakmaniz gerektigini kacirmama garanti edilir.",
          "nasil": [
            "Ust bardan 'Tumu / Acik / Kapali' dugmeleriyle talepleri duruma gore suzun.",
            "Yanindaki Dusuk / Normal / Yuksek / Acil dugmeleriyle oncelik bazinda suzun.",
            "'Yeni Yanit' rozetli veya kalin gorunen satirlar destek ekibinin size cevap verdigi (henuz gormediginiz) taleplerdir; oncelikle onlara bakin.",
            "Bir talebin konusuna ya da satir sonundaki goz (detay) simgesine tiklayarak talep detayina ve mesajlasmaya girin.",
            "Yeni bir sorun icin sag ustteki 'Yeni Talep' dugmesiyle 'Sorun Bildir' penceresini acin.",
            "Liste 50 kayitlik sayfalar halinde gelir; kart altindaki sayfa numaralariyla eski taleplere gecebilirsiniz."
          ],
          "butonlar": [
            {
              "ad": "Yeni Talep",
              "islev": "Sag ust baslikta yer alir; destek.modalAc() ile 'Sorun Bildir' penceresini acar. Pencerede Destek Turu (kategori), Konu, Mesaj, Oncelik alanlari ve opsiyonel dosya secimi bulunur; 'Destek Kaydi Ac' ile kaydedilir (main/destekkaydi).",
              "sonuc": "Girilen bilgilerle yeni bir destek talebi olusur ve listeye eklenir.",
              "renk": "primary"
            },
            {
              "ad": "Tumu",
              "islev": "Durum filtresini kaldirir, tum talepleri listeler.",
              "sonuc": "Acik ve kapali tum talepler goruntulenir.",
              "renk": "ghost"
            },
            {
              "ad": "Acik",
              "islev": "Sadece durumu Acik (DURUM=1) olan talepleri listeler.",
              "sonuc": "Halen cozulmemis / devam eden talepler gorunur.",
              "renk": "accent"
            },
            {
              "ad": "Kapali",
              "islev": "Sadece durumu Kapali (DURUM=2) olan talepleri listeler.",
              "sonuc": "Sonuclanmis talepler gorunur.",
              "renk": "accent"
            },
            {
              "ad": "Dusuk / Normal / Yuksek / Acil",
              "islev": "Secilen oncelik seviyesine gore listeyi suzer (ONCELIK 1-4).",
              "sonuc": "Yalnizca o oncelikteki talepler listelenir.",
              "renk": "ghost"
            },
            {
              "ad": "Detay (goz simgesi)",
              "islev": "Satirdaki talebin detay/mesajlasma ekranini (destekdetay?recid=..) acar.",
              "sonuc": "Talep detayina ve mesaj gecmisine gidilir.",
              "renk": "primary"
            }
          ],
          "eventler": [],
          "iliskiler": [
            "cari",
            "kullanici/oturum",
            "main modulu"
          ],
          "ipuclari": [
            "Kalin yazili veya 'Yeni Yanit' rozetli satirlar destek ekibinin cevapladigi, sizin henuz gormediginiz (acik) taleplerdir.",
            "Talepler her zaman firmaniza (FIRMA_ID) ozeldir; baska firmanin talepleri gorunmez.",
            "Liste acilma tarihine (INSERT_TIME) gore en yeniden eskiye siralidir ve sayfa basina 50 kayit gosterir.",
            "Durum ve oncelik filtreleri URL parametresiyle calisir; ikisini ayni anda kullanabilirsiniz.",
            "'devamedenler' ve 'tamamlananlar' adresleri artik kullanilmiyor; her ikisi de otomatik olarak Taleplerim ekranina yonlendirir."
          ]
        },
        {
          "id": "destekdetay",
          "baslik": "Talep Detayi",
          "yol": "/ekran/destek/islem/destekdetay",
          "sub": "islem",
          "amac": "Tek bir destek talebinin tum bilgilerini (talep no, durum, oncelik, kategori, bildiren, atanan, acilma/guncelleme tarihi, varsa acildigi sayfa) ve destek ekibiyle yapilan mesajlasmayi karsilikli sohbet balonu duzeninde gosterir; acik taleplerde dosya ekli yeni yanit gonderilebilir.",
          "neden": "Bir sorunun cozum surecini bastan sona takip etmek, destek ekibinin sorularini yanitlamak ve ekran goruntusu/belge gibi dosyalari paylasmak icin kullanilir. Mesajlar bir mesajlasma uygulamasi gibi karsilikli balonlarda dizilir (kendi mesajlariniz bir tarafta, destek yanitlari diger tarafta). Ekrani acik tuttugunuz surece destek ekibinden gelen yeni yanitlar sayfa yenilenmeden canli olarak akisa duser. Bu ekrani actiginizda, destek ekibinin cevabini (SON_CEVAP_TARAF=2) otomatik okundu (0) isaretlenir; boylece talep listesindeki 'Yeni Yanit' rozeti temizlenir.",
          "nasil": [
            "Taleplerim listesinden bir talebe tiklayarak bu ekrani acin.",
            "Sol taraftaki 'Talep Bilgileri' kartindan talep no, durum, oncelik, kategori, bildiren, varsa atanan kisi ve acildigi sayfayi gorun.",
            "Sag taraftaki mesaj akisinda 'Ilk Mesaj' (talep acilisi) ve tum yanitlari sohbet balonlari halinde kronolojik okuyun; sizin mesajlariniz bir tarafta, destek ekibi yanitlari diger tarafta (kulaklik simgesiyle, farkli renkte) gorunur.",
            "Ekrani acik biraktiginizda destek ekibinden gelen yeni yanit sayfa yenilenmeden kendiliginden akisin altina duser; konusmayi canli takip edin.",
            "Talep aciksa alttaki kutuya yanitinizi yazin.",
            "Gerekirse 'Dosya Ekle' ile gorsel/pdf/office/txt/zip/rar dosyasi secin (en fazla 10 MB).",
            "'Gonder' dugmesine basin; mesajiniz sayfa yenilenmeden aninda akisa eklenir ve destek ekibine iletilir.",
            "Talep daha once kapatilmis olsa bile yanit yazabilirsiniz; mesaj gonderdiginizde talep otomatik yeniden acilir ve mesajiniz eski yazismanin altina eklenir."
          ],
          "butonlar": [
            {
              "ad": "Dosya Ekle",
              "islev": "Yanita eklenecek dosyayi secmek icin gizli dosya seciciyi acar; secilen dosyanin adini yaninda gosterir.",
              "sonuc": "Secilen dosya, Gonder'e basinca mesajla birlikte yuklenir.",
              "renk": "ghost"
            },
            {
              "ad": "Gonder",
              "islev": "Yaziyi (ve varsa dosyayi) mesajgonder eventine AJAX ile POST eder; yeni mesaj olarak talebe ekler.",
              "sonuc": "Mesaj kaydedilir, akisa aninda eklenir ve talebin son guncelleme/son cevap bilgisi guncellenir.",
              "renk": "primary"
            },
            {
              "ad": "Taleplerim",
              "islev": "Ust baslik (breadcrumb) baglantisidir; talep listesine geri doner.",
              "sonuc": "Taleplerim ekranina donulur.",
              "renk": "ghost"
            }
          ],
          "eventler": [
            {
              "ad": "mesajgonder",
              "tetik": "'Gonder' dugmesi / #destekDetayForm gonderimi (destekDetay.mesajGonder AJAX)",
              "etki": "destek_kart_cevap tablosuna yeni cevap kaydi eklenir (ACIKLAMA, FIRMA_KULLANICI_ID, SYS_KULLANICI_ID=0, ISLEM_ZAMAN, varsa DOSYA_YOLU/DOSYA_ADI); destek_kart kaydinin UPDATE_TIME, SON_CEVAP_ZAMAN, SON_CEVAP_TARAF=1 (musteri) ve CEVAP_SAYISI (+1) alanlari guncellenir.",
              "neden_sonuc": "Bu islemle destek ekibine mesajiniz iletilir ve talep 'guncel' hale gelir. Talep kapali (DURUM=2) olsa bile yeni yanit gonderildiginde talep otomatik olarak yeniden acilir (DURUM=1) ve mesaj ayni yazismanin altina eklenir; ek talebiniz icin sifirdan yeni talep acmaniza gerek kalmaz. Mesaj bos olamaz. Yuklenen dosya uzanti+gercek MIME kontrolunden gecmeli ve 10 MB'i asmamalidir; sartlari saglamayan dosya sessizce eklenmez ancak mesaj yine gonderilir."
            }
          ],
          "iliskiler": [
            "cari",
            "kullanici/oturum"
          ],
          "ipuclari": [
            "Mesajlar karsilikli sohbet balonu duzeninde dizilir; kendi mesajlariniz bir tarafta, destek yanitlari diger tarafta gorunur.",
            "Ekrani acik tuttugunuz surece destek ekibinden gelen yeni yanit sayfa yenilenmeden canli olarak akisa duser; yenilemeye gerek yoktur.",
            "Kapanmis bir talebe yeniden yazdiginizda talep otomatik yeniden acilir ve mesajiniz eski yazismanin altina eklenir; ayni konu tek talepte kalir.",
            "Bu ekrani her acisinizda destek ekibinin son cevabi otomatik 'okundu' isaretlenir; listedeki 'Yeni Yanit' rozeti kaybolur.",
            "Yalnizca su uzantilar yuklenebilir: jpg, jpeg, png, gif, pdf, doc, docx, xls, xlsx, txt, zip, rar; sinir 10 MB.",
            "Gorsel dosyalar mesaj icinde onizleme (tiklaninca buyur), digerleri tiklanabilir baglanti olarak gorunur.",
            "Tumuyle yeni ve farkli bir sorun icin Taleplerim'den 'Yeni Talep' ile ayri bir destek talebi acmaniz daha duzenli olur.",
            "Talep Bilgileri kartinda 'Sayfa' (REFURL) alani varsa, talebin hangi ekrandan acildigini gosterir; destek ekibinin sorununuzu hizli anlamasina yardim eder."
          ]
        }
      ]
    },
    {
      "slug": "otomasyon",
      "title": "Otomasyon",
      "icon": "⚡",
      "modul": "otomasyon",
      "ad": "Otomasyonlar (Olay Tabanlı Kural Motoru)",
      "ozet": "NetEsnaf'ın olay tabanlı otomasyon motoru; ERP içinde bir iş olayı gerçekleştiğinde (fatura kesildi, tahsilat yapıldı, servis durumu değişti vb.) otomatik olarak uygulama içi bildirim, push (FCM), SMS, e-posta, Telegram veya webhook aksiyonu tetikler. Ayar modülü altında (Ayar > Tanım > Otomasyonlar) yönetilir. Her otomasyon bir TETİKLEYİCİ (olay) + opsiyonel KOŞULLAR + bir veya daha çok AKSİYON'dan oluşur. Tetikleyiciler tüm modüllerin index.php dosyalarındaki 'otomasyon_trigger' bloklarından toplanır (register.php içinde GLOBALS['_OTOMASYON_TRIGGERLAR']); DOĞRULANDI: toplam 15 modülden 38 olay tetikleyici mevcuttur (envanterdeki 33 rakamı yanlıştı, kodda 38 sayıldı). Motor lib/Servis/Otomasyon.php içinde çalışır: ilgili modülün event.php'sinden Servis\\Otomasyon::tetikle(config,db,SAAS,'OLAY_KOD',veri) çağrılır; aktif (DURUM=1) ve FID'i eşleşen otomasyonlar bulunur, koşullar AND mantığıyla değerlendirilir, aksiyonlar sırayla çalıştırılır ve otomasyon_log tablosuna sonuç yazılır. Mesajlarda {{cari.unvan}}, {{tutar|para:USD}}, {{tarih|tarihsaat}} gibi şablon değişkenleri kullanılabilir. Otomasyon hatası try/catch ile izole edilir, ana ERP işlemini (fatura kesme vb.) asla engellemez. Loglar 90 günden eski olduğunda motor tarafından otomatik temizlenir (LOG_SAKLA_GUN=90). Multi-tenant (her sorguda FID), soft delete (DURUM=-1).",
      "modul_iliskiler": [
        "fatura (SATIS_FATURA_KESILDI, ALIS_FATURA_KESILDI, FATURA_IPTAL_EDILDI - 3 olay)",
        "ceksenet (CEK_OLUSTURULDU, CEK_DURUM_DEGISTI - 2 olay)",
        "irsaliye (IRSALIYE_KESILDI - 1 olay)",
        "kasa (MASRAF_FISI_KESILDI, VIRMAN_YAPILDI - 2 olay)",
        "personel (PUANTAJ_KAYDEDILDI, MAAS_TAHAKKUK_YAPILDI, PRIM_TAHAKKUK_YAPILDI, MAAS_ODEMESI_YAPILDI, AVANS_ODEMESI_YAPILDI - 5 olay)",
        "istakip/CRM (ILGILENEN_OLUSTURULDU, ILGILENEN_DURUMU_DEGISTI, FIRSAT_OLUSTURULDU, FIRSAT_ASAMASI_DEGISTI, FIRSAT_KAYBEDILDI, MUSTERI_DONUSUMU_YAPILDI - 6 olay)",
        "kesif (KESIF_DURUM_DEGISTI - 1 olay)",
        "musteritedarikci (CARI_OLUSTURULDU, TAHSILAT_YAPILDI, ODEME_YAPILDI - 3 olay)",
        "urunhizmet (STOK_HAREKETI_OLUSTU - 1 olay)",
        "sahasatis (SAHA_ZIYARET_TAMAMLANDI - 1 olay)",
        "proje (GOREV_OLUSTURULDU, GOREV_TAMAMLANDI - 2 olay)",
        "servis (SERVIS_TALEBI_OLUSTURULDU, SERVIS_DURUM_DEGISTI, SERVIS_SLA_ASILDI - 3 olay; SLA aşımı islem/_sla_pilotu.php ile)",
        "siparis (SIPARIS_OLUSTURULDU, SIPARIS_DURUM_DEGISTI - 2 olay)",
        "uretim (URETIM_EMRI_OLUSTURULDU, URETIM_TAMAMLANDI, HAMMADDE_KRITIK_STOK, URETIM_EMIR_GECIKTI - 4 olay)",
        "teklif (TEKLIF_OLUSTURULDU, TEKLIF_DURUM_DEGISTI - 2 olay)",
        "ayar > SMS/Mail/Telegram/FCM ayarları (config->check; aksiyonların ön koşulu)",
        "user tablosu (INAPP alıcı seçimi; TIP=-16081608 Yönetici, 1 Yetkili)",
        "user_notification tablosu (INAPP aksiyonu)",
        "user_fcm_token tablosu (FCM push token'ları)",
        "lib/Servis/Otomasyon.php (motor), lib/Servis/SMS.php, Mail(PHPMailer), Telegram.php, GoogleFCM.php"
      ],
      "ekranlar": [
        {
          "id": "otomasyon-liste",
          "baslik": "Otomasyonlar (Liste)",
          "yol": "/ekran/ayar/tanim/otomasyonlar",
          "sub": "tanim",
          "amac": "Firmaya tanımlı tüm otomasyon kurallarını tablo halinde listeler; her kuralın adı, tetikleyicisi, ait olduğu modül, kaç kez çalıştığı ve son çalışma zamanı görünür. Buradan yeni otomasyon eklenir, mevcutlar aktif/pasif edilir, düzenlenir veya silinir.",
          "neden": "Otomasyon yönetiminin ana giriş ekranıdır. Hangi otomatik akışların kurulu ve aktif olduğunu tek bakışta görmek, bir kuralı geçici kapatmak veya çalışma sıklığını izlemek istendiğinde kullanılır.",
          "nasil": [
            "Ayar > Tanım > Otomasyonlar menüsüne gir.",
            "Tabloda mevcut kuralları incele: Otomasyon Adı, Tetikleyici, Modül (mavi rozet), Çalışma sayısı (kez), Son Çalışma zamanı.",
            "Bir kuralı geçici kapatmak/açmak için aç-kapa (toggle) ikonuna tıkla.",
            "Yeni kural için 'Yeni Otomasyon' butonuna bas.",
            "Çalışma sonuçlarını görmek için 'Loglar' butonuna geç.",
            "Bir kuralı değiştirmek için DÜZENLE, kaldırmak için SİL butonunu kullan."
          ],
          "butonlar": [
            {
              "ad": "Yeni Otomasyon",
              "islev": "Otomasyon oluşturma formunu açar (PAGE=otomasyonform, mode=yeni)",
              "sonuc": "Boş yeni otomasyon formu açılır",
              "renk": "info (mavi)"
            },
            {
              "ad": "Loglar",
              "islev": "Otomasyon çalışma geçmişi ekranına gider (PAGE=otomasyonlog)",
              "sonuc": "Log listesi açılır",
              "renk": "secondary (gri)"
            },
            {
              "ad": "Durum toggle (aç/kapa ikonu)",
              "islev": "otomasyondurumdegistir event'ini çağırır; mevcut DURUM okunup 1<->0 arası ters çevrilir (FID kısıtlı)",
              "sonuc": "Kural aktif ise pasif, pasif ise aktif olur; 'Aktif edildi'/'Pasif edildi' mesajı döner",
              "renk": "yeşil (aktif) / gri (pasif)"
            },
            {
              "ad": "DÜZENLE",
              "islev": "Kuralı düzenle modunda formda açar (otomasyonform, mode=duzenle&recid=ID)",
              "sonuc": "Dolu form açılır",
              "renk": "warning (sarı)"
            },
            {
              "ad": "SİL",
              "islev": "Onay sorup otomasyonsil event'ini çağırır (DURUM=-1 soft delete)",
              "sonuc": "Kural listeden kalkar",
              "renk": "danger (kırmızı)"
            }
          ],
          "eventler": [
            {
              "ad": "otomasyondurumdegistir",
              "tetik": "Durum toggle ikonuna tıklama",
              "etki": "otomasyon tablosunda DURUM alanı okunup 1 ise 0, değilse 1 yapılır (ID + FID ile sınırlı)",
              "neden_sonuc": "Pasif kural motorda TETIKLEYICI eşleşse bile çalışmaz (tetikle() sorgusu sadece DURUM=1 seçer); kullanıcı kuralı silmeden geçici durdurabilir"
            },
            {
              "ad": "otomasyonsil",
              "tetik": "SİL butonu + onay",
              "etki": "otomasyon tablosunda DURUM=-1 yapılır (kalıcı silinmez, soft delete), ID+FID kontrollü",
              "neden_sonuc": "Kural listeden ve motordan çıkar; multi-tenant kuralı gereği FID kontrolüyle sadece kendi firmasının kaydı silinebilir"
            }
          ],
          "iliskiler": [
            "otomasyon-form (Yeni/DÜZENLE ile açılır)",
            "otomasyon-log (Loglar butonu)",
            "GLOBALS _OTOMASYON_TRIGGERLAR (tetikleyici kodunu okunabilir ada / modüle çözer)"
          ],
          "ipuclari": [
            "Tetikleyici adı GLOBALS haritasından çözülür; ilgili modül yayında değilse ham tetikleyici kodu görünür.",
            "Çalışma sayısı (CALISMA_SAYISI) ve Son Çalışma (SON_CALISMA) alanları motor her başarılı değerlendirmede otomatik güncellenir.",
            "DURUM=-1 kayıtlar listede görünmez; toggle yalnızca 1<->0 arası çalışır.",
            "Hiç kural yoksa bilgi kutusu ve yeni otomasyon ekleme çağrısı gösterilir."
          ]
        },
        {
          "id": "otomasyon-form",
          "baslik": "Yeni Otomasyon / Otomasyon Düzenle",
          "yol": "/ekran/ayar/tanim/otomasyonform",
          "sub": "tanim",
          "amac": "Bir otomasyon kuralını uçtan uca tanımlar: Genel Bilgi (Ad [zorunlu], Açıklama, Tetikleyici [zorunlu], Durum), opsiyonel Koşullar (değişken + operatör + değer), ve bir veya birden çok Aksiyon (INAPP/FCM/SMS/Email/Telegram/Webhook). Düzenle modunda (mode=duzenle&recid) mevcut kayıt yüklenir; kaydedilmiş koşul ve aksiyonlar PHP tarafında aksiyonDetayHtml() ile geri render edilir.",
          "neden": "Otomatik akışın kalbini kurmak için kullanılır: 'Şu olay olduğunda, şu koşul sağlanırsa, şu aksiyonu yap' mantığını görsel olarak oluşturur. Örn: VIP müşteriye fatura kesilince yöneticiye uygulama içi bildirim + müşteriye SMS.",
          "nasil": [
            "Genel Bilgi'de Otomasyon Adı (zorunlu) ve Açıklama (opsiyonel) gir.",
            "Tetikleyici açılır listesinden olayı seç (modüle göre optgroup ile gruplu); seçince değişken rehberi ve koşul alan seçenekleri güncellenir.",
            "Durum'u Aktif(1)/Pasif(0) seç.",
            "İsteğe bağlı: 'Koşul Ekle' ile filtre satırı ekle — Değişken seç, operatör seç (Eşittir, Eşit Değil, Büyüktür, Küçüktür, Büyük Eşit, Küçük Eşit, İçerir, İçermez), Değer gir.",
            "'Aksiyon Ekle' menüsünden tip seç (Uygulama İçi Bildirim, Push/FCM, SMS, Email, Telegram, Webhook) ve alanlarını doldur.",
            "Mesaj/başlık alanlarına {{cari.unvan}}, {{fatura.genel_toplam|para}} gibi şablon değişkenleri yaz.",
            "KAYDET'e bas (otomasyon.kaydet); Ad+Tetikleyici boşsa ya da en az bir aksiyon yoksa hata döner."
          ],
          "butonlar": [
            {
              "ad": "Koşul Ekle",
              "islev": "otomasyon.kosulEkle — yeni koşul satırı (kosul_alan[]/kosul_operator[]/kosul_deger[]) ekler",
              "sonuc": "Koşul satırı belirir, 'Koşul eklenmedi' notu gizlenir",
              "renk": "outline-warning (sarı çerçeve)"
            },
            {
              "ad": "Koşul Sil (çöp ikonu)",
              "islev": "otomasyon.kosulSil(this) — ilgili koşul satırını DOM'dan kaldırır",
              "sonuc": "Satır silinir",
              "renk": "danger (kırmızı)"
            },
            {
              "ad": "Aksiyon Ekle (dropdown)",
              "islev": "otomasyon.aksiyonEkle('INAPP'|'FCM'|'SMS'|'EMAIL'|'TELEGRAM'|'WEBHOOK') — seçilen tipte aksiyon kartı ekler",
              "sonuc": "Tipe özel alanlarla aksiyon bloğu eklenir, 'En az bir aksiyon' notu gizlenir",
              "renk": "outline-info (mavi çerçeve)"
            },
            {
              "ad": "Kaldır (aksiyon)",
              "islev": "otomasyon.aksiyonSil(this) — aksiyon bloğunu kaldırır",
              "sonuc": "Aksiyon silinir",
              "renk": "outline-danger (kırmızı)"
            },
            {
              "ad": "KAYDET",
              "islev": "otomasyon.kaydet — FOtomasyon formunu otomasyonkaydet islem event'ine POST eder",
              "sonuc": "Kural kaydedilir, 'Otomasyon kaydedildi' başarı mesajı döner",
              "renk": "info (mavi)"
            },
            {
              "ad": "VAZGEÇ",
              "islev": "Kaydetmeden Otomasyonlar liste ekranına döner (link)",
              "sonuc": "Liste ekranına gider",
              "renk": "default (gri)"
            }
          ],
          "eventler": [
            {
              "ad": "otomasyonkaydet",
              "tetik": "KAYDET butonu (FOtomasyon form POST)",
              "etki": "tetikleyici_kod'dan GLOBALS üzerinden MODUL çözülür; kosul_alan/operator/deger dizileri KOSULLAR JSON'una toplanır; aksiyon_tip[] ve tipe özel alanlar (her tip için ayrı sayaç ci ile) AKSIYONLAR JSON'una toplanır; recid varsa ve kayıt FID'e aitse UPDATE, yoksa INSERT (ID, OLUSTURAN_ID=oturum.ID, OLUSTURMA_TARIH)",
              "neden_sonuc": "Ad veya tetikleyici boşsa 'Ad ve tetikleyici zorunludur', hiç aksiyon yoksa 'En az bir aksiyon eklemelisiniz' hatası döner; kayıt tenant DB'sindeki otomasyon tablosuna FID ile yazılır ve motor için hazır hale gelir"
            },
            {
              "ad": "tetikleyiciDegisti (client)",
              "tetik": "Tetikleyici select onchange",
              "etki": "Seçilen olaya ait değişkenler otomasyonTriggerMap'ten okunur; koşul alan seçeneklerine ve değişken rehberine (degiskenRehberi kartı) yüklenir, rehber görünür olur",
              "neden_sonuc": "Kullanıcı yalnızca o olayda gerçekten var olan değişkenleri (örn fatura.genel_toplam, cari.tel) seçebilir/kullanabilir"
            },
            {
              "ad": "inappAliciDegisti (client)",
              "tetik": "INAPP aksiyonunda Alıcı select onchange",
              "etki": "'Belirli Kullanıcılar' (secili) seçilince select2 çoklu-seçim alanı görünür ve seçim aksiyon_kullanici_idler_csv[] hidden alanına CSV yazılır; diğer seçimlerde gizlenir",
              "neden_sonuc": "Uygulama içi bildirimin hedefi (Tüm Kullanıcılar / Sadece Yöneticiler / Belirli Kullanıcılar) belirlenir"
            }
          ],
          "iliskiler": [
            "otomasyon-tetikleyiciler (tetikleyici listesi triggerGruplu optgroup'ları bu formu besler)",
            "otomasyon-aksiyonlar (aksiyon tipleri ve alanları)",
            "ayar SMS/Mail/Telegram/FCM ayarları (aksiyonların çalışması için ön koşul)",
            "user tablosu (INAPP alıcı seçimi FID'in aktif kullanıcılarından gelir)"
          ],
          "ipuclari": [
            "Koşullar boş bırakılırsa kural her tetiklemede çalışır; birden çok koşul AND (hepsi sağlanmalı) mantığıyla değerlendirilir.",
            "Sayısal karşılaştırma: hem gerçek hem beklenen değer numeric ise floatval ile sayısal kıyaslanır, aksi halde metin kıyaslanır.",
            "Şablon formatları: {{tutar|para}} -> 1.234,56 ₺; {{tutar|para:USD}} -> 1,234.56 $ (USD/EUR/GBP nokta-virgül düzeni); {{tarih|tarih}} -> gg.aa.yyyy; {{tarih|tarihsaat}} -> gg.aa.yyyy SS:dd. Döviz belirtilmezse veri['doviz'], o da yoksa TRY.",
            "SMS telefon alanı varsayılan {{cari.tel}}, Email alanı {{cari.email}} ile ön dolu gelir.",
            "Aynı kurala farklı tiplerde birden çok aksiyon eklenebilir; her tip için POST alanları ayrı sayaçla (ci) eşleştirilir.",
            "Webhook body'si JSON'dur ve içinde şablon değişkeni kullanılabilir: {\"key\":\"{{cari.unvan}}\"}."
          ]
        },
        {
          "id": "otomasyon-tetikleyiciler",
          "baslik": "Kullanılabilir Olaylar (Tetikleyiciler)",
          "yol": "(otomasyon-form içindeki Tetikleyici açılır menüsü ve Değişken Rehberi bölümü)",
          "sub": "tanim",
          "amac": "Otomasyon kurulurken seçilebilecek tüm olay tetikleyicilerinin envanteri. Her modül kendi index.php 'otomasyon_trigger' bloğunda hangi olayları ve o olayda hangi değişkenleri (fatura.*, cari.*, servis.* vb.) sağladığını bildirir; register.php bunları GLOBALS['_OTOMASYON_TRIGGERLAR'] altında toplar. Form bu listeyi modüle göre gruplu (optgroup) açılır menü olarak gösterir. DOĞRULANDI: 15 modülden 38 olay.",
          "neden": "Bir otomasyonun 'ne zaman' çalışacağını bu olaylar belirler. Kullanıcının hangi iş olaylarına bağlanabileceğini ve mesaj/koşullarda hangi değişkenleri kullanabileceğini bilmesi için referans niteliğindedir.",
          "nasil": [
            "Formda Tetikleyici açılır menüsünü aç; olaylar modül başlıklarıyla (Fatura, Servis, Kasa...) gruplanmıştır.",
            "İlgili olayı seç (örn 'Satış Faturası Kesildiğinde').",
            "Seçimden sonra 'Kullanılabilir Değişkenler' rehberi o olaya ait değişkenleri rozet olarak gösterir.",
            "Değişken rozetine tıklayarak {{degisken.adi}} formatını kopyala ve mesaj/koşula yapıştır."
          ],
          "butonlar": [
            {
              "ad": "Değişken rozeti (tıkla-kopyala)",
              "islev": "Seçili olayın değişkenini {{...}} formatında panoya kopyalar",
              "sonuc": "Şablon değişkeni kopyalanır",
              "renk": "badge-light border (açık/çerçeveli)"
            }
          ],
          "eventler": [
            {
              "ad": "SATIS_FATURA_KESILDI / ALIS_FATURA_KESILDI / FATURA_IPTAL_EDILDI",
              "tetik": "Fatura modülü (fatura/index.php): satış/alış faturası kesilince, fatura iptalinde",
              "etki": "fatura.id/seri/no/genel_toplam/kdv_toplam/vade_tarih (iptalde vade/kdv olmadan) + cari.id/unvan/tel/email ile tetiklenir",
              "neden_sonuc": "Satış/alış sonrası müşteriye-yöneticiye bilgilendirme ve iptal uyarı akışları için (3 olay)"
            },
            {
              "ad": "IRSALIYE_KESILDI",
              "tetik": "İrsaliye modülü: irsaliye kesildiğinde",
              "etki": "irsaliye.id/seri/no/tip/tarih + cari.* ile tetiklenir",
              "neden_sonuc": "Sevkiyat/irsaliye bildirimi için (1 olay)"
            },
            {
              "ad": "SIPARIS_OLUSTURULDU / SIPARIS_DURUM_DEGISTI",
              "tetik": "Sipariş modülü: sipariş oluşturma / durum değişimi",
              "etki": "Sipariş ve cari verisiyle tetiklenir",
              "neden_sonuc": "Sipariş takibi ve durum bildirimleri için (2 olay)"
            },
            {
              "ad": "TEKLIF_OLUSTURULDU / TEKLIF_DURUM_DEGISTI",
              "tetik": "Teklif modülü: teklif oluşturma / durum değişimi",
              "etki": "teklif.id/no/genel_toplam/gecerlilik/tip (durum değişiminde eski_durum/yeni_durum) + cari.* ile tetiklenir",
              "neden_sonuc": "Teklif onay/red süreçlerinin otomatik bildirimi için (2 olay)"
            },
            {
              "ad": "MASRAF_FISI_KESILDI / VIRMAN_YAPILDI",
              "tetik": "Kasa modülü: masraf fişi / virman işlemi",
              "etki": "Kasa hareketi verisiyle tetiklenir",
              "neden_sonuc": "Nakit/kasa hareketlerini izleme için (2 olay)"
            },
            {
              "ad": "CARI_OLUSTURULDU / TAHSILAT_YAPILDI / ODEME_YAPILDI",
              "tetik": "Müşteri/Tedarikçi modülü: yeni cari, tahsilat, ödeme",
              "etki": "Cari ve tutar verisiyle tetiklenir",
              "neden_sonuc": "Tahsilat/ödeme teşekkür mesajı, yeni cari karşılama gibi akışlar için (3 olay)"
            },
            {
              "ad": "CEK_OLUSTURULDU / CEK_DURUM_DEGISTI",
              "tetik": "Çek/Senet modülü: çek-senet oluşturma / durum değişimi",
              "etki": "cek.id/no/tutar/vade_tarih/tip (durumda eski_durum/yeni_durum) + cari.* ile tetiklenir",
              "neden_sonuc": "Vade/tahsil durumu hatırlatmaları için (2 olay)"
            },
            {
              "ad": "SERVIS_TALEBI_OLUSTURULDU / SERVIS_DURUM_DEGISTI / SERVIS_SLA_ASILDI",
              "tetik": "Servis modülü: talep açılışı, durum değişimi, SLA süresi aşımı",
              "etki": "Servis talebi ve müşteri verisiyle tetiklenir; SLA aşımı servis/islem/_sla_pilotu.php ile tetiklenir",
              "neden_sonuc": "Servis müşterisine durum bildirimi ve SLA gecikmesinde yöneticiye uyarı için (3 olay)"
            },
            {
              "ad": "URETIM_EMRI_OLUSTURULDU / URETIM_TAMAMLANDI / HAMMADDE_KRITIK_STOK / URETIM_EMIR_GECIKTI",
              "tetik": "Üretim modülü: emir açma/tamamlama, kritik hammadde stoğu, geciken emir",
              "etki": "Üretim emri / hammadde verisiyle tetiklenir",
              "neden_sonuc": "Üretim planlama ve kritik stok uyarıları için (4 olay)"
            },
            {
              "ad": "STOK_HAREKETI_OLUSTU",
              "tetik": "Ürün/Hizmet modülü: stok hareketi oluştuğunda",
              "etki": "stok.id/kod/ad/miktar/birim/tip/bakiye ile tetiklenir",
              "neden_sonuc": "Stok giriş/çıkış izleme, kritik stok uyarısı için (1 olay)"
            },
            {
              "ad": "SAHA_ZIYARET_TAMAMLANDI",
              "tetik": "Saha Satış modülü: saha ziyareti tamamlandığında",
              "etki": "Ziyaret ve cari verisiyle tetiklenir",
              "neden_sonuc": "Saha ekibi ziyaret raporlaması için (1 olay)"
            },
            {
              "ad": "KESIF_DURUM_DEGISTI",
              "tetik": "Keşif modülü: keşif durumu değiştiğinde",
              "etki": "Keşif verisiyle tetiklenir",
              "neden_sonuc": "Keşif süreci takibi için (1 olay)"
            },
            {
              "ad": "GOREV_OLUSTURULDU / GOREV_TAMAMLANDI",
              "tetik": "Proje modülü: görev oluşturma / tamamlama",
              "etki": "Görev ve proje verisiyle tetiklenir",
              "neden_sonuc": "Görev atama/tamamlanma bildirimleri için (2 olay)"
            },
            {
              "ad": "PUANTAJ_KAYDEDILDI / MAAS_TAHAKKUK_YAPILDI / PRIM_TAHAKKUK_YAPILDI / MAAS_ODEMESI_YAPILDI / AVANS_ODEMESI_YAPILDI",
              "tetik": "Personel modülü: puantaj, maaş/prim tahakkuku, maaş/avans ödemesi",
              "etki": "personel.id/adsoyad, puantaj.*, hareket.evrak_no/tutar/tarih, toplam.tutar/personel gibi verilerle tetiklenir",
              "neden_sonuc": "Maaş/avans ödeme bildirimleri ve bordro süreç otomasyonu için (5 olay)"
            },
            {
              "ad": "ILGILENEN_OLUSTURULDU / ILGILENEN_DURUMU_DEGISTI / FIRSAT_OLUSTURULDU / FIRSAT_ASAMASI_DEGISTI / FIRSAT_KAYBEDILDI / MUSTERI_DONUSUMU_YAPILDI",
              "tetik": "İş Takip (CRM) modülü: lead ve fırsat yaşam döngüsü olayları",
              "etki": "Lead/fırsat verisiyle tetiklenir",
              "neden_sonuc": "Satış hunisi otomasyonu; fırsat aşama değişimi/kayıp ve müşteriye dönüşümde otomatik aksiyon için (6 olay)"
            }
          ],
          "iliskiler": [
            "otomasyon-form (bu olaylar formdaki optgroup'lu açılır menüyü ve değişken rehberini oluşturur)",
            "her modülün index.php otomasyon_trigger bloğu",
            "register.php (GLOBALS _OTOMASYON_TRIGGERLAR'ı burada toplar)",
            "ilgili modül event.php (Servis\\Otomasyon::tetikle çağrısı)"
          ],
          "ipuclari": [
            "DOĞRULANDI: Toplam 15 modülden 38 olay tetikleyici mevcuttur (envanterdeki 33 rakamı hatalıydı). Modül başına: fatura 3, ceksenet 2, irsaliye 1, kasa 2, personel 5, istakip 6, kesif 1, musteritedarikci 3, urunhizmet 1, sahasatis 1, proje 2, servis 3, siparis 2, uretim 4, teklif 2.",
            "Motor tetiklemeyi ilgili modülün event.php'sinden Servis\\Otomasyon::tetikle($config,$db,$_SAAS_,'OLAY_KOD',$veri) çağrısıyla alır; olay adı (TETIKLEYICI_KOD) ile eşleşen aktif (DURUM=1) ve aynı FID'li kurallar bulunur.",
            "Bir tetikleyici seçmeden koşul/aksiyonda değişken kullanmak anlamsızdır; önce olayı seçin ki değişken rehberi dolsun.",
            "Değişken yolu nokta ile çözülür: {{cari.unvan}} -> veri['cari']['unvan']; olmayan alan boş string döner.",
            "Her olayın kendine özgü değişken seti vardır; fatura olayları fatura.* + cari.*, stok olayı stok.*, personel olayları personel.*/hareket.* sağlar."
          ]
        },
        {
          "id": "otomasyon-aksiyonlar",
          "baslik": "Aksiyon Tipleri (Yapılabilecek İşlemler)",
          "yol": "(otomasyon-form içindeki Aksiyon Ekle menüsü ve aksiyon kartları)",
          "sub": "tanim",
          "amac": "Bir otomasyon tetiklenip koşullar sağlandığında çalıştırılabilecek altı aksiyon tipini ve her birinin gerektirdiği alanları tanımlar: Uygulama İçi Bildirim (INAPP), Push Bildirim (FCM), SMS, Email, Telegram, Webhook. Motor (Otomasyon.php aksiyonCalistir) her aksiyonu ilgili ayarları kullanarak sırayla çalıştırır ve sonucu loglar.",
          "neden": "Otomasyonun 'ne yapacağını' bu aksiyonlar belirler. Müşteriye/personele haber verme (SMS, e-posta, push, uygulama içi) veya dış sistemlere veri gönderme (webhook, Telegram) ihtiyaçlarına göre seçilir.",
          "nasil": [
            "Formda 'Aksiyon Ekle' menüsünden istenen tipi seç.",
            "INAPP: Başlık, Mesaj ve Alıcı (Tüm Kullanıcılar / Sadece Yöneticiler / Belirli Kullanıcılar) gir; 'Belirli' seçilirse kullanıcıları select2 ile işaretle.",
            "FCM: Başlık ve Mesaj gir (firmanın aktif kullanıcılarının user_fcm_token cihazlarına push gider).",
            "SMS: Telefon (varsayılan {{cari.tel}}) ve Mesaj gir.",
            "Email: E-posta ({{cari.email}}), Konu ve İçerik (HTML) gir.",
            "Telegram: Chat ID ve Mesaj gir; Webhook: URL ve JSON Body gir."
          ],
          "butonlar": [
            {
              "ad": "Uygulama İçi Bildirim",
              "islev": "aksiyonEkle('INAPP') — motor user_notification tablosuna kayıt yazar",
              "sonuc": "INAPP aksiyon bloğu eklenir",
              "renk": "primary (mavi ikon fa-bell)"
            },
            {
              "ad": "Push Bildirim (FCM)",
              "islev": "aksiyonEkle('FCM') — GoogleFCM ile cihazlara push",
              "sonuc": "FCM bloğu eklenir",
              "renk": "success (yeşil ikon fa-mobile-alt)"
            },
            {
              "ad": "SMS Gönder",
              "islev": "aksiyonEkle('SMS') — lib/Servis/SMS ile gönderim",
              "sonuc": "SMS bloğu eklenir",
              "renk": "warning (sarı ikon fa-sms)"
            },
            {
              "ad": "Email Gönder",
              "islev": "aksiyonEkle('EMAIL') — PHPMailer/SMTP ile e-posta",
              "sonuc": "Email bloğu eklenir",
              "renk": "danger (kırmızı ikon fa-envelope)"
            },
            {
              "ad": "Telegram Gönder",
              "islev": "aksiyonEkle('TELEGRAM') — bot token ile Telegram mesajı",
              "sonuc": "Telegram bloğu eklenir",
              "renk": "info (mavi ikon fab fa-telegram)"
            },
            {
              "ad": "Webhook Çağır",
              "islev": "aksiyonEkle('WEBHOOK') — belirtilen URL'e JSON POST",
              "sonuc": "Webhook bloğu eklenir",
              "renk": "secondary (gri ikon fa-globe)"
            }
          ],
          "eventler": [
            {
              "ad": "INAPP",
              "tetik": "Otomasyon çalışınca (aksiyonCalistir -> inappGonder)",
              "etki": "Alıcı tipine göre ($_SAAS_['USERLIST'] üzerinden) hedef kullanıcılar seçilir ve her birine user_notification tablosuna BASLIK+METIN kaydı yazılır. 'yonetici' = TIP -16081608 veya 1 olan aktif kullanıcılar; 'secili' = kullanici_idler CSV; 'hepsi' = tüm DURUM=1 kullanıcılar",
              "neden_sonuc": "Kullanıcılar uygulama içi bildirim zilinde mesajı görür; dış servis gerektirmez, en güvenli aksiyon. Alıcı bulunamazsa hata döner"
            },
            {
              "ad": "FCM",
              "tetik": "Otomasyon çalışınca (fcmGonder)",
              "etki": "config.fcm (project_id, client_email, private_key) ile GoogleFCM üzerinden; aktif kullanıcı ID'leri USERLIST'ten alınır, user_fcm_token tablosundan FID+USER_ID ile token çekilir ve push gönderilir; geçersiz token (invalidToken) DB'den silinir",
              "neden_sonuc": "config->check('fcm') yoksa veya project_id/client_email/private_key eksikse hata; başarılı/başarısız cihaz sayısı loglanır"
            },
            {
              "ad": "SMS",
              "tetik": "Otomasyon çalışınca (smsGonder)",
              "etki": "config.sms (apikey, hash, gonderimbaslik, iys/iyslistesi) ile lib/Servis/SMS üzerinden telefona mesaj gönderir; telefon+mesaj şablonu çözülür",
              "neden_sonuc": "config->check('sms') yoksa 'SMS ayarlari yapilmamis', telefon/mesaj boşsa 'Telefon veya mesaj bos' hatası döner"
            },
            {
              "ad": "EMAIL",
              "tetik": "Otomasyon çalışınca (emailGonder)",
              "etki": "config.mail SMTP ayarlarıyla (smtp_server/username/password/guvenlik/port/gonderici) PHPMailer üzerinden HTML e-posta gönderir; konu+içerik şablonlu, CharSet UTF-8",
              "neden_sonuc": "config->check('mail') yoksa 'Mail ayarlari yapilmamis', email/konu boşsa hata döner"
            },
            {
              "ad": "TELEGRAM",
              "tetik": "Otomasyon çalışınca (telegramGonder)",
              "etki": "config.telegram bot token + girilen Chat ID ile lib/Servis/Telegram üzerinden mesaj gönderir",
              "neden_sonuc": "config->check('telegram') yoksa 'Telegram ayarlari yapilmamis', chat_id/mesaj boşsa hata döner"
            },
            {
              "ad": "WEBHOOK",
              "tetik": "Otomasyon çalışınca (webhookCagir)",
              "etki": "Belirtilen URL'e 10sn timeout ile JSON body POST eder (Content-Type: application/json, User-Agent: NetEsnaf-Otomasyon/1.0); HTTP 2xx başarı sayılır",
              "neden_sonuc": "Dış sistemlere (n8n, kendi API'niz) entegrasyon için; URL boşsa 'Webhook URL bos', curl hatasında veya 2xx dışı kodda başarısız loglanır"
            }
          ],
          "iliskiler": [
            "ayar > SMS ayarları (config.sms)",
            "ayar > Mail SMTP ayarları (config.mail)",
            "ayar > Telegram ayarları (config.telegram)",
            "ayar > FCM ayarları (config.fcm)",
            "user_notification tablosu (INAPP)",
            "user_fcm_token tablosu (FCM)",
            "$_SAAS_['USERLIST'] (INAPP/FCM alıcıları)",
            "otomasyon-log (aksiyon sonuçları burada görünür)"
          ],
          "ipuclari": [
            "Bir aksiyon başarısız olsa da diğerleri çalışır; en az bir aksiyon başarısızsa kuralın genel durumu KISMI_HATA olur ve son hata mesajı loglanır (kod DURUM değerleri: BASARILI ve KISMI_HATA; tam başarısızlık için ayrı 'HATA' etiketi motorda üretilmez).",
            "SMS/Email/Telegram/FCM aksiyonları ilgili ayar bölümü (config->check) dolu değilse çalışmaz — önce Ayar'dan sağlayıcı bilgilerini girin.",
            "INAPP tek dış servise bağlı olmayan, her zaman çalışan en güvenli aksiyondur.",
            "Aksiyon hatası ana ERP işlemini (fatura kesme vb.) asla engellemez; motor tetikle() ve calistir() try/catch ile izole çalışır.",
            "'Sadece Yöneticiler' alıcısı user.TIP alanı -16081608 (Yönetici) veya 1 (Yetkili) olan aktif kullanıcıları hedefler.",
            "Mesaj alanlarında şablon+format birlikte kullanın: 'Sayın {{cari.unvan}}, {{fatura.genel_toplam|para}} tutarlı faturanız kesildi.'"
          ]
        },
        {
          "id": "otomasyon-log",
          "baslik": "Otomasyon Logları (Çalışma Geçmişi)",
          "yol": "/ekran/ayar/tanim/otomasyonlog",
          "sub": "tanim",
          "amac": "Otomasyonların her çalışmasının kaydını gösterir: hangi otomasyon (LEFT JOIN ile adı), ne zaman (TARIH), genel durum (BAŞARILI / KISMI_HATA), tek tek aksiyon sonuçları (ok/hata) ve hata mesajı. Eski logları temizleme aracı içerir.",
          "neden": "Bir otomasyonun gerçekten çalışıp çalışmadığını, SMS/e-posta'nın gidip gitmediğini veya neden başarısız olduğunu (ör. 'SMS ayarlari yapilmamis') teşhis etmek için kullanılır. Denetim/izleme amaçlıdır.",
          "nasil": [
            "Otomasyonlar listesinden 'Loglar' butonuna bas.",
            "Tabloda durum ikonuna göre sonuçları incele: BAŞARILI (yeşil) ve KISMI_HATA (sarı).",
            "Aksiyonlar sütunundaki rozetlerden hangi aksiyon tipinin başarılı/başarısız olduğunu gör.",
            "Hata sütunundan sorunlu kayıtların mesajını oku.",
            "Gerekirse üstteki 'Son X gün kalsın' seçimini yapıp 'Temizle' ile eski kayıtları sil.",
            "Çok kayıt varsa sayfalama ile gezin."
          ],
          "butonlar": [
            {
              "ad": "Temizle",
              "islev": "btnLogTemizle — seçilen aralığa göre otomasyonlogtemizle event'ini çağırır (POST gun)",
              "sonuc": "Belirtilen günden eski (gun>0) veya tüm (gun=0) FID logları silinir, 'Temizlendi. Kalan kayıt: N' mesajı döner",
              "renk": "outline-danger (kırmızı çerçeve)"
            },
            {
              "ad": "Temizleme aralığı seçimi",
              "islev": "selTemizleGun — 'Son X gün kalsın' / 'Tümünü sil' (gun=0) seçenekleri; varsayılan 90",
              "sonuc": "Temizle butonuna gun parametresi sağlar",
              "renk": "form-control (gri)"
            },
            {
              "ad": "Sayfalama (< sayfa no >)",
              "islev": "Log sayfaları arasında gezinir",
              "sonuc": "İlgili log sayfası açılır",
              "renk": "page-link (mavi)"
            }
          ],
          "eventler": [
            {
              "ad": "otomasyonlogtemizle",
              "tetik": "Temizle butonu",
              "etki": "gun>0 ise TARIH < NOW()-gun olan otomasyon_log kayıtlarını, gun=0 ise tüm FID loglarını siler; kalan kayıt sayısını sayıp döner (norefresh)",
              "neden_sonuc": "Log tablosunun şişmesini engeller; kullanıcı manuel temizleme yapabilir. Varsayılan gun=90"
            },
            {
              "ad": "logYaz (motor tarafı - otomatik)",
              "tetik": "Her otomasyon çalışması sonunda (calistir -> logYaz)",
              "etki": "otomasyon_log tablosuna OTOMASYON_ID, TETIKLEYICI_VERI(JSON), TARIH, DURUM, AKSIYONLAR(JSON), HATA_MESAJ, FID yazar; ardından o FID'in 90 günden (LOG_SAKLA_GUN) eski kayıtlarını otomatik siler",
              "neden_sonuc": "Bu ekranın veri kaynağıdır; kullanıcı müdahalesi olmadan otomatik dolar ve 90 gün sonra kendini temizler"
            }
          ],
          "iliskiler": [
            "otomasyon-liste (Loglar butonu buraya getirir)",
            "otomasyon tablosu (LEFT JOIN ile otomasyon adını çeker)",
            "Otomasyon.php logYaz + motor (kayıtları üretir)"
          ],
          "ipuclari": [
            "Loglar 90 günden eski olduğunda motor tarafından her yeni log yazımında otomatik temizlenir (LOG_SAKLA_GUN=90).",
            "DURUM değerleri pratikte BASARILI (tüm aksiyonlar ok) ve KISMI_HATA (en az bir aksiyon başarısız) olarak yazılır.",
            "TETIKLEYICI_VERI alanı olayın anlık verisini JSON olarak saklar; sorun ayıklamada hangi cari/tutarla çalıştığını gösterir.",
            "AKSIYONLAR alanı her aksiyonun tip/durum/mesaj sonucunu JSON olarak tutar."
          ]
        }
      ]
    },
    {
      "slug": "api",
      "title": "API Entegrasyonu",
      "icon": "🔌",
      "modul": "api",
      "ad": "API Entegrasyonu (REST API v1)",
      "ozet": "NetEsnaf REST API v1, dis uygulamalarinizin (mobil, e-ticaret, muhasebe/entegrasyon yazilimlari) ERP verilerinize guvenli erisimini saglar. Tum istek ve yanitlar JSON (UTF-8), kimlik dogrulama JWT Bearer Token ile yapilir. API yalnizca lisansinda \"api\" modulu tanimli firmalarda gorunur ve calisir; lisansta yoksa kilavuz sayfasi kilitli gorunur ve destek@datanetbilisim.com'a yonlendirir. Erisim menusu: Yonetim > API Kilavuzu. Uc noktalar tek kaynaktan (ApiKatalog) uretilir; ayni katalog hem bu ekrandaki tablolari hem de makine-okunur OpenAPI 3.0.3 semasini besler, boylece dokuman ile gercek davranis asla ayrisir. Temel adres firmanizin kendi alan adinizdan otomatik uretilir (demo icin netesnaf.com, urun icin netesnaf.net gibi) — adres sabit degildir, ornekte \"kendi alan adiniz/api/v1\" seklinde dusunun. Katalogda 7 modul grubu var: Cari (13 uc), Urun/Stok (19 uc), Fatura (4 uc), Kasa/Banka (16 uc), Siparis (6 uc), Servis (19 uc), Personel (1 uc). Ayrica auth (login/refresh), spec/openapi ve health/check sistem uclari mevcuttur. Bu ekran API lisansi olan musterilere yoneliktir.",
      "modul_iliskiler": [
        "cari (musteritedarikci)",
        "urunhizmet (stok)",
        "fatura",
        "kasa",
        "siparis",
        "servis",
        "personel",
        "b2b musteri portali (ayri token turu)",
        "lisans/modul yonetimi (api lisansi gerekir)"
      ],
      "ekranlar": [
        {
          "id": "giris",
          "baslik": "API'ye Giris — Ne ise yarar, kimin icin",
          "yol": "",
          "sub": "Yonetim > API Kilavuzu",
          "amac": "Dis uygulamalarinizin (mobil uygulama, e-ticaret sitesi, muhasebe/entegrasyon yazilimi) NetEsnaf ERP verilerinize guvenli ve programatik erisimini saglamak. Tum trafik JSON formatinda, kimlik dogrulama JWT Bearer Token ile yapilir.",
          "neden": "Kendi yazilimlarinizi ERP'ye baglamak, veri senkronizasyonu kurmak veya bir yapay zeka ajanina otomatik entegrasyon yaptirmak istediginizde kullanilir. Bu ozellik yalnizca API lisansi olan firmalar icindir: lisansinizda 'api' modulu tanimli degilse kilavuz sayfasi kilitli gorunur ve satis temsilcinize yonlendirir (destek@datanetbilisim.com).",
          "nasil": [
            "Yonetim menusunden API Kilavuzu ekranini acin.",
            "Lisansinizda API modulu tanimliysa kilavuz (hero, kimlik dogrulama, kurallar, endpoint referansi, ornek) gorunur; degilse kilitli uyari kartini gorursunuz.",
            "Temel adresi (kendi alan adiniz + /api/v1) ve genel semayi (/{modul}/{islem}) not edin.",
            "Once kimlik dogrulama ile token alin, sonra istediginiz uc noktaya istek atin.",
            "Isterseniz OpenAPI semasini bir yapay zeka ajanina vererek entegrasyonu otomatik kurdurun."
          ],
          "butonlar": [
            {
              "ad": "OpenAPI 3.0 JSON",
              "islev": "Hero alanindaki bag; /spec/openapi adresini yeni sekmede acar, makine-okunur semayi gosterir",
              "sonuc": "Tarayicida OpenAPI JSON acilir, bir agent'a verilebilir",
              "renk": "mavi/link"
            },
            {
              "ad": "Tumunu Ac / Kapat",
              "islev": "Endpoint referansi bolumundeki tum modul panellerini ayni anda acar/kapatir",
              "sonuc": "Tum uc nokta tablolari gorunur olur veya gizlenir",
              "renk": "gri (outline-secondary)"
            }
          ],
          "eventler": [
            {
              "ad": "api_license_check",
              "tetik": "Kilavuz sayfasi acildiginda ($_SAAS_ MODULLER JSON'inda 'api' aranir)",
              "etki": "Lisans yoksa tum kilavuz gizlenir, kilitli uyari karti ve destek e-postasi gosterilir",
              "neden_sonuc": "API erisimi lisansa baglidir; yetkisiz firmalar dokumani ve uc noktalari goremez"
            },
            {
              "ad": "base_url_dynamic",
              "tetik": "Sayfa render edilirken HTTP_HOST okunur",
              "etki": "Temel adres tenant'in kendi host'undan uretilir (demo/urun otomatik ayrisir)",
              "neden_sonuc": "Adres sabit kodlanmaz; her firma kendi alan adi uzerinden calisir"
            }
          ],
          "iliskiler": [
            "kimlik-dogrulama",
            "uc-noktalar",
            "openapi"
          ],
          "ipuclari": [
            "Temel adres sabit degildir: ornek adreslerde host yerine kendi alan adinizi kullanin (demo netesnaf.com, urun netesnaf.net).",
            "Genel sema: https://kendi-alan-adiniz/api/v1/{modul}/{islem}",
            "API lisansiniz yoksa uc noktalar hic calismaz; once satis temsilcinizle iletisime gecin."
          ]
        },
        {
          "id": "kimlik-dogrulama",
          "baslik": "Kimlik Dogrulama / Token Alma",
          "yol": "/api/v1/auth/login",
          "sub": "auth/login ve auth/refresh",
          "amac": "Kullanici adi ve sifre ile 12 saat gecerli bir JWT Bearer Token almak; sonraki tum isteklerde bu token'i Authorization basliginda gondererek kimligi ve firmayi dogrulamak.",
          "neden": "API'deki veri uclari (cari, fatura, kasa vb.) token olmadan calismaz. Token firmaya izole erisim saglar: token = firma. Token 12 saat gecerlidir; suresi dolmadan yenilenebilir, dolduysa yeniden login gerekir.",
          "nasil": [
            "POST /auth/login adresine JSON govde ile { \"kullaniciadi\": \"...\", \"sifre\": \"...\" } gonderin (email/password alternatif alan adlari da kabul edilir).",
            "Yanittaki token degerini (eyJ...) ve expireAt (Unix bitis zaman damgasi) alanini saklayin.",
            "Sonraki her istekte HTTP basligina 'Authorization: Bearer eyJ...' ekleyin.",
            "Token suresi dolmadan yenilemek icin POST /auth/refresh cagirin (mevcut gecerli token ile).",
            "Refresh yalniz imzasi gecerli VE suresi dolmamis token icin calisir; dolmus token'da 401 doner ve yeniden login gerekir."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "auth_login",
              "tetik": "POST /auth/login (kullaniciadi + sifre)",
              "etki": "user tablosunda DURUM=1 dogrulama, JWT uretimi (uid, fid, exp=12 saat), token API_TOKEN alanina kaydedilir; status/token/expireAt/user(id,adsoyad,eposta) doner",
              "neden_sonuc": "Basarili giriste token; kullanici bulunamaz/pasifse 401, alanlar eksikse 422"
            },
            {
              "ad": "auth_refresh",
              "tetik": "POST /auth/refresh (Authorization: Bearer mevcut token)",
              "etki": "Token imzasi ve suresi dogrulanir, yeni 12 saatlik token uretilip DB'ye yazilir; status/token/expireAt doner",
              "neden_sonuc": "Gecerli+dolmamis token yenilenir; dolmus/gecersizse 401 ve yeniden login uyarisi"
            },
            {
              "ad": "bearer_required",
              "tetik": "Herhangi bir korumali uca token gondermeden istek",
              "etki": "'Token bulunamadi. Authorization: Bearer {token} gondermelisiniz.' hatasi",
              "neden_sonuc": "401 doner; her korumali istekte token zorunludur"
            }
          ],
          "iliskiler": [
            "giris",
            "uc-noktalar",
            "hata-durum-yonetimi"
          ],
          "ipuclari": [
            "Token 12 saat gecerlidir; uygulamanizda expireAt'i takip edip sure dolmadan refresh cagirin.",
            "B2B (musteri portali) tokeni genel API uclarinda kullanilamaz — ayri bir token turudur (payload.type='b2b'), kullanilirsa 403 doner.",
            "kullaniciadi yerine email, sifre yerine password alan adlari da kabul edilir."
          ]
        },
        {
          "id": "yanit-kurallar",
          "baslik": "Yanit Yapisi ve Genel Kurallar",
          "yol": "",
          "sub": "Kilavuz Bolum 2",
          "amac": "Tum uc noktalarin ortak yanit sozlesmesini ve veri format kurallarini (sayfalama, tarih, tutar, silme davranisi) tek yerde anlatmak.",
          "neden": "Entegrasyonu yazarken yanitlari dogru ayristirmak ve gecerli veri gondermek icin ortak kurallari bilmek gerekir. Boylece her uca ozel tahmin yapmadan tutarli kod yazilir.",
          "nasil": [
            "Liste yanitlarini { status, data:[...], meta:{ sayfa, limit, toplam, toplam_sayfa } } yapisinda bekleyin.",
            "Tekil/islem yanitlarini { status:true, data:{...} } veya { status:true, message, data:{id} } olarak isleyin.",
            "Hatalari { status:false, message } olarak yakalayin (status alanini her zaman kontrol edin).",
            "Sayfalama icin ?sayfa=1&limit=50 kullanin (limit en fazla 200).",
            "Tarihleri YYYY-MM-DD, tutar/miktari nokta ondalikli (orn. 1250.50) gonderin.",
            "Silme islemlerinin soft-delete oldugunu (kayit pasife alinir, fiziksel silinmez) unutmayin."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "response_list",
              "tetik": "Bir liste ucuna GET istegi",
              "etki": "status + data dizisi + meta (sayfa/limit/toplam/toplam_sayfa) doner",
              "neden_sonuc": "Sayfalanabilir veri; toplam_sayfa ile dongu kurulabilir"
            },
            {
              "ad": "response_single",
              "tetik": "Detay veya kaydet/sil islemi",
              "etki": "status + data nesnesi (veya message + data.id) doner",
              "neden_sonuc": "Islem sonucu ve olusan/etkilenen kaydin id'si alinir"
            },
            {
              "ad": "soft_delete",
              "tetik": "Herhangi bir sil ucu (POST .../sil)",
              "etki": "Kayit fiziksel silinmez, pasife alinir",
              "neden_sonuc": "Veri kaybolmaz; bagli kayitlar korunur (orn. fatura silinince stok/cari geri alinir)"
            }
          ],
          "iliskiler": [
            "hata-durum-yonetimi",
            "uc-noktalar"
          ],
          "ipuclari": [
            "limit degeri 200'u asmaz; daha fazla veri icin sayfa arttirin.",
            "Her yaniti islerken once status alanina bakin; false ise message'i kullaniciya gosterin.",
            "Tutarlarda virgul degil nokta kullanin, aksi halde 422 alabilirsiniz."
          ]
        },
        {
          "id": "uc-noktalar",
          "baslik": "Uc Noktalar (Modul Modul Ozet)",
          "yol": "/api/v1/{modul}/{islem}",
          "sub": "Endpoint Referansi — Bolum 3",
          "amac": "Kullanilabilir tum REST uc noktalarini modul gruplarina gore (metod, yol, ne yaptigi, zorunlu/opsiyonel parametreler) listelemek. Zorunlu alanlar koyu gosterilir; GET okuma, POST yazma/silme icindir.",
          "neden": "Hangi verinin nasil okunacagini/yazilacagini gormek ve entegrasyon akisini planlamak icin. Katalog tek kaynaktir; buradaki liste OpenAPI semasiyla birebir aynidir.",
          "nasil": [
            "Ilgili modul basligina tiklayarak paneli acin (Cari, Urun/Stok, Fatura, Kasa/Banka, Siparis, Servis, Personel, Takvim).",
            "Metod (GET/POST), Yol, Ne yapar ve Parametreler sutunlarini inceleyin.",
            "GET uclarinda parametreler query (?ad=deger), POST uclarinda JSON body olarak gonderilir.",
            "Zorunlu (koyu) alanlari mutlaka gonderin; dizi alanlar (orn. satirlar) '(= dizi)' etiketiyle isaretlidir.",
            "Teknik detay ve tam tipler icin OpenAPI semasini (/spec/openapi) kullanin."
          ],
          "butonlar": [
            {
              "ad": "Tumunu Ac / Kapat",
              "islev": "Tum modul panellerini toplu acar/kapatir",
              "sonuc": "Butun uc nokta tablolari gorunur/gizli olur",
              "renk": "gri (outline-secondary)"
            },
            {
              "ad": "Modul basligi (akordeon)",
              "islev": "Ilgili modulun uc nokta tablosunu acar/kapatir",
              "sonuc": "O modulun endpoint listesi gorunur",
              "renk": "yesil (card-success)"
            }
          ],
          "eventler": [
            {
              "ad": "modul_cari",
              "tetik": "musteritedarikci/* uclari",
              "etki": "Cari liste/detay/kaydet/sil, bakiye, bakiyerapor, hareketler, gruplar (kaydet/sil), yetkililer (ekle/sil) (13 uc)",
              "neden_sonuc": "Musteri/tedarikci kartlari ve cari hesap verisi yonetilir"
            },
            {
              "ad": "modul_urun_stok",
              "tetik": "urunhizmet/* uclari",
              "etki": "Urun liste/detay/kaydet/sil, stok bakiye, hareketler, stok fisi (fiskaydet/fisdetay/fissil), gruplar, birimler, depolar, seri no (19 uc)",
              "neden_sonuc": "Urun/hizmet kartlari ve stok hareketleri yonetilir"
            },
            {
              "ad": "modul_fatura",
              "tetik": "fatura/* uclari",
              "etki": "Fatura liste/detay/kaydet/sil (4 uc); evrak_tip 301=satis, 302=alis; satirlar[] ile kalem detayi",
              "neden_sonuc": "Satis/alis faturasi kesilir; silmede stok/cari geri alinir"
            },
            {
              "ad": "modul_kasa_banka",
              "tetik": "kasa/* uclari",
              "etki": "Kasa/banka listesi, guncel durum, kasa detay/kaydet/sil, hareketler, tahsilat/odeme fisi (fiskaydet; evrak_tip 201=tahsilat,202=odeme), fissil, virman, islem tipleri, masraf fis/kart (16 uc)",
              "neden_sonuc": "Nakit/banka hareketleri ve masraflar yonetilir"
            },
            {
              "ad": "modul_siparis",
              "tetik": "siparis/* uclari",
              "etki": "Siparis liste/detay/kaydet/durumdegistir/durumlar/sil (6 uc); islem_tip 0=Alinan,1=Verilen",
              "neden_sonuc": "Siparisler olusturulur; silmede rezerve stok geri alinir"
            },
            {
              "ad": "modul_servis",
              "tetik": "servis/* uclari",
              "etki": "Is emri (servisler/servisdetay/serviskaydet/servisdurumguncelle/servissil), talep, cihaz, kategori, bakim anlasmasi, zamanekle (iscilik) (19 uc); ana_position 1=Yeni..5=Iptal",
              "neden_sonuc": "Teknik servis is emirleri ve bakim surecleri yonetilir"
            },
            {
              "ad": "modul_personel",
              "tetik": "personel/liste",
              "etki": "Personel listesi (arama/kod/limit) — 1 uc",
              "neden_sonuc": "Personel kayitlari okunur (salt liste)"
            }
          ],
          "iliskiler": [
            "kimlik-dogrulama",
            "yanit-kurallar",
            "openapi",
            "uctan-uca-ornek"
          ],
          "ipuclari": [
            "POST kaydet uclarinda id gonderirseniz guncelleme, gondermezseniz yeni kayit olur; cari kaydet'te yalnizca gonderilen alanlar guncellenir.",
            "Fatura ve siparis kaydet'te satirlar[] dizisi zorunludur; fatura satirinda stok_id, miktar, birim_fiyat, kdv_oran (opsiyonel iskonto_oran, birim_id, depo_id) bulunur.",
            "Tam parametre tipleri ad kalibindan turetilir: _id/^id/_tip/_oran/durum/sayfa/limit/kdv=integer, tutar/miktar/fiyat/katsayi/sure=number, tarih/baslangic/bitis=date.",
            "Takvim uclari (takvim/liste, ekle, guncelle, sil) yalnizca elle/harici eklenen etkinlikleri yonetir; fatura vadesi, servis randevusu gibi modul kaynakli olaylar API ile degistirilemez/silinemez. tip: 1=Gorev, 2=Hatirlatma, 3=Bilgi Notu; baslama/bitis 'YYYY-MM-DD HH:MM'."
          ]
        },
        {
          "id": "istakip-crm",
          "baslik": "Is Takip (CRM) Ucu — Aday, Gorusme, Firsat",
          "yol": "",
          "sub": "Kilavuz Bolum 4 — pratik akis",
          "amac": "Web sitesi formu, WhatsApp botu veya otomasyon akisindan gelen kisiyi Is Takip (CRM) modulune mukerrer kayit acmadan yazmak.",
          "neden": "Reklamdan/WhatsApp'tan gelen kisi CRM'e elle giriliyor. Otomatik yazmaya calisinca da her mesajda yeni aday karti aciliyor ve CRM ayni kisinin kopyalariyla doluyor.",
          "neden_ek": "Aday kaydi ucu 'varsa guncelle, yoksa olustur' calisir: telefon numarasi bicim farki gozetmeksizin (bosluk, parantez, +90) taninir ve mevcut aday guncellenir. Telefon yoksa e-posta ikincil anahtardir. Boylece ayni kisi defalarca yazsa bile tek kart olusur.",
          "nasil": [
            "1) POST /auth/login ile token alin.",
            "2) GET /istakip/durumlar ile gecerli kod sozluklerini okuyun (kaynaklar, ilgilenen durumlari, firsat asamalari, gorusme turleri). Degerleri tahmin etmeyin.",
            "3) POST /istakip/ilgilenenkaydet ile adayi yazin. En az 'ad' veya 'firma' gonderin; telefon gonderirseniz mukerrer koruma calisir.",
            "4) Yanittaki 'olusturuldu' alanina bakin: true = yeni aday acildi, false = mevcut aday guncellendi. Karsilama mesajini buna gore ayirabilirsiniz.",
            "5) POST /istakip/gorusmekaydet ile her temasi not olarak dusun (ilgilenen_id veya cari_id zorunlu).",
            "6) Is somutlasinca POST /istakip/firsatkaydet ile firsat acin; sonra /istakip/firsatasamaguncelle ile asamayi ilerletin.",
            "7) Takip icin GET /istakip/ilgilenenler (durum, kaynak, tarih, telefon filtreli) ve GET /istakip/gorusmeler (hatirlatma tarihi filtreli) uclarini kullanin."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "crm_upsert",
              "tetik": "POST /istakip/ilgilenenkaydet",
              "etki": "Telefon (yoksa e-posta) eslesirse mevcut aday guncellenir, yoksa yeni aday acilir",
              "neden_sonuc": "Ayni kisi tekrar tekrar yazsa bile CRM'de tek kart kalir"
            },
            {
              "ad": "crm_kaynak_koruma",
              "tetik": "Mevcut adayin guncellenmesi",
              "etki": "Adayin ilk geldigi kaynak (whatsapp/web/telefon...) korunur, ezilmez",
              "neden_sonuc": "Kaynak Analizi raporu dogru kalir"
            },
            {
              "ad": "crm_kismi_guncelleme",
              "tetik": "Eksik alanlarla ilgilenenkaydet cagrisi",
              "etki": "Gonderilmeyen ya da bos gonderilen alan mevcut degerini korur",
              "neden_sonuc": "Otomasyon kismi veri gonderdiginde dolu alanlar silinmez"
            }
          ],
          "iliskiler": [
            "kimlik-dogrulama",
            "uc-noktalar",
            "hata-durum-yonetimi"
          ],
          "ipuclari": [
            "Telefonu 7 haneden kisa gonderirseniz eslestirmede kullanilmaz (cop degerlerin farkli kisileri tek kartta birlestirmesini onlemek icin); numara yine kaydedilir.",
            "Alan temizlemek icin bos string gondermeyin — bos deger mevcut bilgiyi korur, silmez.",
            "Durum ve asama kodlarini /istakip/durumlar ucundan okuyun; listede 'guncellenebilir' alani false olan durumu gondermeyin.",
            "Aday silme, firsat silme ve gorusme silme uclari kaydi tamamen silmez; kayit pasife alinir (soft delete).",
            "Adayi cari karta donusturme API'de YOKTUR — bu adim bilerek panelde, insan kararina birakilmistir.",
            "Uclar Is Takip ve Entegrasyon/API modullerinin ikisini birden gerektirir."
          ]
        },
        {
          "id": "takvim-api",
          "baslik": "Takvim Ucu — Disaridan Etkinlik / Hatirlatma Yazma",
          "yol": "",
          "sub": "Kilavuz Bolum 4 — pratik akis",
          "amac": "Kendi web sitesi, mobil uygulama veya otomasyon akisindan NetEsnaf takvimine etkinlik, hatirlatma ve gorev yazmak.",
          "neden": "Randevu veya hatirlatma hem disarida hem NetEsnaf'ta ikinci kez elle giriliyor; biri er ya da gec unutuluyor, takvim eksik kaliyor ve randevu kaciriliyor.",
          "neden_ek": "API yalnizca DISARIDAN eklenen etkinlikleri yonetir. Fatura vadesi, cek vadesi, servis randevusu gibi modullerden otomatik dusen olaylar bu uclarla degistirilemez ve silinemez; boylece modul kaynakli kayitlar yanlislikla bozulmaz.",
          "nasil": [
            "1) POST /auth/login ile token alin.",
            "2) POST /takvim/ekle ile etkinlik yazin. baslik ve baslama zorunludur; tarih bicimi 'YYYY-MM-DD HH:MM'.",
            "3) tip degeri: 1=Gorev, 2=Hatirlatma, 3=Bilgi Notu. Belirli bir kullaniciya atamak icin kullanici_id gonderin.",
            "4) Donen data.id degerini saklayin; guncelleme ve silme bu kimlikle yapilir.",
            "5) POST /takvim/guncelle kismi calisir — yalniz gonderdiginiz alanlar degisir.",
            "6) GET /takvim/liste ile tarih araligina gore listeleyin (baslangic, bitis, tip, arama filtreleri).",
            "7) POST /takvim/sil ile etkinligi kaldirin."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "takvim_ekle",
              "tetik": "POST /takvim/ekle",
              "etki": "Takvime manuel etkinlik yazilir ve id doner",
              "neden_sonuc": "Dis sistemdeki randevu NetEsnaf takviminde de gorunur"
            },
            {
              "ad": "takvim_kismi_guncelleme",
              "tetik": "POST /takvim/guncelle",
              "etki": "Yalniz gonderilen alanlar degisir",
              "neden_sonuc": "Otomasyon kismi veri gonderdiginde diger alanlar korunur"
            },
            {
              "ad": "takvim_modul_koruma",
              "tetik": "Modul kaynakli olaya guncelle/sil cagrisi",
              "etki": "Islem reddedilir",
              "neden_sonuc": "Fatura vadesi, servis randevusu gibi otomatik kayitlar bozulmaz"
            }
          ],
          "iliskiler": [
            "kimlik-dogrulama",
            "uc-noktalar",
            "hata-durum-yonetimi"
          ],
          "ipuclari": [
            "GET /takvim/liste yalniz manuel/harici etkinlikleri dondurur; modul kaynakli olaylar (fatura vadesi vb.) bu ucta CIKMAZ.",
            "Tarihleri her zaman 'YYYY-MM-DD HH:MM' biciminde gonderin.",
            "Ayni randevuyu iki kez yazmamak icin dis sistemdeki kaydinizla donen id degerini eslestirip saklayin; ikinci cagrida ekleme yerine guncelleme yapin.",
            "Uc, Entegrasyon/API modulu lisansi gerektirir."
          ]
        },
        {
          "id": "openapi",
          "baslik": "OpenAPI Semasini Alma ve Yapay Zekaya Verme",
          "yol": "/api/v1/spec/openapi",
          "sub": "OpenAPI 3.0.3 — token gerekmez",
          "amac": "Tum uc noktalarin makine-okunur OpenAPI 3.0.3 spesifikasyonunu tek bir JSON olarak almak; bunu bir yapay zeka ajanina veya kod uretim aracina vererek entegrasyonu otomatik kurdurmak.",
          "neden": "Elle her uca kod yazmak yerine, OpenAPI semasini bir agent'a/codegen aracina verip istemci kodunu otomatik urettirmek cok daha hizlidir. Sema, servers.url alanini tenant'in kendi host'undan uretir; demo ve urun ortami otomatik ayrisir.",
          "nasil": [
            "Tarayicidan veya HTTP GET ile /api/v1/spec/openapi adresini acin (token gerekmez).",
            "Donen JSON'u kaydedin veya URL'yi dogrudan yapay zeka ajaniniza/codegen aracina verin.",
            "Ajana 'bu OpenAPI semasina gore istemci olustur / su islemi yap' gibi talimat verin.",
            "servers.url'nin kendi alan adinizdan uretildigini dogrulayin (adres sabit degildir).",
            "Guvenlik semasi bearerAuth (JWT) oldugundan, uretilen istemcide once /auth/login ile token alma adimini ekletin."
          ],
          "butonlar": [
            {
              "ad": "OpenAPI 3.0 JSON",
              "islev": "Hero'daki bag /spec/openapi adresini yeni sekmede acar",
              "sonuc": "Tam OpenAPI JSON semasi tarayicida gorunur",
              "renk": "mavi/link"
            }
          ],
          "eventler": [
            {
              "ad": "spec_openapi",
              "tetik": "GET /api/v1/spec/openapi",
              "etki": "ApiKatalog::openapi(baseUrl) ile 3.0.3 semasi uretilir; paths, components.securitySchemes.bearerAuth, servers[0].url doner (UTF-8, JSON_PRETTY_PRINT)",
              "neden_sonuc": "Token gerektirmez; agent/codegen icin tam makine-okunur sozlesme saglar"
            },
            {
              "ad": "spec_server_dynamic",
              "tetik": "Sema uretilirken HTTP_HOST + scheme (HTTPS / X-Forwarded-Proto) okunur",
              "etki": "servers[0].url = kendi-alan-adiniz/api/v1 olarak set edilir",
              "neden_sonuc": "Demo/urun ayrimi otomatik; sema sabit domain icermez"
            }
          ],
          "iliskiler": [
            "uc-noktalar",
            "kimlik-dogrulama",
            "giris"
          ],
          "ipuclari": [
            "Sema token istemez, ama uretilen istemci veri uclari icin token gerektirir — login adimini atlatmayin.",
            "Sema ile kilavuz tablolari ayni kaynaktan (ApiKatalog) uretildigi icin drift (uyumsuzluk) olmaz.",
            "Katalog disindaki auth (login/refresh) ve health/check uclari semaya elle eklenmistir; health/ping ve system/ping semada listelenmez ama calisir."
          ]
        },
        {
          "id": "saglik-kontrol",
          "baslik": "Saglik Kontrolu (Health Check)",
          "yol": "/api/v1/health/check",
          "sub": "health/check, health/ping, system/ping — token gerekmez",
          "amac": "API'nin ayakta olup olmadigini token gerektirmeden hizlica test etmek; entegrasyon oncesi baglanti dogrulamasi yapmak.",
          "neden": "Entegrasyonu kurmadan veya izleme (monitoring) sisteminde API erisilebilirligini kontrol etmek icin. Kimlik dogrulama gerektirmedigi icin en basit baglanti testidir.",
          "nasil": [
            "GET /api/v1/health/check adresine istek atin (token gondermenize gerek yok).",
            "Yanitta status:true, service:'NetEsnaf API', version:'v1' ve time (ISO tarih) alanlarini kontrol edin.",
            "Alternatif olarak /api/v1/health/ping veya /api/v1/system/ping kullanabilirsiniz.",
            "200 ve status:true donuyorsa API erisilebilir demektir."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "health_check",
              "tetik": "GET /health/check veya /health/ping veya /system/ping",
              "etki": "Anlik status:true + service:'NetEsnaf API' + version:'v1' + time (date('c')) doner",
              "neden_sonuc": "Token gerekmeden API'nin ayakta oldugu dogrulanir"
            }
          ],
          "iliskiler": [
            "giris",
            "kimlik-dogrulama"
          ],
          "ipuclari": [
            "Health uclari kimlik dogrulama istemez; izleme/monitoring icin idealdir.",
            "Yanit gelmiyorsa once alan adinizi ve /api/v1 yolunu, sonra lisansinizi kontrol edin."
          ]
        },
        {
          "id": "hata-durum-yonetimi",
          "baslik": "Hata / Durum Yonetimi Kurallari",
          "yol": "",
          "sub": "HTTP durum kodlari ve hata sozlesmesi",
          "amac": "API'nin dondurdugu HTTP durum kodlarini ve hata yanit yapisini anlatmak; entegrasyonun hatalari dogru yakalamasini saglamak.",
          "neden": "Saglam bir entegrasyon her yaniti kontrol etmeli: token gecersizse (401), yanlis token turuyse (403), uc yoksa (404), alan eksikse (422), sunucu hatasi olursa (500) farkli davranmalidir. Hata sozlesmesi tum uclarda ayni oldugu icin tek bir yakalama mantigi yeterlidir.",
          "nasil": [
            "Her yanitta once status alanina bakin: false ise message'i okuyun.",
            "HTTP kodlarini isleyin: 200 basarili, 201 olusturuldu, 401 yetkisiz/gecersiz token, 403 yanlis token turu, 404 bulunamadi, 422 eksik/gecersiz alan, 500 sunucu hatasi.",
            "401 aldiginizda token'i yenileyin (refresh) veya yeniden login yapin.",
            "422 aldiginizda gonderdiginiz zorunlu alanlari ve format kurallarini (tarih/tutar) kontrol edin.",
            "500'de yanit yine { status:false, message } JSON formatindadir; destek@datanetbilisim.com ile iletisime gecin.",
            "B2B tokeni genel API'de kullanilirsa 403 alirsiniz — dogru token turunu kullanin."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "error_401_unauthorized",
              "tetik": "Token yok / gecersiz / suresi dolmus / eslesen kullanici yok / firma pasif",
              "etki": "{ status:false, message } ile 401 doner",
              "neden_sonuc": "Kimlik dogrulanamaz; login veya refresh gerekir"
            },
            {
              "ad": "error_403_forbidden",
              "tetik": "B2B tokeni (payload.type='b2b') genel API ucunda kullanilir",
              "etki": "'B2B tokeni genel API endpointlerinde kullanilamaz' 403 doner",
              "neden_sonuc": "Token turu uc ile eslesmiyor; dogru token kullanilmali"
            },
            {
              "ad": "error_404_notfound",
              "tetik": "Var olmayan modul/islem yolu (endpoint dosyasi yok)",
              "etki": "'Endpoint bulunamadi' 404 doner",
              "neden_sonuc": "Yol yanlis; katalogdaki gecerli yolu kullanin"
            },
            {
              "ad": "error_422_validation",
              "tetik": "Zorunlu alan eksik veya gecersiz (orn. kullaniciadi/sifre bos)",
              "etki": "Aciklayici message ile 422 doner",
              "neden_sonuc": "Eksik/hatali veri; gonderilen alanlar duzeltilmeli"
            },
            {
              "ad": "error_500_server",
              "tetik": "Uc icinde runtime/fatal hata (\\Throwable yakalanir)",
              "etki": "Hata error_log'a yazilir, { status:false, message } ile 500 doner (JSON sozlesmesi bozulmaz)",
              "neden_sonuc": "Sunucu hatasi; destek ile iletisim, JSON yaniti garanti edilir"
            },
            {
              "ad": "cors_preflight",
              "tetik": "Tarayicidan OPTIONS on-istegi",
              "etki": "204 doner; Allow-Methods GET, POST, OPTIONS ve Allow-Headers Content-Type, Authorization, X-Requested-With",
              "neden_sonuc": "Web uygulamalarindan cross-origin cagrilar desteklenir"
            }
          ],
          "iliskiler": [
            "kimlik-dogrulama",
            "yanit-kurallar"
          ],
          "ipuclari": [
            "Tum hatalar ayni { status:false, message } yapisindadir; tek bir hata yakalama mantigi yeterlidir.",
            "Fatal hatada bile yanit JSON kalir (\\Throwable yakalanir), asla ham HTML hata sayfasi donmez.",
            "401 ile 403'u ayirt edin: 401 kimlik sorunu (yeniden giris), 403 yanlis token turu."
          ]
        },
        {
          "id": "uctan-uca-ornek",
          "baslik": "Uctan Uca Ornek: Satis Faturasi Kes",
          "yol": "",
          "sub": "Kilavuz Bolum 4 — pratik akis",
          "amac": "Token almadan faturayi kesip tahsilat islemeye kadar tipik bir entegrasyon akisini adim adim gostermek.",
          "neden": "Tek tek uc noktalari okumak yerine gercek bir is akisinin (login > cari bul > fatura kes > tahsilat) nasil zincirlendigini gormek entegrasyonu hizlandirir.",
          "nasil": [
            "1) POST /auth/login ile token alin (kullaniciadi/sifre).",
            "2) GET /musteritedarikci/liste?arama=... ile cariyi bulun, data[0].id degerini alin.",
            "3) POST /fatura/kaydet ile evrak_tip:301 (satis), fatura_tarih, cari_id ve satirlar[] gonderip faturayi kesin; yanitta data.id ve evrak_no doner.",
            "4) Opsiyonel: POST /kasa/fiskaydet ile kasa_id, evrak_tip:201 (tahsilat), evrak_tarih, tutar ve cari_id gonderip tahsilati isleyin.",
            "Her adimda Authorization: Bearer token basligini eklemeyi unutmayin (login haric)."
          ],
          "butonlar": [],
          "eventler": [
            {
              "ad": "flow_login",
              "tetik": "Adim 1 — POST /auth/login",
              "etki": "Token uretilir",
              "neden_sonuc": "Sonraki adimlar icin kimlik saglanir"
            },
            {
              "ad": "flow_find_cari",
              "tetik": "Adim 2 — GET /musteritedarikci/liste?arama=",
              "etki": "Eslesen cari(ler) doner, cari_id alinir",
              "neden_sonuc": "Faturaya baglanacak cari belirlenir"
            },
            {
              "ad": "flow_invoice",
              "tetik": "Adim 3 — POST /fatura/kaydet (evrak_tip 301)",
              "etki": "Satis faturasi olusur, data.id + evrak_no doner",
              "neden_sonuc": "Stok ve cari hareketi otomatik islenir"
            },
            {
              "ad": "flow_collection",
              "tetik": "Adim 4 — POST /kasa/fiskaydet (evrak_tip 201)",
              "etki": "Tahsilat fisi olusur, cari bakiyesi guncellenir",
              "neden_sonuc": "Fatura karsiliginda odeme kayda gecer (opsiyonel)"
            }
          ],
          "iliskiler": [
            "kimlik-dogrulama",
            "uc-noktalar"
          ],
          "ipuclari": [
            "evrak_tip degerlerini karistirmayin: 301=satis faturasi, 302=alis; 201=tahsilat, 202=odeme.",
            "Tarihleri YYYY-MM-DD, tutar/birim_fiyat degerlerini nokta ondalikli gonderin.",
            "kasa/fiskaydet zorunlu alanlari: kasa_id, evrak_tip, evrak_tarih, tutar (cari_id opsiyonel). Fatura satirlarinda en az stok_id, miktar, birim_fiyat, kdv_oran bulunmali."
          ]
        }
      ]
    }
  ]
}
