AIFA AKADEMI · Kurumsal Wiki
4.330 makale
Ana sayfa Kurumsal Wiki › Hata Bilgi Bankası › EKB-SESSIZ

Sessiz Mantık / Hesaplama Hataları

ERROR_KBERPGOLD_COREACTIVEAIFASOFT_INTERNALGENERATED_PROPOSAL
Kanonik kaynak: markdown · bu sayfa üretilmiş görünümdür

Hata mesajı vermeden yanlış sonuç üreten 75 kayıt + 44 formül düzeyi risk; invariant ve salt-okunur doğrulama SQL'leri.

Künye (front-matter) · EKB-SESSIZ · reality [SUPPORT_OBSERVED, SOURCE_IMPLEMENTED, GENERATED_PROPOSAL]
idEKB-SESSIZ
titleSessiz Hesaplama Hataları
entity_typeERROR_KB
moduleMOD-KALITE
audience[SUPPORT, DEVELOPER, QA]
confidentialityAIFASOFT_INTERNAL
product_scopeERPGOLD_CORE
customer_scopeALL
reality[SUPPORT_OBSERVED, SOURCE_IMPLEMENTED, GENERATED_PROPOSAL]
lifecycleACTIVE
confidenceMEDIUM
version_fromVERSION_UNKNOWN
version_to-
created_at2026-09-13
last_verified2026-09-13
source_hashes[]
sources[DOCUMENT:ERPGOLD_ERROR_MASTER.xlsx, DOCUMENT:ERPGOLD_HATA_KOK_NEDEN_BILGI_BANKASI.md, SRC-TKT-ERP, SOURCE_CODE:ERPPRO, DB_CATALOG:INST-ERPGOLDV2]
aliases[Sessiz Hesaplama Hataları]
tags[error-kb]
wiki_versionv1.5
source_packageERPGOLD_HATA_BILGI_BANKASI_v1 / Wiki_23_Hata_Bilgi_Bankasi
severityS1–S4 (kayıt bazında)
runtime_statusNOT_REPRODUCED — statik analiz + invariant; Gözlemlendi: HAYIR

Sessiz mantık / hesaplama hataları (75). Hata mesajı vermeden yanlış sonuç üreten noktalar: yuvarlama/hassasiyet, kur=0, boş Catch blokları, eksik türetilmiş kayıt. Etiket: SESSİZ MANTIK / HESAPLAMA. Doğrulama yöntemi olarak invariant ve salt-okunur SQL verilir; bkz. Health Check.

Özet

Kayıt75
Gözlemlendi: EVET / HAYIR38 / 37
SeverityS1 5 · S2 24 · S3 26 · S4 20
Çözümü bilinen10
DurumAÇIK 75

Modül dağılımı

ModülKayıtS1S2S3S4
MOD-SISTEM185445
MOD-CARI180990
MOD-STOK120354
MOD-EFATURA70610
MOD-VERİTABANI60240
MOD-DIGER40004
MOD-GENEL40013
MOD-RAPOR30021
MOD-FINANS20002
MOD-URETIM10001

Hata kategorisi dağılımı

KategoriKayıt
E06 — Algoritma Hatası25
E07 — Finansal Hesaplama Hatası21
E08 — Yuvarlama / Hassasiyet Hatası10
E16 — Eksik Türetilmiş Kayıt10
E15 — Duplicate / Çift İşlem3
E02 — SQL Server Hatası2
E05 — Transaction Hatası2
E03 — Veri Bütünlüğü Hatası1
E17 — Eski Veri / Legacy Problemi1

Kayıtlar

SESSİZ MANTIK / HESAPLAMA ERR-SIL-001 — IndexOutOfRangeException / InvalidCastException — FrmBlokTakozGirisi.ListRefresh S4 · MOD-STOK · Gözlemlendi: HAYIR · PF-010 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-STOK
Alt modülKod
Problem ailesiPF-010 Programa giriş yapılamıyor / program açılmıyor (giriş hatası)
Kullanıcı belirtisiBelirti yok; hatalı girişte 'Girilen Bilgilere Göre Takoz Cıkıs İşlemleri Bulunamadı' mesajı.
Teknik belirtiTxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(0) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
Exception türüIndexOutOfRangeException / InvalidCastException
Kod dosyasıERPPRO/Controls/Islem Ekranı/Ekran/FrmBlokTakozGirisi.vb
ClassFrmBlokTakozGirisi
MethodListRefresh
Satır / bölge17
Tetikleme koşuluTxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(0) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
Kök nedenTry/Catch var ama Catch bloğu boş; SubeId/HesapId/FisNo 0 kalır ve sorgu 0 değerleriyle çalışır. Form Load'da (satır 3-4) ListRefresh boş metinle çağrıldığı için istisna HER açılışta oluşur ve yutulur.
Neden zinciriTeknik olay: IndexOutOfRangeException / InvalidCastException ↓ Yakın neden: TxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(0) yok; veya sayısal ↓ Kök neden: Try/Catch var ama Catch bloğu boş; SubeId/HesapId/FisNo 0 kalır ve sorgu 0 değerleriyle çalışır. Form Load'da (satır 3-4) ListRefresh boş metinle çağrıldığı içi ↓ Kullanıcı etkisi: Belirti yok; hatalı girişte 'Girilen Bilgilere Göre Takoz Cıkıs İşlemleri Bulunamadı' mesajı.
Olasılık / etki / güvenÇOK YÜKSEK / S4 / 90
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Metni Split edip parça sayısı ve Integer.TryParse ile doğrulamak; geçersizse kullanıcıya uyarı verip Exit Sub.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: TxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(0) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · FrmBlokTakozGirisi.vb:16-22 `Try SubeId = TxtSubeId.Text.Split(".")(0) ... Catch ex As Exception End Try`
İlişkili kayıtlarERR-POT-002, ERR-POT-008, ERR-SIL-002, ERR-SIL-003, ERR-SIL-028, ERR-SIL-056, ERR-SIL-059
SESSİZ MANTIK / HESAPLAMA ERR-SIL-002 — IndexOutOfRangeException / InvalidCastException — FrmBlokTakozGirisi.ListRefresh S4 · MOD-STOK · Gözlemlendi: HAYIR · PF-010 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-STOK
Alt modülKod
Problem ailesiPF-010 Programa giriş yapılamıyor / program açılmıyor (giriş hatası)
Kullanıcı belirtisiBelirti yok; hatalı girişte 'Girilen Bilgilere Göre Takoz Cıkıs İşlemleri Bulunamadı' mesajı.
Teknik belirtiTxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(1) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
Exception türüIndexOutOfRangeException / InvalidCastException
Kod dosyasıERPPRO/Controls/Islem Ekranı/Ekran/FrmBlokTakozGirisi.vb
ClassFrmBlokTakozGirisi
MethodListRefresh
Satır / bölge18
Tetikleme koşuluTxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(1) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
Kök nedenTry/Catch var ama Catch bloğu boş; SubeId/HesapId/FisNo 0 kalır ve sorgu 0 değerleriyle çalışır. Form Load'da (satır 3-4) ListRefresh boş metinle çağrıldığı için istisna HER açılışta oluşur ve yutulur.
Neden zinciriTeknik olay: IndexOutOfRangeException / InvalidCastException ↓ Yakın neden: TxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(1) yok; veya sayısal ↓ Kök neden: Try/Catch var ama Catch bloğu boş; SubeId/HesapId/FisNo 0 kalır ve sorgu 0 değerleriyle çalışır. Form Load'da (satır 3-4) ListRefresh boş metinle çağrıldığı içi ↓ Kullanıcı etkisi: Belirti yok; hatalı girişte 'Girilen Bilgilere Göre Takoz Cıkıs İşlemleri Bulunamadı' mesajı.
Olasılık / etki / güvenÇOK YÜKSEK / S4 / 90
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Metni Split edip parça sayısı ve Integer.TryParse ile doğrulamak; geçersizse kullanıcıya uyarı verip Exit Sub.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: TxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(1) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · FrmBlokTakozGirisi.vb:16-22 `Try SubeId = TxtSubeId.Text.Split(".")(0) ... Catch ex As Exception End Try`
İlişkili kayıtlarERR-POT-002, ERR-POT-008, ERR-SIL-001, ERR-SIL-003, ERR-SIL-028, ERR-SIL-056, ERR-SIL-059
SESSİZ MANTIK / HESAPLAMA ERR-SIL-003 — IndexOutOfRangeException / InvalidCastException — FrmBlokTakozGirisi.ListRefresh S4 · MOD-STOK · Gözlemlendi: HAYIR · PF-010 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-STOK
Alt modülKod
Problem ailesiPF-010 Programa giriş yapılamıyor / program açılmıyor (giriş hatası)
Kullanıcı belirtisiBelirti yok; hatalı girişte 'Girilen Bilgilere Göre Takoz Cıkıs İşlemleri Bulunamadı' mesajı.
Teknik belirtiTxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(2) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
Exception türüIndexOutOfRangeException / InvalidCastException
Kod dosyasıERPPRO/Controls/Islem Ekranı/Ekran/FrmBlokTakozGirisi.vb
ClassFrmBlokTakozGirisi
MethodListRefresh
Satır / bölge19
Tetikleme koşuluTxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(2) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
Kök nedenTry/Catch var ama Catch bloğu boş; SubeId/HesapId/FisNo 0 kalır ve sorgu 0 değerleriyle çalışır. Form Load'da (satır 3-4) ListRefresh boş metinle çağrıldığı için istisna HER açılışta oluşur ve yutulur.
Neden zinciriTeknik olay: IndexOutOfRangeException / InvalidCastException ↓ Yakın neden: TxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(2) yok; veya sayısal ↓ Kök neden: Try/Catch var ama Catch bloğu boş; SubeId/HesapId/FisNo 0 kalır ve sorgu 0 değerleriyle çalışır. Form Load'da (satır 3-4) ListRefresh boş metinle çağrıldığı içi ↓ Kullanıcı etkisi: Belirti yok; hatalı girişte 'Girilen Bilgilere Göre Takoz Cıkıs İşlemleri Bulunamadı' mesajı.
Olasılık / etki / güvenÇOK YÜKSEK / S4 / 90
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Metni Split edip parça sayısı ve Integer.TryParse ile doğrulamak; geçersizse kullanıcıya uyarı verip Exit Sub.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: TxtSubeId.Text 'Sube.Hesap.FisNo' biçiminde değilse (Form Load'da boş metinle çağrılır → Split('.')(2) yok; veya sayısal olmayan parça → Integer'a dönüşüm hatası).
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · FrmBlokTakozGirisi.vb:16-22 `Try SubeId = TxtSubeId.Text.Split(".")(0) ... Catch ex As Exception End Try`
İlişkili kayıtlarERR-POT-002, ERR-POT-008, ERR-SIL-001, ERR-SIL-002, ERR-SIL-028, ERR-SIL-056, ERR-SIL-059
SESSİZ MANTIK / HESAPLAMA ERR-SIL-004 — IndexOutOfRangeException — UiForm.LoadDesigner S4 · MOD-SISTEM · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-SISTEM
Alt modülKod
Kullanıcı belirtisiTasarımcıda bazı kontroller yüklenmez; hata mesajı yok.
Teknik belirtiDesigner kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenlenmiş, fazladan boşluk → Split(" ") boş token üretir) (5) indeksi bulunamaz.
Exception türüIndexOutOfRangeException
Kod dosyasıCodeDesigner/CodeDesigner/Controls/UiFormDesigner/UiForm.vb
ClassUiForm
MethodLoadDesigner
Satır / bölge54
Tetikleme koşuluDesigner kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenlenmiş, fazladan boşluk → Split(" ") boş token üretir) (5) indeksi bulunamaz.
Kök nedenSatır 30 `On Error Resume Next` → istisna yutulur, Dim değişkeni Nothing kalır, `ControlTpye <> ""` False olur ve kontrol sessizce atlanır. Araç tarafından üretilen kod (UiConteiner.vb:332) 6 token üretir, normalde güvenli.
Neden zinciriTeknik olay: IndexOutOfRangeException ↓ Yakın neden: Designer kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenle ↓ Kök neden: Satır 30 `On Error Resume Next` → istisna yutulur, Dim değişkeni Nothing kalır, `ControlTpye <> ""` False olur ve kontrol sessizce atlanır. Araç tarafından üret ↓ Kullanıcı etkisi: Tasarımcıda bazı kontroller yüklenmez; hata mesajı yok.
Olasılık / etki / güvenDÜŞÜK / S4 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Split(" "c, StringSplitOptions.RemoveEmptyEntries) + uzunluk kontrolü; On Error Resume Next kaldırılıp Try/Catch ile loglama.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Designer kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenlenmiş, fazladan boşluk → Split(" ") boş token üretir) (5) indeksi bulunamaz.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · UiForm.vb:30 `On Error Resume Next`; :54 `s.Trim.Split(" ")(5).Trim`
İlişkili kayıtlarERR-SIL-005, ERR-SIL-016
SESSİZ MANTIK / HESAPLAMA ERR-SIL-005 — IndexOutOfRangeException — UiForm.LoadDesigner S4 · MOD-SISTEM · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-SISTEM
Alt modülKod
Kullanıcı belirtisiTasarımcıda bazı kontroller yüklenmez; hata mesajı yok.
Teknik belirtiDesigner kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenlenmiş, fazladan boşluk → Split(" ") boş token üretir) (2) indeksi bulunamaz.
Exception türüIndexOutOfRangeException
Kod dosyasıCodeDesigner/CodeDesigner/Controls/UiFormDesigner/UiForm.vb
ClassUiForm
MethodLoadDesigner
Satır / bölge55
Tetikleme koşuluDesigner kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenlenmiş, fazladan boşluk → Split(" ") boş token üretir) (2) indeksi bulunamaz.
Kök nedenSatır 30 `On Error Resume Next` → istisna yutulur, Dim değişkeni Nothing kalır, `ControlTpye <> ""` False olur ve kontrol sessizce atlanır. Araç tarafından üretilen kod (UiConteiner.vb:332) 6 token üretir, normalde güvenli.
Neden zinciriTeknik olay: IndexOutOfRangeException ↓ Yakın neden: Designer kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenle ↓ Kök neden: Satır 30 `On Error Resume Next` → istisna yutulur, Dim değişkeni Nothing kalır, `ControlTpye <> ""` False olur ve kontrol sessizce atlanır. Araç tarafından üret ↓ Kullanıcı etkisi: Tasarımcıda bazı kontroller yüklenmez; hata mesajı yok.
Olasılık / etki / güvenDÜŞÜK / S4 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Split(" "c, StringSplitOptions.RemoveEmptyEntries) + uzunluk kontrolü; On Error Resume Next kaldırılıp Try/Catch ile loglama.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Designer kodundaki 'Friend WithEvents' satırı beklenen 'Friend WithEvents Ad as New Tip' biçiminde değilse (elle düzenlenmiş, fazladan boşluk → Split(" ") boş token üretir) (2) indeksi bulunamaz.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · UiForm.vb:30 `On Error Resume Next`; :55 `s.Trim.Split(" ")(2).Trim`
İlişkili kayıtlarERR-SIL-004, ERR-SIL-016
SESSİZ MANTIK / HESAPLAMA ERR-SIL-006 — NullReferenceException — EtiketDesignList.SimpleList1_ButtonClick S4 · MOD-DIGER · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-DIGER
Alt modülDevExpress-GetFocusedRow-Nothing
Kullanıcı belirtisiButona basınca hiçbir şey olmaz, mesaj yok.
Teknik belirtiListe boşken veya satır seçili değilken Düzenle/Sil butonuna basılırsa GetFocusedRow Nothing döner; `New EtiketDesign(Item)` / `Item.Delete` NRE atar.
Exception türüNullReferenceException
Kod dosyasıERPPRO/Controls/Islem Ekranı/OldFis/EtiketDesignList.vb
ClassEtiketDesignList
MethodSimpleList1_ButtonClick
Satır / bölge17
Tetikleme koşuluListe boşken veya satır seçili değilken Düzenle/Sil butonuna basılırsa GetFocusedRow Nothing döner; `New EtiketDesign(Item)` / `Item.Delete` NRE atar.
Kök nedenSatır 16 `On Error Resume Next` → NRE yutulur, hiçbir şey olmaz. Item Is Nothing kontrolü yok (karşılaştırma: RDPList.vb:13 aynı deseni açıkça kontrol ediyor).
Neden zinciriTeknik olay: NullReferenceException ↓ Yakın neden: Liste boşken veya satır seçili değilken Düzenle/Sil butonuna basılırsa GetFocusedRow Nothing döner; `New EtiketDesign(It ↓ Kök neden: Satır 16 `On Error Resume Next` → NRE yutulur, hiçbir şey olmaz. Item Is Nothing kontrolü yok (karşılaştırma: RDPList.vb:13 aynı deseni açıkça kontrol ediyor). ↓ Kullanıcı etkisi: Butona basınca hiçbir şey olmaz, mesaj yok.
Olasılık / etki / güvenORTA / S4 / 75
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): `If Item Is Nothing Then Message.Show(NotSelectedRecord) : Exit Sub` eklemek; On Error Resume Next kaldırmak.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Liste boşken veya satır seçili değilken Düzenle/Sil butonuna basılırsa GetFocusedRow Nothing döner; `New EtiketDesign(Item)` / `Item.Delete` NRE atar.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · EtiketDesignList.vb:16-17 `On Error Resume Next` / `Dim Item As AIO.Sistem.Etiket = SimpleList1.GridView.GetFocusedRow()`
İlişkili kayıtlarERR-SIL-008
SESSİZ MANTIK / HESAPLAMA ERR-SIL-007 — Tüm istisnalar (maskeleme) — UrunListesi.LoadStok S3 · MOD-CARI · Gözlemlendi: HAYIR · PF-045 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülOnErrorResumeNext-Maskeleme
Problem ailesiPF-045 Kur giriş ekranı / kur listesi boş / kur yanlış geliyor
Kullanıcı belirtisiSeri işlem ekranında ürün listesi eksik görünür; hata mesajı yok.
Teknik belirtiDSX.TABLE.ListOfMaden/ListOfEmtia vb. Nothing ise veya öğe eşlemesinde istisna oluşursa
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıERPPRO/Controls/Islem Ekranı/Ekran/SeriIslemEkrani/UrunListesi.vb
ClassUrunListesi
MethodLoadStok
Satır / bölge59
Tetikleme koşuluDSX.TABLE.ListOfMaden/ListOfEmtia vb. Nothing ise veya öğe eşlemesinde istisna oluşursa
Kök nedenOn Error Resume Next tüm hataları yutar; liste eksik/boş kalır. Loglama yok.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: DSX.TABLE.ListOfMaden/ListOfEmtia vb. Nothing ise veya öğe eşlemesinde istisna oluşursa ↓ Kök neden: On Error Resume Next tüm hataları yutar; liste eksik/boş kalır. Loglama yok. ↓ Kullanıcı etkisi: Seri işlem ekranında ürün listesi eksik görünür; hata mesajı yok.
Olasılık / etki / güvenDÜŞÜK / S3 / 65
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): On Error Resume Next yerine Try/Catch + kullanıcıya uyarı.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: DSX.TABLE.ListOfMaden/ListOfEmtia vb. Nothing ise veya öğe eşlemesinde istisna oluşursa
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · UrunListesi.vb:59 `On Error Resume Next`
SESSİZ MANTIK / HESAPLAMA ERR-SIL-008 — Tüm istisnalar (maskeleme) — EtiketDesignList.SimpleList1_ButtonClick S4 · MOD-DIGER · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-DIGER
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiButon tepkisiz.
Teknik belirtiBkz. satır 17 kaydı
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıERPPRO/Controls/Islem Ekranı/OldFis/EtiketDesignList.vb
ClassEtiketDesignList
MethodSimpleList1_ButtonClick
Satır / bölge16
Tetikleme koşuluBkz. satır 17 kaydı
Kök nedenOn Error Resume Next; NRE ve alt form hataları yutulur.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: Bkz. satır 17 kaydı ↓ Kök neden: On Error Resume Next; NRE ve alt form hataları yutulur. ↓ Kullanıcı etkisi: Buton tepkisiz.
Olasılık / etki / güvenORTA / S4 / 75
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Try/Catch + Nothing kontrolü.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Bkz. satır 17 kaydı
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · EtiketDesignList.vb:16
İlişkili kayıtlarERR-SIL-006
SESSİZ MANTIK / HESAPLAMA ERR-SIL-009 — TargetInvocationException / InvalidCastException (maskeleme) — EtiketDetay.GetValue S4 · MOD-RAPOR · Gözlemlendi: HAYIR · PF-024 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-RAPOR
Alt modülOnErrorResumeNext-Maskeleme
Problem ailesiPF-024 Etiket tasarımı / etiket yazıcısı çıkmıyor / RFID
Kullanıcı belirtisiEtikette ilgili alan boş basılır.
Teknik belirtiItem Nothing ise veya FieldName özelliği okunurken istisna oluşursa (Prop.GetValue), Result boş kalır.
Exception türüTargetInvocationException / InvalidCastException (maskeleme)
Kod dosyasıERPPRO/Controls/Islem Ekranı/OldFis/EtiketDetay.vb
ClassEtiketDetay
MethodGetValue
Satır / bölge329
Tetikleme koşuluItem Nothing ise veya FieldName özelliği okunurken istisna oluşursa (Prop.GetValue), Result boş kalır.
Kök nedenOn Error Resume Next; Prop IsNot Nothing kontrolü var ancak Item Nothing kontrolü yok.
Neden zinciriTeknik olay: TargetInvocationException / InvalidCastException (maskeleme) ↓ Yakın neden: Item Nothing ise veya FieldName özelliği okunurken istisna oluşursa (Prop.GetValue), Result boş kalır. ↓ Kök neden: On Error Resume Next; Prop IsNot Nothing kontrolü var ancak Item Nothing kontrolü yok. ↓ Kullanıcı etkisi: Etikette ilgili alan boş basılır.
Olasılık / etki / güvenDÜŞÜK / S4 / 60
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Try/Catch ile alan bazlı hata metni ('#ERR') basmak.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Item Nothing ise veya FieldName özelliği okunurken istisna oluşursa (Prop.GetValue), Result boş kalır.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · EtiketDetay.vb:329-337
SESSİZ MANTIK / HESAPLAMA ERR-SIL-010 — Tüm istisnalar (maskeleme) — DataList.DataBind S4 · MOD-GENEL · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-GENEL
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiListe boş; ek mesaj yok.
Teknik belirtiInternalDb(Query).DataTable Nothing dönerse (SQL hatası) veya DevExpress kolon işlemlerinde istisna olursa
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıERPPRO/Controls/Grid/DataList.vb
ClassDataList
MethodDataBind
Satır / bölge36
Tetikleme koşuluInternalDb(Query).DataTable Nothing dönerse (SQL hatası) veya DevExpress kolon işlemlerinde istisna olursa
Kök nedenOn Error Resume Next; SQL hatası InternalDb tarafından MsgBox ile gösterilir, sonrası sessiz.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: InternalDb(Query).DataTable Nothing dönerse (SQL hatası) veya DevExpress kolon işlemlerinde istisna olursa ↓ Kök neden: On Error Resume Next; SQL hatası InternalDb tarafından MsgBox ile gösterilir, sonrası sessiz. ↓ Kullanıcı etkisi: Liste boş; ek mesaj yok.
Olasılık / etki / güvenDÜŞÜK / S4 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Try/Catch; DataTable Nothing kontrolü.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: InternalDb(Query).DataTable Nothing dönerse (SQL hatası) veya DevExpress kolon işlemlerinde istisna olursa
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · DataList.vb:36,42
SESSİZ MANTIK / HESAPLAMA ERR-SIL-011 — Tüm istisnalar (maskeleme) — DataListBase.DataBind S4 · MOD-GENEL · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-GENEL
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiListe/resim yüklenmez, mesaj yok.
Teknik belirtiActiveObject Nothing ise veya görsel/veri bağlama hatası
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıERPPRO/Controls/Grid/DataListBase.vb
ClassDataListBase
MethodDataBind
Satır / bölge54
Tetikleme koşuluActiveObject Nothing ise veya görsel/veri bağlama hatası
Kök nedenOn Error Resume Next.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: ActiveObject Nothing ise veya görsel/veri bağlama hatası ↓ Kök neden: On Error Resume Next. ↓ Kullanıcı etkisi: Liste/resim yüklenmez, mesaj yok.
Olasılık / etki / güvenDÜŞÜK / S4 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Try/Catch + loglama.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: ActiveObject Nothing ise veya görsel/veri bağlama hatası
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · DataListBase.vb:54
SESSİZ MANTIK / HESAPLAMA ERR-SIL-012 — Tüm istisnalar (maskeleme) — SimpleList.RetriveData S4 · MOD-GENEL · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-GENEL
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiListe boş; mesaj yok.
Teknik belirtiSQL/DevExpress hataları
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıERPPRO/Controls/Grid/SimpleList.vb
ClassSimpleList
MethodRetriveData
Satır / bölge173
Tetikleme koşuluSQL/DevExpress hataları
Kök nedenOn Error Resume Next.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: SQL/DevExpress hataları ↓ Kök neden: On Error Resume Next. ↓ Kullanıcı etkisi: Liste boş; mesaj yok.
Olasılık / etki / güvenDÜŞÜK / S4 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Try/Catch + loglama.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: SQL/DevExpress hataları
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · SimpleList.vb:173
SESSİZ MANTIK / HESAPLAMA ERR-SIL-013 — Tüm istisnalar (maskeleme) — Appointment.New(Apt) S4 · MOD-DIGER · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-DIGER
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiRandevu eksik bilgiyle kaydedilir; mesaj yok.
Teknik belirtiApt.ResourceIds / RecurrenceInfo Nothing veya DevExpress persistence helper istisnası
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıERPPRO/Controls/Takvim/Class/Appointment.vb
ClassAppointment
MethodNew(Apt)
Satır / bölge28
Tetikleme koşuluApt.ResourceIds / RecurrenceInfo Nothing veya DevExpress persistence helper istisnası
Kök nedenOn Error Resume Next; nesne kısmen dolu olarak devam eder ve kaydedilebilir.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: Apt.ResourceIds / RecurrenceInfo Nothing veya DevExpress persistence helper istisnası ↓ Kök neden: On Error Resume Next; nesne kısmen dolu olarak devam eder ve kaydedilebilir. ↓ Kullanıcı etkisi: Randevu eksik bilgiyle kaydedilir; mesaj yok.
Olasılık / etki / güvenDÜŞÜK / S4 / 60
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Try/Catch, hatalı alan için varsayılan atama ve loglama.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Apt.ResourceIds / RecurrenceInfo Nothing veya DevExpress persistence helper istisnası
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · Appointment.vb:28
SESSİZ MANTIK / HESAPLAMA ERR-SIL-014 — InvalidCastException (CBool("")) — TicketList.GridView1_CustomDrawCell S4 · MOD-DIGER · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-DIGER
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiBazı bilet satırları renklendirilmez.
Teknik belirtiIsActive veya Status hücresi NULL ise `CBool("" & Nothing)` = CBool("") InvalidCastException atar.
Exception türüInvalidCastException (CBool(""))
Kod dosyasıERPPRO/Controls/Takvim/Class/TicketList.vb
ClassTicketList
MethodGridView1_CustomDrawCell
Satır / bölge65
Tetikleme koşuluIsActive veya Status hücresi NULL ise `CBool("" & Nothing)` = CBool("") InvalidCastException atar.
Kök nedenOn Error Resume Next; hücre renklendirmesi atlanır.
Neden zinciriTeknik olay: InvalidCastException (CBool("")) ↓ Yakın neden: IsActive veya Status hücresi NULL ise `CBool("" & Nothing)` = CBool("") InvalidCastException atar. ↓ Kök neden: On Error Resume Next; hücre renklendirmesi atlanır. ↓ Kullanıcı etkisi: Bazı bilet satırları renklendirilmez.
Olasılık / etki / güvenORTA / S4 / 75
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Val()/Boolean.TryParse ile güvenli dönüşüm.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: IsActive veya Status hücresi NULL ise `CBool("" & Nothing)` = CBool("") InvalidCastException atar.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · TicketList.vb:65-68
SESSİZ MANTIK / HESAPLAMA ERR-SIL-015 — NullReferenceException (hata işleyici içinde) — MyApplication.ShowDebugOutput S1 · MOD-SISTEM · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS1 — KRİTİK
ModülMOD-SISTEM
Alt modülThreadException-AutoErrorHandle
Kullanıcı belirtisiUygulama açılışta sessizce kapanır veya hata hiç görünmez; AutoErrorHandle=1 ise hata formu, 'Kapat' → program kapanır.
Teknik belirti1) Giriş ekranı (FrmLoginForm.New) çalışmadan önce bir istisna oluşursa Program.UserSettings Nothing'dir; satır 15 `Program.UserSettings.AutoErrorHandle` On Error Resume Next'ten ÖNCE çalıştığı için hata işleyicinin kendisi NRE atar (ikincil çökme). 2) AutoErrorHandle <> 1 ise hiçbir şey gösterilmez/loglanmaz. 3) st.GetFrame(0) Nothing ise Show çağrısı tümüyle atlanır.
Exception türüNullReferenceException (hata işleyici içinde)
Kod dosyasıERPPRO/Class/Ext/ApplicationExt.vb
ClassMyApplication
MethodShowDebugOutput
Satır / bölge16
Tetikleme koşulu1) Giriş ekranı (FrmLoginForm.New) çalışmadan önce bir istisna oluşursa Program.UserSettings Nothing'dir; satır 15 `Program.UserSettings.AutoErrorHandle` On Error Resume Next'ten ÖNCE çalıştığı için hata işleyicinin kendisi NRE atar (ikincil çökme). 2) AutoErrorHandle <> 1 ise hiçbir şey gösterilmez/loglanmaz. 3) st.GetFrame(0) Nothing ise Show çağrısı tümüyle atlanır.
Kök nedenOn Error Resume Next yalnızca If içindeki satırları kapsar. Loglama yok. ExeptionForm.BtnKapat → `End` (uygulamayı sonlandırır).
Neden zinciriTeknik olay: NullReferenceException (hata işleyici içinde) ↓ Yakın neden: 1) Giriş ekranı (FrmLoginForm.New) çalışmadan önce bir istisna oluşursa Program.UserSettings Nothing'dir; satır 15 `Prog ↓ Kök neden: On Error Resume Next yalnızca If içindeki satırları kapsar. Loglama yok. ExeptionForm.BtnKapat → `End` (uygulamayı sonlandırır). ↓ Kullanıcı etkisi: Uygulama açılışta sessizce kapanır veya hata hiç görünmez; AutoErrorHandle=1 ise hata formu, 'Kapat' → program kapanır.
Etkilenen veriBelirtilen SQL nesnesi / ekran verisi
Olasılık / etki / güvenORTA / S1 / 80
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): UserSettings Nothing kontrolü; AutoErrorHandle=0 iken de dosyaya loglama; UnhandledException'da e.ExitApplication'ı bilinçli yönetmek.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: 1) Giriş ekranı (FrmLoginForm.New) çalışmadan önce bir istisna oluşursa Program.UserSettings Nothing'dir; satır 15 `Program.UserSettings.AutoErrorHandle` On Error Resume Next'ten ÖNCE çalıştığı için h
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · ApplicationExt.vb:14-21; FrmExeption.vb:16 `Sub FormClose() ... End`; FrmLoginForm.vb:10 `Program.UserSettings = New AIO.Sistem.Clients`
SESSİZ MANTIK / HESAPLAMA ERR-SIL-016 — Tüm istisnalar (maskeleme) — UiForm.LoadDesigner S4 · MOD-SISTEM · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-SISTEM
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiForm tasarımcısında eksik kontroller.
Teknik belirtiDesigner kodu ayrıştırılırken herhangi bir istisna (Type.GetType Nothing → Activator NRE, Split indeks vb.)
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıCodeDesigner/CodeDesigner/Controls/UiFormDesigner/UiForm.vb
ClassUiForm
MethodLoadDesigner
Satır / bölge30
Tetikleme koşuluDesigner kodu ayrıştırılırken herhangi bir istisna (Type.GetType Nothing → Activator NRE, Split indeks vb.)
Kök nedenOn Error Resume Next; kontroller sessizce atlanır.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: Designer kodu ayrıştırılırken herhangi bir istisna (Type.GetType Nothing → Activator NRE, Split indeks vb.) ↓ Kök neden: On Error Resume Next; kontroller sessizce atlanır. ↓ Kullanıcı etkisi: Form tasarımcısında eksik kontroller.
Olasılık / etki / güvenDÜŞÜK / S4 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Try/Catch + hata listesi.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Designer kodu ayrıştırılırken herhangi bir istisna (Type.GetType Nothing → Activator NRE, Split indeks vb.)
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · UiForm.vb:30
İlişkili kayıtlarERR-SIL-004, ERR-SIL-005
SESSİZ MANTIK / HESAPLAMA ERR-SIL-017 — Tüm istisnalar (maskeleme) — Properties.ToString S4 · MOD-SISTEM · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS4 — DÜŞÜK
ModülMOD-SISTEM
Alt modülOnErrorResumeNext-Maskeleme
Kullanıcı belirtisiÜretilen designer kodunda eksik özellik satırı.
Teknik belirtiLate-bound .FieldName/.Mask erişimi desteklemeyen kontrol tipinde MissingMemberException
Exception türüTüm istisnalar (maskeleme)
Kod dosyasıCodeDesigner/CodeDesigner/Controls/Properties/Properties.vb
ClassProperties
MethodToString
Satır / bölge220
Tetikleme koşuluLate-bound .FieldName/.Mask erişimi desteklemeyen kontrol tipinde MissingMemberException
Kök nedenOn Error Resume Next; satır atlanır.
Neden zinciriTeknik olay: Tüm istisnalar (maskeleme) ↓ Yakın neden: Late-bound .FieldName/.Mask erişimi desteklemeyen kontrol tipinde MissingMemberException ↓ Kök neden: On Error Resume Next; satır atlanır. ↓ Kullanıcı etkisi: Üretilen designer kodunda eksik özellik satırı.
Olasılık / etki / güvenDÜŞÜK / S4 / 65
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Tip kontrolü (TypeOf) ile üretim.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Late-bound .FieldName/.Mask erişimi desteklemeyen kontrol tipinde MissingMemberException
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · Properties.vb:220-226
SESSİZ MANTIK / HESAPLAMA ERR-SIL-018 — IndexOutOfRangeException (kolon yok) — DBNull yanlış pozitif — ERPFatura.New(RecordId) S2 · MOD-EFATURA · Gözlemlendi: HAYIR · PF-018 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS2 — YÜKSEK
ModülMOD-EFATURA
Alt modülERPFatura-KısmiYükleme
Problem ailesiPF-018 e-Belge entegratör güncellemesi / entegratör reddi (Uyumsoft, ICE, Mysoft, QR/dijital fatura)
Kullanıcı belirtisiMADEN faturası eksik tutar/kur ve entegratör bilgisiyle gönderilmeye çalışılır; entegratör reddi veya hatalı belge.
Teknik belirtiConvert.ToString(DBNull) "" döndürür, istisna atmaz. Gerçek risk: Muhasebe.GetEFatura sonuç kümesinde 'MADENKODU' kolonu yoksa DR("MADENKODU") IndexOutOfRangeException atar.
Exception türüIndexOutOfRangeException (kolon yok) — DBNull yanlış pozitif
Kod dosyasıDijitalFatura/Common/ERPFatura.vb
ClassERPFatura
MethodNew(RecordId)
Satır / bölge77
İlgili SQL nesneleriMuhasebe.GetEFatura
Tetikleme koşuluConvert.ToString(DBNull) "" döndürür, istisna atmaz. Gerçek risk: Muhasebe.GetEFatura sonuç kümesinde 'MADENKODU' kolonu yoksa DR("MADENKODU") IndexOutOfRangeException atar.
Kök nedenSatır 48-155 tek bir Try/Catch (boş Catch) içinde: istisna sonrası kalan TÜM alanlar (DovizMiktar, DovizTLKuru, Entegrator bilgileri, limitler) yüklenmez; fHasRecord=True kalır.
Neden zinciriTeknik olay: IndexOutOfRangeException (kolon yok) — DBNull yanlış pozitif ↓ Yakın neden: Convert.ToString(DBNull) "" döndürür, istisna atmaz. Gerçek risk: Muhasebe.GetEFatura sonuç kümesinde 'MADENKODU' kolonu ↓ Kök neden: Satır 48-155 tek bir Try/Catch (boş Catch) içinde: istisna sonrası kalan TÜM alanlar (DovizMiktar, DovizTLKuru, Entegrator bilgileri, limitler) yüklenmez; fHasR ↓ Kullanıcı etkisi: MADEN faturası eksik tutar/kur ve entegratör bilgisiyle gönderilmeye çalışılır; entegratör reddi veya hatalı belge.
Etkilenen veriBelirtilen SQL nesnesi / ekran verisi
Olasılık / etki / güvenDÜŞÜK / S2 / 60
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Alan başına ayrı güvenli okuma (HasColumn + TryGet); Catch'te loglama ve HasRecord=False.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Convert.ToString(DBNull) "" döndürür, istisna atmaz. Gerçek risk: Muhasebe.GetEFatura sonuç kümesinde 'MADENKODU' kolonu yoksa DR("MADENKODU") IndexOutOfRangeException atar.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · ERPFatura.vb:75-81, 152-155 `Catch ex As Exception End Try`
İlişkili kayıtlarERR-POT-057, ERR-POT-061, ERR-SIL-019, ERR-SIL-020
SESSİZ MANTIK / HESAPLAMA ERR-SIL-019 — ArgumentOutOfRangeException (Substring) — ERPFatura.New(RecordId) S2 · MOD-EFATURA · Gözlemlendi: HAYIR · PF-018 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS2 — YÜKSEK
ModülMOD-EFATURA
Alt modülERPFatura-KısmiYükleme
Problem ailesiPF-018 e-Belge entegratör güncellemesi / entegratör reddi (Uyumsoft, ICE, Mysoft, QR/dijital fatura)
Kullanıcı belirtisiE-belge kısmen yüklenmiş nesneyle gönderilir: tutar 0 / entegratör kimlik bilgisi boş → entegratör hatası; kullanıcı nedeni anlayamaz.
Teknik belirtiCari.IslemDetaylari.DovizKodu 3 karakterden kısa ise (boş string '' NULL değildir → DBNull koruması geçer). DovizKodu FrmEFaturaBas.vb:262 `Left(Transaction.Kodu,3)` ile yazılır; Kodu kısa/boş bir stok kodu ise 1-2 karakter kaydedilir.
Exception türüArgumentOutOfRangeException (Substring)
Kod dosyasıDijitalFatura/Common/ERPFatura.vb
ClassERPFatura
MethodNew(RecordId)
Satır / bölge79
İlgili SQL nesneleriCari.IslemDetaylari
Tetikleme koşuluCari.IslemDetaylari.DovizKodu 3 karakterden kısa ise (boş string '' NULL değildir → DBNull koruması geçer). DovizKodu FrmEFaturaBas.vb:262 `Left(Transaction.Kodu,3)` ile yazılır; Kodu kısa/boş bir stok kodu ise 1-2 karakter kaydedilir.
Kök nedenDBNull kontrolü var, uzunluk kontrolü yok. Dış Try/Catch (boş) istisnayı yutar ve satır 82+ alanları (DovizMiktar, DovizTLKuru, DolarKuru zaten okundu ama EntUserName/EntPassword/EBelgeUsdLimit vb.) atlanır.
Neden zinciriTeknik olay: ArgumentOutOfRangeException (Substring) ↓ Yakın neden: Cari.IslemDetaylari.DovizKodu 3 karakterden kısa ise (boş string '' NULL değildir → DBNull koruması geçer). DovizKodu Fr ↓ Kök neden: DBNull kontrolü var, uzunluk kontrolü yok. Dış Try/Catch (boş) istisnayı yutar ve satır 82+ alanları (DovizMiktar, DovizTLKuru, DolarKuru zaten okundu ama EntUs ↓ Kullanıcı etkisi: E-belge kısmen yüklenmiş nesneyle gönderilir: tutar 0 / entegratör kimlik bilgisi boş → entegratör hatası; kullanıcı ned
Etkilenen veriBelirtilen SQL nesnesi / ekran verisi
Olasılık / etki / güvenDÜŞÜK / S2 / 75
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): `If s.Length >= 3 Then s.Substring(0,3) Else s`; Catch'te loglama.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Cari.IslemDetaylari.DovizKodu 3 karakterden kısa ise (boş string '' NULL değildir → DBNull koruması geçer). DovizKodu FrmEFaturaBas.vb:262 `Left(Transaction.Kodu,3)` ile yazılır; Kodu kısa/boş bir sto
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · ERPFatura.vb:79 `DovizKodu = Convert.ToString(DR("DovizKodu")).Substring(0, 3)`; :152-155 boş Catch
İlişkili kayıtlarERR-POT-057, ERR-POT-061, ERR-SIL-018, ERR-SIL-020
SESSİZ MANTIK / HESAPLAMA ERR-SIL-020 — ArgumentOutOfRangeException (Substring) [SUBSTRING adayı, aynı satır] — ERPFatura.New(RecordId) S2 · MOD-EFATURA · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS2 — YÜKSEK
ModülMOD-EFATURA
Alt modülERPFatura-KısmiYükleme
Kullanıcı belirtisiAynı.
Teknik belirtiBkz. DBNULL_CAST kaydı (aynı satır).
Exception türüArgumentOutOfRangeException (Substring) [SUBSTRING adayı, aynı satır]
Kod dosyasıDijitalFatura/Common/ERPFatura.vb
ClassERPFatura
MethodNew(RecordId)
Satır / bölge79
Tetikleme koşuluBkz. DBNULL_CAST kaydı (aynı satır).
Kök nedenAynı.
Neden zinciriTeknik olay: ArgumentOutOfRangeException (Substring) [SUBSTRING adayı, aynı satır] ↓ Yakın neden: Bkz. DBNULL_CAST kaydı (aynı satır). ↓ Kök neden: Aynı. ↓ Kullanıcı etkisi: Aynı.
Etkilenen veriBelirtilen SQL nesnesi / ekran verisi
Olasılık / etki / güvenDÜŞÜK / S2 / 75
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Aynı.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Bkz. DBNULL_CAST kaydı (aynı satır).
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · ERPFatura.vb:79
İlişkili kayıtlarERR-POT-057, ERR-POT-061, ERR-SIL-018, ERR-SIL-019
SESSİZ MANTIK / HESAPLAMA ERR-SIL-021 — InvalidCastException (CInt(DBNull)) + yutulan SqlException — DBBase.Insert S3 · MOD-GENEL · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS3 — ORTA
ModülMOD-GENEL
Alt modülKod
Kullanıcı belirtisiKayıt sessizce kaydedilmez; çağıran yalnızca False alır.
Teknik belirtiSCOPE_IDENTITY() NULL dönerse (identity kolonu olmayan tablo) CInt(DBNull) InvalidCastException; ayrıca INSERT'teki her SqlException (kısıt, tip hatası) aynı Catch'e düşer.
Exception türüInvalidCastException (CInt(DBNull)) + yutulan SqlException
Kod dosyasıERPPRO/DataLayout/DBBaseClass.vb
ClassDBBase
MethodInsert
Satır / bölge74
Tetikleme koşuluSCOPE_IDENTITY() NULL dönerse (identity kolonu olmayan tablo) CInt(DBNull) InvalidCastException; ayrıca INSERT'teki her SqlException (kısıt, tip hatası) aynı Catch'e düşer.
Kök nedenTry/Catch var; Catch bağlantıyı kapatır, mesaj/log yok → RecId=0 → Insert False döner. Kullanıcıya nedeni gösterilmez.
Neden zinciriTeknik olay: InvalidCastException (CInt(DBNull)) + yutulan SqlException ↓ Yakın neden: SCOPE_IDENTITY() NULL dönerse (identity kolonu olmayan tablo) CInt(DBNull) InvalidCastException; ayrıca INSERT'teki her ↓ Kök neden: Try/Catch var; Catch bağlantıyı kapatır, mesaj/log yok → RecId=0 → Insert False döner. Kullanıcıya nedeni gösterilmez. ↓ Kullanıcı etkisi: Kayıt sessizce kaydedilmez; çağıran yalnızca False alır.
Olasılık / etki / güvenDÜŞÜK / S3 / 80
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Catch'te ex.Message'ı göster/logla; ExecuteScalar sonucunu DBNull kontrolüyle oku.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: SCOPE_IDENTITY() NULL dönerse (identity kolonu olmayan tablo) CInt(DBNull) InvalidCastException; ayrıca INSERT'teki her SqlException (kısıt, tip hatası) aynı Catch'e düşer.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=KISMEN · DBBaseClass.vb:74-78
SESSİZ MANTIK / HESAPLAMA ERR-SIL-022 — Sessiz (Double Infinity → JSON) — MySoft.Get_eDoviz_Belge S2 · MOD-EFATURA · Gözlemlendi: HAYIR · PF-018 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS2 — YÜKSEK
ModülMOD-EFATURA
Alt modülKod
Problem ailesiPF-018 e-Belge entegratör güncellemesi / entegratör reddi (Uyumsoft, ICE, Mysoft, QR/dijital fatura)
Kullanıcı belirtisiEntegratör belgeyi reddeder; sebep anlaşılmaz.
Teknik belirtiDoviz_TL_Kuru = 0 → 1/0 = Infinity (Double, istisna yok) → CalculationRate (Double) Infinity → JSON'a 'Infinity' yazılır → entegratör reddi.
Exception türüSessiz (Double Infinity → JSON)
Kod dosyasıDijitalFatura/Entegrators/MySoft.vb
ClassMySoft
MethodGet_eDoviz_Belge
Satır / bölge586
Tetikleme koşuluDoviz_TL_Kuru = 0 → 1/0 = Infinity (Double, istisna yok) → CalculationRate (Double) Infinity → JSON'a 'Infinity' yazılır → entegratör reddi.
Kök nedenKoruma yok; .NET istisnası oluşmaz.
Neden zinciriTeknik olay: Sessiz (Double Infinity → JSON) ↓ Yakın neden: Doviz_TL_Kuru = 0 → 1/0 = Infinity (Double, istisna yok) → CalculationRate (Double) Infinity → JSON'a 'Infinity' yazılır ↓ Kök neden: Koruma yok; .NET istisnası oluşmaz. ↓ Kullanıcı etkisi: Entegratör belgeyi reddeder; sebep anlaşılmaz.
Etkilenen veriBelirtilen SQL nesnesi / ekran verisi
Olasılık / etki / güvenDÜŞÜK / S2 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Kur > 0 doğrulaması.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Doviz_TL_Kuru = 0 → 1/0 = Infinity (Double, istisna yok) → CalculationRate (Double) Infinity → JSON'a 'Infinity' yazılır → entegratör reddi.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=HAYIR · MySoft.vb:586; MySoftForeignExchangeModel.vb:259 `Property CalculationRate As Double`
İlişkili kayıtlarERR-POT-065, ERR-SIL-023
SESSİZ MANTIK / HESAPLAMA ERR-SIL-023 — Sessiz (Double Infinity) — MySoft.Get_eDoviz_Belge S3 · MOD-EFATURA · Gözlemlendi: HAYIR · PF-018 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS3 — ORTA
ModülMOD-EFATURA
Alt modülKod
Problem ailesiPF-018 e-Belge entegratör güncellemesi / entegratör reddi (Uyumsoft, ICE, Mysoft, QR/dijital fatura)
Kullanıcı belirtisiHatalı oran; entegratör reddi.
Teknik belirtiVergiHaric_Tutar = 0 → Infinity (Double).
Exception türüSessiz (Double Infinity)
Kod dosyasıDijitalFatura/Entegrators/MySoft.vb
ClassMySoft
MethodGet_eDoviz_Belge
Satır / bölge591
Tetikleme koşuluVergiHaric_Tutar = 0 → Infinity (Double).
Kök nedenKoruma yok.
Neden zinciriTeknik olay: Sessiz (Double Infinity) ↓ Yakın neden: VergiHaric_Tutar = 0 → Infinity (Double). ↓ Kök neden: Koruma yok. ↓ Kullanıcı etkisi: Hatalı oran; entegratör reddi.
Olasılık / etki / güvenDÜŞÜK / S3 / 65
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Tutar > 0 doğrulaması.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: VergiHaric_Tutar = 0 → Infinity (Double).
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=HAYIR · MySoft.vb:591
İlişkili kayıtlarERR-POT-065, ERR-SIL-022
SESSİZ MANTIK / HESAPLAMA ERR-SIL-024 — Sessiz (Double Infinity → JSON) — Ticari1.Get_eDoviz_Belge S2 · MOD-EFATURA · Gözlemlendi: HAYIR · PF-018 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS2 — YÜKSEK
ModülMOD-EFATURA
Alt modülKod
Problem ailesiPF-018 e-Belge entegratör güncellemesi / entegratör reddi (Uyumsoft, ICE, Mysoft, QR/dijital fatura)
Kullanıcı belirtisiEntegratör reddi.
Teknik belirtiDoviz_TL_Kuru = 0 → 1/0 Infinity (Double özellik).
Exception türüSessiz (Double Infinity → JSON)
Kod dosyasıDijitalFatura/Entegrators/Ticari1.vb
ClassTicari1
MethodGet_eDoviz_Belge
Satır / bölge347
Tetikleme koşuluDoviz_TL_Kuru = 0 → 1/0 Infinity (Double özellik).
Kök nedenKoruma yok.
Neden zinciriTeknik olay: Sessiz (Double Infinity → JSON) ↓ Yakın neden: Doviz_TL_Kuru = 0 → 1/0 Infinity (Double özellik). ↓ Kök neden: Koruma yok. ↓ Kullanıcı etkisi: Entegratör reddi.
Etkilenen veriBelirtilen SQL nesnesi / ekran verisi
Olasılık / etki / güvenDÜŞÜK / S2 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Kur > 0 doğrulaması.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Doviz_TL_Kuru = 0 → 1/0 Infinity (Double özellik).
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=HAYIR · Ticari1.vb:347; Ticari1_Models.vb:47 `ISLEM_KUR_DEGERI As Double`
İlişkili kayıtlarERR-SIL-025
SESSİZ MANTIK / HESAPLAMA ERR-SIL-025 — Sessiz (Double Infinity/NaN → JSON) — Ticari1.Get_eDoviz_Belge S2 · MOD-EFATURA · Gözlemlendi: HAYIR · PF-018 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE06 — Algoritma Hatası
SeverityS2 — YÜKSEK
ModülMOD-EFATURA
Alt modülKod
Problem ailesiPF-018 e-Belge entegratör güncellemesi / entegratör reddi (Uyumsoft, ICE, Mysoft, QR/dijital fatura)
Kullanıcı belirtisiEntegratör reddi.
Teknik belirtiDolar_TL_Kuru = 0 → Infinity/NaN.
Exception türüSessiz (Double Infinity/NaN → JSON)
Kod dosyasıDijitalFatura/Entegrators/Ticari1.vb
ClassTicari1
MethodGet_eDoviz_Belge
Satır / bölge348
Tetikleme koşuluDolar_TL_Kuru = 0 → Infinity/NaN.
Kök nedenKoruma yok.
Neden zinciriTeknik olay: Sessiz (Double Infinity/NaN → JSON) ↓ Yakın neden: Dolar_TL_Kuru = 0 → Infinity/NaN. ↓ Kök neden: Koruma yok. ↓ Kullanıcı etkisi: Entegratör reddi.
Etkilenen veriBelirtilen SQL nesnesi / ekran verisi
Olasılık / etki / güvenDÜŞÜK / S2 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Kur > 0 doğrulaması.
ÖnlemeGuard (Nothing/DBNull/sıfır) kontrolü + hata loglama
Tespit yöntemiStatik kod analizi + guard/data-flow doğrulaması
Test senaryosuKoşul: Dolar_TL_Kuru = 0 → Infinity/NaN.
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakKod taraması (scan_exc.py) + doğrulama · Guard=HAYIR · Ticari1.vb:348; Ticari1_Models.vb:48 `KAYNAK_PB_USD_PARITE As Double`
İlişkili kayıtlarERR-SIL-024
SESSİZ MANTIK / HESAPLAMA ERR-SIL-026SQLR-049 Divide by zero: FN.Bol S2 · MOD-VERİTABANI · Gözlemlendi: HAYIR · PF-004 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-VERİTABANI
Alt modülDivide by zero
Problem ailesiPF-004 Rapor tasarımı / yeni rapor / sütun ekleme / bakiye ekstresi düzenleme (talep)
Kullanıcı belirtisiHata yok; bakiye/işçilik/ortalama maliyet 0 ya da eksik görünür; raporlarda 0 fiyat.
Teknik belirtiFN.Bol(@a,@b): 'IF (@Number1<>0 and @Number2<>0) SET @Number=@Number1/@Number2' — payda 0 ya da NULL ise 0 döner; hata yok. Ortalama fiyat, kur çevrimi, milyem, işçilik hesapları paydası 0 (kur girilmemiş, miktar 0) olduğunda 0 üretir ve bakiye/maliyet satırına yazılır.
SQL hata no8134 (sessizleştirilmiş → 0)
SQL hata mesajıDivide by zero
Ekran224 çağrı / 103 modül: Cari.AcceptTransaction (işçilik/altına çevir), Stok.GetMadenMaliyeti, Stok.GetOrtMilyem, FN.GetPariteAVG, Pozisyon.*, Bilanco.*, Report(s).*, Cari.GetNetBakiye, Takoz.*; kod: DataStokList.vb:93, BilancoSimpleView.vb:166, Siparis.ParcaEx.vb:85
Kod dosyasımodules.json (fn.bol regex: 224 eşleşme); ERPPRO/Controls/Grid/DataStokList.vb:93; ERPPRO/Designer/ReportManager/BilancoSimpleView.vb:166
İlgili SQL nesneleriFN.Bol, Cari.Islemler
SQL ObjectFN.Bol
Tetikleme koşuluFN.Bol(@a,@b): 'IF (@Number1<>0 and @Number2<>0) SET @Number=@Number1/@Number2' — payda 0 ya da NULL ise 0 döner; hata yok. Ortalama fiyat, kur çevrimi, milyem, işçilik hesapları paydası 0 (kur girilmemiş, miktar 0) olduğunda 0 üretir ve bakiye/maliyet satırına yazılır.
Kök nedenmodules.json FN.Bol tanımı; AcceptTransaction: '@Iscilik = Fn.Bol((@HasIscilik * @HasIscBirimKur),@IscKur) + …', '@HasBakiye += Fn.Bol(((@Miktar*@AgMilyem)*@GumKur),@HasKur)'; FN.Bol çağıran 103 modül listesi (div.py).
Neden zinciriTeknik olay: SQL 8134 (sessizleştirilmiş → 0) Divide by zero ↓ Yakın neden: FN.Bol(@a,@b): 'IF (@Number1<>0 and @Number2<>0) SET @Number=@Number1/@Number2' — payda 0 ya da NULL ise 0 döner; hata y ↓ Kullanıcı etkisi: Hata yok; bakiye/işçilik/ortalama maliyet 0 ya da eksik görünür; raporlarda 0 fiyat.
Etkilenen veriCari.BakiyeIslem / Stok.StokHaraketleri (türetilmiş bakiye ve stok kayıtları), Sistem.Kurlar
Olasılık / etki / güvenYüksek (kur/miktar 0 durumları sık) / S2 (finansal — maliyet/bakiye 0 yazılır) / 95
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): FN.Bol'un 0 yerine NULL döndürmesi ya da çağıran yerlerde NULLIF ile açık koruma; 0 dönen durumların loglanması. (Uygulanmadı)
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSQL modül/katalog analizi
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND (ISNULL(HasKur,0)=0 OR ISNULL(IscilikBirimKur,0)=0) AND IslemKodu=0; -- takoz işlemlerinde kur 0
Test senaryosuDoğrulama SQL'i çalıştır (salt okunur); beklenen: 0 kayıt
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSQL risk analizi SQLR-049 · DB1=EVET DB2=BİLİNMİYOR (muhtemelen EVET) BASE=EVET (BASE-CORE) · Guard=EVET (ama sessiz 0) · modules.json FN.Bol tanımı; AcceptTransaction: '@Iscilik = Fn.Bol((@HasIscilik * @HasIscBirimKur),@IscKur) + …', '@HasBakiye += Fn.Bol(((@Miktar*@AgMilyem)*@GumKur),@HasKur)'; FN.Bol çağıran 103 modül
İlişkili kayıtlarERR-OBS-070, ERR-POT-023, ERR-POT-033, ERR-POT-138, ERR-SIL-036, ERR-SIL-041, ERR-SIL-064
SESSİZ MANTIK / HESAPLAMA ERR-SIL-027SQLR-058 Conversion failed: (kod) TCMB.Currency.Save → MERGE Sistem.TCMBDovizKurlari S3 · MOD-VERİTABANI · Gözlemlendi: HAYIR · PF-007 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE02 — SQL Server Hatası
SeverityS3 — ORTA
ModülMOD-VERİTABANI
Alt modülConversion failed
Problem ailesiPF-007 Fatura kesilemiyor / fatura basma / fatura problemi (genel)
Kullanıcı belirtisiTCMB kur arşivi güncellenmez (sessiz); döviz seri fatura ekranında geçmiş tarih kur boş ya da NullReference.
Teknik belirtiCheckTable() OBJECT_ID null değilse tablo oluşturmaz; DB1'de ad bir VIEW (tablo NonUsed_TCMBDovizKurlari'na taşınmış). MERGE bir TVF-tabanlı view'a yazamaz → 4406/4405; boş Catch → sessiz. GetUSDCurrency(tarih) view'dan yalnız bugünün kurunu görür → geçmiş tarih için Nothing → Cari.Islem.vb:552 '.Alis' NullReference (uygulama tarafı).
SQL hata no4406 (View or function is not updatable)
SQL hata mesajıConversion failed
EkranProgram.vb:225 açılışta arka plan TCMB kur çekme; Cari.Islem.vb:552 GetUSDCurrency
Kod dosyasıERPPRO/Class/Module/TCMB.vb:67,127; ERPPRO/Class/Module/Program.vb:225
İlgili SQL nesneleriSistem.TCMBDovizKurlari, Sistem.NonUsed_TCMBDovizKurlari, Sistem.GetKurListesi
SQL Object(kod) TCMB.Currency.Save → MERGE Sistem.TCMBDovizKurlari
TabloSistem.TCMBDovizKurlari (DB1'de VIEW: Select … from Sistem.GetKurListesi(getdate()))
Tetikleme koşuluCheckTable() OBJECT_ID null değilse tablo oluşturmaz; DB1'de ad bir VIEW (tablo NonUsed_TCMBDovizKurlari'na taşınmış). MERGE bir TVF-tabanlı view'a yazamaz → 4406/4405; boş Catch → sessiz. GetUSDCurrency(tarih) view'dan yalnız bugünün kurunu görür → geçmiş tarih için Nothing → Cari.Islem.vb:552 '.Alis' NullReference (uygulama tarafı).
Kök nedenmodules.json 'Create View Sistem.TCMBDovizKurlari as Select Tarih,Birim as Kodu,Alis,Satis from Sistem.GetKurListesi(getdate())'; TCMB.vb:67 CheckTable; :127 MERGE; phase6 KUY_ONLY 'Sistem.TCMBDovizKurlari' tablo.
Neden zinciriTeknik olay: SQL 4406 (View or function is not updatable) Conversion failed ↓ Yakın neden: CheckTable() OBJECT_ID null değilse tablo oluşturmaz; DB1'de ad bir VIEW (tablo NonUsed_TCMBDovizKurlari'na taşınmış). M ↓ Kullanıcı etkisi: TCMB kur arşivi güncellenmez (sessiz); döviz seri fatura ekranında geçmiş tarih kur boş ya da NullReference.
Etkilenen veriSistem.TCMBDovizKurlari (DB1'de VIEW: Select … from Sistem.GetKurListesi(getdate()))
Olasılık / etki / güvenYüksek (DB1'de her açılışta) / S3 / 85
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): TCMBDovizKurlari'nın tablo mu view mi olacağı kurulum genelinde tek karar; CheckTable'ın view'ı tablo sanmaması. (Uygulanmadı)
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSQL modül/katalog analizi
Validation SQL (salt okunur)
SELECT type_desc FROM sys.objects WHERE object_id=OBJECT_ID('Sistem.TCMBDovizKurlari'); SELECT COUNT(*) FROM Sistem.NonUsed_TCMBDovizKurlari;
Test senaryosu[Ekip tarafından doldurulacak]
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSQL risk analizi SQLR-058 · DB1=EVET (view) / tablo: Sistem.NonUsed_TCMBDovizKurlari (25.212 satır) DB2=EVET (tablo, 34.644 satır) BASE=EVET (view BASE-CORE); NonUsed_ V2_ONLY · Guard=HAYIR · modules.json 'Create View Sistem.TCMBDovizKurlari as Select Tarih,Birim as Kodu,Alis,Satis from Sistem.GetKurListesi(getdate())'; TCMB.vb:67 CheckTable; :127 MERGE; phase6 KUY_ONLY 'Sistem.TCMBDovizKu
SESSİZ MANTIK / HESAPLAMA ERR-SIL-028SQLR-063 Duplicate key: Sistem.Kurlar (BirimId,Tarih); Sistem.Birimler.Kodu; Cari.Hesaplar (VergiNo,SubeId); Cari.Islemler.FisNo; Cari.BakiyeKodlari.Kodu S2 · MOD-VERİTABANI · Gözlemlendi: HAYIR · PF-005 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE15 — Duplicate / Çift İşlem
SeverityS2 — YÜKSEK
ModülMOD-VERİTABANI
Alt modülDuplicate key
Problem ailesiPF-005 Bilanço tutmuyor / eksi-zarar yazıyor / yanlış gösteriyor (genel bilanço problemi)
Kullanıcı belirtisiHata yok; aynı fiş numarası iki işlem, kur listesinde çift satır, bilanço tutarı iki kat.
Teknik belirtiDB1'de PK dışı benzersiz indeks yalnız 4 (sysdiagrams, KYC.BelgeTurleri.Kod, POS.Esikler, POS.VergiOranlari). İş anahtarları (Kurlar BirimId+Tarih, Birimler.Kodu, FisNo, RefNo) benzersiz değil → çakışma hata vermez, mükerrer satır oluşur. Sonuç: Sistem.GetKurListesi aynı birim için 2 satır → FN.GetKur TOP 1 (ORDER BY yok) rastgele kur; Bilanco/Pozisyon join'lerinde tutar iki kat; AcceptTransaction '(Select Id From Sistem.Birimler Where Kodu=HasSymbol)' → 512.
SQL hata no2627 / 2601 (yok — benzersiz indeks yok → sessiz mükerrer)
SQL hata mesajıDuplicate key
EkranKur giriş (FrmKurGirisEkrani, Sistem.KurKopyala); Birim tanımı; hesap kartı; fiş numarası (Max+1, TD-02)
Kod dosyasıERPPRO/Class/Ext/Cari.IslemEx.vb:256-267; ERPPRO/Form/Genel/FrmKurGirisEkrani.vb:110
İlgili SQL nesneleriSistem.Kurlar, Sistem.Birimler, Cari.Hesaplar, Cari.Islemler, Cari.BakiyeKodlari, KYC.BelgeTurleri, POS.Esikler, POS.VergiOranlari, Sistem.GetKurListesi, FN.GetKur
SQL ObjectSistem.Kurlar (BirimId,Tarih); Sistem.Birimler.Kodu; Cari.Hesaplar (VergiNo,SubeId); Cari.Islemler.FisNo; Cari.BakiyeKodlari.Kodu
TabloSistem.Kurlar; Sistem.Birimler; Cari.Hesaplar; Cari.Islemler
Tetikleme koşuluDB1'de PK dışı benzersiz indeks yalnız 4 (sysdiagrams, KYC.BelgeTurleri.Kod, POS.Esikler, POS.VergiOranlari). İş anahtarları (Kurlar BirimId+Tarih, Birimler.Kodu, FisNo, RefNo) benzersiz değil → çakışma hata vermez, mükerrer satır oluşur. Sonuç: Sistem.GetKurListesi aynı birim için 2 satır → FN.GetKur TOP 1 (ORDER BY yok) rastgele kur; Bilanco/Pozisyon join'lerinde tutar iki kat; AcceptTransaction '(Select Id From Sistem.Birimler Where Kodu=HasSymbol)' → 512.
Kök nedenindexes.json is_unique & not PK: 4 satır; Sistem.Kurlar indeksleri PK_Kurlar(Id), IX_KUR_SORT_TARIH(Tarih)…; FN.GetKur 'Select top 1 Alis … Where BirimId=@BirimId' ORDER BY yok; TD-02.
Neden zinciriTeknik olay: SQL 2627 / 2601 (yok — benzersiz indeks yok → sessiz mükerrer) Duplicate key ↓ Yakın neden: DB1'de PK dışı benzersiz indeks yalnız 4 (sysdiagrams, KYC.BelgeTurleri.Kod, POS.Esikler, POS.VergiOranlari). İş anahtar ↓ Kullanıcı etkisi: Hata yok; aynı fiş numarası iki işlem, kur listesinde çift satır, bilanço tutarı iki kat.
Etkilenen veriSistem.Kurlar; Sistem.Birimler; Cari.Hesaplar; Cari.Islemler
Olasılık / etki / güvenOrta (çok kullanıcılı Max+1 fiş no: yüksek) / S2 (finansal — kur/bakiye çiftlenmesi) / 85
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): İş anahtarlarına benzersiz indeks (Kurlar(BirimId,Tarih), Birimler(Kodu) filtered IsDeleted=0, Hesaplar(SubeId,VergiNo)); fiş no için SEQUENCE. (Uygulanmadı)
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSQL modül/katalog analizi
Validation SQL (salt okunur)
SELECT BirimId,Tarih,COUNT(*) FROM Sistem.Kurlar GROUP BY BirimId,Tarih HAVING COUNT(*)>1; SELECT Kodu,COUNT(*) FROM Sistem.Birimler WHERE IsDeleted=0 GROUP BY Kodu HAVING COUNT(*)>1; SELECT FisNo,COUNT(DISTINCT RefNo) FROM Cari.Islemler WHERE IsDeleted=0 GROUP BY FisNo HAVING COUNT(DISTINCT RefNo)>1;
Test senaryosuDoğrulama SQL'i çalıştır (salt okunur); beklenen: 0 kayıt
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSQL risk analizi SQLR-063 · DB1=EVET DB2=BİLİNMİYOR BASE=EVET · Guard=HAYIR · indexes.json is_unique & not PK: 4 satır; Sistem.Kurlar indeksleri PK_Kurlar(Id), IX_KUR_SORT_TARIH(Tarih)…; FN.GetKur 'Select top 1 Alis … Where BirimId=@BirimId' ORDER BY yok; TD-02.
İlişkili kayıtlarERR-POT-002, ERR-POT-008, ERR-SIL-001, ERR-SIL-002, ERR-SIL-003, ERR-SIL-056, ERR-SIL-059, ERR-SIL-070
Wiki bağlantılarıTD-02
SESSİZ MANTIK / HESAPLAMA ERR-SIL-029SQLR-066 Identity: Sistem.SirketOlustur; Sistem.Users Id=1 varsayımı S3 · MOD-VERİTABANI · Gözlemlendi: HAYIR · PF-008 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE03 — Veri Bütünlüğü Hatası
SeverityS3 — ORTA
ModülMOD-VERİTABANI
Alt modülIdentity
Problem ailesiPF-008 ERP kurulumu (yeni kurulum, sıfır kurulum, kurulum sonrası destek)
Kullanıcı belirtisiYeni şirket kurulumunda ADMIN ile giriş yapılamaz / şube-kasa ataması yok.
Teknik belirtiSirketOlustur tüm tabloları TRUNCATE edip ADMIN kullanıcısını ekler ve UserDetails'e UserId=1 yazar; Users kimliği TRUNCATE ile sıfırlandığı için 1 olur — ancak Users tablosu Design/AifaDev dışı olduğu için truncate kapsamında; tohum değiştirilmişse (DBCC CHECKIDENT) ADMIN Id≠1 → UserDetails öksüz, giriş yapılamaz. Kodda Id=1 admin varsayımı.
SQL hata no(sessiz)
SQL hata mesajıIdentity
EkranFrmMainForm.vb:706 (User.Id=1 gizli kısayol); SirketOlustur 'INSERT INTO Sistem.UserDetails(UserId…) Values(1,1,1,1,0)'
Kod dosyasıERPPRO/Form/Genel/FrmMainForm.vb:706
İlgili SQL nesneleriSistem.SirketOlustur, Sistem.Users, Sistem.UserDetails
SQL ObjectSistem.SirketOlustur; Sistem.Users Id=1 varsayımı
TabloSistem.Users; Sistem.UserDetails
KolonId / UserId
Tetikleme koşuluSirketOlustur tüm tabloları TRUNCATE edip ADMIN kullanıcısını ekler ve UserDetails'e UserId=1 yazar; Users kimliği TRUNCATE ile sıfırlandığı için 1 olur — ancak Users tablosu Design/AifaDev dışı olduğu için truncate kapsamında; tohum değiştirilmişse (DBCC CHECKIDENT) ADMIN Id≠1 → UserDetails öksüz, giriş yapılamaz. Kodda Id=1 admin varsayımı.
Kök nedenmodules.json Sistem.SirketOlustur; FrmMainForm.vb:706 'If LoginInformation.User.Id = 1 AndAlso e.Shift…'.
Neden zinciriTeknik olay: SQL (sessiz) Identity ↓ Yakın neden: SirketOlustur tüm tabloları TRUNCATE edip ADMIN kullanıcısını ekler ve UserDetails'e UserId=1 yazar; Users kimliği TRUNC ↓ Kullanıcı etkisi: Yeni şirket kurulumunda ADMIN ile giriş yapılamaz / şube-kasa ataması yok.
Etkilenen veriSistem.Users; Sistem.UserDetails
Olasılık / etki / güvenDüşük / S3 / 70
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): SCOPE_IDENTITY ile UserDetails eklenmesi; Id=1 varsayımının role dayalı yetkiyle değiştirilmesi. (Uygulanmadı)
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSQL modül/katalog analizi
Validation SQL (salt okunur)
SELECT Id,UserName FROM Sistem.Users WHERE Id=1; SELECT * FROM Sistem.UserDetails WHERE UserId NOT IN (SELECT Id FROM Sistem.Users);
Test senaryosu[Ekip tarafından doldurulacak]
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSQL risk analizi SQLR-066 · DB1=EVET DB2=BİLİNMİYOR BASE=SirketOlustur UNKNOWN · Guard=HAYIR · modules.json Sistem.SirketOlustur; FrmMainForm.vb:706 'If LoginInformation.User.Id = 1 AndAlso e.Shift…'.
SESSİZ MANTIK / HESAPLAMA ERR-SIL-030SQLR-070 Subquery returned more than 1 value: Cari.UpdateTransaction; Siparis.Kontrol; MüşteriŞemasıA tetikleyicisi S3 · MOD-VERİTABANI · Gözlemlendi: HAYIR · PF-007 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE02 — SQL Server Hatası
SeverityS3 — ORTA
ModülMOD-VERİTABANI
Alt modülSubquery returned more than 1 value
Problem ailesiPF-007 Fatura kesilemiyor / fatura basma / fatura problemi (genel)
Kullanıcı belirtisiHata yok; iptal edilen fişin bazı satırlarının belge detayı (fatura no/ETTN) silinmez, raporlarda görünür.
Teknik belirtiUpdateTransaction 'Select @IsDeleted=I.IsDeleted, @IslemId=D.IslemId, @Ettn=D.ETTN from inserted I Left Join Cari.IslemDetaylari D' → çok satırlı iptalde yalnız SON satırın IslemDetaylari'ı silinir/EIPTAL yapılır; diğer satırların belge detayı kalır (sessiz). Siparis.Kontrol aynı kalıp.
SQL hata no(sessiz — tek satır varsayımı)
SQL hata mesajıSubquery returned more than 1 value
EkranFiş iptali: iScreen.vb:723 'Update Cari.Islemler Set IsDeleted=''True'' Where FisNo=… and KasaId=…' (çok satır); Cari.Islem.vb:1058 'Where RefNo=… And IslemKodu=…'
Kod dosyasıERPPRO/Controls/Islem Ekranı/Base Control/iScreen.vb:723; ERPPRO/Class/Dao/Islem/Cari.Islem.vb:1058
İlgili SQL nesneleriCari.UpdateTransaction, Siparis.Kontrol, Cari.Islemler, Cari.IslemDetaylari, Siparis.Siparisler
SQL ObjectCari.UpdateTransaction; Siparis.Kontrol; MüşteriŞemasıA tetikleyicisi
TabloCari.IslemlerCari.IslemDetaylari; Siparis.Siparisler
KolonIsDeleted, ETTN, IslemId
Tetikleme koşuluUpdateTransaction 'Select @IsDeleted=I.IsDeleted, @IslemId=D.IslemId, @Ettn=D.ETTN from inserted I Left Join Cari.IslemDetaylari D' → çok satırlı iptalde yalnız SON satırın IslemDetaylari'ı silinir/EIPTAL yapılır; diğer satırların belge detayı kalır (sessiz). Siparis.Kontrol aynı kalıp.
Kök nedenmodules.json Cari.UpdateTransaction metni; sql_frags çok satırlı UPDATE'ler.
Neden zinciriTeknik olay: SQL (sessiz — tek satır varsayımı) Subquery returned more than 1 value ↓ Yakın neden: UpdateTransaction 'Select @IsDeleted=I.IsDeleted, @IslemId=D.IslemId, @Ettn=D.ETTN from inserted I Left Join Cari.IslemD ↓ Kullanıcı etkisi: Hata yok; iptal edilen fişin bazı satırlarının belge detayı (fatura no/ETTN) silinmez, raporlarda görünür.
Etkilenen veriCari.IslemlerCari.IslemDetaylari; Siparis.Siparisler
Olasılık / etki / güvenYüksek (fiş iptali çok satırlı) / S3 / 85
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): Set-tabanlı DELETE/UPDATE (inserted JOIN). (Uygulanmadı)
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSQL modül/katalog analizi
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.IslemDetaylari D JOIN Cari.Islemler I ON I.Id=D.IslemId WHERE I.IsDeleted=1 AND ISNULL(D.ETTN,'')='' ;
Test senaryosu[Ekip tarafından doldurulacak]
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSQL risk analizi SQLR-070 · DB1=EVET DB2=BİLİNMİYOR BASE=EVET · Guard=HAYIR · modules.json Cari.UpdateTransaction metni; sql_frags çok satırlı UPDATE'ler.
İlişkili kayıtlarERR-POT-069
SESSİZ MANTIK / HESAPLAMA ERR-SIL-031SQLR-080 Legacy: Pozisyon.GetOldPozisyon; Sistem.NonUsed_TCMBDovizKurlari; Genel.Dosyalar_; Genel.Experler_; Sistem.AyarEvi_ (DB2); LiveUpdate.VersionHistory_; dbo.Temp; dbo.test; Muhasebe.TEst; FN.GetCariLimitOld; FN.GetKurOldKur; FX.StartSyncOld; Report.BakiyeArtisRaporuOld S3 · MOD-VERİTABANI · Gözlemlendi: HAYIR · PF-004 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE17 — Eski Veri / Legacy Problemi
SeverityS3 — ORTA
ModülMOD-VERİTABANI
Alt modülLegacy
Problem ailesiPF-004 Rapor tasarımı / yeni rapor / sütun ekleme / bakiye ekstresi düzenleme (talep)
Kullanıcı belirtisiTemizlik sonrası Pozisyon ekranı/raporunda 'Invalid object name Pozisyon.GetOldPozisyon'.
Teknik belirti'Old' adlı fonksiyon canlı ekran ve rapor tarafından kullanılıyor (BASE-CORE olarak işaretli) — ad yanıltıcı, temizlikte silinirse 208. NonUsed_TCMBDovizKurlari (25.212 satır) hiçbir modül/kod tarafından okunmuyor (TCMB.vb view'ı hedefliyor). Dosyalar_/Experler_ tabloları 0 satır, view'lar tarafından değil kod tarafından da referans edilmiyor. dbo.Temp/test/Muhasebe.TEst referans yok.
SQL hata mesajıLegacy
EkranFrmPozisyon.vb:8 (ANA MENÜ) → Pozisyon.GetOldPozisyon; AifaDev.Reports #18 'Pozisyon Raporu' → GetOldPozisyon; Pozisyon.GetHacimRaporu → GetOldPozisyon
Kod dosyasıERPPRO/Form/RefreshGrid/FrmPozisyon.vb:8
İlgili SQL nesneleriPozisyon.GetOldPozisyon, Sistem.NonUsed_TCMBDovizKurlari, Genel.Dosyalar_, Genel.Experler_, dbo.Temp, dbo.test, Muhasebe.TEst, FN.GetCariLimitOld, FN.GetKurOldKur, FX.StartSyncOld, Report.BakiyeArtisRaporuOld
SQL ObjectPozisyon.GetOldPozisyon; Sistem.NonUsed_TCMBDovizKurlari; Genel.Dosyalar_; Genel.Experler_; Sistem.AyarEvi_ (DB2); LiveUpdate.VersionHistory_; dbo.Temp; dbo.test; Muhasebe.TEst; FN.GetCariLimitOld; FN.GetKurOldKur; FX.StartSyncOld; Report.BakiyeArtisRaporuOld
Tetikleme koşulu'Old' adlı fonksiyon canlı ekran ve rapor tarafından kullanılıyor (BASE-CORE olarak işaretli) — ad yanıltıcı, temizlikte silinirse 208. NonUsed_TCMBDovizKurlari (25.212 satır) hiçbir modül/kod tarafından okunmuyor (TCMB.vb view'ı hedefliyor). Dosyalar_/Experler_ tabloları 0 satır, view'lar tarafından değil kod tarafından da referans edilmiyor. dbo.Temp/test/Muhasebe.TEst referans yok.
Kök nedenLegacy referans taraması: code FrmPozisyon.vb:8, dbsql AifaDev.Reports#18, modül Pozisyon.GetHacimRaporu; analysis.json LEGACY 25 nesne.
Neden zinciriTeknik olay: SQL Legacy ↓ Yakın neden: 'Old' adlı fonksiyon canlı ekran ve rapor tarafından kullanılıyor (BASE-CORE olarak işaretli) — ad yanıltıcı, temizlikte ↓ Kullanıcı etkisi: Temizlik sonrası Pozisyon ekranı/raporunda 'Invalid object name Pozisyon.GetOldPozisyon'.
Olasılık / etki / güvenDüşük / S3 / 85
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözümÖneri (uygulanmadı): GetOldPozisyon'un LEGACY listesine alınmaması (kullanımda); NonUsed_/_ son ekli nesnelerin EXCLUDE_LEGACY olarak kalması. (Uygulanmadı)
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSQL modül/katalog analizi
Validation SQL (salt okunur)
SELECT OBJECT_ID('Pozisyon.GetOldPozisyon'); SELECT COUNT(*) FROM Sistem.NonUsed_TCMBDovizKurlari;
Test senaryosu[Ekip tarafından doldurulacak]
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSQL risk analizi SQLR-080 · DB1=EVET DB2=Sistem.AyarEvi_/TCMBDovizKurlari tablo (KUY_ONLY); NonUsed_ HAYIR BASE=GetOldPozisyon EVET (BASE-CORE); diğerleri HAYIR (LEGACY 25) · Guard=— · Legacy referans taraması: code FrmPozisyon.vb:8, dbsql AifaDev.Reports#18, modül Pozisyon.GetHacimRaporu; analysis.json LEGACY 25 nesne.
İlişkili kayıtlarERR-POT-101, ERR-POT-102, ERR-POT-138, ERR-POT-139
SESSİZ MANTIK / HESAPLAMA ERR-SIL-032 — SLR-001 Bakiye satırı hassasiyeti: Has (5 hane) → Cari.BakiyeIslem.Bakiye decimal(18,2) S3 · MOD-CARI · Gözlemlendi: EVET · PF-030 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-015 (miktar hassasiyeti), H-110/H-125 teması (bakiye küsuratı) – doğrudan ticket yok) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-030 Cari bakiye / ekstre tutmuyor (bakiye yanlış, ters, birden değişti)
Kullanıcı belirtisiMüşteri has bakiyesi ile stok has toplamı (bilanço BAKIYE vs STOK kalemi) arasında açıklanamayan gram farkı; mutabakatta 'küsurat tutmuyor' şikâyeti
Teknik belirtiTrigger has'ı 5 haneli hesaplar ancak BakiyeIslem.Bakiye 2 haneli olduğu için her satır ±0,005 has yuvarlanır. Aynı işlem için Stok.StokHaraketleri.Has 5 haneli yazılır; cari has toplamı ile stok has toplamı aynı hareket kümesinde farklılaşır. Binlerce satırda birikimli fark oluşur, hiçbir hata üretmez.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 73, 348-349; kb_src/db/columns.json Cari.BakiyeIslem.Bakiye decimal(18,2); Stok.StokHaraketleri.Has decimal(18,5)
İlgili SQL nesneleriStok.StokHaraketleri, Cari.Islemler, Cari.BakiyeIslem
Tetikleme koşuluMiktar × AuMilyem üçüncü ondalıkta 5 ve üzeri (ör. 12,34 g × 0,916 = 11,30344 → 11,30); yüksek hacimli hesaplar
Kök nedenTrigger has'ı 5 haneli hesaplar ancak BakiyeIslem.Bakiye 2 haneli olduğu için her satır ±0,005 has yuvarlanır. Aynı işlem için Stok.StokHaraketleri.Has 5 haneli yazılır; cari has toplamı ile stok has toplamı aynı hareket kümesinde farklılaşır. Binlerce satırda birikimli fark oluşur, hiçbir hata üretmez.
Neden zinciriBelirti: Müşteri has bakiyesi ile stok has toplamı (bilanço BAKIYE vs STOK kalemi) arasında açıklanamayan gra ↓ Teknik olay: @Has = I.Miktar * Case When AuMilyem=0 Then 1 else AuMilyem end → Insert Into Cari.BakiyeIslem(...,Bakiye) Values(..., ↓ Yakın neden: Miktar × AuMilyem üçüncü ondalıkta 5 ve üzeri (ör. 12,34 g × 0,916 = 11,30344 → 11,30); yüksek hacim ↓ Kök neden: Trigger has'ı 5 haneli hesaplar ancak BakiyeIslem.Bakiye 2 haneli olduğu için her satır ±0,005 has yuvarlanır. Aynı işlem için Stok.StokHara ↓ Etkilenen veri: Bir işlemin has bakiye satırı, |Miktar × AuMilyem| değerine 2 hane yuvarlama toleransı içinde eşit o
Etkilenen veriBir işlemin has bakiye satırı, |Miktar × AuMilyem| değerine 2 hane yuvarlama toleransı içinde eşit olmalıdır.
Etkilenen iş süreciBakiye satırı hassasiyeti: Has (5 hane) → Cari.BakiyeIslem.Bakiye decimal(18,2)
Olasılık / etki / güvenÇOK YÜKSEK / S3 / 92
Bilinen ticketCTR-015 (miktar hassasiyeti), H-110/H-125 teması (bakiye küsuratı) – doğrudan ticket yok
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT I.Id, I.Miktar*I.AuMilyem AS HasHesap, B.Bakiye FROM Cari.Islemler I JOIN Cari.BakiyeIslem B ON B.IslemId=I.Id AND B.BirimId=I.BakiyeId WHERE I.IsDeleted=0 AND I.IslemKodu IN (1,2,9) AND ABS(ABS(B.Bakiye)-ABS(I.Miktar*I.AuMilyem))>0.004; toplam sapma: SELECT SUM(ABS(B.Bakiye)-ABS(I.Miktar*I.AuMilyem)) ...
Validation SQL (salt okunur)
SELECT I.Id, I.Miktar*I.AuMilyem AS HasHesap, B.Bakiye FROM Cari.Islemler I JOIN Cari.BakiyeIslem B ON B.IslemId=I.Id AND B.BirimId=I.BakiyeId WHERE I.IsDeleted=0 AND I.IslemKodu IN (1,2,9) AND ABS(ABS(B.Bakiye)-ABS(I.Miktar*I.AuMilyem))>0.004; toplam sapma: SELECT SUM(ABS(B.Bakiye)-ABS(I.Miktar*I.AuMilyem)) ...
Test senaryosuGirdi: Cari.Islemler.Miktar decimal(18,2), AuMilyem decimal(18,5); trigger @Has Decimal(18,5) · Formül: @Has = I.Miktar * Case When AuMilyem=0 Then 1 else AuMilyem end → Insert Into Cari.BakiyeIslem(...,Bakiye) Values(...,@Has) [Bakiye decimal(18,2)] · Sınır: Miktar × AuMilyem üçüncü ondalıkta 5 ve üzeri (ör. 12,34 g × 0,916 = 11,30344 → 11,30); yüksek hacimli hesaplar
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: @Has = I.Miktar * Case When AuMilyem=0 Then 1 else AuMilyem end → Insert Into Cari.BakiyeIslem(...,Bakiye) Values(...,@Has) [Bakiye decimal(18,2)] · Kanıt: Declare @Has as Decimal(18,5) (satır 23) … Values(@InsertDate,…,@BakiyeId,@Has) (satır 349); columns.json: Cari.BakiyeIslem.Bakiye decimal 18,2; Stok.StokHaraketleri.Has decimal 18,5
Wiki bağlantılarıH-110 · H-125
SESSİZ MANTIK / HESAPLAMA ERR-SIL-033 — SLR-002 Trigger içinde ROLLBACK sonrası RETURN olmayan dallar (evrak eksik, şube/kasa/hesap=0, takoz stok kontrolü) S2 · MOD-CARI · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: GAP-DB-07 (ROLLBACK sonrası RETURN yok), PRB-BAKIYE-000 / H-104-H-106 teması) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiCari.Islemler'de IsDeleted=0 kalan işlemin BakiyeIslem satırları silinmiş (bakiye eksik) ya da IsDeleted=1 olması gereken işlem aktif kalırken türetilmiş kayıtları silinmiş; takoz kartı yanlışlıkla silinmiş
Teknik belirtiROLLBACK sonrası trigger yürütmeye devam eder ve sonraki DML'ler autocommit ile kalıcı olur (SQL Server davranışı). Aynı satır için @IsError=1 olduğundan BakiyeIslem'e dokunulmaz; ancak Inserted çok satırlıysa sonraki satırlarda @IsError sıfırlanır: bu satırların BakiyeIslem/StokHaraketleri kayıtları silinip Inserted (yeni) değerlerle yeniden yazılır, oysa Cari.Islemler güncellemesi geri alınmıştır. Ayrıca satır 235 'Update Stok.Takoz Set IsDeleted=True' ve Activity MERGE geri alınmış işlem için kalıcı olur.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 90, 109-123, 180-185, 225-247, 256-260
İlgili SQL nesneleriCari.Islemler, Stok.Takoz, Cari.BakiyeIslem
Tetikleme koşuluTek UPDATE ile birden çok Cari.Islemler satırı değişirken satırlardan birinin hesabında zorunlu evrak eksik/şube pasif/takoz stokta yok olması (virman/parite çift bacağının RefNo ile iptali, İptal-FişNo, hesap birleştirme)
Kök nedenROLLBACK sonrası trigger yürütmeye devam eder ve sonraki DML'ler autocommit ile kalıcı olur (SQL Server davranışı). Aynı satır için @IsError=1 olduğundan BakiyeIslem'e dokunulmaz; ancak Inserted çok satırlıysa sonraki satırlarda @IsError sıfırlanır: bu satırların BakiyeIslem/StokHaraketleri kayıtları silinip Inserted (yeni) değerlerle yeniden yazılır, oysa Cari.Islemler güncellemesi geri alınmıştır. Ayrıca satır 235 'Update Stok.Takoz Set IsDeleted=True' ve Activity MERGE geri alınmış işlem için kalıcı olur.
Neden zinciriBelirti: Cari.Islemler'de IsDeleted=0 kalan işlemin BakiyeIslem satırları silinmiş (bakiye eksik) ya da IsDel ↓ Teknik olay: RAISERROR(...) ; Set @IsError=1 ; ROLLBACK -- RETURN yok (satır 119-123, 180-185, 225-247); döngü başında Set @IsError ↓ Yakın neden: Tek UPDATE ile birden çok Cari.Islemler satırı değişirken satırlardan birinin hesabında zorunlu evra ↓ Kök neden: ROLLBACK sonrası trigger yürütmeye devam eder ve sonraki DML'ler autocommit ile kalıcı olur (SQL Server davranışı). Aynı satır için @IsError ↓ Etkilenen veri: Aktif (IsDeleted=0, tip ∉{1,11,12}) ve tutar/has üreten her işlemin en az bir BakiyeIslem satırı olm
Etkilenen veriAktif (IsDeleted=0, tip ∉{1,11,12}) ve tutar/has üreten her işlemin en az bir BakiyeIslem satırı olmalı; silinmiş işlemin hiç olmamalı.
Etkilenen iş süreciTrigger içinde ROLLBACK sonrası RETURN olmayan dallar (evrak eksik, şube/kasa/hesap=0, takoz stok kontrolü)
Olasılık / etki / güvenORTA / S2 / 70
Bilinen ticketGAP-DB-07 (ROLLBACK sonrası RETURN yok), PRB-BAKIYE-000 / H-104-H-106 teması
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT I.Id FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTipi NOT IN (1,11,12) AND I.IslemKodu IN (1,2,9,4,5,6) AND (I.Tutar<>0 OR (I.BakiyeId>0 AND I.Miktar<>0)) AND NOT EXISTS (SELECT 1 FROM Cari.BakiyeIslem B WHERE B.IslemId=I.Id); ayrıca sys.triggers sırasını ve SQL error log 3609 kayıtlarını inceleyin
Validation SQL (salt okunur)
SELECT I.Id FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTipi NOT IN (1,11,12) AND I.IslemKodu IN (1,2,9,4,5,6) AND (I.Tutar<>0 OR (I.BakiyeId>0 AND I.Miktar<>0)) AND NOT EXISTS (SELECT 1 FROM Cari.BakiyeIslem B WHERE B.IslemId=I.Id); ayrıca sys.triggers sırasını ve SQL error log 3609 kayıtlarını inceleyin
Test senaryosuGirdi: Inserted (çok satırlı UPDATE: DeleteAt RefNo, İptal FişNo, FrmHesapTemizle, FrmProvizyonKabul), Cari.GetGerekliEvraklar, Stok.GetTakozAdet · Formül: RAISERROR(...) ; Set @IsError=1 ; ROLLBACK -- RETURN yok (satır 119-123, 180-185, 225-247); döngü başında Set @IsError=0 (satır 90) · Sınır: Tek UPDATE ile birden çok Cari.Islemler satırı değişirken satırlardan birinin hesabında zorunlu evrak eksik/şube pasif/t
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
NotlarÇözüm adayı: kod kanıtı: her ROLLBACK'ten sonra RETURN eklenmesi gerektiği kitapçık 2.7'de not edilmiş; uygulanmamış
KaynakSessiz risk analizi · Formül: RAISERROR(...) ; Set @IsError=1 ; ROLLBACK -- RETURN yok (satır 119-123, 180-185, 225-247); döngü başında Set @IsError=0 (satır 90) · Kanıt: satır 119-123: RAISERROR('BU HESABIN ZORUNLU EVRAKLARI EKSIKTIR…') … Set @IsError=1 … ROLLBACK (RETURN yok); satır 92-98'deki şube pasif dalında ise RETURN var — tutarsızlık
İlişkili kayıtlarERR-POT-003, ERR-POT-004, ERR-POT-134
Wiki bağlantılarıPRB-BAKIYE-000 · H-104 · H-106
SESSİZ MANTIK / HESAPLAMA ERR-SIL-034 — SLR-003 Limit kontrolü için toplam bakiye (Cari.ToplamBakiye = bugünkü BakiyeIslem + Cari.BakiyeDun) S2 · MOD-CARI · Gözlemlendi: EVET · PF-030 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: GAP-DB-03 (Cari.BakiyeDun boş), CTR-014 (limit kapsamı)) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-030 Cari bakiye / ekstre tutmuyor (bakiye yanlış, ters, birden değişti)
Kullanıcı belirtisiLimit aşan müşteriye satış/çıkış işlemi sessizce kabul edilir ('limit çalışmıyor'); tersine job gün içinde tekrar çalışırsa bugünkü hareketler iki kez sayılıp işlem haksız reddedilir
Teknik belirtiDünkü ve önceki bakiyeler yalnız Cari.BakiyeDun tablosundan gelir; bu tabloyu dolduran prosedürü çağıran bir job kaynakta yok ve örnek DB'de tablo 0 satır. Boşsa kalan limit = Limit + (yalnız bugünkü hareketler) + 3 olur; müşterinin birikmiş borcu yok sayılır. BakiyeIslem.Tarih işlem tarihi olduğundan geçmiş tarihle girilen bugünkü işlemler de ne 'bugün' dilimine ne BakiyeDun'a girer.
Kod dosyasıCari.ToplamBakiye, FN.GetCariLimit, Bakiye.DunkiBakiyeler (modules.json); Cari.Islem.vb:520-528
İlgili SQL nesneleriCari.ToplamBakiye, FN.GetCariLimit, Bakiye.DunkiBakiyeler, Cari.BakiyeDun, Cari.BakiyeIslem, Cari.HesapBilgileri
SQL ObjectCari.ToplamBakiye, FN.GetCariLimit, Bakiye.DunkiBakiyeler (modules.json); Cari.Islem.vb:520-528
Tetikleme koşuluCari.BakiyeDun boş/eski (job çalışmamış); işlem tarihi ≠ bugün; kur listesi HAS satırı 0
Kök nedenDünkü ve önceki bakiyeler yalnız Cari.BakiyeDun tablosundan gelir; bu tabloyu dolduran prosedürü çağıran bir job kaynakta yok ve örnek DB'de tablo 0 satır. Boşsa kalan limit = Limit + (yalnız bugünkü hareketler) + 3 olur; müşterinin birikmiş borcu yok sayılır. BakiyeIslem.Tarih işlem tarihi olduğundan geçmiş tarihle girilen bugünkü işlemler de ne 'bugün' dilimine ne BakiyeDun'a girer.
Neden zinciriBelirti: Limit aşan müşteriye satış/çıkış işlemi sessizce kabul edilir ('limit çalışmıyor'); tersine job gün ↓ Teknik olay: Cari.ToplamBakiye = Σ_bugün( Convert(dec(18,2), Bol(Bakiye*Carpan*Kur.Alis, KurHAS.Alis)) )*-1 + Σ Cari.BakiyeDun.Bakiye ↓ Yakın neden: Cari.BakiyeDun boş/eski (job çalışmamış); işlem tarihi ≠ bugün; kur listesi HAS satırı 0 ↓ Kök neden: Dünkü ve önceki bakiyeler yalnız Cari.BakiyeDun tablosundan gelir; bu tabloyu dolduran prosedürü çağıran bir job kaynakta yok ve örnek DB'de ↓ Etkilenen veri: Cari.BakiyeDun.Tarih = dün ve limit tanımlı her hesap için satır bulunmalı; ToplamBakiye tüm BakiyeI
Etkilenen veriCari.BakiyeDun.Tarih = dün ve limit tanımlı her hesap için satır bulunmalı; ToplamBakiye tüm BakiyeIslem toplamına eşit olmalı.
Etkilenen iş süreciLimit kontrolü için toplam bakiye (Cari.ToplamBakiye = bugünkü BakiyeIslem + Cari.BakiyeDun)
Olasılık / etki / güvenYÜKSEK / S2 / 85
Bilinen ticketGAP-DB-03 (Cari.BakiyeDun boş), CTR-014 (limit kapsamı)
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*), MAX(Tarih) FROM Cari.BakiyeDun; karşılaştırma: SELECT H.Id, FN.GetCariLimit(H.Id) AS KalanLimit, H.Limit + (-1)*(SELECT SUM(B.Bakiye*Brm.Carpan*K.Alis/KH.Alis) FROM Cari.BakiyeIslem B …) FROM Cari.HesapBilgileri H WHERE H.Limit<>0
Validation SQL (salt okunur)
SELECT COUNT(*), MAX(Tarih) FROM Cari.BakiyeDun; karşılaştırma: SELECT H.Id, FN.GetCariLimit(H.Id) AS KalanLimit, H.Limit + (-1)*(SELECT SUM(B.Bakiye*Brm.Carpan*K.Alis/KH.Alis) FROM Cari.BakiyeIslem B …) FROM Cari.HesapBilgileri H WHERE H.Limit<>0
Test senaryosuGirdi: Cari.BakiyeIslem (Tarih = işlem tarihi), Cari.BakiyeDun (Bakiye.DunkiBakiyeler prosedürüyle dolar), Sistem.GetKurListesi(Getdate()) · Formül: Cari.ToplamBakiye = Σ_bugün( Convert(dec(18,2), Bol(Bakiye*Carpan*Kur.Alis, KurHAS.Alis)) )*-1 + Σ Cari.BakiyeDun.Bakiye ; FN.GetCariLimit = IsNull(H · Sınır: Cari.BakiyeDun boş/eski (job çalışmamış); işlem tarihi ≠ bugün; kur listesi HAS satırı 0
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Cari.ToplamBakiye = Σ_bugün( Convert(dec(18,2), Bol(Bakiye*Carpan*Kur.Alis, KurHAS.Alis)) )*-1 + Σ Cari.BakiyeDun.Bakiye ; FN.GetCariLimit = IsNull(H.Limit,0)+IsNull(ToplamBakiye,0)+3 · Kanıt: Cari.ToplamBakiye: 'Where Convert(date,Tarih)=CONVERT(date,getdate()) … UNION ALL Select Bakiye from Cari.BakiyeDun'; tables.json: Cari.BakiyeDun rows=0
SESSİZ MANTIK / HESAPLAMA ERR-SIL-035 — SLR-004 Limit kontrolü has karşılığı (Satis ÷ HAS kuru) S2 · MOD-CARI · Gözlemlendi: EVET · PF-030 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-014, BR-BAKIYE-016) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-030 Cari bakiye / ekstre tutmuyor (bakiye yanlış, ters, birden değişti)
Kullanıcı belirtisiLimit aşımı sessizce kabul edilir ya da (sembol farkında) her işlem reddedilir
Teknik belirtiDivide uzantısı bölen 0 ise 0 döndürür: HAS kuru 0/eksikse Balance=0 ve kontrol daima geçer. GetKur birim listede yoksa 1 döner: HasSymbol 'HAS' dışında tanımlıysa (kod sabit 'HAS' kullanıyor) Balance = Satis (TL) olur ve HAS cinsinden limitle kıyaslanır. Kontrol yalnız IslemKodu 1,2,3 ÇIKIŞ ve tip≠PEŞİN'de çalışır; takoz/vadeli/çevir çıkışları hiç kontrol edilmez; +3 has tolerans sabittir.
Kod dosyasıClass/Dao/Islem/Cari.Islem.vb:520-528; Class/Module/Program.vb:260-268; Class/Module/Extention.vb:428-435
İlgili SQL nesneleriSistem.Settings, Cari.Islemler, Sistem.GetKurListesi
Tetikleme koşuluKur listesinde HAS 0 veya yok; Settings.HasSymbol ≠ 'HAS'; IslemKodu ∉ {1,2,3}
Kök nedenDivide uzantısı bölen 0 ise 0 döndürür: HAS kuru 0/eksikse Balance=0 ve kontrol daima geçer. GetKur birim listede yoksa 1 döner: HasSymbol 'HAS' dışında tanımlıysa (kod sabit 'HAS' kullanıyor) Balance = Satis (TL) olur ve HAS cinsinden limitle kıyaslanır. Kontrol yalnız IslemKodu 1,2,3 ÇIKIŞ ve tip≠PEŞİN'de çalışır; takoz/vadeli/çevir çıkışları hiç kontrol edilmez; +3 has tolerans sabittir.
Neden zinciriBelirti: Limit aşımı sessizce kabul edilir ya da (sembol farkında) her işlem reddedilir ↓ Teknik olay: Balance = Satis.Divide(Program.GetKur("HAS")) ; AvaibleLimit = Val(FN.GetCariLimit(HesapId)) ; If Balance > AvaibleLimit ↓ Yakın neden: Kur listesinde HAS 0 veya yok; Settings.HasSymbol ≠ 'HAS'; IslemKodu ∉ {1,2,3} ↓ Kök neden: Divide uzantısı bölen 0 ise 0 döndürür: HAS kuru 0/eksikse Balance=0 ve kontrol daima geçer. GetKur birim listede yoksa 1 döner: HasSymbol ' ↓ Etkilenen veri: Aktif işlemde HasKur > 1 ve HasKur ≠ 0 olmalı (has kuru fotoğrafı anlamlı).
Etkilenen veriAktif işlemde HasKur > 1 ve HasKur ≠ 0 olmalı (has kuru fotoğrafı anlamlı).
Etkilenen iş süreciLimit kontrolü has karşılığı (Satis ÷ HAS kuru)
Olasılık / etki / güvenORTA / S2 / 85
Bilinen ticketCTR-014, BR-BAKIYE-016
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT HasSymbol FROM Sistem.Settings; SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE Birim='HAS' OR Alis=0 OR Alis IS NULL; limit tanımlı hesaplarda çıkış işlemleri: SELECT I.Id,I.Satis,I.HasKur FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTuru=1 AND I.IslemTipi<>1 AND I.HasKur IN (0,1)
Validation SQL (salt okunur)
SELECT HasSymbol FROM Sistem.Settings; SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE Birim='HAS' OR Alis=0 OR Alis IS NULL; limit tanımlı hesaplarda çıkış işlemleri: SELECT I.Id,I.Satis,I.HasKur FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTuru=1 AND I.IslemTipi<>1 AND I.HasKur IN (0,1)
Test senaryosuGirdi: Islem.Satis (MaliyetHesapla, Double), Program.GetKur("HAS") (bellek kur listesi Alis), FN.GetCariLimit · Formül: Balance = Satis.Divide(Program.GetKur("HAS")) ; AvaibleLimit = Val(FN.GetCariLimit(HesapId)) ; If Balance > AvaibleLimit Then red · Sınır: Kur listesinde HAS 0 veya yok; Settings.HasSymbol ≠ 'HAS'; IslemKodu ∉ {1,2,3}
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Balance = Satis.Divide(Program.GetKur("HAS")) ; AvaibleLimit = Val(FN.GetCariLimit(HesapId)) ; If Balance > AvaibleLimit Then red · Kanıt: Cari.Islem.vb:521 'Dim Balance As Double = Satis.Divide(Program.GetKur("HAS"))'; Program.vb:264-265 'Else Return 1'
İlişkili kayıtlarERR-SIL-036, ERR-SIL-057, ERR-SIL-058
Wiki bağlantılarıBR-BAKIYE-016
SESSİZ MANTIK / HESAPLAMA ERR-SIL-036 — SLR-005 Kur fotoğrafı (HasKur/GumKur/PltKur/PldKur/EurKur) kaydı S2 · MOD-CARI · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Kullanıcı belirtisiİşlem satırında HasKur=1; takoz/rapor kâr-zarar ve 'işlem günü kur' raporları anlamsız
Teknik belirtiSembol kur listesinde yoksa 1 yazılır; takoz bakiyesinde 'Altına Çevir' Fn.Bol((Miktar*AgMilyem)*GumKur, HasKur) HasKur=1 ile has bakiyeyi TL değerine eşitler. Liste yenileme hatası sessizce yutulur (boş Catch) ve eski kur kullanılmaya devam eder; hesaplanan (IsComputed) birimler için GetLastKur yedeği yoktur (aşağıdaki kayda bakınız).
Kod dosyasıClass/Dao/Islem/Cari.Islem.vb:607-612; Class/Module/Program.vb:260-268; Class/Dao/Sistem.KurListesi.vb:60-120
İlgili SQL nesneleriCari.Islemler, Sistem.Settings, Sistem.Birimler, FN.Bol
Tetikleme koşuluSettings sembolü Birimler'de yok/silinmiş; kur listesi yenileme başarısız; kur tarihi bugün için girilmemiş
Kök nedenSembol kur listesinde yoksa 1 yazılır; takoz bakiyesinde 'Altına Çevir' Fn.Bol((Miktar*AgMilyem)*GumKur, HasKur) HasKur=1 ile has bakiyeyi TL değerine eşitler. Liste yenileme hatası sessizce yutulur (boş Catch) ve eski kur kullanılmaya devam eder; hesaplanan (IsComputed) birimler için GetLastKur yedeği yoktur (aşağıdaki kayda bakınız).
Neden zinciriBelirti: İşlem satırında HasKur=1; takoz/rapor kâr-zarar ve 'işlem günü kur' raporları anlamsız ↓ Teknik olay: @HasKur = Program.GetKur(GlobalSettings.HasSymbol) → K.Alis ; birim bulunamazsa 1 ↓ Yakın neden: Settings sembolü Birimler'de yok/silinmiş; kur listesi yenileme başarısız; kur tarihi bugün için gir ↓ Kök neden: Sembol kur listesinde yoksa 1 yazılır; takoz bakiyesinde 'Altına Çevir' Fn.Bol((Miktar*AgMilyem)*GumKur, HasKur) HasKur=1 ile has bakiyeyi T ↓ Etkilenen veri: Settings'teki her metal/döviz sembolü Sistem.Birimler'de silinmemiş ve tek satır olarak bulunmalı; a
Etkilenen veriSettings'teki her metal/döviz sembolü Sistem.Birimler'de silinmemiş ve tek satır olarak bulunmalı; aktif işlemde HasKur∉{0,1}.
Etkilenen iş süreciKur fotoğrafı (HasKur/GumKur/PltKur/PldKur/EurKur) kaydı
Olasılık / etki / güvenDÜŞÜK / S2 / 90
Bilinen ticketHAYIR (BR-KUR-001 kuralı)
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND (HasKur=1 OR GumKur=1 OR PltKur=1 OR PldKur=1 OR EurKur=1); SELECT s.HasSymbol,s.GumSymbol,s.PltSymbol,s.PldSymbol,s.UsdSymbol,s.EurSymbol FROM Sistem.Settings s; her biri için Sistem.Birimler'de IsDeleted=0 tek satır
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND (HasKur=1 OR GumKur=1 OR PltKur=1 OR PldKur=1 OR EurKur=1); SELECT s.HasSymbol,s.GumSymbol,s.PltSymbol,s.PldSymbol,s.UsdSymbol,s.EurSymbol FROM Sistem.Settings s; her biri için Sistem.Birimler'de IsDeleted=0 tek satır
Test senaryosuGirdi: Program.KurListesi (15 sn'de bir arka planda yenilenen liste), GlobalSettings.*Symbol · Formül: @HasKur = Program.GetKur(GlobalSettings.HasSymbol) → K.Alis ; birim bulunamazsa 1 · Sınır: Settings sembolü Birimler'de yok/silinmiş; kur listesi yenileme başarısız; kur tarihi bugün için girilmemiş
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: @HasKur = Program.GetKur(GlobalSettings.HasSymbol) → K.Alis ; birim bulunamazsa 1 · Kanıt: Program.vb:261-266: If K IsNot Nothing Then Return K.Alis Else Return 1
İlişkili kayıtlarERR-OBS-070, ERR-POT-023, ERR-POT-033, ERR-POT-138, ERR-SIL-026, ERR-SIL-035, ERR-SIL-041, ERR-SIL-057, ERR-SIL-058, ERR-SIL-064
Wiki bağlantılarıBR-KUR-001
SESSİZ MANTIK / HESAPLAMA ERR-SIL-037 — SLR-006 Sistem.GetKurListesi – günün kuru yoksa son kur (GetLastKur) yedeği; hesaplanan birimlerde yedek yok S2 · MOD-SISTEM · Gözlemlendi: EVET · PF-023 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-107 (geçmiş tarihli işlem son kurla), H-124, H-125, PRB-KUR-000) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-023 Birim (para birimi) tanımlama / listede görünmüyor / çarpan / çift birim
Kullanıcı belirtisiYanlış günün kuruyla TL karşılığı/has karşılığı; türev birimde fiyat 0 (Perakende Fiyat = GetKur × Carpan = 0); TAKOZ satırı yanlış kur
Teknik belirti(a) Günün kuru girilmemişse tüm işlemler sessizce en son (dün, hafta sonu öncesi, hatta ileri tarihli) kurla fiyatlanır; ekranda uyarı yoktur. (b) Hesaplanan birimlerde (ör. ayar/ons türevleri) L join K.BirimId (türev birim Id) üzerinden yapılır; GetLastKur türev birimleri içermediğinden Alis NULL döner; uygulama listesinde KurItem varsayılan 0 ile güncellenir → fiyat 0. (c) TAKOZ (-1) satırı için BirimId 1 sabitlenmiştir (Id=1'in HAS olduğu varsayımı). (d) Kurlar.IsDeleted süzülmez.
Kod dosyasıSistem.GetKurListesi, Sistem.GetLastKur (modules.json); Class/Dao/Sistem.KurListesi.vb:100-108
İlgili SQL nesneleriSistem.Birimler, Sistem.Kurlar, Sistem.GetKurListesi
Tetikleme koşuluGün başında kur girilmeden işlem; hafta sonu/tatil; IsComputed=1 birim; BirimId=1 ≠ HAS olan kurulum
Kök neden(a) Günün kuru girilmemişse tüm işlemler sessizce en son (dün, hafta sonu öncesi, hatta ileri tarihli) kurla fiyatlanır; ekranda uyarı yoktur. (b) Hesaplanan birimlerde (ör. ayar/ons türevleri) L join K.BirimId (türev birim Id) üzerinden yapılır; GetLastKur türev birimleri içermediğinden Alis NULL döner; uygulama listesinde KurItem varsayılan 0 ile güncellenir → fiyat 0. (c) TAKOZ (-1) satırı için BirimId 1 sabitlenmiştir (Id=1'in HAS olduğu varsayımı). (d) Kurlar.IsDeleted süzülmez.
Neden zinciriBelirti: Yanlış günün kuruyla TL karşılığı/has karşılığı; türev birimde fiyat 0 (Perakende Fiyat = GetKur × C ↓ Teknik olay: Alis = IsNull(Convert(dec(18,4), Kur.Alis*Carpan), L.Alis) ; Kur join: (Case When AnaBirimId=-1 Then 1 Else AnaBirimId E ↓ Yakın neden: Gün başında kur girilmeden işlem; hafta sonu/tatil; IsComputed=1 birim; BirimId=1 ≠ HAS olan kurulum ↓ Kök neden: (a) Günün kuru girilmemişse tüm işlemler sessizce en son (dün, hafta sonu öncesi, hatta ileri tarihli) kurla fiyatlanır; ekranda uyarı yoktu ↓ Etkilenen veri: Her aktif, hesaplanmayan birim için bugünün tarihli, silinmemiş tek bir kur satırı bulunmalı; GetKur
Etkilenen veriHer aktif, hesaplanmayan birim için bugünün tarihli, silinmemiş tek bir kur satırı bulunmalı; GetKurListesi hiçbir satırda NULL/0 Alis döndürmemeli.
Etkilenen iş süreciSistem.GetKurListesi – günün kuru yoksa son kur (GetLastKur) yedeği; hesaplanan birimlerde yedek yok
Olasılık / etki / güvenYÜKSEK / S2 / 80
Bilinen ticketH-107 (geçmiş tarihli işlem son kurla), H-124, H-125, PRB-KUR-000
Ticket sayısı0
Bilinen çözümBilinen operasyonel çözüm (wiki H-107/H-124): kur giriş ekranında günün kuru girilir veya KOPYALA; kalıcı kod çözümü [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT B.Kodu FROM Sistem.Birimler B WHERE B.IsDeleted=0 AND B.IsComputed=0 AND NOT EXISTS (SELECT 1 FROM Sistem.Kurlar K WHERE K.BirimId=B.Id AND K.Tarih=CONVERT(date,GETDATE()) AND K.IsDeleted=0); SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE Alis IS NULL OR Alis=0; SELECT Id,Kodu FROM Sistem.Birimler WHERE Id=1
Validation SQL (salt okunur)
SELECT B.Kodu FROM Sistem.Birimler B WHERE B.IsDeleted=0 AND B.IsComputed=0 AND NOT EXISTS (SELECT 1 FROM Sistem.Kurlar K WHERE K.BirimId=B.Id AND K.Tarih=CONVERT(date,GETDATE()) AND K.IsDeleted=0); SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE Alis IS NULL OR Alis=0; SELECT Id,Kodu FROM Sistem.Birimler WHERE Id=1
Test senaryosuGirdi: Sistem.Kurlar (Tarih=@Tarih), Cari.BakiyeKodlari (Carpan, AnaBirimId), Sistem.GetLastKur (yalnız IsComputed='False') · Formül: Alis = IsNull(Convert(dec(18,4), Kur.Alis*Carpan), L.Alis) ; Kur join: (Case When AnaBirimId=-1 Then 1 Else AnaBirimId End)=Kur.BirimId And Kur.Tarih= · Sınır: Gün başında kur girilmeden işlem; hafta sonu/tatil; IsComputed=1 birim; BirimId=1 ≠ HAS olan kurulum
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Alis = IsNull(Convert(dec(18,4), Kur.Alis*Carpan), L.Alis) ; Kur join: (Case When AnaBirimId=-1 Then 1 Else AnaBirimId End)=Kur.BirimId And Kur.Tarih=@Tarih ; L join: L.BirimId=K.BirimId · Kanıt: GetKurListesi: 'Left Join Sistem.GetLastKur L on L.BirimId =K.BirimId'; GetLastKur: 'Where K.Id is not null And B.IsComputed ='False''; KurListesi.vb:104-105: DBNull ise Set_Alis çağrılmaz, yeni KurItem 0 ile Add→mevcut kaydı 0'a çeker
Wiki bağlantılarıH-107 · H-124 · H-125 · PRB-KUR-000
SESSİZ MANTIK / HESAPLAMA ERR-SIL-038 — SLR-007 Sistem.Kurlar benzersizlik/tarih kontrolü yok; FN.GetKur TOP 1 sırasız S3 · MOD-SISTEM · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-125, H-131/H-023 teması) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-SISTEM
Alt modülHesaplama
Kullanıcı belirtisiBakiye/pozisyon/bilanço toplamları çift sayılır; rastgele kur ile dönüşüm
Teknik belirtiAynı birim+tarih için birden çok satır oluşabilir (ekranda Id çözümleme hatası, KOPYALA + elle giriş, dış besleme). GetKurListesi bu durumda birimi iki kez döndürür; FN.GetKur rastgele satırı alır, uygulama listesi son okunanı alır, ToplamBakiye/OzetBilanco Birim koduyla join yaptığından bakiye iki kez toplanır. GetLastKur ileri tarihli (yanlış girilmiş) kuru 'son kur' sayar.
Kod dosyasıFN.GetKur, Sistem.GetLastKur, Sistem.GetKurListesi; dbclean/indexes.json (Sistem.Kurlar: yalnız PK_Kurlar ve Tarih indexleri)
İlgili SQL nesneleriFN.GetKur, Sistem.Kurlar, Sistem.GetKurListesi
Tetikleme koşuluDuplicate (BirimId,Tarih); ileri tarihli kur satırı; IsDeleted=1 kur satırı
Kök nedenAynı birim+tarih için birden çok satır oluşabilir (ekranda Id çözümleme hatası, KOPYALA + elle giriş, dış besleme). GetKurListesi bu durumda birimi iki kez döndürür; FN.GetKur rastgele satırı alır, uygulama listesi son okunanı alır, ToplamBakiye/OzetBilanco Birim koduyla join yaptığından bakiye iki kez toplanır. GetLastKur ileri tarihli (yanlış girilmiş) kuru 'son kur' sayar.
Neden zinciriBelirti: Bakiye/pozisyon/bilanço toplamları çift sayılır; rastgele kur ile dönüşüm ↓ Teknik olay: FN.GetKur = Select top 1 Alis From Sistem.GetKurListesi(Getdate()) Where BirimId=@BirimId (ORDER BY yok) ; GetLastKur = ↓ Yakın neden: Duplicate (BirimId,Tarih); ileri tarihli kur satırı; IsDeleted=1 kur satırı ↓ Kök neden: Aynı birim+tarih için birden çok satır oluşabilir (ekranda Id çözümleme hatası, KOPYALA + elle giriş, dış besleme). GetKurListesi bu durumda ↓ Etkilenen veri: Sistem.Kurlar'da (BirimId, Tarih) çifti silinmemiş satırlar için benzersiz olmalı ve Tarih > bugün o
Etkilenen veriSistem.Kurlar'da (BirimId, Tarih) çifti silinmemiş satırlar için benzersiz olmalı ve Tarih > bugün olmamalı.
Etkilenen iş süreciSistem.Kurlar benzersizlik/tarih kontrolü yok; FN.GetKur TOP 1 sırasız
Olasılık / etki / güvenORTA / S3 / 85
Bilinen ticketH-125, H-131/H-023 teması
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT BirimId,Tarih,COUNT(*) FROM Sistem.Kurlar WHERE IsDeleted=0 GROUP BY BirimId,Tarih HAVING COUNT(*)>1; SELECT * FROM Sistem.Kurlar WHERE Tarih>CONVERT(date,GETDATE()); SELECT Birim,COUNT(*) FROM Sistem.GetKurListesi(GETDATE()) GROUP BY Birim HAVING COUNT(*)>1
Validation SQL (salt okunur)
SELECT BirimId,Tarih,COUNT(*) FROM Sistem.Kurlar WHERE IsDeleted=0 GROUP BY BirimId,Tarih HAVING COUNT(*)>1; SELECT * FROM Sistem.Kurlar WHERE Tarih>CONVERT(date,GETDATE()); SELECT Birim,COUNT(*) FROM Sistem.GetKurListesi(GETDATE()) GROUP BY Birim HAVING COUNT(*)>1
Test senaryosuGirdi: Sistem.Kurlar (BirimId,Tarih) – unique index yok (indexes.json), IsDeleted süzgeci yok · Formül: FN.GetKur = Select top 1 Alis From Sistem.GetKurListesi(Getdate()) Where BirimId=@BirimId (ORDER BY yok) ; GetLastKur = MAX(Tarih) per BirimId (ileri · Sınır: Duplicate (BirimId,Tarih); ileri tarihli kur satırı; IsDeleted=1 kur satırı
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: FN.GetKur = Select top 1 Alis From Sistem.GetKurListesi(Getdate()) Where BirimId=@BirimId (ORDER BY yok) ; GetLastKur = MAX(Tarih) per BirimId (ileri tarih dahil) · Kanıt: indexes.json Sistem.Kurlar: PK_Kurlar(Id), IX_KUR_SORT_TARIH(Tarih), IX_BILANCOARSIV(Tarih) – unique yok; GetLastKur 'Select BirimId,MAX(Tarih) … Group By BirimId' IsDeleted/tarih sınırı yok
Wiki bağlantılarıH-125 · H-131 · H-023
SESSİZ MANTIK / HESAPLAMA ERR-SIL-039 — SLR-008 Kur giriş ekranı: yeni kur satırının Id'si olarak ExecuteNonQuery dönüşü (etkilenen satır sayısı) kullanılıyor S3 · MOD-SISTEM · Gözlemlendi: HAYIR · PF-010 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-010 Programa giriş yapılamıyor / program açılmıyor (giriş hatası)
Kullanıcı belirtisiGünün kuru yanlış (ilk girilen) kalır; Id=1'li eski kur satırı bozulur → o günkü arşiv raporları/kur farkı hesabı değişir
Teknik belirtiExecuteNonQuery eklenen satır sayısını (1) döndürür, SCOPE_IDENTITY sonucunu değil. Grid'deki Id 1 olur; kullanıcı aynı oturumda (yenilemeden) aynı birimi ikinci kez düzeltirse Kurlar tablosundaki Id=1 olan tarihi kur satırı güncellenir, günün satırı ilk değerde kalır. Hata mesajı çıkmaz.
Kod dosyasıForm/Genel/FrmKurGirisEkrani.vb:71-84
İlgili SQL nesneleriSistem.Kurlar
Tetikleme koşuluAynı ekran oturumunda aynı birim için iki kez değer girme (yazım düzeltmesi)
Kök nedenExecuteNonQuery eklenen satır sayısını (1) döndürür, SCOPE_IDENTITY sonucunu değil. Grid'deki Id 1 olur; kullanıcı aynı oturumda (yenilemeden) aynı birimi ikinci kez düzeltirse Kurlar tablosundaki Id=1 olan tarihi kur satırı güncellenir, günün satırı ilk değerde kalır. Hata mesajı çıkmaz.
Neden zinciriBelirti: Günün kuru yanlış (ilk girilen) kalır; Id=1'li eski kur satırı bozulur → o günkü arşiv raporları/kur ↓ Teknik olay: Id = Db.ExecuteNonQuery("Insert Into Sistem.Kurlar(...) Values(...) SELECT SCOPE_IDENTITY()") → 1 ; sonraki düzenleme: ↓ Yakın neden: Aynı ekran oturumunda aynı birim için iki kez değer girme (yazım düzeltmesi) ↓ Kök neden: ExecuteNonQuery eklenen satır sayısını (1) döndürür, SCOPE_IDENTITY sonucunu değil. Grid'deki Id 1 olur; kullanıcı aynı oturumda (yenilemede ↓ Etkilenen veri: Sistem.Kurlar satırında LastModify, Tarih'ten makul süre (≤ birkaç gün) sonra olmalı; Id=1 satırı gü
Etkilenen veriSistem.Kurlar satırında LastModify, Tarih'ten makul süre (≤ birkaç gün) sonra olmalı; Id=1 satırı güncel tarihli değişiklik taşımamalı.
Etkilenen iş süreciKur giriş ekranı: yeni kur satırının Id'si olarak ExecuteNonQuery dönüşü (etkilenen satır sayısı) kullanılıyor
Olasılık / etki / güvenORTA / S3 / 85
Bilinen ticketHAYIR (PRB-KUR-000 teması)
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT Id,Tarih,BirimId,Alis,Satis,LastModify FROM Sistem.Kurlar WHERE Id=1 – LastModify tarihinin Tarih'ten çok sonra olması bulguyu doğrular; SELECT * FROM Sistem.Kurlar WHERE LastModify > DATEADD(day,2,Tarih)
Validation SQL (salt okunur)
SELECT Id,Tarih,BirimId,Alis,Satis,LastModify FROM Sistem.Kurlar WHERE Id=1 – LastModify tarihinin Tarih'ten çok sonra olması bulguyu doğrular; SELECT * FROM Sistem.Kurlar WHERE LastModify > DATEADD(day,2,Tarih)
Test senaryosuGirdi: VwKurListesi satırı (Id, BirimId, Alis, Satis), Tarih · Formül: Id = Db.ExecuteNonQuery("Insert Into Sistem.Kurlar(...) Values(...) SELECT SCOPE_IDENTITY()") → 1 ; sonraki düzenleme: Update Sistem.Kurlar Set Alis= · Sınır: Aynı ekran oturumunda aynı birim için iki kez değer girme (yazım düzeltmesi)
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Id = Db.ExecuteNonQuery("Insert Into Sistem.Kurlar(...) Values(...) SELECT SCOPE_IDENTITY()") → 1 ; sonraki düzenleme: Update Sistem.Kurlar Set Alis=…,Satis=… Where Id='1' · Kanıt: FrmKurGirisEkrani.vb:73 'Id = Db.ExecuteNonQuery("Insert Into Sistem.Kurlar(…) … SELECT SCOPE_IDENTITY() ")'; InternalDb.ExecuteNonQuery → SqlCommand.ExecuteNonQuery() (rows affected)
Wiki bağlantılarıPRB-KUR-000
SESSİZ MANTIK / HESAPLAMA ERR-SIL-040 — SLR-009 Sistem.KurKopyala – bugünün kurlarını silip son kurla değiştirir S3 · MOD-SISTEM · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-107/H-124 çözüm adımı olarak öneriliyor (yan etkisi belgelenmemiş)) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-SISTEM
Alt modülHesaplama
Kullanıcı belirtisiBugünün kurları önceki güne döner; işlemlerde HasKur/BirimKur eski değer
Teknik belirtiKOPYALA, bugün elle girilmiş tüm kurları siler ve önceki günün kurlarıyla değiştirir; onay/uyarı yoktur, UserId=0 yazılır. Gün içinde kur güncellendikten sonra basılırsa güncel kurlar kaybolur; işlemler eski kurla devam eder.
Kod dosyasıSistem.KurKopyala (modules.json); FrmKurGirisEkrani.vb:BtnKopyala
İlgili SQL nesneleriSistem.KurKopyala, Sistem.Kurlar
SQL ObjectSistem.KurKopyala (modules.json); FrmKurGirisEkrani.vb:BtnKopyala
Tetikleme koşuluGün içinde kur girildikten sonra KOPYALA'ya basılması; ileri tarihli kur varsa GetLastKur onu getirir
Kök nedenKOPYALA, bugün elle girilmiş tüm kurları siler ve önceki günün kurlarıyla değiştirir; onay/uyarı yoktur, UserId=0 yazılır. Gün içinde kur güncellendikten sonra basılırsa güncel kurlar kaybolur; işlemler eski kurla devam eder.
Neden zinciriBelirti: Bugünün kurları önceki güne döner; işlemlerde HasKur/BirimKur eski değer ↓ Teknik olay: Delete From Sistem.Kurlar Where Tarih=Convert(Date,GETDATE()) ; Insert … Select GETDATE(),BirimId,Alis,Satis,GETDATE(),0 ↓ Yakın neden: Gün içinde kur girildikten sonra KOPYALA'ya basılması; ileri tarihli kur varsa GetLastKur onu getiri ↓ Kök neden: KOPYALA, bugün elle girilmiş tüm kurları siler ve önceki günün kurlarıyla değiştirir; onay/uyarı yoktur, UserId=0 yazılır. Gün içinde kur gü ↓ Etkilenen veri: Günün kur satırları gün içinde sonradan UserId=0 ile yeniden yazılmamalı.
Etkilenen veriGünün kur satırları gün içinde sonradan UserId=0 ile yeniden yazılmamalı.
Etkilenen iş süreciSistem.KurKopyala – bugünün kurlarını silip son kurla değiştirir
Olasılık / etki / güvenORTA / S3 / 90
Bilinen ticketH-107/H-124 çözüm adımı olarak öneriliyor (yan etkisi belgelenmemiş)
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT Tarih,BirimId,UserId,LastModify,InsertDate FROM Sistem.Kurlar WHERE Tarih=CONVERT(date,GETDATE()) AND UserId=0 – aynı gün UserId<>0 satırları yoksa ve LastModify öğleden sonra ise kopyalama sonradan yapılmış demektir
Validation SQL (salt okunur)
SELECT Tarih,BirimId,UserId,LastModify,InsertDate FROM Sistem.Kurlar WHERE Tarih=CONVERT(date,GETDATE()) AND UserId=0 – aynı gün UserId<>0 satırları yoksa ve LastModify öğleden sonra ise kopyalama sonradan yapılmış demektir
Test senaryosuGirdi: Sistem.Kurlar (Tarih=bugün), Sistem.GetLastKur · Formül: Delete From Sistem.Kurlar Where Tarih=Convert(Date,GETDATE()) ; Insert … Select GETDATE(),BirimId,Alis,Satis,GETDATE(),0 From Sistem.GetLastKur · Sınır: Gün içinde kur girildikten sonra KOPYALA'ya basılması; ileri tarihli kur varsa GetLastKur onu getirir
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Delete From Sistem.Kurlar Where Tarih=Convert(Date,GETDATE()) ; Insert … Select GETDATE(),BirimId,Alis,Satis,GETDATE(),0 From Sistem.GetLastKur · Kanıt: KurKopyala tanımı: 'Delete From Sistem.Kurlar Where Tarih = Convert(Date,GETDATE())'
Wiki bağlantılarıH-107 · H-124
SESSİZ MANTIK / HESAPLAMA ERR-SIL-041 — SLR-010 Kur 0/NULL iken Fn.Bol ve .Divide'ın sessiz 0 üretmesi (NET, limit, bilanço, maliyet) S2 · MOD-SISTEM · Gözlemlendi: EVET · PF-005 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-124 (TOPLAM 0), H-110, H-126 (Divide by zero → Fn.Bol'a çevirme önerisi)) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS2 — YÜKSEK
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-005 Bilanço tutmuyor / eksi-zarar yazıyor / yanlış gösteriyor (genel bilanço problemi)
Kullanıcı belirtisiBakiye ekstresi TOPLAM 0; limit kontrolü etkisiz; maliyet 0
Teknik belirtiSıfıra bölme korunur ancak sonuç 0 olarak akar: kur eksikse NET=0, bilanço kalemi 0, pozisyon 0, limit karşılığı 0 (kontrol geçer), maliyet 0. Kullanıcı 'toplam 0' görür ama işlem/raporda hata yoktur; kararlar 0 üzerinden verilir.
Kod dosyasıFN.Bol (modules.json); Class/Module/Extention.vb:428-484; Cari.ToplamBakiye; Bakiye.GetBakiye NET; Stok.GetMadenMaliyeti son satır; Pozisyon.Write
İlgili SQL nesneleriSistem.Kurlar, Sistem.GetKurListesi
Tetikleme koşuluKur satırı 0 (ekran engeller ama SQL/KOPYALA/dış kaynak engellemez) veya birim kur listesinde yok
Kök nedenSıfıra bölme korunur ancak sonuç 0 olarak akar: kur eksikse NET=0, bilanço kalemi 0, pozisyon 0, limit karşılığı 0 (kontrol geçer), maliyet 0. Kullanıcı 'toplam 0' görür ama işlem/raporda hata yoktur; kararlar 0 üzerinden verilir.
Neden zinciriBelirti: Bakiye ekstresi TOPLAM 0; limit kontrolü etkisiz; maliyet 0 ↓ Teknik olay: FN.Bol(a,b) = (a<>0 and b<>0) ? a/b : 0 ; Divide(v1,v2) = (v1<>0 And v2<>0) ? v1/v2 : 0 ↓ Yakın neden: Kur satırı 0 (ekran engeller ama SQL/KOPYALA/dış kaynak engellemez) veya birim kur listesinde yok ↓ Kök neden: Sıfıra bölme korunur ancak sonuç 0 olarak akar: kur eksikse NET=0, bilanço kalemi 0, pozisyon 0, limit karşılığı 0 (kontrol geçer), maliyet ↓ Etkilenen veri: Sistem.Kurlar'da silinmemiş hiçbir satırda Alis veya Satis 0/NULL olmamalı.
Etkilenen veriSistem.Kurlar'da silinmemiş hiçbir satırda Alis veya Satis 0/NULL olmamalı.
Etkilenen iş süreciKur 0/NULL iken FN.Bol ve .Divide'ın sessiz 0 üretmesi (NET, limit, bilanço, maliyet)
Olasılık / etki / güvenORTA / S2 / 90
Bilinen ticketH-124 (TOPLAM 0), H-110, H-126 (Divide by zero → FN.Bol'a çevirme önerisi)
Ticket sayısı0
Bilinen çözümBilinen operasyonel çözüm (H-124): kurları girmek/KOPYALA. Kod tarafında 0 yerine hata/uyarı üretilmesi [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT * FROM Sistem.Kurlar WHERE IsDeleted=0 AND (ISNULL(Alis,0)<=0 OR ISNULL(Satis,0)<=0); SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE ISNULL(Alis,0)=0
Validation SQL (salt okunur)
SELECT * FROM Sistem.Kurlar WHERE IsDeleted=0 AND (ISNULL(Alis,0)<=0 OR ISNULL(Satis,0)<=0); SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE ISNULL(Alis,0)=0
Test senaryosuGirdi: Sistem.GetKurListesi Alis/Satis, FN.Bol, Extention.Divide · Formül: FN.Bol(a,b) = (a<>0 and b<>0) ? a/b : 0 ; Divide(v1,v2) = (v1<>0 And v2<>0) ? v1/v2 : 0 · Sınır: Kur satırı 0 (ekran engeller ama SQL/KOPYALA/dış kaynak engellemez) veya birim kur listesinde yok
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: FN.Bol(a,b) = (a<>0 and b<>0) ? a/b : 0 ; Divide(v1,v2) = (v1<>0 And v2<>0) ? v1/v2 : 0 · Kanıt: FN.Bol: 'IF (@Number1 <> 0 and @Number2 <>0) … RETURN (@Number)' (varsayılan 0); BR-MALIYET-004
İlişkili kayıtlarERR-OBS-005, ERR-OBS-070, ERR-OBS-076, ERR-POT-023, ERR-POT-033, ERR-POT-138, ERR-SIL-026, ERR-SIL-036, ERR-SIL-045, ERR-SIL-046
Wiki bağlantılarıH-124 · H-110 · H-126 · BR-MALIYET-004
SESSİZ MANTIK / HESAPLAMA ERR-SIL-042 — SLR-011 Kur hassasiyeti: GetKurListesi Convert(Decimal(18,4)) ile kuru 4 haneye yuvarlar (Kurlar 18,5) S4 · MOD-SISTEM · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS4 — DÜŞÜK
ModülMOD-SISTEM
Alt modülHesaplama
Kullanıcı belirtisiTL karşılıklarında küçük ama sistematik sapma; işlem kur fotoğrafı ile Kurlar tablosu farklı
Teknik belirtiBeşinci ondalık atılır; parite tipi küçük kurlarda (ör. 0,00012 gibi TL-dışı çaprazlar) ve Carpan ile türetilen birimlerde bağıl hata büyür. Uygulama, işlem kur fotoğrafı ve tüm SQL NET hesapları bu 4 haneli değeri kullanır.
Kod dosyasıSistem.GetKurListesi (modules.json)
İlgili SQL nesneleriSistem.GetKurListesi, Sistem.Kurlar
SQL ObjectSistem.GetKurListesi (modules.json)
Tetikleme koşuluKur < 0,01 veya Carpan çarpımı 5. hanede anlamlı; büyük tutarlar
Kök nedenBeşinci ondalık atılır; parite tipi küçük kurlarda (ör. 0,00012 gibi TL-dışı çaprazlar) ve Carpan ile türetilen birimlerde bağıl hata büyür. Uygulama, işlem kur fotoğrafı ve tüm SQL NET hesapları bu 4 haneli değeri kullanır.
Neden zinciriBelirti: TL karşılıklarında küçük ama sistematik sapma; işlem kur fotoğrafı ile Kurlar tablosu farklı ↓ Teknik olay: Convert(Decimal(18,4), Kur.Alis * Carpan) as Alis ↓ Yakın neden: Kur < 0,01 veya Carpan çarpımı 5. hanede anlamlı; büyük tutarlar ↓ Kök neden: Beşinci ondalık atılır; parite tipi küçük kurlarda (ör. 0,00012 gibi TL-dışı çaprazlar) ve Carpan ile türetilen birimlerde bağıl hata büyür. ↓ Etkilenen veri: GetKurListesi.Alis ile Kurlar.Alis×Carpan farkı 0,00005'i aşmamalı.
Etkilenen veriGetKurListesi.Alis ile Kurlar.Alis×Carpan farkı 0,00005'i aşmamalı.
Etkilenen iş süreciKur hassasiyeti: GetKurListesi Convert(Decimal(18,4)) ile kuru 4 haneye yuvarlar (Kurlar 18,5)
Olasılık / etki / güvenORTA / S4 / 80
Bilinen ticketHAYIR
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT K.BirimId,K.Alis, L.Alis FROM Sistem.Kurlar K JOIN Sistem.GetKurListesi(K.Tarih) L ON L.BirimId=K.BirimId WHERE K.Tarih=CONVERT(date,GETDATE()) AND K.Alis<>L.Alis
Validation SQL (salt okunur)
SELECT K.BirimId,K.Alis, L.Alis FROM Sistem.Kurlar K JOIN Sistem.GetKurListesi(K.Tarih) L ON L.BirimId=K.BirimId WHERE K.Tarih=CONVERT(date,GETDATE()) AND K.Alis<>L.Alis
Test senaryosuGirdi: Sistem.Kurlar.Alis/Satis decimal(18,5), Carpan decimal(18,5) · Formül: Convert(Decimal(18,4), Kur.Alis * Carpan) as Alis · Sınır: Kur < 0,01 veya Carpan çarpımı 5. hanede anlamlı; büyük tutarlar
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Convert(Decimal(18,4), Kur.Alis * Carpan) as Alis · Kanıt: 'Convert(Decimal(18,4), Kur.Alis * Carpan) as Alis' ; columns.json Sistem.Kurlar.Alis decimal 18,5
SESSİZ MANTIK / HESAPLAMA ERR-SIL-043 — SLR-012 IslemTipi 11 (belge takip) ve 12 (MAHSUP) hiç stok/bakiye hareketi üretmez – sayım farkı/açılış girişleri operasyonel stoğa yansımaz S2 · MOD-STOK · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-003, CTR-004, CTR-005, BR-TIP-004, H-123 (çözüm adımı MAHSUP), H-142) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiStok sayım düzeltmesi yapılmış sanılır ama stok eski değerde; bilanço farkı; düzeltme ile bakiye kaybı
Teknik belirtiKullanıcı dokümanı (A-Z 1.8/2.4, H-123) sayım farkı ve açılış stoğunun MAHSUP ile girilmesini önerir; tetikleyici MAHSUP için Stok.StokHaraketleri satırı yazmaz. İşlem listede görünür, hata yoktur, ancak stok listesi/bilanço/pozisyon değişmez. Üstelik mevcut NORMAL bir satır Düzelt ile 11/12'ye çevrilirse önce silme (satır 258-259) çalışır ve bakiye/stok kaydı sessizce kaybolur.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 263
İlgili SQL nesneleriStok.StokHaraketleri, Cari.Islemler, Cari.History
Tetikleme koşuluIslemTipi ∈ {11,12}; tip değişikliği ile düzeltme
Kök nedenKullanıcı dokümanı (A-Z 1.8/2.4, H-123) sayım farkı ve açılış stoğunun MAHSUP ile girilmesini önerir; tetikleyici MAHSUP için Stok.StokHaraketleri satırı yazmaz. İşlem listede görünür, hata yoktur, ancak stok listesi/bilanço/pozisyon değişmez. Üstelik mevcut NORMAL bir satır Düzelt ile 11/12'ye çevrilirse önce silme (satır 258-259) çalışır ve bakiye/stok kaydı sessizce kaybolur.
Neden zinciriBelirti: Stok sayım düzeltmesi yapılmış sanılır ama stok eski değerde; bilanço farkı; düzeltme ile bakiye kay ↓ Teknik olay: if @IsDeleted='False' And @IsError=0 AND (@IslemTipi <>11 AND @IslemTipi<>12) BEGIN … stok/bakiye üretimi … END ↓ Yakın neden: IslemTipi ∈ {11,12}; tip değişikliği ile düzeltme ↓ Kök neden: Kullanıcı dokümanı (A-Z 1.8/2.4, H-123) sayım farkı ve açılış stoğunun MAHSUP ile girilmesini önerir; tetikleyici MAHSUP için Stok.StokHarak ↓ Etkilenen veri: IslemTipi ∈ {11,12} olan işlemlerin BakiyeIslem/StokHaraketleri(Bolum=0) satırı olmamalı; NORMAL→11/
Etkilenen veriIslemTipi ∈ {11,12} olan işlemlerin BakiyeIslem/StokHaraketleri(Bolum=0) satırı olmamalı; NORMAL→11/12 tip değişikliği History'de izlenebilir olmalı.
Etkilenen iş süreciIslemTipi 11 (belge takip) ve 12 (MAHSUP) hiç stok/bakiye hareketi üretmez – sayım farkı/açılış girişleri operasyonel stoğa yansımaz
Olasılık / etki / güvenYÜKSEK / S2 / 95
Bilinen ticketCTR-003, CTR-004, CTR-005, BR-TIP-004, H-123 (çözüm adımı MAHSUP), H-142
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTipi=12 AND I.IslemKodu IN (1,2,3); bunların hiçbirinde EXISTS(Stok.StokHaraketleri Bolum=0) olmamalı – varsa trigger sürümü farklıdır; History: SELECT TransactionId FROM Cari.History H WHERE LogType='Düzeltme' AND IslemTipi IN (11,12) AND EXISTS(SELECT 1 FROM Cari.History H0 WHERE H0.TransactionId=H.TransactionId AND H0.IslemTipi NOT IN (11,12))
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTipi=12 AND I.IslemKodu IN (1,2,3); bunların hiçbirinde EXISTS(Stok.StokHaraketleri Bolum=0) olmamalı – varsa trigger sürümü farklıdır; History: SELECT TransactionId FROM Cari.History H WHERE LogType='Düzeltme' AND IslemTipi IN (11,12) AND EXISTS(SELECT 1 FROM Cari.History H0 WHERE H0.TransactionId=H.TransactionId AND H0.IslemTipi NOT IN (11,12))
Test senaryosuGirdi: Cari.Islemler.IslemTipi · Formül: if @IsDeleted='False' And @IsError=0 AND (@IslemTipi <>11 AND @IslemTipi<>12) BEGIN … stok/bakiye üretimi … END · Sınır: IslemTipi ∈ {11,12}; tip değişikliği ile düzeltme
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
NotlarÇözüm adayı: ürün kararı gerektirir: MAHSUP'un operasyonel stok etkisi
KaynakSessiz risk analizi · Formül: if @IsDeleted='False' And @IsError=0 AND (@IslemTipi <>11 AND @IslemTipi<>12) BEGIN … stok/bakiye üretimi … END · Kanıt: satır 256-260 önce 'Delete From Cari.BakiyeIslem Where IslemId=@IslemId' çalışır; satır 263 koşulu 11/12'yi yeniden üretimden hariç tutar
Wiki bağlantılarıBR-TIP-004 · H-123 · H-142
SESSİZ MANTIK / HESAPLAMA ERR-SIL-044 — SLR-013 Negatif miktar/adet girişi: bakiye abs() ile yön alır, stok hareketi işaretsiz miktarı taşır S2 · MOD-STOK · Gözlemlendi: HAYIR · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiCari has bakiyesi doğru, stok ters; bilanço BAKIYE≠STOK
Teknik belirtiMiktar negatif girilirse bakiye satırı yön kuralına göre düzgün işaret alır ama stok hareketi ters yöne yazılır (giriş stoğu azaltır). Ayrıca tip PEŞİN nakit satırı ve pırlanta maliyeti aynı biçimde ters işaret alır. Uygulama yalnız Miktar=0'ı engeller.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 274, 284, 336-344; Cari.Islem.vb:513 (yalnız Miktar=0 kontrolü)
İlgili SQL nesneleriCari.Islemler, Stok.StokHaraketleri
Tetikleme koşuluMiktar<0, Adet<0 veya Tutar<0 girilmiş satır
Kök nedenMiktar negatif girilirse bakiye satırı yön kuralına göre düzgün işaret alır ama stok hareketi ters yöne yazılır (giriş stoğu azaltır). Ayrıca tip PEŞİN nakit satırı ve pırlanta maliyeti aynı biçimde ters işaret alır. Uygulama yalnız Miktar=0'ı engeller.
Neden zinciriBelirti: Cari has bakiyesi doğru, stok ters; bilanço BAKIYE≠STOK ↓ Teknik olay: Bakiye: Set @Has=0-abs(@Has) / abs(@Has) ; Stok: Miktar = Case When @IslemTuru=0 Then @Miktar When 1 Then 0-@Miktar End ↓ Yakın neden: Miktar<0, Adet<0 veya Tutar<0 girilmiş satır ↓ Kök neden: Miktar negatif girilirse bakiye satırı yön kuralına göre düzgün işaret alır ama stok hareketi ters yöne yazılır (giriş stoğu azaltır). Ayrıc ↓ Etkilenen veri: Aktif işlemde Miktar, Adet ve Tutar negatif olmamalı; stok hareketi işareti IslemTuru ile uyumlu olm
Etkilenen veriAktif işlemde Miktar, Adet ve Tutar negatif olmamalı; stok hareketi işareti IslemTuru ile uyumlu olmalı.
Etkilenen iş süreciNegatif miktar/adet girişi: bakiye abs() ile yön alır, stok hareketi işaretsiz miktarı taşır
Olasılık / etki / güvenDÜŞÜK / S2 / 60
Bilinen ticketHAYIR (H-123 negatif stok teması)
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT Id,IslemKodu,IslemTuru,Miktar,Adet,Tutar FROM Cari.Islemler WHERE IsDeleted=0 AND (Miktar<0 OR Adet<0 OR Tutar<0); SELECT H.* FROM Stok.StokHaraketleri H JOIN Cari.Islemler I ON I.Id=H.IslemId AND H.Bolum=0 WHERE I.IslemKodu IN (1,2,9) AND H.StokTipi=1 AND SIGN(H.Miktar)<>CASE WHEN I.IslemTuru=0 THEN 1 ELSE -1 END
Validation SQL (salt okunur)
SELECT Id,IslemKodu,IslemTuru,Miktar,Adet,Tutar FROM Cari.Islemler WHERE IsDeleted=0 AND (Miktar<0 OR Adet<0 OR Tutar<0); SELECT H.* FROM Stok.StokHaraketleri H JOIN Cari.Islemler I ON I.Id=H.IslemId AND H.Bolum=0 WHERE I.IslemKodu IN (1,2,9) AND H.StokTipi=1 AND SIGN(H.Miktar)<>CASE WHEN I.IslemTuru=0 THEN 1 ELSE -1 END
Test senaryosuGirdi: Cari.Islemler.Miktar/Adet (DevExpress numeric mask; negatif engeli kodda yok), IslemTuru · Formül: Bakiye: Set @Has=0-abs(@Has) / abs(@Has) ; Stok: Miktar = Case When @IslemTuru=0 Then @Miktar When 1 Then 0-@Miktar End (abs yok) · Sınır: Miktar<0, Adet<0 veya Tutar<0 girilmiş satır
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Bakiye: Set @Has=0-abs(@Has) / abs(@Has) ; Stok: Miktar = Case When @IslemTuru=0 Then @Miktar When 1 Then 0-@Miktar End (abs yok) · Kanıt: satır 274: 'Case When @IslemTuru=0 Then @Miktar When @IslemTuru=1 Then 0-@Miktar End' (abs yok); satır 336: 'Set @Has=0-abs(@Has)'
Wiki bağlantılarıH-123
SESSİZ MANTIK / HESAPLAMA ERR-SIL-045 — SLR-014 Stok.GetMadenMaliyeti – son 50 giriş (LIFO), bugünkü kurla bölme, kalan miktara 0 maliyet S3 · MOD-STOK · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-120, H-121, H-122, H-129, CTR-SEC-MALIYET-01) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS3 — ORTA
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiBirim maliyet düşük/0; maliyet bir günde sıçrar; kur değişince tarihi maliyet değişir
Teknik belirtiMaliyet yalnız girişteki işçilik TL'sidir (metal değeri yoktur); 50 hareket sınırı nedeniyle çok hareketli stokta eski girişler görülmez ve eldeki miktarın karşılanamayan kısmı 0 maliyetle kalır; kur 'en son tarihli' alındığından geçmiş tarihli stok listesi bugünkü kurla değerlenir; Order By IslemId, Bolum=1/2 (üretim/transfer) satırlarının farklı Id ad alanıyla karışmasına açıktır; @Miktar/@Maliyet Decimal(18,2).
Kod dosyasıStok.GetMadenMaliyeti (modules.json)
İlgili SQL nesneleriStok.GetMadenMaliyeti, Stok.StokHaraketleri, Bilanco.GetKurFarki
SQL ObjectStok.GetMadenMaliyeti (modules.json)
Tetikleme koşuluStok > son 50 girişin toplamı; geçmiş tarihli rapor; maliyet birimi kuru değişimi; transfer ile gelen stok (Maliyet satırı yok)
Kök nedenMaliyet yalnız girişteki işçilik TL'sidir (metal değeri yoktur); 50 hareket sınırı nedeniyle çok hareketli stokta eski girişler görülmez ve eldeki miktarın karşılanamayan kısmı 0 maliyetle kalır; kur 'en son tarihli' alındığından geçmiş tarihli stok listesi bugünkü kurla değerlenir; Order By IslemId, Bolum=1/2 (üretim/transfer) satırlarının farklı Id ad alanıyla karışmasına açıktır; @Miktar/@Maliyet Decimal(18,2).
Neden zinciriBelirti: Birim maliyet düşük/0; maliyet bir günde sıçrar; kur değişince tarihi maliyet değişir ↓ Teknik olay: CURSOR top 50 … Order By IslemId Desc ; ToplamMaliyet += Maliyet (veya orantılı) ; RETURN Convert(dec(18,2), Bol(ToplamM ↓ Yakın neden: Stok > son 50 girişin toplamı; geçmiş tarihli rapor; maliyet birimi kuru değişimi; transfer ile gele ↓ Kök neden: Maliyet yalnız girişteki işçilik TL'sidir (metal değeri yoktur); 50 hareket sınırı nedeniyle çok hareketli stokta eski girişler görülmez ve ↓ Etkilenen veri: Eldeki miktar, maliyet hesabına giren giriş hareketleri toplamını aşmamalı (aşarsa maliyet eksik).
Etkilenen veriEldeki miktar, maliyet hesabına giren giriş hareketleri toplamını aşmamalı (aşarsa maliyet eksik).
Etkilenen iş süreciStok.GetMadenMaliyeti – son 50 giriş (LIFO), bugünkü kurla bölme, kalan miktara 0 maliyet
Olasılık / etki / güvenYÜKSEK / S3 / 90
Bilinen ticketH-120, H-121, H-122, H-129, CTR-SEC-MALIYET-01
Ticket sayısı0
Bilinen çözümH-129 teknik çözümü (fonksiyonun ALTER edilip stoğun boş hesaba çıkılıp geri girilmesi) wikide tarif edilmiş; kaynak sürümü doğrulanmadı → [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT StokId,SubeId,KasaId,COUNT(*) FROM Stok.StokHaraketleri WHERE StokTipi=1 AND IslemTuru=0 GROUP BY StokId,SubeId,KasaId HAVING COUNT(*)>50; eldeki miktarı ilk 50 girişin toplamını aşan stoklar: karşılaştırma sorgusu; Bilanco.GetKurFarki çıktısı
Validation SQL (salt okunur)
SELECT StokId,SubeId,KasaId,COUNT(*) FROM Stok.StokHaraketleri WHERE StokTipi=1 AND IslemTuru=0 GROUP BY StokId,SubeId,KasaId HAVING COUNT(*)>50; eldeki miktarı ilk 50 girişin toplamını aşan stoklar: karşılaştırma sorgusu; Bilanco.GetKurFarki çıktısı
Test senaryosuGirdi: Stok.StokHaraketleri (IslemTuru=0, StokTipi=1, Bolum süzgeci yok), Stok.Maden.MaliyetBirimId, Sistem.Kurlar (Order By Tarih Desc, IsDeleted yok) · Formül: CURSOR top 50 … Order By IslemId Desc ; ToplamMaliyet += Maliyet (veya orantılı) ; RETURN Convert(dec(18,2), Bol(ToplamMaliyet, (Select top 1 Alis Fro · Sınır: Stok > son 50 girişin toplamı; geçmiş tarihli rapor; maliyet birimi kuru değişimi; transfer ile gelen stok (Maliyet satı
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: CURSOR top 50 … Order By IslemId Desc ; ToplamMaliyet += Maliyet (veya orantılı) ; RETURN Convert(dec(18,2), Bol(ToplamMaliyet, (Select top 1 Alis From Sistem.Kurlar Where BirimId=@BirimId Order By Ta · Kanıt: 'Select top 50 Case When @IscTur =0 Then Adet Else Miktar End as Miktar,Maliyet FRom Stok.StokHaraketleri … Order By IslemId Desc'
İlişkili kayıtlarERR-OBS-005, ERR-OBS-076, ERR-POT-023, ERR-SIL-041, ERR-SIL-046, ERR-SIL-049
Wiki bağlantılarıH-120 · H-121 · H-122 · H-129
SESSİZ MANTIK / HESAPLAMA ERR-SIL-046 — SLR-015 Ortalama milyem / maliyet cursor değişkenleri Decimal(18,2) – 5 haneli Has/Miktar kesilir S4 · MOD-STOK · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-015) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS4 — DÜŞÜK
ModülMOD-STOK
Alt modülHesaplama
Kullanıcı belirtisiOrtalama milyem ve has stoğu küsuratta yanlış; stok listesi ile hareket dökümü toplamı farklı
Teknik belirtiHer hareket 2 haneye yuvarlanarak toplanır; küçük gramajlı çok sayıda hareket (ör. 0,005 g altı has satırları) ortalama milyemi saptırır; stok listesi Miktar/Has 2 haneye yuvarlanır ancak StokHaraketleri toplamı 5 hanelidir → liste toplamı ≠ hareket toplamı.
Kod dosyasıStok.GetOrtMilyem, Stok.GetMadenMaliyeti (modules.json); Stok.GetMadenStok/GetMadenStoklari CONVERT(Decimal(18,2), Miktar)
İlgili SQL nesneleriStok.StokHaraketleri
Tetikleme koşuluMiktar×Milyem 3. ondalıkta anlamlı; çok sayıda küçük hareket
Kök nedenHer hareket 2 haneye yuvarlanarak toplanır; küçük gramajlı çok sayıda hareket (ör. 0,005 g altı has satırları) ortalama milyemi saptırır; stok listesi Miktar/Has 2 haneye yuvarlanır ancak StokHaraketleri toplamı 5 hanelidir → liste toplamı ≠ hareket toplamı.
Neden zinciriBelirti: Ortalama milyem ve has stoğu küsuratta yanlış; stok listesi ile hareket dökümü toplamı farklı ↓ Teknik olay: Declare @Miktar Decimal(18,2), @Has Decimal(18,2), @ToplamHas Decimal(18,2) … RETURN Fn.Bol(@ToplamHas,@ToplamMiktar) ↓ Yakın neden: Miktar×Milyem 3. ondalıkta anlamlı; çok sayıda küçük hareket ↓ Kök neden: Her hareket 2 haneye yuvarlanarak toplanır; küçük gramajlı çok sayıda hareket (ör. 0,005 g altı has satırları) ortalama milyemi saptırır; st ↓ Etkilenen veri: Stok listesi has/miktar değerleri, hareket toplamına 0,01 toleransla eşit olmalı.
Etkilenen veriStok listesi has/miktar değerleri, hareket toplamına 0,01 toleransla eşit olmalı.
Etkilenen iş süreciOrtalama milyem / maliyet cursor değişkenleri Decimal(18,2) – 5 haneli Has/Miktar kesilir
Olasılık / etki / güvenYÜKSEK / S4 / 85
Bilinen ticketCTR-015
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT StokId,SUM(Miktar) AS M5, SUM(CONVERT(decimal(18,2),Miktar)) AS M2 FROM Stok.StokHaraketleri WHERE StokTipi=1 GROUP BY StokId HAVING SUM(Miktar)<>SUM(CONVERT(decimal(18,2),Miktar))
Validation SQL (salt okunur)
SELECT StokId,SUM(Miktar) AS M5, SUM(CONVERT(decimal(18,2),Miktar)) AS M2 FROM Stok.StokHaraketleri WHERE StokTipi=1 GROUP BY StokId HAVING SUM(Miktar)<>SUM(CONVERT(decimal(18,2),Miktar))
Test senaryosuGirdi: Stok.StokHaraketleri.Miktar/Has decimal(18,5) · Formül: Declare @Miktar Decimal(18,2), @Has Decimal(18,2), @ToplamHas Decimal(18,2) … RETURN Fn.Bol(@ToplamHas,@ToplamMiktar) · Sınır: Miktar×Milyem 3. ondalıkta anlamlı; çok sayıda küçük hareket
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Declare @Miktar Decimal(18,2), @Has Decimal(18,2), @ToplamHas Decimal(18,2) … RETURN Fn.Bol(@ToplamHas,@ToplamMiktar) · Kanıt: GetOrtMilyem: 'Declare @Miktar Decimal(18,2)=0 ; Declare @Has Decimal(18,2)=0'
İlişkili kayıtlarERR-OBS-005, ERR-OBS-076, ERR-OBS-086, ERR-POT-003, ERR-POT-023, ERR-POT-030, ERR-POT-116, ERR-POT-134, ERR-POT-135, ERR-SIL-041
SESSİZ MANTIK / HESAPLAMA ERR-SIL-047 — SLR-016 Stok has değeri kart milyemiyle, cari has bakiyesi işlem milyemiyle – stok ve cari türetilmiş kayıtları farklı milyem kullanır S3 · MOD-STOK · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-129, H-130, PRB-BILANCO-000, PRB-POZISYON-000) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS3 — ORTA
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiPozisyon raporunda has farkı; bilanço kâr/zarar hatalı; 'kur değişince bilanço değişiyor'
Teknik belirtiİşçilikli milyem ayrıştırması (BR-HESAP-005) veya elle farklı milyem girilen işlemde bakiyeye Miktar×AuMilyem yazılır; stok ve pozisyon ise kart milyemini kullanır. Pozisyon.Write değişken milyemli (MilyemDurumu=True, hurda) kartlarda da sabit kart milyemini alır. Sonuç: BAKIYE ve STOK kalemleri farklı has üretir; bilanço/pozisyon 'tutmaz'.
Kod dosyasıStok.GetMadenStoklari, Stok.GetMadenStok, Pozisyon.Write (modules.json); iFMaden.vb MilyemDegisti (BR-HESAP-005)
İlgili SQL nesneleriStok.GetMadenStoklari, Stok.GetMadenStok, Pozisyon.Write, Cari.Islemler, Stok.Maden, Stok.StokHaraketleri
SQL ObjectStok.GetMadenStoklari, Stok.GetMadenStok, Pozisyon.Write (modules.json); iFMaden.vb MilyemDegisti (BR-HESAP-005)
Tetikleme koşuluAuMilyem ≠ Maden.Milyem olan işlemler; MilyemDurumu=True kartlar; negatif işçilikli kart (BR-HESAP-011)
Kök nedenİşçilikli milyem ayrıştırması (BR-HESAP-005) veya elle farklı milyem girilen işlemde bakiyeye Miktar×AuMilyem yazılır; stok ve pozisyon ise kart milyemini kullanır. Pozisyon.Write değişken milyemli (MilyemDurumu=True, hurda) kartlarda da sabit kart milyemini alır. Sonuç: BAKIYE ve STOK kalemleri farklı has üretir; bilanço/pozisyon 'tutmaz'.
Neden zinciriBelirti: Pozisyon raporunda has farkı; bilanço kâr/zarar hatalı; 'kur değişince bilanço değişiyor' ↓ Teknik olay: Stok listesi: Has = Miktar × (MilyemDurumu='False' ? Maden.Milyem : GetOrtMilyem) ; Pozisyon: Sum(Miktar × StabilMilyem) ↓ Yakın neden: AuMilyem ≠ Maden.Milyem olan işlemler; MilyemDurumu=True kartlar; negatif işçilikli kart (BR-HESAP-0 ↓ Kök neden: İşçilikli milyem ayrıştırması (BR-HESAP-005) veya elle farklı milyem girilen işlemde bakiyeye Miktar×AuMilyem yazılır; stok ve pozisyon ise ↓ Etkilenen veri: Bir stok kodunun StokHaraketleri.Has toplamı, aynı satırların Miktar×Milyem toplamına eşit olmalı; p
Etkilenen veriBir stok kodunun StokHaraketleri.Has toplamı, aynı satırların Miktar×Milyem toplamına eşit olmalı; pozisyon has'ı hareket has'ı ile aynı temeli kullanmalı.
Etkilenen iş süreciStok has değeri kart milyemiyle, cari has bakiyesi işlem milyemiyle – stok ve cari türetilmiş kayıtları farklı milyem kullanır
Olasılık / etki / güvenORTA / S3 / 75
Bilinen ticketH-129, H-130, PRB-BILANCO-000, PRB-POZISYON-000
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT I.Id,I.StokId,I.AuMilyem,M.Milyem,M.MilyemDurumu FROM Cari.Islemler I JOIN Stok.Maden M ON M.Id=I.StokId WHERE I.IsDeleted=0 AND I.IslemKodu IN (1,2) AND I.AuMilyem<>M.Milyem; SELECT StokId,SUM(Has) AS HasHareket, SUM(Miktar)*MAX(Milyem) FROM Stok.StokHaraketleri WHERE StokTipi=1 GROUP BY StokId
Validation SQL (salt okunur)
SELECT I.Id,I.StokId,I.AuMilyem,M.Milyem,M.MilyemDurumu FROM Cari.Islemler I JOIN Stok.Maden M ON M.Id=I.StokId WHERE I.IsDeleted=0 AND I.IslemKodu IN (1,2) AND I.AuMilyem<>M.Milyem; SELECT StokId,SUM(Has) AS HasHareket, SUM(Miktar)*MAX(Milyem) FROM Stok.StokHaraketleri WHERE StokTipi=1 GROUP BY StokId
Test senaryosuGirdi: Stok.Maden.Milyem/MilyemDurumu, Cari.Islemler.AuMilyem, Stok.StokHaraketleri.Milyem · Formül: Stok listesi: Has = Miktar × (MilyemDurumu='False' ? Maden.Milyem : GetOrtMilyem) ; Pozisyon: Sum(Miktar × StabilMilyem) (=Maden.Milyem her durumda) ; · Sınır: AuMilyem ≠ Maden.Milyem olan işlemler; MilyemDurumu=True kartlar; negatif işçilikli kart (BR-HESAP-011)
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Stok listesi: Has = Miktar × (MilyemDurumu='False' ? Maden.Milyem : GetOrtMilyem) ; Pozisyon: Sum(Miktar × StabilMilyem) (=Maden.Milyem her durumda) ; Bakiye: Miktar × AuMilyem (işlem) · Kanıt: Pozisyon.Write: 'Sum(Miktar * StabilMilyem) as Has From Stok.GetMadenStoklari' ; GetMadenStoklari: 'M.Milyem as StabilMilyem'
Wiki bağlantılarıH-129 · H-130 · PRB-BILANCO-000 · PRB-POZISYON-000 · BR-HESAP-005
SESSİZ MANTIK / HESAPLAMA ERR-SIL-048 — SLR-017 Transfer kabulünde stok hareketi üretimi (Cari.TransferUpdateSTatus) – eski satırlar silinmiyor S2 · MOD-STOK · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-114, H-119 teması; BR-TRANSFER-001) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiAynı transfer stoktan iki (n) kez düşer/çıkar; iptal edilen transferin stoğu geri gelmez
Teknik belirtiSilme koşulu StokTipi=-2 (var olmayan tip) olduğundan hiçbir zaman eski Bolum=2 satırı silinmez. Transferler.Update() Status kolonunu her zaman yazdığı için UPDATE(status) doğru döner ve Status=1 olan bir transfer her düzenlendiğinde iki stok hareketi daha eklenir. Transferin IsDeleted=1 yapılması veya Status'un 1'den başka değere alınması mevcut hareketleri silmez.
Kod dosyasıCari.TransferUpdateSTatus (modules.json); Class/Dao/Cari.Transferler.vb:222 (Update tüm kolonları, Status dahil yazar), :272-301 (IsDeleted)
İlgili SQL nesneleriCari.Transferler, Stok.StokHaraketleri
Tetikleme koşuluKabul edilmiş (Status=1) transferin düzenlenmesi/yeniden kaydı; transferin sonradan iptali
Kök nedenSilme koşulu StokTipi=-2 (var olmayan tip) olduğundan hiçbir zaman eski Bolum=2 satırı silinmez. Transferler.Update() Status kolonunu her zaman yazdığı için UPDATE(status) doğru döner ve Status=1 olan bir transfer her düzenlendiğinde iki stok hareketi daha eklenir. Transferin IsDeleted=1 yapılması veya Status'un 1'den başka değere alınması mevcut hareketleri silmez.
Neden zinciriBelirti: Aynı transfer stoktan iki (n) kez düşer/çıkar; iptal edilen transferin stoğu geri gelmez ↓ Teknik olay: if UPDATE(status): Delete From Stok.StokHaraketleri Where StokTipi=-2 AND IslemId in (inserted) ; Insert … Select 2,Id,1 ↓ Yakın neden: Kabul edilmiş (Status=1) transferin düzenlenmesi/yeniden kaydı; transferin sonradan iptali ↓ Kök neden: Silme koşulu StokTipi=-2 (var olmayan tip) olduğundan hiçbir zaman eski Bolum=2 satırı silinmez. Transferler.Update() Status kolonunu her za ↓ Etkilenen veri: Status=1 ve silinmemiş her transfer için tam 2 adet Bolum=2 stok hareketi; diğer durumlarda 0 olmalı
Etkilenen veriStatus=1 ve silinmemiş her transfer için tam 2 adet Bolum=2 stok hareketi; diğer durumlarda 0 olmalı.
Etkilenen iş süreciTransfer kabulünde stok hareketi üretimi (Cari.TransferUpdateSTatus) – eski satırlar silinmiyor
Olasılık / etki / güvenORTA / S2 / 80
Bilinen ticketH-114, H-119 teması; BR-TRANSFER-001
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT T.Id,T.Status,T.IsDeleted,COUNT(H.IslemId) FROM Cari.Transferler T LEFT JOIN Stok.StokHaraketleri H ON H.IslemId=T.Id AND H.Bolum=2 GROUP BY T.Id,T.Status,T.IsDeleted HAVING (T.Status=1 AND T.IsDeleted=0 AND COUNT(H.IslemId)<>2) OR ((T.Status<>1 OR T.IsDeleted=1) AND COUNT(H.IslemId)>0)
Validation SQL (salt okunur)
SELECT T.Id,T.Status,T.IsDeleted,COUNT(H.IslemId) FROM Cari.Transferler T LEFT JOIN Stok.StokHaraketleri H ON H.IslemId=T.Id AND H.Bolum=2 GROUP BY T.Id,T.Status,T.IsDeleted HAVING (T.Status=1 AND T.IsDeleted=0 AND COUNT(H.IslemId)<>2) OR ((T.Status<>1 OR T.IsDeleted=1) AND COUNT(H.IslemId)>0)
Test senaryosuGirdi: Cari.Transferler (Status), Stok.StokHaraketleri Bolum=2 · Formül: if UPDATE(status): Delete From Stok.StokHaraketleri Where StokTipi=-2 AND IslemId in (inserted) ; Insert … Select 2,Id,1,…,CikanKasaId,…,Adet*-1,Mikta · Sınır: Kabul edilmiş (Status=1) transferin düzenlenmesi/yeniden kaydı; transferin sonradan iptali
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: if UPDATE(status): Delete From Stok.StokHaraketleri Where StokTipi=-2 AND IslemId in (inserted) ; Insert … Select 2,Id,1,…,CikanKasaId,…,Adet*-1,Miktar*-1 … Where Status=1 ; Insert … GirenKasaId … Whe · Kanıt: 'Delete From Stok.StokHaraketleri Where StokTipi =-2 AND IslemId in (Select Id from inserted)'
İlişkili kayıtlarERR-POT-136
Wiki bağlantılarıH-114 · H-119 · BR-TRANSFER-001
SESSİZ MANTIK / HESAPLAMA ERR-SIL-049 — SLR-018 Stok.StokHaraketleri.IslemId ad alanı çakışması (Bolum 0 → Cari.Islemler.Id, Bolum 1 → Uretim, Bolum 2 → Transferler.Id) S3 · MOD-STOK · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-119 (transfer satırları yanlış tarihte)) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE05 — Transaction Hatası
SeverityS3 — ORTA
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiStok hareket raporunda transfer satırı yanlış tarih/hesapla; maliyet sırası yanlış
Teknik belirtiTransfer/üretim satırlarının IslemId'si Cari.Islemler'deki rastgele bir işlemle çakışır; hareket dökümünde yanlış hesap adı/tarih/tutar görünür; LIFO maliyet sıralaması Id karışımıyla bozulur. AcceptTransaction'daki silme Bolum=0 ile sınırlı olduğundan veri silinmez ama raporlar yanıltır.
Kod dosyasıStok.GetStokHareketleri, Stok.GetTakozAdet, Stok.GetMadenMaliyeti (Order By IslemId) – modules.json; AcceptTransaction satır 259 (Bolum=0 ile sınırlı silme)
İlgili SQL nesneleriStok.GetStokHareketleri, Stok.GetTakozAdet, Stok.GetMadenMaliyeti, Cari.Islemler, Stok.StokHaraketleri
SQL ObjectStok.GetStokHareketleri, Stok.GetTakozAdet, Stok.GetMadenMaliyeti (Order By IslemId) – modules.json; AcceptTransaction satır 259 (Bolum=0 ile sınırlı silme)
Tetikleme koşuluBolum=2 veya Bolum=1 satırının IslemId'si ile aynı Id'li Cari.Islemler satırı
Kök nedenTransfer/üretim satırlarının IslemId'si Cari.Islemler'deki rastgele bir işlemle çakışır; hareket dökümünde yanlış hesap adı/tarih/tutar görünür; LIFO maliyet sıralaması Id karışımıyla bozulur. AcceptTransaction'daki silme Bolum=0 ile sınırlı olduğundan veri silinmez ama raporlar yanıltır.
Neden zinciriBelirti: Stok hareket raporunda transfer satırı yanlış tarih/hesapla; maliyet sırası yanlış ↓ Teknik olay: GetStokHareketleri: Left Join Cari.Islemler I on H.IslemId=I.Id (Bolum süzgeci yok) → HesapAdi/Tarih/Fiyat/Tutar başka i ↓ Yakın neden: Bolum=2 veya Bolum=1 satırının IslemId'si ile aynı Id'li Cari.Islemler satırı ↓ Kök neden: Transfer/üretim satırlarının IslemId'si Cari.Islemler'deki rastgele bir işlemle çakışır; hareket dökümünde yanlış hesap adı/tarih/tutar görü ↓ Etkilenen veri: Bolum≠0 stok hareketleri Cari.Islemler ile Id üzerinden ilişkilendirilmemeli.
Etkilenen veriBolum≠0 stok hareketleri Cari.Islemler ile Id üzerinden ilişkilendirilmemeli.
Etkilenen iş süreciStok.StokHaraketleri.IslemId ad alanı çakışması (Bolum 0 → Cari.Islemler.Id, Bolum 1 → Uretim, Bolum 2 → Transferler.Id)
Olasılık / etki / güvenYÜKSEK / S3 / 90
Bilinen ticketH-119 (transfer satırları yanlış tarihte)
Ticket sayısı0
Bilinen çözümH-119 teknik çözümü wikide: GetStokHareketleri'nin IsNull(I.InsertDate,H.Tarih) ve Bolum=2→'TRANSFER' etiketli sürümü; kaynak sürüm doğrulanmadı → [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Stok.StokHaraketleri H JOIN Cari.Islemler I ON I.Id=H.IslemId WHERE H.Bolum<>0
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Stok.StokHaraketleri H JOIN Cari.Islemler I ON I.Id=H.IslemId WHERE H.Bolum<>0
Test senaryosuGirdi: Stok.StokHaraketleri.IslemId, Bolum · Formül: GetStokHareketleri: Left Join Cari.Islemler I on H.IslemId=I.Id (Bolum süzgeci yok) → HesapAdi/Tarih/Fiyat/Tutar başka işlemden; GetTakozAdet: IslemId · Sınır: Bolum=2 veya Bolum=1 satırının IslemId'si ile aynı Id'li Cari.Islemler satırı
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: GetStokHareketleri: Left Join Cari.Islemler I on H.IslemId=I.Id (Bolum süzgeci yok) → HesapAdi/Tarih/Fiyat/Tutar başka işlemden; GetTakozAdet: IslemId<>@IslemId (Bolum süzgeci yok) · Kanıt: GetStokHareketleri: 'Left Join Cari.Islemler I on H.IslemId =I.Id' (Bolum koşulu yok)
İlişkili kayıtlarERR-OBS-005, ERR-OBS-076, ERR-POT-023, ERR-SIL-041, ERR-SIL-045, ERR-SIL-046
Wiki bağlantılarıH-119
SESSİZ MANTIK / HESAPLAMA ERR-SIL-050 — SLR-019 Pırlanta stok maliyeti = Tutar × FN.GetKur(BirimId) S3 · MOD-STOK · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-SEC-PIRLANTA-01, BR-STOK-004) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiPırlanta maliyeti NULL/yanlış birim kuruyla; bilanço PIRLANTA kalemi eksik
Teknik belirtiGetKur eşleşme bulamazsa NULL döner → Maliyet NULL (bilanço PIRLANTA kalemi Sum ile NULL'u atlar). PEŞİN tipte BirimId nakit stok kimliğidir, birim kimliği değil; yanlış birimin kuru uygulanır. Kur, işlem tarihinin değil bugünün kurudur; düzeltmede de bugünkü kurla yeniden yazılır. Uygulama tarafı (BR-MALIYET-003) farklı formül kullanır (CTR-SEC-PIRLANTA-01).
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 291-296; FN.GetKur
İlgili SQL nesneleriStok.StokHaraketleri, Cari.Islemler
Tetikleme koşuluIslemKodu=8 ve IslemTipi=1; BirimId kur listesinde yok; geçmiş tarihli düzeltme
Kök nedenGetKur eşleşme bulamazsa NULL döner → Maliyet NULL (bilanço PIRLANTA kalemi Sum ile NULL'u atlar). PEŞİN tipte BirimId nakit stok kimliğidir, birim kimliği değil; yanlış birimin kuru uygulanır. Kur, işlem tarihinin değil bugünün kurudur; düzeltmede de bugünkü kurla yeniden yazılır. Uygulama tarafı (BR-MALIYET-003) farklı formül kullanır (CTR-SEC-PIRLANTA-01).
Neden zinciriBelirti: Pırlanta maliyeti NULL/yanlış birim kuruyla; bilanço PIRLANTA kalemi eksik ↓ Teknik olay: Declare @Maliyet decimal(18,2) = @Tutar * Fn.GetKur(@BirimId) → StokHaraketleri.Maliyet ↓ Yakın neden: IslemKodu=8 ve IslemTipi=1; BirimId kur listesinde yok; geçmiş tarihli düzeltme ↓ Kök neden: GetKur eşleşme bulamazsa NULL döner → Maliyet NULL (bilanço PIRLANTA kalemi Sum ile NULL'u atlar). PEŞİN tipte BirimId nakit stok kimliğidir ↓ Etkilenen veri: StokTipi=4 hareketlerde Maliyet NULL olmamalı.
Etkilenen veriStokTipi=4 hareketlerde Maliyet NULL olmamalı.
Etkilenen iş süreciPırlanta stok maliyeti = Tutar × FN.GetKur(BirimId)
Olasılık / etki / güvenORTA / S3 / 75
Bilinen ticketCTR-SEC-PIRLANTA-01, BR-STOK-004
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT H.* FROM Stok.StokHaraketleri H WHERE H.StokTipi=4 AND (H.Maliyet IS NULL OR H.Maliyet=0); SELECT I.Id,I.IslemTipi,I.BirimId FROM Cari.Islemler I WHERE I.IslemKodu=8 AND I.IslemTipi=1 AND I.IsDeleted=0
Validation SQL (salt okunur)
SELECT H.* FROM Stok.StokHaraketleri H WHERE H.StokTipi=4 AND (H.Maliyet IS NULL OR H.Maliyet=0); SELECT I.Id,I.IslemTipi,I.BirimId FROM Cari.Islemler I WHERE I.IslemKodu=8 AND I.IslemTipi=1 AND I.IsDeleted=0
Test senaryosuGirdi: @Tutar, @BirimId (PEŞİN'de nakit stok Id'si, diğerlerinde birim Id'si), FN.GetKur (bugünün kur listesi) · Formül: Declare @Maliyet decimal(18,2) = @Tutar * Fn.GetKur(@BirimId) → StokHaraketleri.Maliyet · Sınır: IslemKodu=8 ve IslemTipi=1; BirimId kur listesinde yok; geçmiş tarihli düzeltme
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Declare @Maliyet decimal(18,2) = @Tutar * Fn.GetKur(@BirimId) → StokHaraketleri.Maliyet · Kanıt: 'Declare @Maliyet decimal(18,2) =@Tutar * Fn.GetKur(@BirimId)'
Wiki bağlantılarıBR-STOK-004 · BR-MALIYET-003
SESSİZ MANTIK / HESAPLAMA ERR-SIL-051 — SLR-020 Çeşni ve takoz stok listeleri InsertDate ile, stok hareketleri Tarih ile süzülür S3 · MOD-STOK · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-108 (devir kesimi), H-130) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS3 — ORTA
ModülMOD-STOK
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiTarihli bilanço/pozisyon farkı; devirde satırın yanlış döneme düşmesi
Teknik belirtiGeçmiş tarihe girilen çeşni/takoz işlemi bilançoda kayıt gününe, cari bakiyede işlem gününe düşer; tarihli bilanço iki kalemde farklı kesim kullanır ve tutmaz. Ayrıca trigger değişkeni @InsertDate aslında I.Tarih'i taşır (isim yanıltıcı); devir kesimi bu alana dayanır.
Kod dosyasıStok.GetCesniStoklari, Stok.GetTakozSubeStoklari (modules.json); AcceptTransaction satır 72-75 (@InsertDate = I.Tarih)
İlgili SQL nesneleriStok.GetCesniStoklari, Stok.GetTakozSubeStoklari, Cari.Islemler
SQL ObjectStok.GetCesniStoklari, Stok.GetTakozSubeStoklari (modules.json); AcceptTransaction satır 72-75 (@InsertDate = I.Tarih)
Tetikleme koşuluGeçmiş tarihli takoz/çeşni işlemi; devir kesim tarihine yakın kayıtlar
Kök nedenGeçmiş tarihe girilen çeşni/takoz işlemi bilançoda kayıt gününe, cari bakiyede işlem gününe düşer; tarihli bilanço iki kalemde farklı kesim kullanır ve tutmaz. Ayrıca trigger değişkeni @InsertDate aslında I.Tarih'i taşır (isim yanıltıcı); devir kesimi bu alana dayanır.
Neden zinciriBelirti: Tarihli bilanço/pozisyon farkı; devirde satırın yanlış döneme düşmesi ↓ Teknik olay: GetCesniStoklari/GetTakozSubeStoklari: CONVERT(date,InsertDate)<=@Tarih ; StokHaraketleri: Tarih<=@Tarih ; BakiyeIslem.T ↓ Yakın neden: Geçmiş tarihli takoz/çeşni işlemi; devir kesim tarihine yakın kayıtlar ↓ Kök neden: Geçmiş tarihe girilen çeşni/takoz işlemi bilançoda kayıt gününe, cari bakiyede işlem gününe düşer; tarihli bilanço iki kalemde farklı kesim ↓ Etkilenen veri: Stok ve bakiye türetimleri aynı tarih alanını (Tarih) esas almalı.
Etkilenen veriStok ve bakiye türetimleri aynı tarih alanını (Tarih) esas almalı.
Etkilenen iş süreciÇeşni ve takoz stok listeleri InsertDate ile, stok hareketleri Tarih ile süzülür
Olasılık / etki / güvenORTA / S3 / 85
Bilinen ticketH-108 (devir kesimi), H-130
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (0,14) AND CONVERT(date,InsertDate)<>Tarih
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (0,14) AND CONVERT(date,InsertDate)<>Tarih
Test senaryosuGirdi: Cari.Islemler.InsertDate vs Tarih; Stok.StokHaraketleri.Tarih · Formül: GetCesniStoklari/GetTakozSubeStoklari: CONVERT(date,InsertDate)<=@Tarih ; StokHaraketleri: Tarih<=@Tarih ; BakiyeIslem.Tarih = I.Tarih · Sınır: Geçmiş tarihli takoz/çeşni işlemi; devir kesim tarihine yakın kayıtlar
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: GetCesniStoklari/GetTakozSubeStoklari: CONVERT(date,InsertDate)<=@Tarih ; StokHaraketleri: Tarih<=@Tarih ; BakiyeIslem.Tarih = I.Tarih · Kanıt: GetCesniStoklari: 'AND CONVERT(date, InsertDate) <= @Tarih' ; GetTakozSubeStoklari: 'Convert(date,I.InsertDate)<=@Tarih'
Wiki bağlantılarıH-108 · H-130
SESSİZ MANTIK / HESAPLAMA ERR-SIL-052 — SLR-021 Nakit tip 10 (PARİTE) satırı doğrudan kaydedilirse ters işaretli bakiye ve BirimId=0 satırı S2 · MOD-CARI · Gözlemlendi: EVET · PF-023 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-027, BR-YON-004, H-080) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-023 Birim (para birimi) tanımlama / listede görünmüyor / çarpan / çift birim
Kullanıcı belirtisiMüşteri TL bakiyesi ters işaretli; görünmeyen BirimId=0 bakiye satırı
Teknik belirtiEkran PARİTE'yi yeni kayıtta iki NORMAL bacağa çevirir; ancak mevcut kayıt düzenlenirken (RecordId≠0) tip PARİTE seçilirse satır IslemTipi=10 ile kaydedilir. Trigger bu satır için BirimId=0 (Birimler'de yok) bir bakiye satırı ve normal nakit kuralının tersi işaretli tutar satırı yazar. Bakiye kartı BirimId=0 satırını göstermez; ToplamBakiye/bilanço Carpan NULL nedeniyle atlar; tutar satırı ise müşteri bakiyesini ters yöne çevirir.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 318-330, 421-425; Controls/Islem Ekranı/Ekran/iFNakit.vb:91-96, 323-330
İlgili SQL nesneleriCari.Islemler, Cari.BakiyeIslem
Tetikleme koşuluIslemTipi=10 olarak kaydedilmiş nakit satırı (düzeltme yolu)
Kök nedenEkran PARİTE'yi yeni kayıtta iki NORMAL bacağa çevirir; ancak mevcut kayıt düzenlenirken (RecordId≠0) tip PARİTE seçilirse satır IslemTipi=10 ile kaydedilir. Trigger bu satır için BirimId=0 (Birimler'de yok) bir bakiye satırı ve normal nakit kuralının tersi işaretli tutar satırı yazar. Bakiye kartı BirimId=0 satırını göstermez; ToplamBakiye/bilanço Carpan NULL nedeniyle atlar; tutar satırı ise müşteri bakiyesini ters yöne çevirir.
Neden zinciriBelirti: Müşteri TL bakiyesi ters işaretli; görünmeyen BirimId=0 bakiye satırı ↓ Teknik olay: satır 318-330: Insert BakiyeIslem(BirimId=@BakiyeId, Bakiye=±@Miktar) ; satır 421-425: Insert BakiyeIslem(BirimId=@Birim ↓ Yakın neden: IslemTipi=10 olarak kaydedilmiş nakit satırı (düzeltme yolu) ↓ Kök neden: Ekran PARİTE'yi yeni kayıtta iki NORMAL bacağa çevirir; ancak mevcut kayıt düzenlenirken (RecordId≠0) tip PARİTE seçilirse satır IslemTipi=1 ↓ Etkilenen veri: Cari.BakiyeIslem.BirimId ∈ Sistem.Birimler.Id ∪ {-1} olmalı; 0/NULL olmamalı.
Etkilenen veriCari.BakiyeIslem.BirimId ∈ Sistem.Birimler.Id ∪ {-1} olmalı; 0/NULL olmamalı.
Etkilenen iş süreciNakit tip 10 (PARİTE) satırı doğrudan kaydedilirse ters işaretli bakiye ve BirimId=0 satırı
Olasılık / etki / güvenDÜŞÜK / S2 / 65
Bilinen ticketCTR-027, BR-YON-004, H-080
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=3 AND IslemTipi=10; SELECT * FROM Cari.BakiyeIslem WHERE BirimId=0 OR BirimId IS NULL
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=3 AND IslemTipi=10; SELECT * FROM Cari.BakiyeIslem WHERE BirimId=0 OR BirimId IS NULL
Test senaryosuGirdi: IslemKodu=3, IslemTipi=10, BakiyeId (nakitte daima 0 – Cari.IslemEx.vb:291-303), Tutar · Formül: satır 318-330: Insert BakiyeIslem(BirimId=@BakiyeId, Bakiye=±@Miktar) ; satır 421-425: Insert BakiyeIslem(BirimId=@BirimId, Bakiye=@Tutar*-1) · Sınır: IslemTipi=10 olarak kaydedilmiş nakit satırı (düzeltme yolu)
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: satır 318-330: Insert BakiyeIslem(BirimId=@BakiyeId, Bakiye=±@Miktar) ; satır 421-425: Insert BakiyeIslem(BirimId=@BirimId, Bakiye=@Tutar*-1) · Kanıt: Cari.IslemEx.vb:303 'Case tIslemKodu.NAKIT … Return 0' ; trigger satır 323 'Values(…,@BakiyeId,@Miktar *-1)'
Wiki bağlantılarıBR-YON-004 · H-080
SESSİZ MANTIK / HESAPLAMA ERR-SIL-053 — SLR-022 Çeşni (IslemKodu=14) bakiye satırları yönden bağımsız pozitif yazılır S3 · MOD-CARI · Gözlemlendi: EVET · PF-030 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: BR-BAKIYE-004, BR-HESAP-020, CTR-039) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-030 Cari bakiye / ekstre tutmuyor (bakiye yanlış, ters, birden değişti)
Kullanıcı belirtisiÇeşni girişinde müşteri alacaklanacağına borçlanır
Teknik belirtiEkran her zaman ÇIKIŞ yazdığı için sonuç doğru görünür; ancak satır Düzelt ile tür değiştirilirse ya da seri/sonradan eklenen bir yol GİRİŞ çeşnisi yazarsa bakiye yine borç (+) olarak kalır. Ayrıca çeşni satırı IslemKodu∉{0,1,2,4,5,6,9} olduğu için 'diğer stok işlemi' bloğuna da girer; Tutar≠0 ise ek bir tutar satırı yazılır.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 311-317; Controls/Islem Ekranı/Ekran/iFCesni.vb:60-69 (IslemTuru daima CIKIS)
İlgili SQL nesneleriCari.Islemler
Tetikleme koşuluIslemKodu=14 ve IslemTuru∈{0,2,4}; Tutar≠0 çeşni satırı
Kök nedenEkran her zaman ÇIKIŞ yazdığı için sonuç doğru görünür; ancak satır Düzelt ile tür değiştirilirse ya da seri/sonradan eklenen bir yol GİRİŞ çeşnisi yazarsa bakiye yine borç (+) olarak kalır. Ayrıca çeşni satırı IslemKodu∉{0,1,2,4,5,6,9} olduğu için 'diğer stok işlemi' bloğuna da girer; Tutar≠0 ise ek bir tutar satırı yazılır.
Neden zinciriBelirti: Çeşni girişinde müşteri alacaklanacağına borçlanır ↓ Teknik olay: Values(…,@HasBirimId,@Miktar * @AuMilyem) ; Values(…,@GumBirimId,@Miktar * @AgMilyem) (IslemTuru'na göre işaret yok) ↓ Yakın neden: IslemKodu=14 ve IslemTuru∈{0,2,4}; Tutar≠0 çeşni satırı ↓ Kök neden: Ekran her zaman ÇIKIŞ yazdığı için sonuç doğru görünür; ancak satır Düzelt ile tür değiştirilirse ya da seri/sonradan eklenen bir yol GİRİŞ ↓ Etkilenen veri: IslemKodu=14 satırlarında IslemTuru=1 ve Tutar=0 olmalı.
Etkilenen veriIslemKodu=14 satırlarında IslemTuru=1 ve Tutar=0 olmalı.
Etkilenen iş süreciÇeşni (IslemKodu=14) bakiye satırları yönden bağımsız pozitif yazılır
Olasılık / etki / güvenDÜŞÜK / S3 / 70
Bilinen ticketBR-BAKIYE-004, BR-HESAP-020, CTR-039
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=14 AND (IslemTuru<>1 OR ISNULL(Tutar,0)<>0)
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=14 AND (IslemTuru<>1 OR ISNULL(Tutar,0)<>0)
Test senaryosuGirdi: IslemKodu=14, Miktar, AuMilyem, AgMilyem, IslemTuru · Formül: Values(…,@HasBirimId,@Miktar * @AuMilyem) ; Values(…,@GumBirimId,@Miktar * @AgMilyem) (IslemTuru'na göre işaret yok) · Sınır: IslemKodu=14 ve IslemTuru∈{0,2,4}; Tutar≠0 çeşni satırı
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Values(…,@HasBirimId,@Miktar * @AuMilyem) ; Values(…,@GumBirimId,@Miktar * @AgMilyem) (IslemTuru'na göre işaret yok) · Kanıt: satır 314: 'Values(@InsertDate,@HesapType,@HesapId,@KasaId,@IslemId,@HasBirimId,@Miktar * @AuMilyem )'
Wiki bağlantılarıBR-BAKIYE-004 · BR-HESAP-020
SESSİZ MANTIK / HESAPLAMA ERR-SIL-054 — SLR-023 Raporsuz takoz bakiyesi: XRF milyemi 0 ise TAKOZ (-1) birimine miktar; değerleme 0,6 varsayımı S3 · MOD-CARI · Gözlemlendi: EVET · PF-004 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-SYM-TAKOZ-01, BR-BAKIYE-008/009, GAP-TAKOZ-FIRE, H-117, H-130) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-004 Rapor tasarımı / yeni rapor / sütun ekleme / bakiye ekstresi düzenleme (talep)
Kullanıcı belirtisiPozisyon 0, bilanço 0,6, bakiye kartı miktar bazlı – üç rapor tutmaz
Teknik belirtiAynı raporsuz takoz üç yerde üç farklı has değeriyle değerlenir (0; 0,6; kart Miktar*0,6 vs bakiye Miktar). Rapor geldiğinde işlem düzeltilmezse bakiye TAKOZ satırında kalır; düzeltme (Geri Al/Düzelt) anındaki XRF değerleri orijinal kayıttan farklıysa bakiye yeniden üretimde değişir.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 452-458, 554-558; Cari.BakiyeIslem.NetBakiye computed; Bakiye.GetBakiye; Pozisyon.Write; Bilanco.OzetBilanco
İlgili SQL nesneleriCari.BakiyeIslem, Stok.Takoz, Cari.Islemler
Tetikleme koşuluIsRapor=0 ve XRF milyemleri 0; rapor sonrası düzeltilmemiş takoz; XRF sonradan güncellenen takoz
Kök nedenAynı raporsuz takoz üç yerde üç farklı has değeriyle değerlenir (0; 0,6; kart Miktar*0,6 vs bakiye Miktar). Rapor geldiğinde işlem düzeltilmezse bakiye TAKOZ satırında kalır; düzeltme (Geri Al/Düzelt) anındaki XRF değerleri orijinal kayıttan farklıysa bakiye yeniden üretimde değişir.
Neden zinciriBelirti: Pozisyon 0, bilanço 0,6, bakiye kartı miktar bazlı – üç rapor tutmaz ↓ Teknik olay: IsRapor=0 ⇒ @AuMilyem=XRFAuMilyem ; (@AuMilyem=0 And @AgMilyem=0) ⇒ Insert BakiyeIslem(BirimId=-1, Bakiye=∓Miktar) ; Net ↓ Yakın neden: IsRapor=0 ve XRF milyemleri 0; rapor sonrası düzeltilmemiş takoz; XRF sonradan güncellenen takoz ↓ Kök neden: Aynı raporsuz takoz üç yerde üç farklı has değeriyle değerlenir (0; 0,6; kart Miktar*0,6 vs bakiye Miktar). Rapor geldiğinde işlem düzeltilm ↓ Etkilenen veri: Raporlu (IsRapor=1) takozun işlemlerinde BirimId=-1 bakiye satırı kalmamalı; raporsuz takoz değerlem
Etkilenen veriRaporlu (IsRapor=1) takozun işlemlerinde BirimId=-1 bakiye satırı kalmamalı; raporsuz takoz değerleme katsayısı tüm raporlarda aynı olmalı.
Etkilenen iş süreciRaporsuz takoz bakiyesi: XRF milyemi 0 ise TAKOZ (-1) birimine miktar; değerleme 0,6 varsayımı
Olasılık / etki / güvenORTA / S3 / 85
Bilinen ticketCTR-SYM-TAKOZ-01, BR-BAKIYE-008/009, GAP-TAKOZ-FIRE, H-117, H-130
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT HesapId,SUM(Bakiye) FROM Cari.BakiyeIslem WHERE BirimId=-1 GROUP BY HesapId HAVING SUM(Bakiye)<>0; SELECT T.Id FROM Stok.Takoz T WHERE T.IsRapor=1 AND EXISTS(SELECT 1 FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.StokId=T.Id AND I.IslemKodu=0 AND B.BirimId=-1)
Validation SQL (salt okunur)
SELECT HesapId,SUM(Bakiye) FROM Cari.BakiyeIslem WHERE BirimId=-1 GROUP BY HesapId HAVING SUM(Bakiye)<>0; SELECT T.Id FROM Stok.Takoz T WHERE T.IsRapor=1 AND EXISTS(SELECT 1 FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.StokId=T.Id AND I.IslemKodu=0 AND B.BirimId=-1)
Test senaryosuGirdi: Stok.Takoz.XRFAuMilyem/XRFAgMilyem, IsRapor, Miktar(+CesniMiktar girişte) · Formül: IsRapor=0 ⇒ @AuMilyem=XRFAuMilyem ; (@AuMilyem=0 And @AgMilyem=0) ⇒ Insert BakiyeIslem(BirimId=-1, Bakiye=∓Miktar) ; NetBakiye = Bakiye*0.6 ; Bakiye.G · Sınır: IsRapor=0 ve XRF milyemleri 0; rapor sonrası düzeltilmemiş takoz; XRF sonradan güncellenen takoz
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
NotlarÇözüm adayı: ürün kararı: raporsuz takoz has varsayımı
KaynakSessiz risk analizi · Formül: IsRapor=0 ⇒ @AuMilyem=XRFAuMilyem ; (@AuMilyem=0 And @AgMilyem=0) ⇒ Insert BakiyeIslem(BirimId=-1, Bakiye=∓Miktar) ; NetBakiye = Bakiye*0.6 ; Bakiye.GetBakiye: Case When XRFAuMilyem=0 Then 0.6 ; Pozis · Kanıt: satır 556-557: 'Values(…,-1,Case When @IslemTuru=0 Then 0-@Miktar Else @Miktar End)'; Pozisyon.Write: 'Case When R='False' Then Miktar * 0'
Wiki bağlantılarıSYM-TAKOZ · BR-BAKIYE-008 · H-117 · H-130
SESSİZ MANTIK / HESAPLAMA ERR-SIL-055 — SLR-024 İptalin geri alınması / mutabakat gibi her UPDATE'te bakiye ve stoğun güncel referans verisiyle yeniden üretilmesi S3 · MOD-CARI · Gözlemlendi: EVET · PF-030 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-105 (bakiye birden değişti), BR-BAKIYE-014) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-030 Cari bakiye / ekstre tutmuyor (bakiye yanlış, ters, birden değişti)
Kullanıcı belirtisiKimse işlem değiştirmeden bakiye değişir (H-105'in kod bağlantısı)
Teknik belirtiTüretilmiş kayıtlar işlem satırındaki kur fotoğrafıyla değil o anki referans verilerle (takoz XRF milyemi, Settings sembolleri, pırlanta için bugünkü kur) yeniden hesaplanır. 'Geri Alındı', mutabakat, hesap birleştirme gibi işlem tutarını değiştirmeyen güncellemelerde bile bakiye satırları değişebilir; Cari.Hesaplar.LastDate güncellenir. Sonuç, tarihi bakiye ekstresinde açıklanamayan değişikliktir (History'de işlem alanları aynı görünür).
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 256-260, 293, 452-455; iScreen.vb:1136 (F12 mutabakat UPDATE)
İlgili SQL nesneleriCari.Hesaplar, Cari.BakiyeIslem, Cari.Islemler
Tetikleme koşuluXRF milyemi/Settings/kur değiştikten sonra eski işlemin herhangi bir nedenle güncellenmesi
Kök nedenTüretilmiş kayıtlar işlem satırındaki kur fotoğrafıyla değil o anki referans verilerle (takoz XRF milyemi, Settings sembolleri, pırlanta için bugünkü kur) yeniden hesaplanır. 'Geri Alındı', mutabakat, hesap birleştirme gibi işlem tutarını değiştirmeyen güncellemelerde bile bakiye satırları değişebilir; Cari.Hesaplar.LastDate güncellenir. Sonuç, tarihi bakiye ekstresinde açıklanamayan değişikliktir (History'de işlem alanları aynı görünür).
Neden zinciriBelirti: Kimse işlem değiştirmeden bakiye değişir (H-105'in kod bağlantısı) ↓ Teknik olay: Her UPDATE'te: Delete BakiyeIslem/StokHaraketleri(Bolum=0) → yeniden Insert (XRF milyem, HasBirimId, FN.GetKur bugünkü d ↓ Yakın neden: XRF milyemi/Settings/kur değiştikten sonra eski işlemin herhangi bir nedenle güncellenmesi ↓ Kök neden: Türetilmiş kayıtlar işlem satırındaki kur fotoğrafıyla değil o anki referans verilerle (takoz XRF milyemi, Settings sembolleri, pırlanta içi ↓ Etkilenen veri: Bir işlemin BakiyeIslem toplamı, işlem alanları değişmedikçe (History 'Düzeltme' yoksa) sabit kalmal
Etkilenen veriBir işlemin BakiyeIslem toplamı, işlem alanları değişmedikçe (History 'Düzeltme' yoksa) sabit kalmalı.
Etkilenen iş süreciİptalin geri alınması / mutabakat gibi her UPDATE'te bakiye ve stoğun güncel referans verisiyle yeniden üretilmesi
Olasılık / etki / güvenORTA / S3 / 75
Bilinen ticketH-105 (bakiye birden değişti), BR-BAKIYE-014
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT B.IslemId FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.LastModify IS NULL AND I.MTarih IS NOT NULL – mutabakat yapılmış işlemlerde BakiyeIslem toplamı ile History'deki orijinal Miktar×AuMilyem karşılaştırılır
Validation SQL (salt okunur)
SELECT B.IslemId FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.LastModify IS NULL AND I.MTarih IS NOT NULL – mutabakat yapılmış işlemlerde BakiyeIslem toplamı ile History'deki orijinal Miktar×AuMilyem karşılaştırılır
Test senaryosuGirdi: Inserted (herhangi bir kolon güncellemesi), Stok.Takoz XRF milyemleri, Sistem.Settings sembolleri, Fn.GetKur(bugün) · Formül: Her UPDATE'te: Delete BakiyeIslem/StokHaraketleri(Bolum=0) → yeniden Insert (XRF milyem, HasBirimId, FN.GetKur bugünkü değerlerle) · Sınır: XRF milyemi/Settings/kur değiştikten sonra eski işlemin herhangi bir nedenle güncellenmesi
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Her UPDATE'te: Delete BakiyeIslem/StokHaraketleri(Bolum=0) → yeniden Insert (XRF milyem, HasBirimId, FN.GetKur bugünkü değerlerle) · Kanıt: satır 258: 'Delete From Cari.BakiyeIslem Where IslemId =@IslemId' her INSERT/UPDATE olayında koşulsuz çalışır
Wiki bağlantılarıH-105 · BR-BAKIYE-014
SESSİZ MANTIK / HESAPLAMA ERR-SIL-056 — SLR-025 Fiş numarası üretimi MAX(FisNo)+1 (silinmemişler) ve fiş bazlı toplu iptal S2 · MOD-CARI · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-102, CTR-012, CTR-016) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Kullanıcı belirtisiYanlış işlemlerin toplu iptali (bakiye/stok geri alınır); fiş bakiyesi (GetFisBakiye FisNo<=) yanlış
Teknik belirti(a) İki kullanıcı aynı anda aynı fiş numarasını alır (yarış). (b) Son fişin tüm satırları iptal edilince numara yeniden kullanılır; iptal edilen fişle yeni fiş aynı numarayı paylaşır. (c) Fiş-No ile iptal, tarih süzgeci olmadan kasadaki aynı numaralı tüm satırları (farklı günler dahil) sessizce iptal eder; açıklama/onay/karşı bacak kontrolü yapmaz.
Kod dosyasıClass/Ext/Cari.IslemEx.vb:256-260; Controls/Islem Ekranı/Base Control/iScreen.vb:720-728
İlgili SQL nesneleriCari.Islemler
Tetikleme koşuluEşzamanlı kayıt; son fişin iptali; aynı FisNo'ya sahip farklı günlerdeki satırlar
Kök neden(a) İki kullanıcı aynı anda aynı fiş numarasını alır (yarış). (b) Son fişin tüm satırları iptal edilince numara yeniden kullanılır; iptal edilen fişle yeni fiş aynı numarayı paylaşır. (c) Fiş-No ile iptal, tarih süzgeci olmadan kasadaki aynı numaralı tüm satırları (farklı günler dahil) sessizce iptal eder; açıklama/onay/karşı bacak kontrolü yapmaz.
Neden zinciriBelirti: Yanlış işlemlerin toplu iptali (bakiye/stok geri alınır); fiş bakiyesi (GetFisBakiye FisNo<=) yanlış ↓ Teknik olay: GetNewFisNo = Val(Select Max(FisNo) From Cari.Islemler Where IsDeleted='False') + 1 ; onIptalFisNoClick: Update Cari.Isl ↓ Yakın neden: Eşzamanlı kayıt; son fişin iptali; aynı FisNo'ya sahip farklı günlerdeki satırlar ↓ Kök neden: (a) İki kullanıcı aynı anda aynı fiş numarasını alır (yarış). (b) Son fişin tüm satırları iptal edilince numara yeniden kullanılır; iptal ed ↓ Etkilenen veri: Aynı kasada aynı FisNo yalnız tek bir güne ve tek bir hesaba ait olmalı.
Etkilenen veriAynı kasada aynı FisNo yalnız tek bir güne ve tek bir hesaba ait olmalı.
Etkilenen iş süreciFiş numarası üretimi MAX(FisNo)+1 (silinmemişler) ve fiş bazlı toplu iptal
Olasılık / etki / güvenORTA / S2 / 85
Bilinen ticketH-102, CTR-012, CTR-016
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT FisNo,KasaId,COUNT(DISTINCT Tarih) FROM Cari.Islemler GROUP BY FisNo,KasaId HAVING COUNT(DISTINCT Tarih)>1; SELECT FisNo,COUNT(DISTINCT HesapId) FROM Cari.Islemler WHERE IsDeleted=0 GROUP BY FisNo HAVING COUNT(DISTINCT HesapId)>1
Validation SQL (salt okunur)
SELECT FisNo,KasaId,COUNT(DISTINCT Tarih) FROM Cari.Islemler GROUP BY FisNo,KasaId HAVING COUNT(DISTINCT Tarih)>1; SELECT FisNo,COUNT(DISTINCT HesapId) FROM Cari.Islemler WHERE IsDeleted=0 GROUP BY FisNo HAVING COUNT(DISTINCT HesapId)>1
Test senaryosuGirdi: Cari.Islemler.FisNo (unique değil, IX_FisNo), IsDeleted; Program.KasaId · Formül: GetNewFisNo = Val(Select Max(FisNo) From Cari.Islemler Where IsDeleted='False') + 1 ; onIptalFisNoClick: Update Cari.Islemler Set IsDeleted='True' Whe · Sınır: Eşzamanlı kayıt; son fişin iptali; aynı FisNo'ya sahip farklı günlerdeki satırlar
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: GetNewFisNo = Val(Select Max(FisNo) From Cari.Islemler Where IsDeleted='False') + 1 ; onIptalFisNoClick: Update Cari.Islemler Set IsDeleted='True' Where FisNo=@FisNo and KasaId=@KasaId · Kanıt: iScreen.vb:723: "Update Cari.Islemler Set IsDeleted='True' Where FisNo='" & FisNo & "' and KasaId='" & Program.KasaId & "'"
İlişkili kayıtlarERR-POT-002, ERR-POT-008, ERR-SIL-001, ERR-SIL-002, ERR-SIL-003, ERR-SIL-028, ERR-SIL-059, ERR-SIL-062
Wiki bağlantılarıH-102
SESSİZ MANTIK / HESAPLAMA ERR-SIL-057 — SLR-026 Çift kayıt (duplicate posting) – zaman aşımı/ağ kopması sonrası tekrar kayıt S2 · MOD-CARI · Gözlemlendi: EVET · PF-071 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: TD-01 teması; PRB-BAGLANTI-000) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE15 — Duplicate / Çift İşlem
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-071 Bakiye ekstresi / bilanço / rapor zaman aşımı (timeout)
Kullanıcı belirtisiAynı işlem iki kez bakiye ve stoğa yazılır
Teknik belirtiSunucu INSERT'i işledikten sonra yanıt istemciye ulaşmazsa (timeout 30 sn, ağ) uygulama hata gösterir ve kayıt başarısız sanılır; kullanıcı tekrar F2 basar. RefNo her nesnede yeni GUID olduğundan ve FisNo/hesap/tutar için benzersizlik yoktur, ikinci satır sessizce kabul edilir.
Kod dosyasıClass/Dao/Islem/Cari.Islem.vb:694-709; Class/Module/InternalDb.vb:69-81; dbclean/indexes.json (Cari.Islemler unique yalnız PK)
İlgili SQL nesneleriCari.Islemler
Tetikleme koşuluAğ kesintisi/uzun tetikleyici süresi (AcceptTransaction cursor + GetGerekliEvraklar) sırasında kayıt
Kök nedenSunucu INSERT'i işledikten sonra yanıt istemciye ulaşmazsa (timeout 30 sn, ağ) uygulama hata gösterir ve kayıt başarısız sanılır; kullanıcı tekrar F2 basar. RefNo her nesnede yeni GUID olduğundan ve FisNo/hesap/tutar için benzersizlik yoktur, ikinci satır sessizce kabul edilir.
Neden zinciriBelirti: Aynı işlem iki kez bakiye ve stoğa yazılır ↓ Teknik olay: Try RecId=db.ExecuteScalar() Catch … End Try ; If RecId>0 Then Id=RecId … Else Return False ↓ Yakın neden: Ağ kesintisi/uzun tetikleyici süresi (AcceptTransaction cursor + GetGerekliEvraklar) sırasında kayıt ↓ Kök neden: Sunucu INSERT'i işledikten sonra yanıt istemciye ulaşmazsa (timeout 30 sn, ağ) uygulama hata gösterir ve kayıt başarısız sanılır; kullanıcı ↓ Etkilenen veri: Aynı hesap/tarih/kod/yön/miktar/tutar ile 60 sn içinde ikinci aktif işlem olmamalı.
Etkilenen veriAynı hesap/tarih/kod/yön/miktar/tutar ile 60 sn içinde ikinci aktif işlem olmamalı.
Etkilenen iş süreciÇift kayıt (duplicate posting) – zaman aşımı/ağ kopması sonrası tekrar kayıt
Olasılık / etki / güvenORTA / S2 / 75
Bilinen ticketTD-01 teması; PRB-BAGLANTI-000
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT a.Id,b.Id FROM Cari.Islemler a JOIN Cari.Islemler b ON b.Id>a.Id AND b.HesapId=a.HesapId AND b.Tarih=a.Tarih AND b.IslemKodu=a.IslemKodu AND b.IslemTuru=a.IslemTuru AND ISNULL(b.Kodu,'')=ISNULL(a.Kodu,'') AND b.Miktar=a.Miktar AND b.Tutar=a.Tutar AND ABS(DATEDIFF(second,a.InsertDate,b.InsertDate))<=60 WHERE a.IsDeleted=0 AND b.IsDeleted=0
Validation SQL (salt okunur)
SELECT a.Id,b.Id FROM Cari.Islemler a JOIN Cari.Islemler b ON b.Id>a.Id AND b.HesapId=a.HesapId AND b.Tarih=a.Tarih AND b.IslemKodu=a.IslemKodu AND b.IslemTuru=a.IslemTuru AND ISNULL(b.Kodu,'')=ISNULL(a.Kodu,'') AND b.Miktar=a.Miktar AND b.Tutar=a.Tutar AND ABS(DATEDIFF(second,a.InsertDate,b.InsertDate))<=60 WHERE a.IsDeleted=0 AND b.IsDeleted=0
Test senaryosuGirdi: Insert (InternalDb.ExecuteScalar → hata MsgBox, RecId=0), RefNo (her nesnede yeni GUID), unique index yok · Formül: Try RecId=db.ExecuteScalar() Catch … End Try ; If RecId>0 Then Id=RecId … Else Return False · Sınır: Ağ kesintisi/uzun tetikleyici süresi (AcceptTransaction cursor + GetGerekliEvraklar) sırasında kayıt
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Try RecId=db.ExecuteScalar() Catch … End Try ; If RecId>0 Then Id=RecId … Else Return False · Kanıt: InternalDb.ExecuteScalar: 'Catch ex As Exception MsgBox(ex.Message)' → Result Nothing; Cari.Islem.vb:702 'If RecId > 0'
İlişkili kayıtlarERR-POT-009, ERR-SIL-035, ERR-SIL-036, ERR-SIL-058, ERR-SIL-059
Wiki bağlantılarıTD-01 · PRB-BAGLANTI-000
SESSİZ MANTIK / HESAPLAMA ERR-SIL-058 — SLR-027 Çok adımlı kayıt zincirlerinde transaction yokluğu (Insert→RsAktar, Save→SendTo karşı bacak, parite iki bacak, Update→Takoz.RaporYaz) S2 · MOD-CARI · Gözlemlendi: EVET · PF-004 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: TD-01, H-106, H-063, BR-VIRMAN-002) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-004 Rapor tasarımı / yeni rapor / sütun ekleme / bakiye ekstresi düzenleme (talep)
Kullanıcı belirtisiİki hesabın bakiye toplamı sıfırlanmaz; parite ikinci döviz stoğu değişmez
Teknik belirtiİlk bacak yazıldıktan sonra ikinci adım (karşı hesap limiti/evrak/pasif şube nedeniyle trigger reddi, ağ) başarısız olursa uyarı çıkar ama ilk bacak kalır: virman/parite/transfer tek taraflı, RsAktar eksik. İptalde RefNo+IslemKodu ile karşı bacak aranır; farklı IslemKodu'lu eşler (yoksa) bulunmaz.
Kod dosyasıClass/Dao/Islem/Cari.Islem.vb:694-700, 987-993; Controls/Islem Ekranı/Ekran/iFormBase.vb:218-264; iFNakit.vb:180-300
İlgili SQL nesneleriCari.Islemler
Tetikleme koşuluKarşı hesapta zorunlu evrak eksik, limit aşımı, şube pasif; ağ kesintisi
Kök nedenİlk bacak yazıldıktan sonra ikinci adım (karşı hesap limiti/evrak/pasif şube nedeniyle trigger reddi, ağ) başarısız olursa uyarı çıkar ama ilk bacak kalır: virman/parite/transfer tek taraflı, RsAktar eksik. İptalde RefNo+IslemKodu ile karşı bacak aranır; farklı IslemKodu'lu eşler (yoksa) bulunmaz.
Neden zinciriBelirti: İki hesabın bakiye toplamı sıfırlanmaz; parite ikinci döviz stoğu değişmez ↓ Teknik olay: RecId = db.ExecuteScalar() ; If RSAktar … db.ExecuteNonQuery("Cari.RSAktar " & RecId) ; … SendTo: I.Id=0; I.HesapId=karş ↓ Yakın neden: Karşı hesapta zorunlu evrak eksik, limit aşımı, şube pasif; ağ kesintisi ↓ Kök neden: İlk bacak yazıldıktan sonra ikinci adım (karşı hesap limiti/evrak/pasif şube nedeniyle trigger reddi, ağ) başarısız olursa uyarı çıkar ama i ↓ Etkilenen veri: Virman (IslemKodu=11) RefNo'su tam iki aktif satır taşımalı; parite birinci bacağının (VaryantId=-1)
Etkilenen veriVirman (IslemKodu=11) RefNo'su tam iki aktif satır taşımalı; parite birinci bacağının (VaryantId=-1) ikinci bacağı (VaryantId=Id) bulunmalı.
Etkilenen iş süreciÇok adımlı kayıt zincirlerinde transaction yokluğu (Insert→RsAktar, Save→SendTo karşı bacak, parite iki bacak, Update→Takoz.RaporYaz)
Olasılık / etki / güvenORTA / S2 / 90
Bilinen ticketTD-01, H-106, H-063, BR-VIRMAN-002
Ticket sayısı0
Bilinen çözümTD-01 önerisi (tek SqlTransaction/TransactionScope) belgelenmiş, uygulanmamış → [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT RefNo,COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=11 GROUP BY RefNo HAVING COUNT(*)<>2; parite: SELECT a.Id FROM Cari.Islemler a WHERE a.IsDeleted=0 AND a.IslemKodu=3 AND a.VaryantId=-1 AND NOT EXISTS(SELECT 1 FROM Cari.Islemler b WHERE b.VaryantId=a.Id AND b.IsDeleted=0)
Validation SQL (salt okunur)
SELECT RefNo,COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=11 GROUP BY RefNo HAVING COUNT(*)<>2; parite: SELECT a.Id FROM Cari.Islemler a WHERE a.IsDeleted=0 AND a.IslemKodu=3 AND a.VaryantId=-1 AND NOT EXISTS(SELECT 1 FROM Cari.Islemler b WHERE b.VaryantId=a.Id AND b.IsDeleted=0)
Test senaryosuGirdi: Cari.Islem.Insert/Update, iFormBase.SendTo, iFNakit.SaveCashTransaction · Formül: RecId = db.ExecuteScalar() ; If RSAktar … db.ExecuteNonQuery("Cari.RSAktar " & RecId) ; … SendTo: I.Id=0; I.HesapId=karşı; I.IslemTuru=GetKarsiIslemTu · Sınır: Karşı hesapta zorunlu evrak eksik, limit aşımı, şube pasif; ağ kesintisi
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: RecId = db.ExecuteScalar() ; If RSAktar … db.ExecuteNonQuery("Cari.RSAktar " & RecId) ; … SendTo: I.Id=0; I.HesapId=karşı; I.IslemTuru=GetKarsiIslemTuru; I.Save · Kanıt: Cari.Islem.vb:1055 karşı bacak sorgusu 'RefNo=… And IslemKodu=…'; iFormBase.vb:238 'Karşı Hesaba Transfer Edilemedi. Lütfen İşlemi Manuel Olarak Gerçekleştiriniz.'
İlişkili kayıtlarERR-SIL-035, ERR-SIL-036, ERR-SIL-057
Wiki bağlantılarıTD-01 · H-106 · H-063 · BR-VIRMAN-002
SESSİZ MANTIK / HESAPLAMA ERR-SIL-059 — SLR-028 Cari.UpdateTransaction – çok satırlı UPDATE'te tek satır değişkeni; Mutabakat güncellemesi history üretmez S3 · MOD-CARI · Gözlemlendi: HAYIR · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Kullanıcı belirtisiBelge havuzunda iptal edilmiş işlem 'F' durumunda kalır; history eksik
Teknik belirtiRefNo/FisNo ile toplu iptalde yalnız rastgele bir satırın IslemDetaylari kaydı silinir/EIPTAL yapılır; diğer satırların belge detayları aktif kalır (belge havuzu görünümü iptal edilmiş işlemi belgeli sayabilir). Mutabakat ve Mutabakat ile birlikte başka alan değişen güncellemelerde hiç history yazılmaz.
Kod dosyasıCari.UpdateTransaction (modules.json)
İlgili SQL nesneleriCari.UpdateTransaction, Cari.IslemDetaylari, Cari.Islemler, Cari.History
SQL ObjectCari.UpdateTransaction (modules.json)
Tetikleme koşuluBirden çok satırı etkileyen UPDATE; Mutabakat kolonunu içeren UPDATE
Kök nedenRefNo/FisNo ile toplu iptalde yalnız rastgele bir satırın IslemDetaylari kaydı silinir/EIPTAL yapılır; diğer satırların belge detayları aktif kalır (belge havuzu görünümü iptal edilmiş işlemi belgeli sayabilir). Mutabakat ve Mutabakat ile birlikte başka alan değişen güncellemelerde hiç history yazılmaz.
Neden zinciriBelirti: Belge havuzunda iptal edilmiş işlem 'F' durumunda kalır; history eksik ↓ Teknik olay: Select @IsDeleted=I.IsDeleted, @IslemId=D.IslemId, @Ettn=D.ETTN from inserted I Left Join IslemDetaylari D … (tek değer) ↓ Yakın neden: Birden çok satırı etkileyen UPDATE; Mutabakat kolonunu içeren UPDATE ↓ Kök neden: RefNo/FisNo ile toplu iptalde yalnız rastgele bir satırın IslemDetaylari kaydı silinir/EIPTAL yapılır; diğer satırların belge detayları akti ↓ Etkilenen veri: İptal edilmiş (IsDeleted=1) ve e-belgesi olmayan işlemin IslemDetaylari satırı kalmamalı; her işlemi
Etkilenen veriİptal edilmiş (IsDeleted=1) ve e-belgesi olmayan işlemin IslemDetaylari satırı kalmamalı; her işlemin en az bir History satırı olmalı.
Etkilenen iş süreciCari.UpdateTransaction – çok satırlı UPDATE'te tek satır değişkeni; Mutabakat güncellemesi history üretmez
Olasılık / etki / güvenORTA / S3 / 85
Bilinen ticketHAYIR (H-105 history okuma akışı)
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT D.IslemId FROM Cari.IslemDetaylari D JOIN Cari.Islemler I ON I.Id=D.IslemId WHERE I.IsDeleted=1 AND ISNULL(D.ETTN,'')='' ; SELECT I.Id FROM Cari.Islemler I WHERE NOT EXISTS(SELECT 1 FROM Cari.History H WHERE H.TransactionId=I.Id)
Validation SQL (salt okunur)
SELECT D.IslemId FROM Cari.IslemDetaylari D JOIN Cari.Islemler I ON I.Id=D.IslemId WHERE I.IsDeleted=1 AND ISNULL(D.ETTN,'')='' ; SELECT I.Id FROM Cari.Islemler I WHERE NOT EXISTS(SELECT 1 FROM Cari.History H WHERE H.TransactionId=I.Id)
Test senaryosuGirdi: Inserted/Deleted (çok satır), Cari.IslemDetaylari.ETTN · Formül: Select @IsDeleted=I.IsDeleted, @IslemId=D.IslemId, @Ettn=D.ETTN from inserted I Left Join IslemDetaylari D … (tek değer) ; Set @Status=(Select top 1 … · Sınır: Birden çok satırı etkileyen UPDATE; Mutabakat kolonunu içeren UPDATE
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Select @IsDeleted=I.IsDeleted, @IslemId=D.IslemId, @Ettn=D.ETTN from inserted I Left Join IslemDetaylari D … (tek değer) ; Set @Status=(Select top 1 … From Inserted) ; if NOT Update(Mutabakat) … · Kanıt: 'Select @IsDeleted =I.IsDeleted, @IslemId =D.IslemId , @Ettn =D.ETTN from inserted I Left Join Cari.IslemDetaylari D on D.IslemId =I.Id'
İlişkili kayıtlarERR-POT-002, ERR-POT-008, ERR-POT-009, ERR-SIL-001, ERR-SIL-002, ERR-SIL-003, ERR-SIL-028, ERR-SIL-056, ERR-SIL-057
Wiki bağlantılarıH-105
SESSİZ MANTIK / HESAPLAMA ERR-SIL-060 — SLR-029 Uygulama yuvarlama yardımcıları: .Round(n) uzantısı keser (truncate) ve hane parametresini yok sayar; Math.Round banker's; ToNumeric/TextN kültür varsayımı S4 · MOD-FINANS · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-010, BR-BSMV-003/004) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS4 — DÜŞÜK
ModülMOD-FINANS
Alt modülHesaplama
Kullanıcı belirtisiVergi tutarı 1 kuruş eksik; ekran ile SQL raporu arasında kuruş farkı; parite TL bacağı ±0,5 TL
Teknik belirtiVadeli ve hızlı satışta BSMV = (Tutar×BSMV/1000).Round(2) her zaman aşağı kesilir (12,999→12,99), hane parametresi 2'ye sabittir, bilimsel gösterim (1E-05) ve kültür ayarı '.' değilse Catch ile yuvarlanmadan döner. Nakit/parite ekranı Math.Round (bankacı yuvarlama) kullanırken SQL Convert(decimal(18,2)) yarım-yukarı yuvarlar → 0,005'lik değerlerde ekran/rapor farkı. Parite tutarları 0 haneye yuvarlanır (Round(...,0)).
Kod dosyasıClass/Module/Extention.vb:437-450, 366-368; Controls/Editor/TexBoxEdit.vb:100-105; iFVadeli.vb:755; HizliSatisEkrani.vb:688-737; iFNakit.vb:452,463-471; iFDoviz.vb:95-181
İlgili SQL nesneleriSistem.Settings, Cari.Islemler
Tetikleme koşuluBSMV küsuratı 3. hanede ≥5; tutar×fiyat tam yarım kuruş; kültür/ondalık ayarı farklı iş parçacığı
Kök nedenVadeli ve hızlı satışta BSMV = (Tutar×BSMV/1000).Round(2) her zaman aşağı kesilir (12,999→12,99), hane parametresi 2'ye sabittir, bilimsel gösterim (1E-05) ve kültür ayarı '.' değilse Catch ile yuvarlanmadan döner. Nakit/parite ekranı Math.Round (bankacı yuvarlama) kullanırken SQL Convert(decimal(18,2)) yarım-yukarı yuvarlar → 0,005'lik değerlerde ekran/rapor farkı. Parite tutarları 0 haneye yuvarlanır (Round(...,0)).
Neden zinciriBelirti: Vergi tutarı 1 kuruş eksik; ekran ile SQL raporu arasında kuruş farkı; parite TL bacağı ±0,5 TL ↓ Teknik olay: Round(Value,Decimals): Values=Value.ToString.Split(".") ; Result=Values(0)+"."+Left(Values(1),2) ; Val(Result) ; ToNumer ↓ Yakın neden: BSMV küsuratı 3. hanede ≥5; tutar×fiyat tam yarım kuruş; kültür/ondalık ayarı farklı iş parçacığı ↓ Kök neden: Vadeli ve hızlı satışta BSMV = (Tutar×BSMV/1000).Round(2) her zaman aşağı kesilir (12,999→12,99), hane parametresi 2'ye sabittir, bilimsel g ↓ Etkilenen veri: Kayıtlı BSMV, (Tutar−BSMV)×BSMVOran/1000 değerine ±0,01 toleransla eşit olmalı.
Etkilenen veriKayıtlı BSMV, (Tutar−BSMV)×BSMVOran/1000 değerine ±0,01 toleransla eşit olmalı.
Etkilenen iş süreciUygulama yuvarlama yardımcıları: .Round(n) uzantısı keser (truncate) ve hane parametresini yok sayar; Math.Round banker's; ToNumeric/TextN kültür varsayımı
Olasılık / etki / güvenYÜKSEK / S4 / 90
Bilinen ticketCTR-010, BR-BSMV-003/004
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT Id,Tutar,BSMV,ROUND((Tutar-BSMV)*(SELECT BSMV FROM Sistem.Settings)/1000,2) AS BSMVHesap FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (3,6) AND BSMV<>0 AND ABS(BSMV-ROUND((Tutar-BSMV)*(SELECT BSMV FROM Sistem.Settings)/1000,2))>0.011
Validation SQL (salt okunur)
SELECT Id,Tutar,BSMV,ROUND((Tutar-BSMV)*(SELECT BSMV FROM Sistem.Settings)/1000,2) AS BSMVHesap FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (3,6) AND BSMV<>0 AND ABS(BSMV-ROUND((Tutar-BSMV)*(SELECT BSMV FROM Sistem.Settings)/1000,2))>0.011
Test senaryosuGirdi: Double değerler (BSMV, tutar), Utils.Culture (ondalık '.', binlik ',') · Formül: Round(Value,Decimals): Values=Value.ToString.Split(".") ; Result=Values(0)+"."+Left(Values(1),2) ; Val(Result) ; ToNumeric = Val(Replace(Value,",","") · Sınır: BSMV küsuratı 3. hanede ≥5; tutar×fiyat tam yarım kuruş; kültür/ondalık ayarı farklı iş parçacığı
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Round(Value,Decimals): Values=Value.ToString.Split(".") ; Result=Values(0)+"."+Left(Values(1),2) ; Val(Result) ; ToNumeric = Val(Replace(Value,",","")) ; Math.Round(x,2) = MidpointRounding.ToEven · Kanıt: Extention.vb:441 'Dim Result As String = Values(0) + "." + Left(Values(1), 2)' (Decimals kullanılmıyor, kesme)
İlişkili kayıtlarERR-OBS-057, ERR-SIL-061
Wiki bağlantılarıBR-BSMV-003
SESSİZ MANTIK / HESAPLAMA ERR-SIL-061 — SLR-030 Nakit BSMV geri hesabı (Tutar'dan fiyat) ileri formülün tersi değil S4 · MOD-FINANS · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: BR-BSMV-003, CTR-010) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS4 — DÜŞÜK
ModülMOD-FINANS
Alt modülHesaplama
Kullanıcı belirtisiBelge vergi tutarı ile işlem BSMV alanı farklı; tutar 40 kuruş sapar
Teknik belirtiTutar elle girildiğinde net tutar ve fiyat yaklaşık hesaplanır; ardından TutarHesapla yeniden tetiklenirse Tutar ilk girilenden farklı olur (100.000 → 99.999,60). Kayıtlı BSMV ile Tutar arasındaki ilişki işlemden işleme değişir; e-belge vergi matrahı (Calc.BSMV) farklı formülle (BSMVOran) hesaplandığından belge ile işlem satırı uyuşmayabilir.
Kod dosyasıControls/Islem Ekranı/Ekran/iFNakit.vb:440-472; Class/Module/ExtensionEx.vb:16-44
İlgili SQL nesneleriCari.Islemler
Tetikleme koşuluIsBsmv ve Tutar elle girilmiş; BSMV ayarı Dahil/Hariç
Kök nedenTutar elle girildiğinde net tutar ve fiyat yaklaşık hesaplanır; ardından TutarHesapla yeniden tetiklenirse Tutar ilk girilenden farklı olur (100.000 → 99.999,60). Kayıtlı BSMV ile Tutar arasındaki ilişki işlemden işleme değişir; e-belge vergi matrahı (Calc.BSMV) farklı formülle (BSMVOran) hesaplandığından belge ile işlem satırı uyuşmayabilir.
Neden zinciriBelirti: Belge vergi tutarı ile işlem BSMV alanı farklı; tutar 40 kuruş sapar ↓ Teknik olay: İleri: BSMV = Net×BSMV/1000 ; TUTAR = Round(Net+BSMV,2) ; Geri (TxtTutar LostFocus): Net ≈ Tutar − Tutar×BSMV/1000 (br ↓ Yakın neden: IsBsmv ve Tutar elle girilmiş; BSMV ayarı Dahil/Hariç ↓ Kök neden: Tutar elle girildiğinde net tutar ve fiyat yaklaşık hesaplanır; ardından TutarHesapla yeniden tetiklenirse Tutar ilk girilenden farklı olur ↓ Etkilenen veri: Nakit satırında Tutar = Miktar×Fiyat + BSMV (±0,01) olmalı.
Etkilenen veriNakit satırında Tutar = Miktar×Fiyat + BSMV (±0,01) olmalı.
Etkilenen iş süreciNakit BSMV geri hesabı (Tutar'dan fiyat) ileri formülün tersi değil
Olasılık / etki / güvenYÜKSEK / S4 / 85
Bilinen ticketBR-BSMV-003, CTR-010
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT Id,Tutar,BSMV,Miktar,Fiyat, Miktar*Fiyat AS Net FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=3 AND BSMV<>0 AND ABS((Miktar*Fiyat+BSMV)-Tutar)>0.011
Validation SQL (salt okunur)
SELECT Id,Tutar,BSMV,Miktar,Fiyat, Miktar*Fiyat AS Net FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=3 AND BSMV<>0 AND ABS((Miktar*Fiyat+BSMV)-Tutar)>0.011
Test senaryosuGirdi: TxtTutar (BSMV dahil), GlobalSettings.BSMV (binde), IsBsmv · Formül: İleri: BSMV = Net×BSMV/1000 ; TUTAR = Round(Net+BSMV,2) ; Geri (TxtTutar LostFocus): Net ≈ Tutar − Tutar×BSMV/1000 (brütten kesinti) · Sınır: IsBsmv ve Tutar elle girilmiş; BSMV ayarı Dahil/Hariç
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: İleri: BSMV = Net×BSMV/1000 ; TUTAR = Round(Net+BSMV,2) ; Geri (TxtTutar LostFocus): Net ≈ Tutar − Tutar×BSMV/1000 (brütten kesinti) · Kanıt: iFNakit.vb:460 'If IsBsmv = True Then Tutar -= (Tutar * Program.GlobalSettings.BSMV).Divide(1000)'
İlişkili kayıtlarERR-OBS-057, ERR-SIL-060
Wiki bağlantılarıBR-BSMV-003
SESSİZ MANTIK / HESAPLAMA ERR-SIL-062 — SLR-031 Maliyet/İşçilik hesabı Double ile; negatif işçilik 0'a çekilir; kur 0 ise işçilik 0 S3 · MOD-CARI · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: BR-MALIYET-001, GAP-DOC-05, GAP-SEC-ISCILIK-02) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Kullanıcı belirtisiKâr raporunda alış iskontosu kaybolur; maliyet 0
Teknik belirtiMüşteriden metal değerinin altında alış (negatif işçilik = iskonto) 0 işçilikle kaydedilir; StokHaraketleri.Maliyet (=Iscilik×Kur) 0 olur, gerçek kazanç maliyet raporunda görünmez. Maliyet birimi kuru 0/eksikse Divide 0 döndürür ve işçilik sessizce 0 yazılır. Tüm hesap Double'dır; decimal(18,2) kolonlara dönüşümde bankacı/yarım-yukarı farkı.
Kod dosyasıClass/Ext/Cari.IslemEx.vb:122-146, 185-212
İlgili SQL nesneleriCari.Islemler
Tetikleme koşuluTutarMaliyeti < MiktarMaliyeti (iskontolu alış); MaliyetBirim kuru 0; kur listesi eksik
Kök nedenMüşteriden metal değerinin altında alış (negatif işçilik = iskonto) 0 işçilikle kaydedilir; StokHaraketleri.Maliyet (=Iscilik×Kur) 0 olur, gerçek kazanç maliyet raporunda görünmez. Maliyet birimi kuru 0/eksikse Divide 0 döndürür ve işçilik sessizce 0 yazılır. Tüm hesap Double'dır; decimal(18,2) kolonlara dönüşümde bankacı/yarım-yukarı farkı.
Neden zinciriBelirti: Kâr raporunda alış iskontosu kaybolur; maliyet 0 ↓ Teknik olay: MiktarMaliyeti=(Miktar×AuMilyem)×AnaBirim.Price ; Giriş: Iscilik=(TutarMaliyeti−MiktarMaliyeti).Divide(MaliyetBirim.Pric ↓ Yakın neden: TutarMaliyeti < MiktarMaliyeti (iskontolu alış); MaliyetBirim kuru 0; kur listesi eksik ↓ Kök neden: Müşteriden metal değerinin altında alış (negatif işçilik = iskonto) 0 işçilikle kaydedilir; StokHaraketleri.Maliyet (=Iscilik×Kur) 0 olur, g ↓ Etkilenen veri: Girişte Iscilik×IscilikBirimKur ≈ Tutar×BirimKur − Miktar×AuMilyem×HasKur (negatif değer 0'a çekilme
Etkilenen veriGirişte Iscilik×IscilikBirimKur ≈ Tutar×BirimKur − Miktar×AuMilyem×HasKur (negatif değer 0'a çekilmemeli).
Etkilenen iş süreciMaliyet/İşçilik hesabı Double ile; negatif işçilik 0'a çekilir; kur 0 ise işçilik 0
Olasılık / etki / güvenORTA / S3 / 80
Bilinen ticketBR-MALIYET-001, GAP-DOC-05, GAP-SEC-ISCILIK-02
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT Id,Miktar,AuMilyem,HasKur,Tutar,BirimKur,Iscilik FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (1,9) AND IslemTuru=0 AND IslemTipi NOT IN (1,2,5) AND Iscilik=0 AND (Tutar*BirimKur) < (Miktar*AuMilyem*HasKur)
Validation SQL (salt okunur)
SELECT Id,Miktar,AuMilyem,HasKur,Tutar,BirimKur,Iscilik FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (1,9) AND IslemTuru=0 AND IslemTipi NOT IN (1,2,5) AND Iscilik=0 AND (Tutar*BirimKur) < (Miktar*AuMilyem*HasKur)
Test senaryosuGirdi: Miktar, AuMilyem, AnaBirim.Price, TutarBirim.Price, MaliyetBirim.Price (bellek kur listesi Alis) · Formül: MiktarMaliyeti=(Miktar×AuMilyem)×AnaBirim.Price ; Giriş: Iscilik=(TutarMaliyeti−MiktarMaliyeti).Divide(MaliyetBirim.Price) ; If Iscilik<0 Then Iscilik · Sınır: TutarMaliyeti < MiktarMaliyeti (iskontolu alış); MaliyetBirim kuru 0; kur listesi eksik
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: MiktarMaliyeti=(Miktar×AuMilyem)×AnaBirim.Price ; Giriş: Iscilik=(TutarMaliyeti−MiktarMaliyeti).Divide(MaliyetBirim.Price) ; If Iscilik<0 Then Iscilik=0 ; Maliyet=Satis=TutarMaliyeti · Kanıt: Cari.IslemEx.vb:144 'If Iscilik < 0 Then Iscilik = 0'; :135 '.Divide(MaliyetBirim.Price)'
İlişkili kayıtlarERR-SIL-056
Wiki bağlantılarıBR-MALIYET-001
SESSİZ MANTIK / HESAPLAMA ERR-SIL-063 — SLR-032 Bilanco.OzetBilanco – kalemler farklı kesim tarihleri ve varsayımlarla toplanır S3 · MOD-RAPOR · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-128, H-129, H-130, CTR-SYM-TAKOZ-01, PRB-BILANCO-000) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS3 — ORTA
ModülMOD-RAPOR
Alt modülHesaplama
Kullanıcı belirtisiBilanço eksi/artı sapar; günlük kâr-zarar yanlış; pozisyon ile bilanço tutmaz
Teknik belirtiGeçmiş tarihli bilanço masraf hesaplarının bugüne kadarki tüm bakiyesini içerirken diğer kalemler kesim tarihine kadar alınır; hizmet gelir/gideri yalnız kesim günü toplanır; raporsuz takoz bilançoda 0,6, pozisyonda 0 ile değerlenir; kur listesi eksikse Net 0. Uygulama KÂR/ZARAR = TOPLAM−DEVİR olarak önceki satırla hesaplandığından her hata bir sonraki güne taşınır (SaveAll o günü silip yeniden yazar).
Kod dosyasıBilanco.OzetBilanco, Bilanco.SaveAll, Pozisyon.Write (modules.json); Class/Ext/Sistem.Bilanco.vb:172-211
İlgili SQL nesneleriBilanco.OzetBilanco, Bilanco.Bilancolar
Tetikleme koşuluGeçmiş tarih için bilanço; masraf hareketi olan dönem; raporsuz takoz stoğu; kur eksik gün
Kök nedenGeçmiş tarihli bilanço masraf hesaplarının bugüne kadarki tüm bakiyesini içerirken diğer kalemler kesim tarihine kadar alınır; hizmet gelir/gideri yalnız kesim günü toplanır; raporsuz takoz bilançoda 0,6, pozisyonda 0 ile değerlenir; kur listesi eksikse Net 0. Uygulama KÂR/ZARAR = TOPLAM−DEVİR olarak önceki satırla hesaplandığından her hata bir sonraki güne taşınır (SaveAll o günü silip yeniden yazar).
Neden zinciriBelirti: Bilanço eksi/artı sapar; günlük kâr-zarar yanlış; pozisyon ile bilanço tutmaz ↓ Teknik olay: BAKIYE: B.Tarih<=@Tarih … GELIR/GIDER(masraf bakiyesi): Where H.HesapTuru=4 (tarih yok) ; GELİR/GİDER(hizmet): Tarih>S.R ↓ Yakın neden: Geçmiş tarih için bilanço; masraf hareketi olan dönem; raporsuz takoz stoğu; kur eksik gün ↓ Kök neden: Geçmiş tarihli bilanço masraf hesaplarının bugüne kadarki tüm bakiyesini içerirken diğer kalemler kesim tarihine kadar alınır; hizmet gelir/ ↓ Etkilenen veri: Aynı kesim tarihi için bilanço yeniden hesaplandığında arşivlenen (Bilancolar) değerle eşit olmalı.
Etkilenen veriAynı kesim tarihi için bilanço yeniden hesaplandığında arşivlenen (Bilancolar) değerle eşit olmalı.
Etkilenen iş süreciBilanco.OzetBilanco – kalemler farklı kesim tarihleri ve varsayımlarla toplanır
Olasılık / etki / güvenYÜKSEK / S3 / 70
Bilinen ticketH-128, H-129, H-130, CTR-SYM-TAKOZ-01, PRB-BILANCO-000
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiAynı @Tarih için Bilanco.OzetBilanco'yu iki farklı günde çalıştırıp Bilanco.Bilancolar arşiviyle karşılaştırın: SELECT Tarih,SubeId,Cinsi,Kodu,Bakiye FROM Bilanco.Bilancolar WHERE Tarih=@T EXCEPT SELECT @T,SubeId,Cinsi,Kodu,Bakiye FROM Bilanco.OzetBilanco(@Sube,@T)
Validation SQL (salt okunur)
Aynı @Tarih için Bilanco.OzetBilanco'yu iki farklı günde çalıştırıp Bilanco.Bilancolar arşiviyle karşılaştırın: SELECT Tarih,SubeId,Cinsi,Kodu,Bakiye FROM Bilanco.Bilancolar WHERE Tarih=@T EXCEPT SELECT @T,SubeId,Cinsi,Kodu,Bakiye FROM Bilanco.OzetBilanco(@Sube,@T)
Test senaryosuGirdi: Cari.BakiyeIslem (Tarih<=@Tarih), masraf hesapları (HesapTuru=4, tarih süzgeci yok), IslemKodu=5 GELİR/GİDER (Tarih=@Tarih tek gün), takoz 0,6, GetKur · Formül: BAKIYE: B.Tarih<=@Tarih … GELIR/GIDER(masraf bakiyesi): Where H.HesapTuru=4 (tarih yok) ; GELİR/GİDER(hizmet): Tarih>S.RevCostDate And Tarih=@Tarih ; · Sınır: Geçmiş tarih için bilanço; masraf hareketi olan dönem; raporsuz takoz stoğu; kur eksik gün
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: BAKIYE: B.Tarih<=@Tarih … GELIR/GIDER(masraf bakiyesi): Where H.HesapTuru=4 (tarih yok) ; GELİR/GİDER(hizmet): Tarih>S.RevCostDate And Tarih=@Tarih ; TAKOZ: R='False' ⇒ Miktar*0.6 ; Net = Bol(Bakiye*K · Kanıt: OzetBilanco: 'Where H.HesapTuru =4 group by Br.Kodu ,h.SubeId' (Tarih koşulu yok); '(Tarih>S.RevCostDate And Tarih =@Tarih)'
Wiki bağlantılarıH-128 · H-129 · H-130 · SYM-TAKOZ · PRB-BILANCO-000
SESSİZ MANTIK / HESAPLAMA ERR-SIL-064 — SLR-033 Bilanco.GetIKar – parametre/sabit karışıklığı (KasaId=SubeId, BirimId=1=HAS, Satis kuru, ham bölme) S3 · MOD-RAPOR · Gözlemlendi: HAYIR · PF-023 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiHAYIR · Observed=HAYIR · Potential=EVET · Silent=EVET
Runtime durumuDOĞRULANMADI — statik analiz bulgusu; çalışma zamanında yeniden üretilmedi (Gözlemlendi: HAYIR)
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-RAPOR
Alt modülHesaplama
Problem ailesiPF-023 Birim (para birimi) tanımlama / listede görünmüyor / çarpan / çift birim
Kullanıcı belirtisiİşlem bazlı kâr raporu boş/yanlış
Teknik belirtiKasa kimliği şube kimliği yerine kullanılır (yalnız Id'ler çakışırsa sonuç döner); HAS için Id=1 varsayımı; bakiye satış kuruyla, stok alış kuruyla değerlenir; FN.Bol yerine ham bölme (kur 0'da hata – sessiz değil ama kur yoksa NULL çarpımı sessiz NULL).
Kod dosyasıBilanco.GetIKar (modules.json)
İlgili SQL nesneleriBilanco.GetIKar, FN.Bol, Sistem.Kasalar, Sistem.Birimler
SQL ObjectBilanco.GetIKar (modules.json)
Tetikleme koşuluKasaId≠SubeId kurulum; BirimId 1 ≠ HAS; kur eksik
Kök nedenKasa kimliği şube kimliği yerine kullanılır (yalnız Id'ler çakışırsa sonuç döner); HAS için Id=1 varsayımı; bakiye satış kuruyla, stok alış kuruyla değerlenir; FN.Bol yerine ham bölme (kur 0'da hata – sessiz değil ama kur yoksa NULL çarpımı sessiz NULL).
Neden zinciriBelirti: İşlem bazlı kâr raporu boş/yanlış ↓ Teknik olay: Where B.KasaId=@SubeId … Bakiye*Kur.Satis / kur1.Alis (Kur1.BirimId=1) ↓ Yakın neden: KasaId≠SubeId kurulum; BirimId 1 ≠ HAS; kur eksik ↓ Kök neden: Kasa kimliği şube kimliği yerine kullanılır (yalnız Id'ler çakışırsa sonuç döner); HAS için Id=1 varsayımı; bakiye satış kuruyla, stok alış ↓ Etkilenen veri: Rapor fonksiyonları HAS birimini Settings.HasSymbol üzerinden çözmeli, sabit Id kullanmamalı.
Etkilenen veriRapor fonksiyonları HAS birimini Settings.HasSymbol üzerinden çözmeli, sabit Id kullanmamalı.
Etkilenen iş süreciBilanco.GetIKar – parametre/sabit karışıklığı (KasaId=SubeId, BirimId=1=HAS, Satis kuru, ham bölme)
Olasılık / etki / güvenORTA / S3 / 75
Bilinen ticketHAYIR (PRB-RAPOR-000)
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Sistem.Kasalar K WHERE K.Id<>K.SubeId; SELECT Kodu FROM Sistem.Birimler WHERE Id=1
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Sistem.Kasalar K WHERE K.Id<>K.SubeId; SELECT Kodu FROM Sistem.Birimler WHERE Id=1
Test senaryosuGirdi: Cari.BakiyeIslem.KasaId (SubeId parametresiyle karşılaştırılır), GetKurListesi BirimId=1, Kur.Satis · Formül: Where B.KasaId=@SubeId … Bakiye*Kur.Satis / kur1.Alis (Kur1.BirimId=1) · Sınır: KasaId≠SubeId kurulum; BirimId 1 ≠ HAS; kur eksik
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Where B.KasaId=@SubeId … Bakiye*Kur.Satis / kur1.Alis (Kur1.BirimId=1) · Kanıt: 'Where B.KasaId =@SubeId and B.Tarih =@Tarih' ; 'Kur1 on Kur1.BirimId =1'
İlişkili kayıtlarERR-OBS-070, ERR-POT-023, ERR-POT-033, ERR-POT-138, ERR-SIL-026, ERR-SIL-036, ERR-SIL-041
Wiki bağlantılarıPRB-RAPOR-000
SESSİZ MANTIK / HESAPLAMA ERR-SIL-065 — SLR-034 Sistem.Devir (SQL) – açılış satırlarında has/milyem sıfır, takoz/pırlanta stokları ve tarihsiz satırlar düşer, 2 hane yuvarlama S2 · MOD-SISTEM · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-108, H-111, H-130, GAP-DEVIR-SCOPE, CTR-034, PRB-DEVIR-000, H-006) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS2 — YÜKSEK
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiDevir sonrası stok has/milyem/maliyet yanlış; takoz çıkışı engellenir veya eksi adet; bakiye eksik
Teknik belirtiDevir sonrası maden açılış hareketinin Has=0 ve Milyem=0 olduğu için GetOrtMilyem/GetMadenStok has stoğu ve ortalama milyem sessizce bozulur; takoz (StokTipi 3) ve pırlanta (4) adet stokları sıfırlanır (GetTakozAdet 0 → 'takoz stokta yok'); Tarih NULL satırlar hiçbir dilime girmediği için kaybolur; miktar/has 2 haneye yuvarlanır; maliyet devir günü değil çalıştırma günü kuruyla çevrilir. Tetikleyiciler kapatılıp açılır; arada hata olursa açık kalmayabilir (H-006).
Kod dosyasıSistem.Devir (modules.json)
İlgili SQL nesneleriSistem.Devir, Stok.StokHaraketleri, Cari.BakiyeIslem
SQL ObjectSistem.Devir (modules.json)
Tetikleme koşuluYıl sonu devri; devir öncesi alınıp sonra çıkılan takoz; Tarih NULL kayıt; devirin kesim tarihinden sonra çalıştırılması
Kök nedenDevir sonrası maden açılış hareketinin Has=0 ve Milyem=0 olduğu için GetOrtMilyem/GetMadenStok has stoğu ve ortalama milyem sessizce bozulur; takoz (StokTipi 3) ve pırlanta (4) adet stokları sıfırlanır (GetTakozAdet 0 → 'takoz stokta yok'); Tarih NULL satırlar hiçbir dilime girmediği için kaybolur; miktar/has 2 haneye yuvarlanır; maliyet devir günü değil çalıştırma günü kuruyla çevrilir. Tetikleyiciler kapatılıp açılır; arada hata olursa açık kalmayabilir (H-006).
Neden zinciriBelirti: Devir sonrası stok has/milyem/maliyet yanlış; takoz çıkışı engellenir veya eksi adet; bakiye eksik ↓ Teknik olay: #TBLStokHaraketleri(Miktar dec(18,2), Has dec(18,2)) ; maden açılış: 0 as Milyem, 0 as Has, Maliyet*K.Alis(bugün) ; trun ↓ Yakın neden: Yıl sonu devri; devir öncesi alınıp sonra çıkılan takoz; Tarih NULL kayıt; devirin kesim tarihinden ↓ Kök neden: Devir sonrası maden açılış hareketinin Has=0 ve Milyem=0 olduğu için GetOrtMilyem/GetMadenStok has stoğu ve ortalama milyem sessizce bozulur ↓ Etkilenen veri: Devir açılış satırları (IslemId=-1) StokTipi 1 için Has ve Milyem taşımalı; StokHaraketleri/BakiyeIs
Etkilenen veriDevir açılış satırları (IslemId=-1) StokTipi 1 için Has ve Milyem taşımalı; StokHaraketleri/BakiyeIslem'de Tarih NULL satır olmamalı; devir öncesi/sonrası bakiye toplamları hesap+birim bazında eşit olmalı.
Etkilenen iş süreciSistem.Devir (SQL) – açılış satırlarında has/milyem sıfır, takoz/pırlanta stokları ve tarihsiz satırlar düşer, 2 hane yuvarlama
Olasılık / etki / güvenORTA / S2 / 85
Bilinen ticketH-108, H-111, H-130, GAP-DEVIR-SCOPE, CTR-034, PRB-DEVIR-000, H-006
Ticket sayısı0
Bilinen çözümH-108/H-130 operasyonel çözümleri wikide (arşivle karşılaştırma, takoz çıkışını devir öncesine yapma); kod düzeltmesi [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND StokTipi=1 AND (Has=0 OR Milyem=0) AND Miktar<>0; SELECT COUNT(*) FROM Stok.StokHaraketleri WHERE Tarih IS NULL; SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE Tarih IS NULL; SELECT StokId,SUM(Adet) FROM Stok.StokHaraketleri WHERE StokTipi=3 GROUP BY StokId HAVING SUM(Adet)<0
Validation SQL (salt okunur)
SELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND StokTipi=1 AND (Has=0 OR Milyem=0) AND Miktar<>0; SELECT COUNT(*) FROM Stok.StokHaraketleri WHERE Tarih IS NULL; SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE Tarih IS NULL; SELECT StokId,SUM(Adet) FROM Stok.StokHaraketleri WHERE StokTipi=3 GROUP BY StokId HAVING SUM(Adet)<0
Test senaryosuGirdi: Stok.GetNakitStoklari/GetMadenStoklari(@Tarih-1), Stok.StokHaraketleri (StokTipi 1,2), Cari.BakiyeIslem (Tarih<@Tarih), GetKurListesi(getdate()) · Formül: #TBLStokHaraketleri(Miktar dec(18,2), Has dec(18,2)) ; maden açılış: 0 as Milyem, 0 as Has, Maliyet*K.Alis(bugün) ; truncate StokHaraketleri/BakiyeIsl · Sınır: Yıl sonu devri; devir öncesi alınıp sonra çıkılan takoz; Tarih NULL kayıt; devirin kesim tarihinden sonra çalıştırılması
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: #TBLStokHaraketleri(Miktar dec(18,2), Has dec(18,2)) ; maden açılış: 0 as Milyem, 0 as Has, Maliyet*K.Alis(bugün) ; truncate StokHaraketleri/BakiyeIslem ; yalnız StokTipi in (1,2) ; Tarih<@Tarih / Tar · Kanıt: 'Select -1 as IslemId,0 as Bolum,…,1 as StokTipi,M.Id as StokId,0 as Adet,Miktar,0 as Milyem,0 as Has,convert( decimal(18,2), Maliyet * K.Alis) as Maliyet … From Stok.GetMadenStoklari (0,0,dateadd(day,-1,@Tarih),0)'
Wiki bağlantılarıH-108 · H-111 · H-130 · PRB-DEVIR-000 · H-006
SESSİZ MANTIK / HESAPLAMA ERR-SIL-066 — SLR-035 Devir.vb (uygulama devri) – Sum(Milyem) ile açılış satırı, tarih=çalıştırma günü, transaction yok S1 · MOD-SISTEM · Gözlemlendi: EVET · PF-036 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-034, GAP-PROCESS-03, H-108) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE08 — Yuvarlama / Hassasiyet Hatası
SeverityS1 — KRİTİK
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-036 Yıl sonu devir işlemi ve devir sonrası fark
Kullanıcı belirtisiDevir açılış satırında Milyem>1; stok has/maliyet yanlış; tam veri kaybı riski
Teknik belirtiMilyem sütunu toplanır (100 satır × 0,916 = 91,6) → NetBakiye hesaplanan sütunu ve GetStokHareketleri'nin Has=Miktar×Milyem gösterimi anlamsız; giriş/çıkış satırları ayrı toplandığı için LIFO maliyet/ortalama milyem yalnız giriş satırlarını görür; takoz/pırlanta yine düşer; Tarih=GETDATE (kesim değil); truncate ile insert arasında transaction yok – hata halinde tablolar boş kalır (yedek dışında geri dönüş yok).
Kod dosyasıClass/Module/Devir.vb:36-87, 128
İlgili SQL nesneleriStok.StokHaraketleri
Tetikleme koşuluDevir.vb ile devir; hareketli stok kartları; devir sırasında hata
Kök nedenMilyem sütunu toplanır (100 satır × 0,916 = 91,6) → NetBakiye hesaplanan sütunu ve GetStokHareketleri'nin Has=Miktar×Milyem gösterimi anlamsız; giriş/çıkış satırları ayrı toplandığı için LIFO maliyet/ortalama milyem yalnız giriş satırlarını görür; takoz/pırlanta yine düşer; Tarih=GETDATE (kesim değil); truncate ile insert arasında transaction yok – hata halinde tablolar boş kalır (yedek dışında geri dönüş yok).
Neden zinciriBelirti: Devir açılış satırında Milyem>1; stok has/maliyet yanlış; tam veri kaybı riski ↓ Teknik olay: INSERT #ERPStok Select -1,0,IslemTuru,Getdate(),SubeId,KasaId,StokTipi,StokId,Sum(Adet),Sum(Miktar),Sum(Milyem),Sum(Has) ↓ Yakın neden: Devir.vb ile devir; hareketli stok kartları; devir sırasında hata ↓ Kök neden: Milyem sütunu toplanır (100 satır × 0,916 = 91,6) → NetBakiye hesaplanan sütunu ve GetStokHareketleri'nin Has=Miktar×Milyem gösterimi anlams ↓ Etkilenen veri: StokHaraketleri.Milyem ≤ 1 olmalı; açılış satırında Has = Miktar×Milyem tutmalı.
Etkilenen veriStokHaraketleri.Milyem ≤ 1 olmalı; açılış satırında Has = Miktar×Milyem tutmalı.
Etkilenen iş süreciDevir.vb (uygulama devri) – Sum(Milyem) ile açılış satırı, tarih=çalıştırma günü, transaction yok
Olasılık / etki / güvenORTA / S1 / 85
Bilinen ticketCTR-034, GAP-PROCESS-03, H-108
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND Milyem>1; SELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND StokTipi=1 AND ABS(Has - Miktar*Milyem)>0.01
Validation SQL (salt okunur)
SELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND Milyem>1; SELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND StokTipi=1 AND ABS(Has - Miktar*Milyem)>0.01
Test senaryosuGirdi: Stok.StokHaraketleri (StokTipi 1,2), Cari.BakiyeIslem · Formül: INSERT #ERPStok Select -1,0,IslemTuru,Getdate(),SubeId,KasaId,StokTipi,StokId,Sum(Adet),Sum(Miktar),Sum(Milyem),Sum(Has),Sum(Maliyet),VaryantId … Grou · Sınır: Devir.vb ile devir; hareketli stok kartları; devir sırasında hata
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: INSERT #ERPStok Select -1,0,IslemTuru,Getdate(),SubeId,KasaId,StokTipi,StokId,Sum(Adet),Sum(Miktar),Sum(Milyem),Sum(Has),Sum(Maliyet),VaryantId … Group by IslemTuru,… ; Truncate Cari.Islemler/BakiyeIs · Kanıt: Devir.vb:67 'Sum(Adet),Sum(Miktar),Sum(Milyem),Sum(Has),Sum(Maliyet)'
Wiki bağlantılarıH-108
SESSİZ MANTIK / HESAPLAMA ERR-SIL-067 — SLR-036 Repair.BalanceRepair – güncel tetikleyiciden geride kalmış tam yeniden kurma S1 · MOD-SISTEM · Gözlemlendi: EVET · PF-004 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: TERM-REPAIR-BALANCEREPAIR, KNOWN_GAPS TD-BALANCEREPAIR, SYM-BAKIYE (çalıştırılmaz), proje notu erpgoldv2-balancerepair-riski) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS1 — KRİTİK
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-004 Rapor tasarımı / yeni rapor / sütun ekleme / bakiye ekstresi düzenleme (talep)
Kullanıcı belirtisiTüm bakiyeler ve stoklar sistematik olarak farklı kural setiyle yeniden yazılır; devir/transfer verisi kaybı
Teknik belirtiÇalıştırılırsa devir (IslemId=-1), transfer (Bolum=2) ve üretim (Bolum=1) satırları kalıcı silinir; tip 11/12 satırları için bakiye/stok üretilir (tetikleyici üretmez); MAHSUP/belge tipleri bakiyeye girer; çeşni, model, pırlanta, hizmet (5), nakit emanet satırları eksik kalır; PEŞİN maden has bakiyesi yazılır. Hata mesajı yok; tablolar dolu görünür.
Kod dosyasıRepair.BalanceRepair (modules.json); karşılaştırma: Cari.AcceptTransaction satır 263, 281, 291-302, 311-330, 346, 363, 516
İlgili SQL nesneleriRepair.BalanceRepair, Cari.AcceptTransaction, Cari.BakiyeIslem, Stok.StokHaraketleri, Cari.Islemler
SQL ObjectRepair.BalanceRepair (modules.json); karşılaştırma: Cari.AcceptTransaction satır 263, 281, 291-302, 311-330, 346, 363, 516
Tetikleme koşuluProsedürün elle çalıştırılması (destek/geliştirici)
Kök nedenÇalıştırılırsa devir (IslemId=-1), transfer (Bolum=2) ve üretim (Bolum=1) satırları kalıcı silinir; tip 11/12 satırları için bakiye/stok üretilir (tetikleyici üretmez); MAHSUP/belge tipleri bakiyeye girer; çeşni, model, pırlanta, hizmet (5), nakit emanet satırları eksik kalır; PEŞİN maden has bakiyesi yazılır. Hata mesajı yok; tablolar dolu görünür.
Neden zinciriBelirti: Tüm bakiyeler ve stoklar sistematik olarak farklı kural setiyle yeniden yazılır; devir/transfer veri ↓ Teknik olay: Truncate Cari.BakiyeIslem ; Truncate Stok.StokHaraketleri ; cursor: eski kural seti (tip 11/12 hariç tutma yok; kod 14, ↓ Yakın neden: Prosedürün elle çalıştırılması (destek/geliştirici) ↓ Kök neden: Çalıştırılırsa devir (IslemId=-1), transfer (Bolum=2) ve üretim (Bolum=1) satırları kalıcı silinir; tip 11/12 satırları için bakiye/stok üre ↓ Etkilenen veri: Devir (IslemId=-1) ve Bolum≠0 türetilmiş satırlar hiçbir onarımda silinmemeli; onarım kural seti tet
Etkilenen veriDevir (IslemId=-1) ve Bolum≠0 türetilmiş satırlar hiçbir onarımda silinmemeli; onarım kural seti tetikleyiciyle birebir olmalı.
Etkilenen iş süreciRepair.BalanceRepair – güncel tetikleyiciden geride kalmış tam yeniden kurma
Olasılık / etki / güvenDÜŞÜK / S1 / 95
Bilinen ticketTERM-REPAIR-BALANCEREPAIR, KNOWN_GAPS TD-BALANCEREPAIR, SYM-BAKIYE (çalıştırılmaz), proje notu erpgoldv2-balancerepair-riski
Ticket sayısı0
Bilinen çözümKanıtlı kural: hiçbir koşulda çalıştırılmaz (SYM-BAKIYE). Güncel tetikleyiciyle eşitlenmiş bir onarım aracı yok → [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiÇalıştırılmış mı: SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE IslemId=-1; SELECT COUNT(*) FROM Stok.StokHaraketleri WHERE Bolum<>0; sıfırsa ve devir/transfer geçmişi varsa çalıştırılmış olabilir; ayrıca tip 11/12 için BakiyeIslem var mı: SELECT COUNT(*) FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.IslemTipi IN (11,12)
Validation SQL (salt okunur)
Çalıştırılmış mı: SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE IslemId=-1; SELECT COUNT(*) FROM Stok.StokHaraketleri WHERE Bolum<>0; sıfırsa ve devir/transfer geçmişi varsa çalıştırılmış olabilir; ayrıca tip 11/12 için BakiyeIslem var mı: SELECT COUNT(*) FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.IslemTipi IN (11,12)
Test senaryosuGirdi: Cari.Islemler (IsDeleted=0) – tümü · Formül: Truncate Cari.BakiyeIslem ; Truncate Stok.StokHaraketleri ; cursor: eski kural seti (tip 11/12 hariç tutma yok; kod 14, 9, 8, 3/10, 5 dalları yok; nak · Sınır: Prosedürün elle çalıştırılması (destek/geliştirici)
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Truncate Cari.BakiyeIslem ; Truncate Stok.StokHaraketleri ; cursor: eski kural seti (tip 11/12 hariç tutma yok; kod 14, 9, 8, 3/10, 5 dalları yok; nakit tip 4 istisnası yok; has satırında IslemTipi<>1 · Kanıt: BalanceRepair: 'if @IsDeleted='False' And @IsError=0' (tip 11/12 yok); 'if @IslemKodu=3 ---NAKİT' (tip 4 istisnası yok); 'if @BakiyeId>0 and @Miktar<>0' (tip<>1 yok)
İlişkili kayıtlarERR-OBS-067, ERR-POT-030, ERR-POT-129
Wiki bağlantılarıTERM-REPAIR-BALANCEREPAIR · SYM-BAKIYE
SESSİZ MANTIK / HESAPLAMA ERR-SIL-068 — SLR-037 Repair.StokRepair – ikinci FETCH'te değişken sayısı uyumsuz (17 ≠ 18) S1 · MOD-SISTEM · Gözlemlendi: EVET · PF-034 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: TD-BALANCEREPAIR teması) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS1 — KRİTİK
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-034 Stok tutmuyor / stok düzeltme / eksi stok / stok girişi
Kullanıcı belirtisiTüm stok hareketleri silinir; stok listeleri boş
Teknik belirtiİlk satır işlendikten sonra ikinci FETCH 'number of variables … must match' hatasıyla durur; TRUNCATE zaten autocommit ile kalıcı olduğundan stok hareket tablosu tek satırla kalır. Prosedür hata verir ancak veri kaybı gerçekleşmiştir.
Kod dosyasıRepair.StokRepair (modules.json) – son FETCH satırı
İlgili SQL nesneleriRepair.StokRepair, Stok.StokHaraketleri
SQL ObjectRepair.StokRepair (modules.json) – son FETCH satırı
Tetikleme koşuluProsedürün çalıştırılması
Kök nedenİlk satır işlendikten sonra ikinci FETCH 'number of variables … must match' hatasıyla durur; TRUNCATE zaten autocommit ile kalıcı olduğundan stok hareket tablosu tek satırla kalır. Prosedür hata verir ancak veri kaybı gerçekleşmiştir.
Neden zinciriBelirti: Tüm stok hareketleri silinir; stok listeleri boş ↓ Teknik olay: Truncate Table Stok.StokHaraketleri ; FETCH NEXT … INTO 18 değişken (ilk) ; döngü sonunda FETCH NEXT … INTO 17 değişken ↓ Yakın neden: Prosedürün çalıştırılması ↓ Kök neden: İlk satır işlendikten sonra ikinci FETCH 'number of variables … must match' hatasıyla durur; TRUNCATE zaten autocommit ile kalıcı olduğundan ↓ Etkilenen veri: Onarım prosedürleri TRUNCATE'i yalnız başarılı yeniden kurma ile aynı transaction içinde yapmalı.
Etkilenen veriOnarım prosedürleri TRUNCATE'i yalnız başarılı yeniden kurma ile aynı transaction içinde yapmalı.
Etkilenen iş süreciRepair.StokRepair – ikinci FETCH'te değişken sayısı uyumsuz (17 ≠ 18)
Olasılık / etki / güvenDÜŞÜK / S1 / 90
Bilinen ticketTD-BALANCEREPAIR teması
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiTanım karşılaştırması: OBJECT_DEFINITION(OBJECT_ID('Repair.StokRepair')) içindeki iki FETCH NEXT satırındaki değişken sayısı; çalıştırılmış mı: SELECT COUNT(*) FROM Stok.StokHaraketleri
Validation SQL (salt okunur)
Tanım karşılaştırması: OBJECT_DEFINITION(OBJECT_ID('Repair.StokRepair')) içindeki iki FETCH NEXT satırındaki değişken sayısı; çalıştırılmış mı: SELECT COUNT(*) FROM Stok.StokHaraketleri
Test senaryosuGirdi: Cari.Islemler (IsDeleted=0) · Formül: Truncate Table Stok.StokHaraketleri ; FETCH NEXT … INTO 18 değişken (ilk) ; döngü sonunda FETCH NEXT … INTO 17 değişken (@VaryantId eksik) · Sınır: Prosedürün çalıştırılması
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
NotlarÇözüm adayı: çalıştırılmamalı
KaynakSessiz risk analizi · Formül: Truncate Table Stok.StokHaraketleri ; FETCH NEXT … INTO 18 değişken (ilk) ; döngü sonunda FETCH NEXT … INTO 17 değişken (@VaryantId eksik) · Kanıt: İlk FETCH: '…,@StokId,@VaryantId,@Adet,…' ; son FETCH: '…,@StokId,@Adet,@Miktar,…' (@VaryantId yok)
İlişkili kayıtlarERR-POT-030
SESSİZ MANTIK / HESAPLAMA ERR-SIL-069 — SLR-038 Sistem.Settings tek satır varsayımı; Save = TRUNCATE + INSERT (transaction yok) S1 · MOD-SISTEM · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: GAP-DB-06) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE05 — Transaction Hatası
SeverityS1 — KRİTİK
ModülMOD-SISTEM
Alt modülHesaplama
Kullanıcı belirtisiBirimId NULL bakiye satırları; vergi/uyarı kontrolleri kapanır
Teknik belirtiINSERT başarısız olursa (tip dönüşümü, kolon uyumsuzluğu) tablo boş kalır: tetikleyici sembolleri NULL alır, takoz/çeşni bakiye satırları BirimId NULL ile yazılır (bakiye kartında görünmez), uygulama varsayılanlarla (BSMV=0, OnsCarpan=31,1035, IslemKurFarki=0) çalışır – kur farkı uyarısı ve BSMV sessizce kapanır. İki satır oluşursa trigger 'subquery returned more than 1 value' ile tüm işlemleri durdurur. Read() 'Do While Dr.Read' ile son satırı alır.
Kod dosyasıForm/Settings/Settings.vb:121-138; AcceptTransaction satır 64-67; Uretim.TrBakiyeHesapla
İlgili SQL nesneleriSistem.Settings, Cari.BakiyeIslem, Sistem.Birimler
Tetikleme koşuluAyar kaydı sırasında hata; elle satır ekleme; sembolün Birimler'de olmaması
Kök nedenINSERT başarısız olursa (tip dönüşümü, kolon uyumsuzluğu) tablo boş kalır: tetikleyici sembolleri NULL alır, takoz/çeşni bakiye satırları BirimId NULL ile yazılır (bakiye kartında görünmez), uygulama varsayılanlarla (BSMV=0, OnsCarpan=31,1035, IslemKurFarki=0) çalışır – kur farkı uyarısı ve BSMV sessizce kapanır. İki satır oluşursa trigger 'subquery returned more than 1 value' ile tüm işlemleri durdurur. Read() 'Do While Dr.Read' ile son satırı alır.
Neden zinciriBelirti: BirimId NULL bakiye satırları; vergi/uyarı kontrolleri kapanır ↓ Teknik olay: GlobalSettings.Save: Truncate Table Sistem.Settings ; Insert Into Sistem.Settings(...) Values('…') ; Trigger: @HasBirimI ↓ Yakın neden: Ayar kaydı sırasında hata; elle satır ekleme; sembolün Birimler'de olmaması ↓ Kök neden: INSERT başarısız olursa (tip dönüşümü, kolon uyumsuzluğu) tablo boş kalır: tetikleyici sembolleri NULL alır, takoz/çeşni bakiye satırları Bi ↓ Etkilenen veri: Sistem.Settings tam 1 satır içermeli; sembol kolonları Birimler'de tekil eşleşmeli.
Etkilenen veriSistem.Settings tam 1 satır içermeli; sembol kolonları Birimler'de tekil eşleşmeli.
Etkilenen iş süreciSistem.Settings tek satır varsayımı; Save = TRUNCATE + INSERT (transaction yok)
Olasılık / etki / güvenDÜŞÜK / S1 / 80
Bilinen ticketGAP-DB-06
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Sistem.Settings; SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE BirimId IS NULL; SELECT s.HasSymbol FROM Sistem.Settings s WHERE NOT EXISTS(SELECT 1 FROM Sistem.Birimler b WHERE b.Kodu=s.HasSymbol AND b.IsDeleted=0)
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Sistem.Settings; SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE BirimId IS NULL; SELECT s.HasSymbol FROM Sistem.Settings s WHERE NOT EXISTS(SELECT 1 FROM Sistem.Birimler b WHERE b.Kodu=s.HasSymbol AND b.IsDeleted=0)
Test senaryosuGirdi: Sistem.Settings (HasSymbol, GumSymbol, PltSymbol, PldSymbol, BSMV, OnsCarpan, IslemKurFarki…) · Formül: GlobalSettings.Save: Truncate Table Sistem.Settings ; Insert Into Sistem.Settings(...) Values('…') ; Trigger: @HasBirimId=(Select Id From Birimler Whe · Sınır: Ayar kaydı sırasında hata; elle satır ekleme; sembolün Birimler'de olmaması
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: GlobalSettings.Save: Truncate Table Sistem.Settings ; Insert Into Sistem.Settings(...) Values('…') ; Trigger: @HasBirimId=(Select Id From Birimler Where Kodu=(Select HasSymbol From Sistem.Settings)) · Kanıt: Settings.vb:135-136 'Db.ExecuteNonQuery("Truncate Table Sistem.Settings") ; Db.ExecuteNonQuery(Query)'
SESSİZ MANTIK / HESAPLAMA ERR-SIL-070 — SLR-039 Sistem.Birimler.Kodu benzersiz değil; kur listesi ve bakiye toplamları kod ile birleştirilir S2 · MOD-SISTEM · Gözlemlendi: EVET · PF-023 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-023, H-131) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE15 — Duplicate / Çift İşlem
SeverityS2 — YÜKSEK
ModülMOD-SISTEM
Alt modülHesaplama
Problem ailesiPF-023 Birim (para birimi) tanımlama / listede görünmüyor / çarpan / çift birim
Kullanıcı belirtisiLimit, bilanço ve pozisyon çift sayım
Teknik belirtiAynı kodlu iki birim (silinip yeniden açılan) kur listesinde iki satır üretir; koda göre join yapan bakiye/limit/bilanço/pozisyon sorguları satırları çiftler (bakiye iki kat).
Kod dosyasıCari.ToplamBakiye, Bilanco.OzetBilanco, Pozisyon.Write, Bakiye.DunkiBakiyeler (modules.json); indexes.json Sistem.Birimler
İlgili SQL nesneleriCari.ToplamBakiye, Bilanco.OzetBilanco, Pozisyon.Write, Bakiye.DunkiBakiyeler, Sistem.Birimler
SQL ObjectCari.ToplamBakiye, Bilanco.OzetBilanco, Pozisyon.Write, Bakiye.DunkiBakiyeler (modules.json); indexes.json Sistem.Birimler
Tetikleme koşuluBirimler'de aynı Kodu ile IsDeleted=0 iki satır
Kök nedenAynı kodlu iki birim (silinip yeniden açılan) kur listesinde iki satır üretir; koda göre join yapan bakiye/limit/bilanço/pozisyon sorguları satırları çiftler (bakiye iki kat).
Neden zinciriBelirti: Limit, bilanço ve pozisyon çift sayım ↓ Teknik olay: Left Join Sistem.GetKurListesi(Getdate()) Kur on Kur.Birim = Bak.Kodu ↓ Yakın neden: Birimler'de aynı Kodu ile IsDeleted=0 iki satır ↓ Kök neden: Aynı kodlu iki birim (silinip yeniden açılan) kur listesinde iki satır üretir; koda göre join yapan bakiye/limit/bilanço/pozisyon sorguları ↓ Etkilenen veri: Sistem.Birimler.Kodu silinmemiş satırlarda benzersiz olmalı.
Etkilenen veriSistem.Birimler.Kodu silinmemiş satırlarda benzersiz olmalı.
Etkilenen iş süreciSistem.Birimler.Kodu benzersiz değil; kur listesi ve bakiye toplamları kod ile birleştirilir
Olasılık / etki / güvenDÜŞÜK / S2 / 85
Bilinen ticketH-023, H-131
Ticket sayısı0
Bilinen çözümH-131 teknik çözümü wikide (tekrarlayan kodun değiştirilmesi)
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT Kodu,COUNT(*) FROM Sistem.Birimler WHERE IsDeleted=0 GROUP BY Kodu HAVING COUNT(*)>1
Validation SQL (salt okunur)
SELECT Kodu,COUNT(*) FROM Sistem.Birimler WHERE IsDeleted=0 GROUP BY Kodu HAVING COUNT(*)>1
Test senaryosuGirdi: Sistem.Birimler (unique index yalnız PK), ToplamBakiye/OzetBilanco/Pozisyon.Write 'Kur.Birim = Kodu' join'leri · Formül: Left Join Sistem.GetKurListesi(Getdate()) Kur on Kur.Birim = Bak.Kodu · Sınır: Birimler'de aynı Kodu ile IsDeleted=0 iki satır
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Left Join Sistem.GetKurListesi(Getdate()) Kur on Kur.Birim = Bak.Kodu · Kanıt: indexes.json: Sistem.Birimler yalnız PK_Birimler(Id)
İlişkili kayıtlarERR-SIL-028
Wiki bağlantılarıH-023 · H-131
SESSİZ MANTIK / HESAPLAMA ERR-SIL-071 — SLR-040 FN.GetKatki daima 0 döndürür; FN.Katsayı tablo dışı milyemde NULL → FN.AyarCevir 0 S3 · MOD-SISTEM · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: GAP-SEC-AYAR-01) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-SISTEM
Alt modülHesaplama
Kullanıcı belirtisiSipariş/üretim miktarı 0 veya katkı 0
Teknik belirtiKatkı hesabı her koşulda 0; ayar çevirici 0,995/0,9166 gibi listede olmayan milyemlerde 0 döndürür (Bol NULL→0). Sipariş girişinde çevrilen miktar sessizce 0 olur.
Kod dosyasıFN.GetKatki, FN.Katsayı, FN.AyarCevir (modules.json); Form/Siparis/FrmSiparisGirisi.vb:194
İlgili SQL nesneleriFN.AyarCevir, FN.GetKatki
Tetikleme koşuluMilyem tam olarak listedeki 7 değerden biri değilse
Kök nedenKatkı hesabı her koşulda 0; ayar çevirici 0,995/0,9166 gibi listede olmayan milyemlerde 0 döndürür (Bol NULL→0). Sipariş girişinde çevrilen miktar sessizce 0 olur.
Neden zinciriBelirti: Sipariş/üretim miktarı 0 veya katkı 0 ↓ Teknik olay: GetKatki: … Set @Result=… ; return 0 ; AyarCevir = Bol(@Miktar, Katsayı(@Milyem1)) * Katsayı(@Milyem2) ; Katsayı: CASE ↓ Yakın neden: Milyem tam olarak listedeki 7 değerden biri değilse ↓ Kök neden: Katkı hesabı her koşulda 0; ayar çevirici 0,995/0,9166 gibi listede olmayan milyemlerde 0 döndürür (Bol NULL→0). Sipariş girişinde çevrilen ↓ Etkilenen veri: Ayar çevrimi tanımsız milyemde 0 yerine hata/uyarı üretmeli.
Etkilenen veriAyar çevrimi tanımsız milyemde 0 yerine hata/uyarı üretmeli.
Etkilenen iş süreciFN.GetKatki daima 0 döndürür; FN.Katsayı tablo dışı milyemde NULL → FN.AyarCevir 0
Olasılık / etki / güvenDÜŞÜK / S3 / 90
Bilinen ticketGAP-SEC-AYAR-01
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT FN.AyarCevir(10,0.995,0.585), FN.GetKatki(10,0.916,0.585) – beklenen 0 dışı, gelen 0
Validation SQL (salt okunur)
SELECT FN.AyarCevir(10,0.995,0.585), FN.GetKatki(10,0.916,0.585) – beklenen 0 dışı, gelen 0
Test senaryosuGirdi: Milyem1, Milyem2 (yalnız 0.333/0.375/0.417/0.585/0.750/0.875/0.916 tanımlı) · Formül: GetKatki: … Set @Result=… ; return 0 ; AyarCevir = Bol(@Miktar, Katsayı(@Milyem1)) * Katsayı(@Milyem2) ; Katsayı: CASE … END (ELSE yok → NULL) · Sınır: Milyem tam olarak listedeki 7 değerden biri değilse
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: GetKatki: … Set @Result=… ; return 0 ; AyarCevir = Bol(@Miktar, Katsayı(@Milyem1)) * Katsayı(@Milyem2) ; Katsayı: CASE … END (ELSE yok → NULL) · Kanıt: FN.GetKatki son satır 'return 0'; FN.Katsayı CASE ifadesinde ELSE yok
SESSİZ MANTIK / HESAPLAMA ERR-SIL-072 — SLR-041 Uretim.TrBakiyeHesapla – kasa seçimi sırasız TOP 1, has = Tutar×Fiyat S4 · MOD-URETIM · Gözlemlendi: EVET · PF-030 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: GAP-SEC-ATOLYE-02) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS4 — DÜŞÜK
ModülMOD-URETIM
Alt modülHesaplama
Problem ailesiPF-030 Cari bakiye / ekstre tutmuyor (bakiye yanlış, ters, birden değişti)
Kullanıcı belirtisiÜretimden gelen stok yanlış kasada; kasa stok listesi tutmaz
Teknik belirtiŞubede birden çok kasa varsa üretim çıktısı rastgele kasaya yazılır (plan değişince kasa değişir); giriş satırında miktar/milyem alanları Tutar/Fiyat ile doldurulduğundan alan anlamı ekrana bağlıdır.
Kod dosyasıUretim.TrBakiyeHesapla (modules.json)
İlgili SQL nesneleriUretim.TrBakiyeHesapla, Sistem.Kasalar, Stok.StokHaraketleri
SQL ObjectUretim.TrBakiyeHesapla (modules.json)
Tetikleme koşuluŞubede >1 kasa; üretim modülü kullanan kurulum
Kök nedenŞubede birden çok kasa varsa üretim çıktısı rastgele kasaya yazılır (plan değişince kasa değişir); giriş satırında miktar/milyem alanları Tutar/Fiyat ile doldurulduğundan alan anlamı ekrana bağlıdır.
Neden zinciriBelirti: Üretimden gelen stok yanlış kasada; kasa stok listesi tutmaz ↓ Teknik olay: @KasaId = (Select Top 1 Id From Sistem.Kasalar Where IsDeleted='False' And SubeId=@SubeId) ; URETIMGIRIS: StokHaraketler ↓ Yakın neden: Şubede >1 kasa; üretim modülü kullanan kurulum ↓ Kök neden: Şubede birden çok kasa varsa üretim çıktısı rastgele kasaya yazılır (plan değişince kasa değişir); giriş satırında miktar/milyem alanları Tu ↓ Etkilenen veri: Bolum=1 stok hareketleri deterministik bir kasaya yazılmalı.
Etkilenen veriBolum=1 stok hareketleri deterministik bir kasaya yazılmalı.
Etkilenen iş süreciUretim.TrBakiyeHesapla – kasa seçimi sırasız TOP 1, has = Tutar×Fiyat
Olasılık / etki / güvenDÜŞÜK / S4 / 60
Bilinen ticketGAP-SEC-ATOLYE-02
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT SubeId,COUNT(*) FROM Sistem.Kasalar WHERE IsDeleted=0 GROUP BY SubeId HAVING COUNT(*)>1; SELECT KasaId,COUNT(*) FROM Stok.StokHaraketleri WHERE Bolum=1 GROUP BY KasaId
Validation SQL (salt okunur)
SELECT SubeId,COUNT(*) FROM Sistem.Kasalar WHERE IsDeleted=0 GROUP BY SubeId HAVING COUNT(*)>1; SELECT KasaId,COUNT(*) FROM Stok.StokHaraketleri WHERE Bolum=1 GROUP BY KasaId
Test senaryosuGirdi: Sistem.Kasalar (SubeId), UretimIslemleri · Formül: @KasaId = (Select Top 1 Id From Sistem.Kasalar Where IsDeleted='False' And SubeId=@SubeId) ; URETIMGIRIS: StokHaraketleri(…, Miktar=@Tutar, Milyem=@Fi · Sınır: Şubede >1 kasa; üretim modülü kullanan kurulum
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: @KasaId = (Select Top 1 Id From Sistem.Kasalar Where IsDeleted='False' And SubeId=@SubeId) ; URETIMGIRIS: StokHaraketleri(…, Miktar=@Tutar, Milyem=@Fiyat, Has=@Tutar*@Fiyat) · Kanıt: 'Declare @KasaId int = (Select Top 1 Id From Sistem.Kasalar Where IsDeleted ='False' And SubeId =@SubeId)'
SESSİZ MANTIK / HESAPLAMA ERR-SIL-073 — SLR-042 Trigger hata iletimi ve uygulamanın algısı S3 · MOD-CARI · Gözlemlendi: EVET · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: GAP-CODE-05, GAP-CODE-07) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE07 — Finansal Hesaplama Hatası
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Kullanıcı belirtisiRs aktarımı eksik işlem; takoz raporu yazılmamış giriş; haksız limit reddi
Teknik belirtiTrigger reddi kullanıcıya SQL metniyle gösterilir (sessiz değil). Ancak RAISERROR olmadan hata yutulan yerler vardır: Insert sonrası 'Cari.RSAktar' ve Update sonrası 'Takoz.RaporYaz' hataları MsgBox ile geçilir ve ana kayıt tamam sayılır; GetCariLimit ExecuteScalar hatası Val('')=0 ile 'limit 0' gibi davranır (işlem reddedilir – tersine sessizlik).
Kod dosyasıClass/Module/InternalDb.vb:53-81; Cari.Islem.vb:694-709; AcceptTransaction
İlgili SQL nesneleriCari.RSAktar, Takoz.RaporYaz, Cari.Islemler
Tetikleme koşuluRsAktar/RaporYaz prosedür hatası; FN.GetCariLimit hata
Kök nedenTrigger reddi kullanıcıya SQL metniyle gösterilir (sessiz değil). Ancak RAISERROR olmadan hata yutulan yerler vardır: Insert sonrası 'Cari.RSAktar' ve Update sonrası 'Takoz.RaporYaz' hataları MsgBox ile geçilir ve ana kayıt tamam sayılır; GetCariLimit ExecuteScalar hatası Val('')=0 ile 'limit 0' gibi davranır (işlem reddedilir – tersine sessizlik).
Neden zinciriBelirti: Rs aktarımı eksik işlem; takoz raporu yazılmamış giriş; haksız limit reddi ↓ Teknik olay: InternalDb.ExecuteScalar: Catch ex → MsgBox(ex.Message); Result=Nothing ; Insert: RecId=0 → Return False ↓ Yakın neden: RsAktar/RaporYaz prosedür hatası; FN.GetCariLimit hata ↓ Kök neden: Trigger reddi kullanıcıya SQL metniyle gösterilir (sessiz değil). Ancak RAISERROR olmadan hata yutulan yerler vardır: Insert sonrası 'Cari.R ↓ Etkilenen veri: Insert sonrası ikincil adımlar (RsAktar/RaporYaz) başarısızsa ana kayıt işaretlenmeli veya geri alın
Etkilenen veriInsert sonrası ikincil adımlar (RsAktar/RaporYaz) başarısızsa ana kayıt işaretlenmeli veya geri alınmalı.
Etkilenen iş süreciTrigger hata iletimi ve uygulamanın algısı
Olasılık / etki / güvenORTA / S3 / 80
Bilinen ticketGAP-CODE-05, GAP-CODE-07
Ticket sayısı0
Bilinen çözüm[Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND RsAktar=1 AND NOT EXISTS(… Rs hedef tablosu …) [Rs hedefi kaynakta yok – GAP-CODE-05]
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND RsAktar=1 AND NOT EXISTS(… Rs hedef tablosu …) [Rs hedefi kaynakta yok – GAP-CODE-05]
Test senaryosuGirdi: RAISERROR(…,16,1)+ROLLBACK → SqlException 3609; InternalDb MsgBox; Cari.Islem.Insert Catch · Formül: InternalDb.ExecuteScalar: Catch ex → MsgBox(ex.Message); Result=Nothing ; Insert: RecId=0 → Return False · Sınır: RsAktar/RaporYaz prosedür hatası; FN.GetCariLimit hata
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: InternalDb.ExecuteScalar: Catch ex → MsgBox(ex.Message); Result=Nothing ; Insert: RecId=0 → Return False · Kanıt: Cari.Islem.vb:696-697 'If RSAktar = True … db.ExecuteNonQuery("Cari.RSAktar " & RecId) Catch ex As Exception' (boş)
SESSİZ MANTIK / HESAPLAMA ERR-SIL-074 — SLR-043 Nakit NORMAL girişte yalnız karşılık birimi (TL) bakiyeye yazılır; döviz tarafı yalnız kasa stoğuna S3 · MOD-CARI · Gözlemlendi: EVET · PF-023 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: CTR-025, H-104) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS3 — ORTA
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-023 Birim (para birimi) tanımlama / listede görünmüyor / çarpan / çift birim
Kullanıcı belirtisiYanlış düzeltme girişleri; çift kayıt
Teknik belirtiKullanıcı dokümanı (A-Z 2.6) EUR+TL iki satır bekler; kod yalnız TL yazar. Personel 'işlem eksik' sanıp ikinci kez döviz satırı girebilir (çift kayıt) ya da müşteri döviz bakiyesini elle takip eder.
Kod dosyasıCari.AcceptTransaction (dbclean/modules.json def) satır 281-285, 401-432; Class/Ext/Cari.IslemEx.vb:291-303
İlgili SQL nesneleriCari.BakiyeIslem, Cari.Islemler
Tetikleme koşuluNakit NORMAL/ EMANET dışı işlem; kullanıcı beklentisi
Kök nedenKullanıcı dokümanı (A-Z 2.6) EUR+TL iki satır bekler; kod yalnız TL yazar. Personel 'işlem eksik' sanıp ikinci kez döviz satırı girebilir (çift kayıt) ya da müşteri döviz bakiyesini elle takip eder.
Neden zinciriBelirti: Yanlış düzeltme girişleri; çift kayıt ↓ Teknik olay: satır 401-432: Tutar satırı (BirimId, ±Tutar) ; has/miktar satırı yok (BakiyeId=0) ; Stok: StokHaraketleri(StokTipi=2, S ↓ Yakın neden: Nakit NORMAL/ EMANET dışı işlem; kullanıcı beklentisi ↓ Kök neden: Kullanıcı dokümanı (A-Z 2.6) EUR+TL iki satır bekler; kod yalnız TL yazar. Personel 'işlem eksik' sanıp ikinci kez döviz satırı girebilir (ç ↓ Etkilenen veri: Nakit işlemi (tip≠10) yalnız BirimId'li tek bakiye satırı üretmeli.
Etkilenen veriNakit işlemi (tip≠10) yalnız BirimId'li tek bakiye satırı üretmeli.
Etkilenen iş süreciNakit NORMAL girişte yalnız karşılık birimi (TL) bakiyeye yazılır; döviz tarafı yalnız kasa stoğuna
Olasılık / etki / güvenORTA / S3 / 90
Bilinen ticketCTR-025, H-104
Ticket sayısı0
Bilinen çözümDoküman düzeltme önerisi CTR-025'te; kod değişikliği yok
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiSELECT COUNT(*) FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.IslemKodu=3 AND B.BirimId<>I.BirimId AND I.IslemTipi<>10 – 0 beklenir
Validation SQL (salt okunur)
SELECT COUNT(*) FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.IslemKodu=3 AND B.BirimId<>I.BirimId AND I.IslemTipi<>10 – 0 beklenir
Test senaryosuGirdi: IslemKodu=3, BakiyeId=0 (Cari.IslemEx.vb:291-303), Tutar/BirimId, Miktar/StokId · Formül: satır 401-432: Tutar satırı (BirimId, ±Tutar) ; has/miktar satırı yok (BakiyeId=0) ; Stok: StokHaraketleri(StokTipi=2, StokId, ±Miktar) · Sınır: Nakit NORMAL/ EMANET dışı işlem; kullanıcı beklentisi
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: satır 401-432: Tutar satırı (BirimId, ±Tutar) ; has/miktar satırı yok (BakiyeId=0) ; Stok: StokHaraketleri(StokTipi=2, StokId, ±Miktar) · Kanıt: Cari.IslemEx.vb:303 'Return 0' (NAKIT BakiyeId)
Wiki bağlantılarıH-104
SESSİZ MANTIK / HESAPLAMA ERR-SIL-075 — SLR-044 PEŞİN (IslemTipi=1) işlemde bakiye/limit muafiyeti ve %5 karşılık toleransı S2 · MOD-CARI · Gözlemlendi: EVET · PF-007 · AÇIK
Hata sınıfıSESSİZ MANTIK / HESAPLAMA SESSİZ MANTIK / HESAPLAMA HATASI
GözlemlendiEVET · Observed=EVET (wiki/ticket bağı: H-104 (PEŞİN tip bakiye üretmez), BR-DEFTER-URETIMI, BR-BAKIYE-016, BR-FATURA-008) · Potential=EVET · Silent=EVET
Runtime durumuGÖZLEMLENDİ — ticket/wiki kanıtı var
Hata kategorisiE16 — Eksik Türetilmiş Kayıt
SeverityS2 — YÜKSEK
ModülMOD-CARI
Alt modülHesaplama
Problem ailesiPF-007 Fatura kesilemiyor / fatura basma / fatura problemi (genel)
Kullanıcı belirtisiBakiyesi olmayan ama karşılığı da tam girilmemiş peşin işlem; kasa/stok farkı; limit aşımı
Teknik belirtiPEŞİN tip bakiye satırı üretmediği ve limit kontrolünden muaf olduğu için, karşılığı eksik/ yanlış girilmiş peşin fiş sessizce bakiye dışı kalır; %5 tolerans yalnız PesinKontrol açık grupta ve yalnız fiş yazdırırken çalışır (F2 kayıt anında değil). Tolerans içindeki fark (≤%5) hiç uyarı vermez → kasa/stok farkı birikir.
Kod dosyasıCari.GetFisPesinKontrol · basecontrol/Base Control/iScreen.vb:98-101 · Cari.AcceptTransaction (tip 1 bakiye satırı üretmez)
İlgili SQL nesneleriCari.Islemler
Tetikleme koşuluPesinKontrol kapalı grup; fiş yazdırılmadan kapatılan işlem; %5 altındaki farklar; GIRIS=0 (Bol 0 döner → fark %100 gibi ya da 0)
Kök nedenPEŞİN tip bakiye satırı üretmediği ve limit kontrolünden muaf olduğu için, karşılığı eksik/ yanlış girilmiş peşin fiş sessizce bakiye dışı kalır; %5 tolerans yalnız PesinKontrol açık grupta ve yalnız fiş yazdırırken çalışır (F2 kayıt anında değil). Tolerans içindeki fark (≤%5) hiç uyarı vermez → kasa/stok farkı birikir.
Neden zinciriBelirti: Bakiyesi olmayan ama karşılığı da tam girilmemiş peşin işlem; kasa/stok farkı; limit aşımı ↓ Teknik olay: Cari.GetFisPesinKontrol: Tutar = GIRIS>CIKIS ? (1 − Bol(CIKIS,GIRIS)) × 100 : Bol(CIKIS,GIRIS); sonuç > 5 ise 'karşılık ↓ Yakın neden: PesinKontrol kapalı grup; fiş yazdırılmadan kapatılan işlem; %5 altındaki farklar; GIRIS=0 (Bol 0 dö ↓ Kök neden: PEŞİN tip bakiye satırı üretmediği ve limit kontrolünden muaf olduğu için, karşılığı eksik/ yanlış girilmiş peşin fiş sessizce bakiye dışı k ↓ Etkilenen veri: INV-03: IslemTipi=1 işlemin Cari.BakiyeIslem satırı olmamalı; PEŞİN fişte giriş/çıkış karşılığı deng
Etkilenen veriINV-03: IslemTipi=1 işlemin Cari.BakiyeIslem satırı olmamalı; PEŞİN fişte giriş/çıkış karşılığı dengeli olmalı
Etkilenen iş süreciPEŞİN (IslemTipi=1) işlemde bakiye/limit muafiyeti ve %5 karşılık toleransı
Olasılık / etki / güvenORTA / S2 / 75
Bilinen ticketH-104 (PEŞİN tip bakiye üretmez), BR-DEFTER-URETIMI, BR-BAKIYE-016, BR-FATURA-008
Ticket sayısı0
Bilinen çözümBilinen davranış ve kullanıcı bilgilendirmesi: H-104 / BR-TIP-002-003 (PEŞİN tip kasaya yansır, bakiye üretmez). Kod düzeltmesi için: [Ekip tarafından doldurulacak]
Geçici çözüm[Ekip tarafından doldurulacak]
Kalıcı çözüm[Ekip tarafından doldurulacak]
Önleme[Ekip tarafından doldurulacak]
Tespit yöntemiINV-03 (PEŞİN işlemin bakiye satırı olmamalı) + fiş bazında giriş/çıkış TL karşılığı farkı: SELECT FisNo, SUM(CASE WHEN IslemTuru%2=0 THEN Tutar ELSE -Tutar END) FROM Cari.Islemler WHERE IslemTipi=1 AND IsDeleted=0 GROUP BY HesapId,FisNo HAVING ABS(SUM(...))>0
Validation SQL (salt okunur)
INV-03 (PEŞİN işlemin bakiye satırı olmamalı) + fiş bazında giriş/çıkış TL karşılığı farkı: SELECT FisNo, SUM(CASE WHEN IslemTuru%2=0 THEN Tutar ELSE -Tutar END) FROM Cari.Islemler WHERE IslemTipi=1 AND IsDeleted=0 GROUP BY HesapId,FisNo HAVING ABS(SUM(...))>0
Test senaryosuGirdi: Cari.Islemler.IslemTipi=1; fişteki giriş/çıkış stok hareketleri TL karşılıkları; Sube.IsLimitControl; kullanıcı grubu PesinKontrol · Formül: Cari.GetFisPesinKontrol: Tutar = GIRIS>CIKIS ? (1 − Bol(CIKIS,GIRIS)) × 100 : Bol(CIKIS,GIRIS); sonuç > 5 ise 'karşılık bulunamadı' (yazdırma engellen · Sınır: PesinKontrol kapalı grup; fiş yazdırılmadan kapatılan işlem; %5 altındaki farklar; GIRIS=0 (Bol 0 döner → fark %100 gibi
DurumAÇIK
Sorumlu[Ekip tarafından atanacak]
KaynakSessiz risk analizi · Formül: Cari.GetFisPesinKontrol: Tutar = GIRIS>CIKIS ? (1 − Bol(CIKIS,GIRIS)) × 100 : Bol(CIKIS,GIRIS); sonuç > 5 ise 'karşılık bulunamadı' (yazdırma engellenir); limit kontrolü PEŞİN hariç · Kanıt: BR-FATURA-008 (Cari.GetFisPesinKontrol formülü, %5), BR-BAKIYE-016 ('PEŞİN hariç' limit kontrolü), BR-DEFTER-URETIMI, AcceptTransaction tanımı
Wiki bağlantılarıH-104 · BR-DEFTER-URETIMI · BR-BAKIYE-016 · BR-FATURA-008 · BR-TIP-002-003

Sessiz hesaplama riskleri (44) — formül düzeyi

ERPGOLD_SESSIZ_HESAPLAMA_RISKLERI.xlsx "Sessiz_Riskler" sayfası: hesaplama, girdi, formül, sınır koşulu, olası yanlış sonuç, finansal etki ve doğrulama yöntemi.

#ModülHesaplamaGirdilerFormülRiskSınır koşuluOlası yanlış sonuçFinansal etkiOlasılıkGüvenDoğrulamaBilinen ticketInvariantKonum
1MOD-CARIBakiye satırı hassasiyeti: Has (5 hane) → Cari.BakiyeIslem.Bakiye decimal(18,2)Cari.Islemler.Miktar decimal(18,2), AuMilyem decimal(18,5); trigger @Has Decimal(18,5)@Has = I.Miktar * Case When AuMilyem=0 Then 1 else AuMilyem end → Insert Into Cari.BakiyeIslem(...,Bakiye) Values(...,@Has) [Bakiye decimal(18,2)]Trigger has'ı 5 haneli hesaplar ancak BakiyeIslem.Bakiye 2 haneli olduğu için her satır ±0,005 has yuvarlanır. Aynı işlem için Stok.StokHaraketleri.Has 5 haneli yazılır; cari has toplamı ile stok has toplamı aynı hareket kümesinde farklılaşır. Binlerce satırda birikimli fark oluşur, hiçbir hata üretmez.Miktar × AuMilyem üçüncü ondalıkta 5 ve üzeri (ör. 12,34 g × 0,916 = 11,30344 → 11,30); yüksek hacimli hesaplarMüşteri has bakiyesi ile stok has toplamı (bilanço BAKIYE vs STOK kalemi) arasında açıklanamayan gram farkı; mutabakatta 'küsurat tutmuyor' şikâyetiS3 – satır başına ≤0,005 has; hacimli hesaplarda birikimli gram farkı, bilanço/pozisyon mutarsızlığıÇOK YÜKSEK92
SELECT I.Id, I.Miktar*I.AuMilyem AS HasHesap, B.Bakiye FROM Cari.Islemler I JOIN Cari.BakiyeIslem B ON B.IslemId=I.Id AND B.BirimId=I.BakiyeId WHERE I.IsDeleted=0 AND I.IslemKodu IN (1,2,9) AND ABS(ABS(B.Bakiye)-ABS(I.Miktar*I.AuMilyem))>0.004; toplam sapma: SELECT SUM(ABS(B.Bakiye)-ABS(I.Miktar*I.AuMilyem)) ...
CTR-015 (miktar hassasiyeti), H-110/H-125 teması (bakiye küsuratı) – doğrudan ticket yokBir işlemin has bakiye satırı, |Miktar × AuMilyem| değerine 2 hane yuvarlama toleransı içinde eşit olmalıdır.Cari.AcceptTransaction (dbclean/modules.json def) satır 73, 348-349; kb_src/db/columns.json Cari.BakiyeIslem.Bakiye decimal(18,2); Stok.StokHaraketleri.Has decimal(18,5)
2MOD-CARITrigger içinde ROLLBACK sonrası RETURN olmayan dallar (evrak eksik, şube/kasa/hesap=0, takoz stok kontrolü)Inserted (çok satırlı UPDATE: DeleteAt RefNo, İptal FişNo, FrmHesapTemizle, FrmProvizyonKabul), Cari.GetGerekliEvraklar, Stok.GetTakozAdetRAISERROR(...) ; Set @IsError=1 ; ROLLBACK -- RETURN yok (satır 119-123, 180-185, 225-247); döngü başında Set @IsError=0 (satır 90)ROLLBACK sonrası trigger yürütmeye devam eder ve sonraki DML'ler autocommit ile kalıcı olur (SQL Server davranışı). Aynı satır için @IsError=1 olduğundan BakiyeIslem'e dokunulmaz; ancak Inserted çok satırlıysa sonraki satırlarda @IsError sıfırlanır: bu satırların BakiyeIslem/StokHaraketleri kayıtları silinip Inserted (yeni) değerlerle yeniden yazılır, oysa Cari.Islemler güncellemesi geri alınmıştır. Ayrıca satır 235 'Update Stok.Takoz Set IsDeleted=True' ve Activity MERGE geri alınmış işlem için kalıcı olur.Tek UPDATE ile birden çok Cari.Islemler satırı değişirken satırlardan birinin hesabında zorunlu evrak eksik/şube pasif/takoz stokta yok olması (virman/parite çift bacağının RefNo ile iptali, İptal-FişNo, hesap birleştirme)Cari.Islemler'de IsDeleted=0 kalan işlemin BakiyeIslem satırları silinmiş (bakiye eksik) ya da IsDeleted=1 olması gereken işlem aktif kalırken türetilmiş kayıtları silinmiş; takoz kartı yanlışlıkla silinmişS2 – bakiye kartında sessiz eksilme; müşteriye yanlış bakiye bildirimiORTA70
SELECT I.Id FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTipi NOT IN (1,11,12) AND I.IslemKodu IN (1,2,9,4,5,6) AND (I.Tutar<>0 OR (I.BakiyeId>0 AND I.Miktar<>0)) AND NOT EXISTS (SELECT 1 FROM Cari.BakiyeIslem B WHERE B.IslemId=I.Id); ayrıca sys.triggers sırasını ve SQL error log 3609 kayıtlarını inceleyin
GAP-DB-07 (ROLLBACK sonrası RETURN yok), PRB-BAKIYE-000 / H-104-H-106 temasıAktif (IsDeleted=0, tip ∉{1,11,12}) ve tutar/has üreten her işlemin en az bir BakiyeIslem satırı olmalı; silinmiş işlemin hiç olmamalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 90, 109-123, 180-185, 225-247, 256-260
3MOD-CARILimit kontrolü için toplam bakiye (Cari.ToplamBakiye = bugünkü BakiyeIslem + Cari.BakiyeDun)Cari.BakiyeIslem (Tarih = işlem tarihi), Cari.BakiyeDun (Bakiye.DunkiBakiyeler prosedürüyle dolar), Sistem.GetKurListesi(Getdate())Cari.ToplamBakiye = Σ_bugün( Convert(dec(18,2), Bol(Bakiye*Carpan*Kur.Alis, KurHAS.Alis)) )*-1 + Σ Cari.BakiyeDun.Bakiye ; FN.GetCariLimit = IsNull(H.Limit,0)+IsNull(ToplamBakiye,0)+3Dünkü ve önceki bakiyeler yalnız Cari.BakiyeDun tablosundan gelir; bu tabloyu dolduran prosedürü çağıran bir job kaynakta yok ve örnek DB'de tablo 0 satır. Boşsa kalan limit = Limit + (yalnız bugünkü hareketler) + 3 olur; müşterinin birikmiş borcu yok sayılır. BakiyeIslem.Tarih işlem tarihi olduğundan geçmiş tarihle girilen bugünkü işlemler de ne 'bugün' dilimine ne BakiyeDun'a girer.Cari.BakiyeDun boş/eski (job çalışmamış); işlem tarihi ≠ bugün; kur listesi HAS satırı 0Limit aşan müşteriye satış/çıkış işlemi sessizce kabul edilir ('limit çalışmıyor'); tersine job gün içinde tekrar çalışırsa bugünkü hareketler iki kez sayılıp işlem haksız reddedilirS2 – kredi limiti kontrolünün devre dışı kalması; tahsilat riskiYÜKSEK85
SELECT COUNT(*), MAX(Tarih) FROM Cari.BakiyeDun; karşılaştırma: SELECT H.Id, FN.GetCariLimit(H.Id) AS KalanLimit, H.Limit + (-1)*(SELECT SUM(B.Bakiye*Brm.Carpan*K.Alis/KH.Alis) FROM Cari.BakiyeIslem B …) FROM Cari.HesapBilgileri H WHERE H.Limit<>0
GAP-DB-03 (Cari.BakiyeDun boş), CTR-014 (limit kapsamı)Cari.BakiyeDun.Tarih = dün ve limit tanımlı her hesap için satır bulunmalı; ToplamBakiye tüm BakiyeIslem toplamına eşit olmalı.Cari.ToplamBakiye, FN.GetCariLimit, Bakiye.DunkiBakiyeler (modules.json); Cari.Islem.vb:520-528
4MOD-CARILimit kontrolü has karşılığı (Satis ÷ HAS kuru)Islem.Satis (MaliyetHesapla, Double), Program.GetKur("HAS") (bellek kur listesi Alis), FN.GetCariLimitBalance = Satis.Divide(Program.GetKur("HAS")) ; AvaibleLimit = Val(FN.GetCariLimit(HesapId)) ; If Balance > AvaibleLimit Then redDivide uzantısı bölen 0 ise 0 döndürür: HAS kuru 0/eksikse Balance=0 ve kontrol daima geçer. GetKur birim listede yoksa 1 döner: HasSymbol 'HAS' dışında tanımlıysa (kod sabit 'HAS' kullanıyor) Balance = Satis (TL) olur ve HAS cinsinden limitle kıyaslanır. Kontrol yalnız IslemKodu 1,2,3 ÇIKIŞ ve tip≠PEŞİN'de çalışır; takoz/vadeli/çevir çıkışları hiç kontrol edilmez; +3 has tolerans sabittir.Kur listesinde HAS 0 veya yok; Settings.HasSymbol ≠ 'HAS'; IslemKodu ∉ {1,2,3}Limit aşımı sessizce kabul edilir ya da (sembol farkında) her işlem reddedilirS2 – limit kontrolünün devre dışı kalmasıORTA85
SELECT HasSymbol FROM Sistem.Settings; SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE Birim='HAS' OR Alis=0 OR Alis IS NULL; limit tanımlı hesaplarda çıkış işlemleri: SELECT I.Id,I.Satis,I.HasKur FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTuru=1 AND I.IslemTipi<>1 AND I.HasKur IN (0,1)
CTR-014, BR-BAKIYE-016Aktif işlemde HasKur > 1 ve HasKur ≠ 0 olmalı (has kuru fotoğrafı anlamlı).Class/Dao/Islem/Cari.Islem.vb:520-528; Class/Module/Program.vb:260-268; Class/Module/Extention.vb:428-435
5MOD-CARIKur fotoğrafı (HasKur/GumKur/PltKur/PldKur/EurKur) kaydıProgram.KurListesi (15 sn'de bir arka planda yenilenen liste), GlobalSettings.*Symbol@HasKur = Program.GetKur(GlobalSettings.HasSymbol) → K.Alis ; birim bulunamazsa 1Sembol kur listesinde yoksa 1 yazılır; takoz bakiyesinde 'Altına Çevir' Fn.Bol((Miktar*AgMilyem)*GumKur, HasKur) HasKur=1 ile has bakiyeyi TL değerine eşitler. Liste yenileme hatası sessizce yutulur (boş Catch) ve eski kur kullanılmaya devam eder; hesaplanan (IsComputed) birimler için GetLastKur yedeği yoktur (aşağıdaki kayda bakınız).Settings sembolü Birimler'de yok/silinmiş; kur listesi yenileme başarısız; kur tarihi bugün için girilmemişİşlem satırında HasKur=1; takoz/rapor kâr-zarar ve 'işlem günü kur' raporları anlamsızS2 – takoz bakiyesinde büyüklük hatası; raporlarda kur farkı hesabı bozulurDÜŞÜK90
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND (HasKur=1 OR GumKur=1 OR PltKur=1 OR PldKur=1 OR EurKur=1); SELECT s.HasSymbol,s.GumSymbol,s.PltSymbol,s.PldSymbol,s.UsdSymbol,s.EurSymbol FROM Sistem.Settings s; her biri için Sistem.Birimler'de IsDeleted=0 tek satır
HAYIR (BR-KUR-001 kuralı)Settings'teki her metal/döviz sembolü Sistem.Birimler'de silinmemiş ve tek satır olarak bulunmalı; aktif işlemde HasKur∉{0,1}.Class/Dao/Islem/Cari.Islem.vb:607-612; Class/Module/Program.vb:260-268; Class/Dao/Sistem.KurListesi.vb:60-120
6MOD-SISTEMSistem.GetKurListesi – günün kuru yoksa son kur (GetLastKur) yedeği; hesaplanan birimlerde yedek yokSistem.Kurlar (Tarih=@Tarih), Cari.BakiyeKodlari (Carpan, AnaBirimId), Sistem.GetLastKur (yalnız IsComputed='False')Alis = IsNull(Convert(dec(18,4), Kur.Alis*Carpan), L.Alis) ; Kur join: (Case When AnaBirimId=-1 Then 1 Else AnaBirimId End)=Kur.BirimId And Kur.Tarih=@Tarih ; L join: L.BirimId=K.BirimId(a) Günün kuru girilmemişse tüm işlemler sessizce en son (dün, hafta sonu öncesi, hatta ileri tarihli) kurla fiyatlanır; ekranda uyarı yoktur. (b) Hesaplanan birimlerde (ör. ayar/ons türevleri) L join K.BirimId (türev birim Id) üzerinden yapılır; GetLastKur türev birimleri içermediğinden Alis NULL döner; uygulama listesinde KurItem varsayılan 0 ile güncellenir → fiyat 0. (c) TAKOZ (-1) satırı için BirimId 1 sabitlenmiştir (Id=1'in HAS olduğu varsayımı). (d) Kurlar.IsDeleted süzülmez.Gün başında kur girilmeden işlem; hafta sonu/tatil; IsComputed=1 birim; BirimId=1 ≠ HAS olan kurulumYanlış günün kuruyla TL karşılığı/has karşılığı; türev birimde fiyat 0 (Perakende Fiyat = GetKur × Carpan = 0); TAKOZ satırı yanlış kurS2 – işlem fiyatlaması ve bakiye karşılıkları yanlış kurla; S3 türev birimYÜKSEK80
SELECT B.Kodu FROM Sistem.Birimler B WHERE B.IsDeleted=0 AND B.IsComputed=0 AND NOT EXISTS (SELECT 1 FROM Sistem.Kurlar K WHERE K.BirimId=B.Id AND K.Tarih=CONVERT(date,GETDATE()) AND K.IsDeleted=0); SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE Alis IS NULL OR Alis=0; SELECT Id,Kodu FROM Sistem.Birimler WHERE Id=1
H-107 (geçmiş tarihli işlem son kurla), H-124, H-125, PRB-KUR-000Her aktif, hesaplanmayan birim için bugünün tarihli, silinmemiş tek bir kur satırı bulunmalı; GetKurListesi hiçbir satırda NULL/0 Alis döndürmemeli.Sistem.GetKurListesi, Sistem.GetLastKur (modules.json); Class/Dao/Sistem.KurListesi.vb:100-108
7MOD-SISTEMSistem.Kurlar benzersizlik/tarih kontrolü yok; FN.GetKur TOP 1 sırasızSistem.Kurlar (BirimId,Tarih) – unique index yok (indexes.json), IsDeleted süzgeci yokFN.GetKur = Select top 1 Alis From Sistem.GetKurListesi(Getdate()) Where BirimId=@BirimId (ORDER BY yok) ; GetLastKur = MAX(Tarih) per BirimId (ileri tarih dahil)Aynı birim+tarih için birden çok satır oluşabilir (ekranda Id çözümleme hatası, KOPYALA + elle giriş, dış besleme). GetKurListesi bu durumda birimi iki kez döndürür; FN.GetKur rastgele satırı alır, uygulama listesi son okunanı alır, ToplamBakiye/OzetBilanco Birim koduyla join yaptığından bakiye iki kez toplanır. GetLastKur ileri tarihli (yanlış girilmiş) kuru 'son kur' sayar.Duplicate (BirimId,Tarih); ileri tarihli kur satırı; IsDeleted=1 kur satırıBakiye/pozisyon/bilanço toplamları çift sayılır; rastgele kur ile dönüşümS3 – rapor ve karşılık hesaplarında çift sayımORTA85
SELECT BirimId,Tarih,COUNT(*) FROM Sistem.Kurlar WHERE IsDeleted=0 GROUP BY BirimId,Tarih HAVING COUNT(*)>1; SELECT * FROM Sistem.Kurlar WHERE Tarih>CONVERT(date,GETDATE()); SELECT Birim,COUNT(*) FROM Sistem.GetKurListesi(GETDATE()) GROUP BY Birim HAVING COUNT(*)>1
H-125, H-131/H-023 temasıSistem.Kurlar'da (BirimId, Tarih) çifti silinmemiş satırlar için benzersiz olmalı ve Tarih > bugün olmamalı.FN.GetKur, Sistem.GetLastKur, Sistem.GetKurListesi; dbclean/indexes.json (Sistem.Kurlar: yalnız PK_Kurlar ve Tarih indexleri)
8MOD-SISTEMKur giriş ekranı: yeni kur satırının Id'si olarak ExecuteNonQuery dönüşü (etkilenen satır sayısı) kullanılıyorVwKurListesi satırı (Id, BirimId, Alis, Satis), TarihId = Db.ExecuteNonQuery("Insert Into Sistem.Kurlar(...) Values(...) SELECT SCOPE_IDENTITY()") → 1 ; sonraki düzenleme: Update Sistem.Kurlar Set Alis=…,Satis=… Where Id='1'ExecuteNonQuery eklenen satır sayısını (1) döndürür, SCOPE_IDENTITY sonucunu değil. Grid'deki Id 1 olur; kullanıcı aynı oturumda (yenilemeden) aynı birimi ikinci kez düzeltirse Kurlar tablosundaki Id=1 olan tarihi kur satırı güncellenir, günün satırı ilk değerde kalır. Hata mesajı çıkmaz.Aynı ekran oturumunda aynı birim için iki kez değer girme (yazım düzeltmesi)Günün kuru yanlış (ilk girilen) kalır; Id=1'li eski kur satırı bozulur → o günkü arşiv raporları/kur farkı hesabı değişirS3 – yanlış kur ile fiyatlama; tarihi kur bozulmasıORTA85
SELECT Id,Tarih,BirimId,Alis,Satis,LastModify FROM Sistem.Kurlar WHERE Id=1 – LastModify tarihinin Tarih'ten çok sonra olması bulguyu doğrular; SELECT * FROM Sistem.Kurlar WHERE LastModify > DATEADD(day,2,Tarih)
HAYIR (PRB-KUR-000 teması)Sistem.Kurlar satırında LastModify, Tarih'ten makul süre (≤ birkaç gün) sonra olmalı; Id=1 satırı güncel tarihli değişiklik taşımamalı.Form/Genel/FrmKurGirisEkrani.vb:71-84
9MOD-SISTEMSistem.KurKopyala – bugünün kurlarını silip son kurla değiştirirSistem.Kurlar (Tarih=bugün), Sistem.GetLastKurDelete From Sistem.Kurlar Where Tarih=Convert(Date,GETDATE()) ; Insert … Select GETDATE(),BirimId,Alis,Satis,GETDATE(),0 From Sistem.GetLastKurKOPYALA, bugün elle girilmiş tüm kurları siler ve önceki günün kurlarıyla değiştirir; onay/uyarı yoktur, UserId=0 yazılır. Gün içinde kur güncellendikten sonra basılırsa güncel kurlar kaybolur; işlemler eski kurla devam eder.Gün içinde kur girildikten sonra KOPYALA'ya basılması; ileri tarihli kur varsa GetLastKur onu getirirBugünün kurları önceki güne döner; işlemlerde HasKur/BirimKur eski değerS3 – yanlış kurla fiyatlama, raporlarda kur farkıORTA90
SELECT Tarih,BirimId,UserId,LastModify,InsertDate FROM Sistem.Kurlar WHERE Tarih=CONVERT(date,GETDATE()) AND UserId=0 – aynı gün UserId<>0 satırları yoksa ve LastModify öğleden sonra ise kopyalama sonradan yapılmış demektir
H-107/H-124 çözüm adımı olarak öneriliyor (yan etkisi belgelenmemiş)Günün kur satırları gün içinde sonradan UserId=0 ile yeniden yazılmamalı.Sistem.KurKopyala (modules.json); FrmKurGirisEkrani.vb:BtnKopyala
10MOD-SISTEMKur 0/NULL iken Fn.Bol ve .Divide'ın sessiz 0 üretmesi (NET, limit, bilanço, maliyet)Sistem.GetKurListesi Alis/Satis, FN.Bol, Extention.DivideFN.Bol(a,b) = (a<>0 and b<>0) ? a/b : 0 ; Divide(v1,v2) = (v1<>0 And v2<>0) ? v1/v2 : 0Sıfıra bölme korunur ancak sonuç 0 olarak akar: kur eksikse NET=0, bilanço kalemi 0, pozisyon 0, limit karşılığı 0 (kontrol geçer), maliyet 0. Kullanıcı 'toplam 0' görür ama işlem/raporda hata yoktur; kararlar 0 üzerinden verilir.Kur satırı 0 (ekran engeller ama SQL/KOPYALA/dış kaynak engellemez) veya birim kur listesinde yokBakiye ekstresi TOPLAM 0; limit kontrolü etkisiz; maliyet 0S2 – limit/karar hataları; S3 raporlarORTA90
SELECT * FROM Sistem.Kurlar WHERE IsDeleted=0 AND (ISNULL(Alis,0)<=0 OR ISNULL(Satis,0)<=0); SELECT * FROM Sistem.GetKurListesi(GETDATE()) WHERE ISNULL(Alis,0)=0
H-124 (TOPLAM 0), H-110, H-126 (Divide by zero → FN.Bol'a çevirme önerisi)Sistem.Kurlar'da silinmemiş hiçbir satırda Alis veya Satis 0/NULL olmamalı.FN.Bol (modules.json); Class/Module/Extention.vb:428-484; Cari.ToplamBakiye; Bakiye.GetBakiye NET; Stok.GetMadenMaliyeti son satır; Pozisyon.Write
11MOD-SISTEMKur hassasiyeti: GetKurListesi Convert(Decimal(18,4)) ile kuru 4 haneye yuvarlar (Kurlar 18,5)Sistem.Kurlar.Alis/Satis decimal(18,5), Carpan decimal(18,5)Convert(Decimal(18,4), Kur.Alis * Carpan) as AlisBeşinci ondalık atılır; parite tipi küçük kurlarda (ör. 0,00012 gibi TL-dışı çaprazlar) ve Carpan ile türetilen birimlerde bağıl hata büyür. Uygulama, işlem kur fotoğrafı ve tüm SQL NET hesapları bu 4 haneli değeri kullanır.Kur < 0,01 veya Carpan çarpımı 5. hanede anlamlı; büyük tutarlarTL karşılıklarında küçük ama sistematik sapma; işlem kur fotoğrafı ile Kurlar tablosu farklıS4 – küsurat düzeyinde sistematik sapmaORTA80
SELECT K.BirimId,K.Alis, L.Alis FROM Sistem.Kurlar K JOIN Sistem.GetKurListesi(K.Tarih) L ON L.BirimId=K.BirimId WHERE K.Tarih=CONVERT(date,GETDATE()) AND K.Alis<>L.Alis
HAYIRGetKurListesi.Alis ile Kurlar.Alis×Carpan farkı 0,00005'i aşmamalı.Sistem.GetKurListesi (modules.json)
12MOD-STOKIslemTipi 11 (belge takip) ve 12 (MAHSUP) hiç stok/bakiye hareketi üretmez – sayım farkı/açılış girişleri operasyonel stoğa yansımazCari.Islemler.IslemTipiif @IsDeleted='False' And @IsError=0 AND (@IslemTipi <>11 AND @IslemTipi<>12) BEGIN … stok/bakiye üretimi … ENDKullanıcı dokümanı (A-Z 1.8/2.4, H-123) sayım farkı ve açılış stoğunun MAHSUP ile girilmesini önerir; tetikleyici MAHSUP için Stok.StokHaraketleri satırı yazmaz. İşlem listede görünür, hata yoktur, ancak stok listesi/bilanço/pozisyon değişmez. Üstelik mevcut NORMAL bir satır Düzelt ile 11/12'ye çevrilirse önce silme (satır 258-259) çalışır ve bakiye/stok kaydı sessizce kaybolur.IslemTipi ∈ {11,12}; tip değişikliği ile düzeltmeStok sayım düzeltmesi yapılmış sanılır ama stok eski değerde; bilanço farkı; düzeltme ile bakiye kaybıS2 – stok ve bilanço farkı; müşteri bakiyesinin sessiz silinmesiYÜKSEK95
SELECT COUNT(*) FROM Cari.Islemler I WHERE I.IsDeleted=0 AND I.IslemTipi=12 AND I.IslemKodu IN (1,2,3); bunların hiçbirinde EXISTS(Stok.StokHaraketleri Bolum=0) olmamalı – varsa trigger sürümü farklıdır; History: SELECT TransactionId FROM Cari.History H WHERE LogType='Düzeltme' AND IslemTipi IN (11,12) AND EXISTS(SELECT 1 FROM Cari.History H0 WHERE H0.TransactionId=H.TransactionId AND H0.IslemTipi NOT IN (11,12))
CTR-003, CTR-004, CTR-005, BR-TIP-004, H-123 (çözüm adımı MAHSUP), H-142IslemTipi ∈ {11,12} olan işlemlerin BakiyeIslem/StokHaraketleri(Bolum=0) satırı olmamalı; NORMAL→11/12 tip değişikliği History'de izlenebilir olmalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 263
13MOD-STOKNegatif miktar/adet girişi: bakiye abs() ile yön alır, stok hareketi işaretsiz miktarı taşırCari.Islemler.Miktar/Adet (DevExpress numeric mask; negatif engeli kodda yok), IslemTuruBakiye: Set @Has=0-abs(@Has) / abs(@Has) ; Stok: Miktar = Case When @IslemTuru=0 Then @Miktar When 1 Then 0-@Miktar End (abs yok)Miktar negatif girilirse bakiye satırı yön kuralına göre düzgün işaret alır ama stok hareketi ters yöne yazılır (giriş stoğu azaltır). Ayrıca tip PEŞİN nakit satırı ve pırlanta maliyeti aynı biçimde ters işaret alır. Uygulama yalnız Miktar=0'ı engeller.Miktar<0, Adet<0 veya Tutar<0 girilmiş satırCari has bakiyesi doğru, stok ters; bilanço BAKIYE≠STOKS2 – stok/bilanço tutarsızlığıDÜŞÜK60
SELECT Id,IslemKodu,IslemTuru,Miktar,Adet,Tutar FROM Cari.Islemler WHERE IsDeleted=0 AND (Miktar<0 OR Adet<0 OR Tutar<0); SELECT H.* FROM Stok.StokHaraketleri H JOIN Cari.Islemler I ON I.Id=H.IslemId AND H.Bolum=0 WHERE I.IslemKodu IN (1,2,9) AND H.StokTipi=1 AND SIGN(H.Miktar)<>CASE WHEN I.IslemTuru=0 THEN 1 ELSE -1 END
HAYIR (H-123 negatif stok teması)Aktif işlemde Miktar, Adet ve Tutar negatif olmamalı; stok hareketi işareti IslemTuru ile uyumlu olmalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 274, 284, 336-344; Cari.Islem.vb:513 (yalnız Miktar=0 kontrolü)
14MOD-STOKStok.GetMadenMaliyeti – son 50 giriş (LIFO), bugünkü kurla bölme, kalan miktara 0 maliyetStok.StokHaraketleri (IslemTuru=0, StokTipi=1, Bolum süzgeci yok), Stok.Maden.MaliyetBirimId, Sistem.Kurlar (Order By Tarih Desc, IsDeleted yok)CURSOR top 50 … Order By IslemId Desc ; ToplamMaliyet += Maliyet (veya orantılı) ; RETURN Convert(dec(18,2), Bol(ToplamMaliyet, (Select top 1 Alis From Sistem.Kurlar Where BirimId=@BirimId Order By Tarih Desc)))Maliyet yalnız girişteki işçilik TL'sidir (metal değeri yoktur); 50 hareket sınırı nedeniyle çok hareketli stokta eski girişler görülmez ve eldeki miktarın karşılanamayan kısmı 0 maliyetle kalır; kur 'en son tarihli' alındığından geçmiş tarihli stok listesi bugünkü kurla değerlenir; Order By IslemId, Bolum=1/2 (üretim/transfer) satırlarının farklı Id ad alanıyla karışmasına açıktır; @Miktar/@Maliyet Decimal(18,2).Stok > son 50 girişin toplamı; geçmiş tarihli rapor; maliyet birimi kuru değişimi; transfer ile gelen stok (Maliyet satırı yok)Birim maliyet düşük/0; maliyet bir günde sıçrar; kur değişince tarihi maliyet değişirS3 – kâr/maliyet raporları yanlış; bilanço İŞÇİLİK kalemiYÜKSEK90
SELECT StokId,SubeId,KasaId,COUNT(*) FROM Stok.StokHaraketleri WHERE StokTipi=1 AND IslemTuru=0 GROUP BY StokId,SubeId,KasaId HAVING COUNT(*)>50; eldeki miktarı ilk 50 girişin toplamını aşan stoklar: karşılaştırma sorgusu; Bilanco.GetKurFarki çıktısı
H-120, H-121, H-122, H-129, CTR-SEC-MALIYET-01Eldeki miktar, maliyet hesabına giren giriş hareketleri toplamını aşmamalı (aşarsa maliyet eksik).Stok.GetMadenMaliyeti (modules.json)
15MOD-STOKOrtalama milyem / maliyet cursor değişkenleri Decimal(18,2) – 5 haneli Has/Miktar kesilirStok.StokHaraketleri.Miktar/Has decimal(18,5)Declare @Miktar Decimal(18,2), @Has Decimal(18,2), @ToplamHas Decimal(18,2) … RETURN Fn.Bol(@ToplamHas,@ToplamMiktar)Her hareket 2 haneye yuvarlanarak toplanır; küçük gramajlı çok sayıda hareket (ör. 0,005 g altı has satırları) ortalama milyemi saptırır; stok listesi Miktar/Has 2 haneye yuvarlanır ancak StokHaraketleri toplamı 5 hanelidir → liste toplamı ≠ hareket toplamı.Miktar×Milyem 3. ondalıkta anlamlı; çok sayıda küçük hareketOrtalama milyem ve has stoğu küsuratta yanlış; stok listesi ile hareket dökümü toplamı farklıS4 – küsurat sapması; birikimliYÜKSEK85
SELECT StokId,SUM(Miktar) AS M5, SUM(CONVERT(decimal(18,2),Miktar)) AS M2 FROM Stok.StokHaraketleri WHERE StokTipi=1 GROUP BY StokId HAVING SUM(Miktar)<>SUM(CONVERT(decimal(18,2),Miktar))
CTR-015Stok listesi has/miktar değerleri, hareket toplamına 0,01 toleransla eşit olmalı.Stok.GetOrtMilyem, Stok.GetMadenMaliyeti (modules.json); Stok.GetMadenStok/GetMadenStoklari CONVERT(Decimal(18,2), Miktar)
16MOD-STOKStok has değeri kart milyemiyle, cari has bakiyesi işlem milyemiyle – stok ve cari türetilmiş kayıtları farklı milyem kullanırStok.Maden.Milyem/MilyemDurumu, Cari.Islemler.AuMilyem, Stok.StokHaraketleri.MilyemStok listesi: Has = Miktar × (MilyemDurumu='False' ? Maden.Milyem : GetOrtMilyem) ; Pozisyon: Sum(Miktar × StabilMilyem) (=Maden.Milyem her durumda) ; Bakiye: Miktar × AuMilyem (işlem)İşçilikli milyem ayrıştırması (BR-HESAP-005) veya elle farklı milyem girilen işlemde bakiyeye Miktar×AuMilyem yazılır; stok ve pozisyon ise kart milyemini kullanır. Pozisyon.Write değişken milyemli (MilyemDurumu=True, hurda) kartlarda da sabit kart milyemini alır. Sonuç: BAKIYE ve STOK kalemleri farklı has üretir; bilanço/pozisyon 'tutmaz'.AuMilyem ≠ Maden.Milyem olan işlemler; MilyemDurumu=True kartlar; negatif işçilikli kart (BR-HESAP-011)Pozisyon raporunda has farkı; bilanço kâr/zarar hatalı; 'kur değişince bilanço değişiyor'S3 – yönetim raporlarında has pozisyonu yanlışORTA75
SELECT I.Id,I.StokId,I.AuMilyem,M.Milyem,M.MilyemDurumu FROM Cari.Islemler I JOIN Stok.Maden M ON M.Id=I.StokId WHERE I.IsDeleted=0 AND I.IslemKodu IN (1,2) AND I.AuMilyem<>M.Milyem; SELECT StokId,SUM(Has) AS HasHareket, SUM(Miktar)*MAX(Milyem) FROM Stok.StokHaraketleri WHERE StokTipi=1 GROUP BY StokId
H-129, H-130, PRB-BILANCO-000, PRB-POZISYON-000Bir stok kodunun StokHaraketleri.Has toplamı, aynı satırların Miktar×Milyem toplamına eşit olmalı; pozisyon has'ı hareket has'ı ile aynı temeli kullanmalı.Stok.GetMadenStoklari, Stok.GetMadenStok, Pozisyon.Write (modules.json); iFMaden.vb MilyemDegisti (BR-HESAP-005)
17MOD-STOKTransfer kabulünde stok hareketi üretimi (Cari.TransferUpdateSTatus) – eski satırlar silinmiyorCari.Transferler (Status), Stok.StokHaraketleri Bolum=2if UPDATE(status): Delete From Stok.StokHaraketleri Where StokTipi=-2 AND IslemId in (inserted) ; Insert … Select 2,Id,1,…,CikanKasaId,…,Adet*-1,Miktar*-1 … Where Status=1 ; Insert … GirenKasaId … Where Status=1Silme koşulu StokTipi=-2 (var olmayan tip) olduğundan hiçbir zaman eski Bolum=2 satırı silinmez. Transferler.Update() Status kolonunu her zaman yazdığı için UPDATE(status) doğru döner ve Status=1 olan bir transfer her düzenlendiğinde iki stok hareketi daha eklenir. Transferin IsDeleted=1 yapılması veya Status'un 1'den başka değere alınması mevcut hareketleri silmez.Kabul edilmiş (Status=1) transferin düzenlenmesi/yeniden kaydı; transferin sonradan iptaliAynı transfer stoktan iki (n) kez düşer/çıkar; iptal edilen transferin stoğu geri gelmezS2 – kasa/şube stokları çift sayımORTA80
SELECT T.Id,T.Status,T.IsDeleted,COUNT(H.IslemId) FROM Cari.Transferler T LEFT JOIN Stok.StokHaraketleri H ON H.IslemId=T.Id AND H.Bolum=2 GROUP BY T.Id,T.Status,T.IsDeleted HAVING (T.Status=1 AND T.IsDeleted=0 AND COUNT(H.IslemId)<>2) OR ((T.Status<>1 OR T.IsDeleted=1) AND COUNT(H.IslemId)>0)
H-114, H-119 teması; BR-TRANSFER-001Status=1 ve silinmemiş her transfer için tam 2 adet Bolum=2 stok hareketi; diğer durumlarda 0 olmalı.Cari.TransferUpdateSTatus (modules.json); Class/Dao/Cari.Transferler.vb:222 (Update tüm kolonları, Status dahil yazar), :272-301 (IsDeleted)
18MOD-STOKStok.StokHaraketleri.IslemId ad alanı çakışması (Bolum 0 → Cari.Islemler.Id, Bolum 1 → Uretim, Bolum 2 → Transferler.Id)Stok.StokHaraketleri.IslemId, BolumGetStokHareketleri: Left Join Cari.Islemler I on H.IslemId=I.Id (Bolum süzgeci yok) → HesapAdi/Tarih/Fiyat/Tutar başka işlemden; GetTakozAdet: IslemId<>@IslemId (Bolum süzgeci yok)Transfer/üretim satırlarının IslemId'si Cari.Islemler'deki rastgele bir işlemle çakışır; hareket dökümünde yanlış hesap adı/tarih/tutar görünür; LIFO maliyet sıralaması Id karışımıyla bozulur. AcceptTransaction'daki silme Bolum=0 ile sınırlı olduğundan veri silinmez ama raporlar yanıltır.Bolum=2 veya Bolum=1 satırının IslemId'si ile aynı Id'li Cari.Islemler satırıStok hareket raporunda transfer satırı yanlış tarih/hesapla; maliyet sırası yanlışS3 – rapor yanılgısı; maliyet sırasıYÜKSEK90
SELECT COUNT(*) FROM Stok.StokHaraketleri H JOIN Cari.Islemler I ON I.Id=H.IslemId WHERE H.Bolum<>0
H-119 (transfer satırları yanlış tarihte)Bolum≠0 stok hareketleri Cari.Islemler ile Id üzerinden ilişkilendirilmemeli.Stok.GetStokHareketleri, Stok.GetTakozAdet, Stok.GetMadenMaliyeti (Order By IslemId) – modules.json; AcceptTransaction satır 259 (Bolum=0 ile sınırlı silme)
19MOD-STOKPırlanta stok maliyeti = Tutar × FN.GetKur(BirimId)@Tutar, @BirimId (PEŞİN'de nakit stok Id'si, diğerlerinde birim Id'si), FN.GetKur (bugünün kur listesi)Declare @Maliyet decimal(18,2) = @Tutar * Fn.GetKur(@BirimId) → StokHaraketleri.MaliyetGetKur eşleşme bulamazsa NULL döner → Maliyet NULL (bilanço PIRLANTA kalemi Sum ile NULL'u atlar). PEŞİN tipte BirimId nakit stok kimliğidir, birim kimliği değil; yanlış birimin kuru uygulanır. Kur, işlem tarihinin değil bugünün kurudur; düzeltmede de bugünkü kurla yeniden yazılır. Uygulama tarafı (BR-MALIYET-003) farklı formül kullanır (CTR-SEC-PIRLANTA-01).IslemKodu=8 ve IslemTipi=1; BirimId kur listesinde yok; geçmiş tarihli düzeltmePırlanta maliyeti NULL/yanlış birim kuruyla; bilanço PIRLANTA kalemi eksikS3 – bilanço kalemi hatasıORTA75
SELECT H.* FROM Stok.StokHaraketleri H WHERE H.StokTipi=4 AND (H.Maliyet IS NULL OR H.Maliyet=0); SELECT I.Id,I.IslemTipi,I.BirimId FROM Cari.Islemler I WHERE I.IslemKodu=8 AND I.IslemTipi=1 AND I.IsDeleted=0
CTR-SEC-PIRLANTA-01, BR-STOK-004StokTipi=4 hareketlerde Maliyet NULL olmamalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 291-296; FN.GetKur
20MOD-STOKÇeşni ve takoz stok listeleri InsertDate ile, stok hareketleri Tarih ile süzülürCari.Islemler.InsertDate vs Tarih; Stok.StokHaraketleri.TarihGetCesniStoklari/GetTakozSubeStoklari: CONVERT(date,InsertDate)<=@Tarih ; StokHaraketleri: Tarih<=@Tarih ; BakiyeIslem.Tarih = I.TarihGeçmiş tarihe girilen çeşni/takoz işlemi bilançoda kayıt gününe, cari bakiyede işlem gününe düşer; tarihli bilanço iki kalemde farklı kesim kullanır ve tutmaz. Ayrıca trigger değişkeni @InsertDate aslında I.Tarih'i taşır (isim yanıltıcı); devir kesimi bu alana dayanır.Geçmiş tarihli takoz/çeşni işlemi; devir kesim tarihine yakın kayıtlarTarihli bilanço/pozisyon farkı; devirde satırın yanlış döneme düşmesiS3 – rapor kesim hatasıORTA85
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (0,14) AND CONVERT(date,InsertDate)<>Tarih
H-108 (devir kesimi), H-130Stok ve bakiye türetimleri aynı tarih alanını (Tarih) esas almalı.Stok.GetCesniStoklari, Stok.GetTakozSubeStoklari (modules.json); AcceptTransaction satır 72-75 (@InsertDate = I.Tarih)
21MOD-CARINakit tip 10 (PARİTE) satırı doğrudan kaydedilirse ters işaretli bakiye ve BirimId=0 satırıIslemKodu=3, IslemTipi=10, BakiyeId (nakitte daima 0 – Cari.IslemEx.vb:291-303), Tutarsatır 318-330: Insert BakiyeIslem(BirimId=@BakiyeId, Bakiye=±@Miktar) ; satır 421-425: Insert BakiyeIslem(BirimId=@BirimId, Bakiye=@Tutar*-1)Ekran PARİTE'yi yeni kayıtta iki NORMAL bacağa çevirir; ancak mevcut kayıt düzenlenirken (RecordId≠0) tip PARİTE seçilirse satır IslemTipi=10 ile kaydedilir. Trigger bu satır için BirimId=0 (Birimler'de yok) bir bakiye satırı ve normal nakit kuralının tersi işaretli tutar satırı yazar. Bakiye kartı BirimId=0 satırını göstermez; ToplamBakiye/bilanço Carpan NULL nedeniyle atlar; tutar satırı ise müşteri bakiyesini ters yöne çevirir.IslemTipi=10 olarak kaydedilmiş nakit satırı (düzeltme yolu)Müşteri TL bakiyesi ters işaretli; görünmeyen BirimId=0 bakiye satırıS2 – bakiye yönü hatasıDÜŞÜK65
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=3 AND IslemTipi=10; SELECT * FROM Cari.BakiyeIslem WHERE BirimId=0 OR BirimId IS NULL
CTR-027, BR-YON-004, H-080Cari.BakiyeIslem.BirimId ∈ Sistem.Birimler.Id ∪ {-1} olmalı; 0/NULL olmamalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 318-330, 421-425; Controls/Islem Ekranı/Ekran/iFNakit.vb:91-96, 323-330
22MOD-CARIÇeşni (IslemKodu=14) bakiye satırları yönden bağımsız pozitif yazılırIslemKodu=14, Miktar, AuMilyem, AgMilyem, IslemTuruValues(…,@HasBirimId,@Miktar * @AuMilyem) ; Values(…,@GumBirimId,@Miktar * @AgMilyem) (IslemTuru'na göre işaret yok)Ekran her zaman ÇIKIŞ yazdığı için sonuç doğru görünür; ancak satır Düzelt ile tür değiştirilirse ya da seri/sonradan eklenen bir yol GİRİŞ çeşnisi yazarsa bakiye yine borç (+) olarak kalır. Ayrıca çeşni satırı IslemKodu∉{0,1,2,4,5,6,9} olduğu için 'diğer stok işlemi' bloğuna da girer; Tutar≠0 ise ek bir tutar satırı yazılır.IslemKodu=14 ve IslemTuru∈{0,2,4}; Tutar≠0 çeşni satırıÇeşni girişinde müşteri alacaklanacağına borçlanırS3 – yön hatası (nadir yol)DÜŞÜK70
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=14 AND (IslemTuru<>1 OR ISNULL(Tutar,0)<>0)
BR-BAKIYE-004, BR-HESAP-020, CTR-039IslemKodu=14 satırlarında IslemTuru=1 ve Tutar=0 olmalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 311-317; Controls/Islem Ekranı/Ekran/iFCesni.vb:60-69 (IslemTuru daima CIKIS)
23MOD-CARIRaporsuz takoz bakiyesi: XRF milyemi 0 ise TAKOZ (-1) birimine miktar; değerleme 0,6 varsayımıStok.Takoz.XRFAuMilyem/XRFAgMilyem, IsRapor, Miktar(+CesniMiktar girişte)IsRapor=0 ⇒ @AuMilyem=XRFAuMilyem ; (@AuMilyem=0 And @AgMilyem=0) ⇒ Insert BakiyeIslem(BirimId=-1, Bakiye=∓Miktar) ; NetBakiye = Bakiye*0.6 ; Bakiye.GetBakiye: Case When XRFAuMilyem=0 Then 0.6 ; Pozisyon.Write: Miktar*0 ; Bilanço: Miktar*0.6Aynı raporsuz takoz üç yerde üç farklı has değeriyle değerlenir (0; 0,6; kart Miktar*0,6 vs bakiye Miktar). Rapor geldiğinde işlem düzeltilmezse bakiye TAKOZ satırında kalır; düzeltme (Geri Al/Düzelt) anındaki XRF değerleri orijinal kayıttan farklıysa bakiye yeniden üretimde değişir.IsRapor=0 ve XRF milyemleri 0; rapor sonrası düzeltilmemiş takoz; XRF sonradan güncellenen takozPozisyon 0, bilanço 0,6, bakiye kartı miktar bazlı – üç rapor tutmazS3 – rafineri/ayar evi kurulumlarında has pozisyonu belirsizORTA85
SELECT HesapId,SUM(Bakiye) FROM Cari.BakiyeIslem WHERE BirimId=-1 GROUP BY HesapId HAVING SUM(Bakiye)<>0; SELECT T.Id FROM Stok.Takoz T WHERE T.IsRapor=1 AND EXISTS(SELECT 1 FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.StokId=T.Id AND I.IslemKodu=0 AND B.BirimId=-1)
CTR-SYM-TAKOZ-01, BR-BAKIYE-008/009, GAP-TAKOZ-FIRE, H-117, H-130Raporlu (IsRapor=1) takozun işlemlerinde BirimId=-1 bakiye satırı kalmamalı; raporsuz takoz değerleme katsayısı tüm raporlarda aynı olmalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 452-458, 554-558; Cari.BakiyeIslem.NetBakiye computed; Bakiye.GetBakiye; Pozisyon.Write; Bilanco.OzetBilanco
24MOD-CARIİptalin geri alınması / mutabakat gibi her UPDATE'te bakiye ve stoğun güncel referans verisiyle yeniden üretilmesiInserted (herhangi bir kolon güncellemesi), Stok.Takoz XRF milyemleri, Sistem.Settings sembolleri, Fn.GetKur(bugün)Her UPDATE'te: Delete BakiyeIslem/StokHaraketleri(Bolum=0) → yeniden Insert (XRF milyem, HasBirimId, Fn.GetKur bugünkü değerlerle)Türetilmiş kayıtlar işlem satırındaki kur fotoğrafıyla değil o anki referans verilerle (takoz XRF milyemi, Settings sembolleri, pırlanta için bugünkü kur) yeniden hesaplanır. 'Geri Alındı', mutabakat, hesap birleştirme gibi işlem tutarını değiştirmeyen güncellemelerde bile bakiye satırları değişebilir; Cari.Hesaplar.LastDate güncellenir. Sonuç, tarihi bakiye ekstresinde açıklanamayan değişikliktir (History'de işlem alanları aynı görünür).XRF milyemi/Settings/kur değiştikten sonra eski işlemin herhangi bir nedenle güncellenmesiKimse işlem değiştirmeden bakiye değişir (H-105'in kod bağlantısı)S3 – bakiye değişimi izlenemezORTA75
SELECT B.IslemId FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.LastModify IS NULL AND I.MTarih IS NOT NULL – mutabakat yapılmış işlemlerde BakiyeIslem toplamı ile History'deki orijinal Miktar×AuMilyem karşılaştırılır
H-105 (bakiye birden değişti), BR-BAKIYE-014Bir işlemin BakiyeIslem toplamı, işlem alanları değişmedikçe (History 'Düzeltme' yoksa) sabit kalmalı.Cari.AcceptTransaction (dbclean/modules.json def) satır 256-260, 293, 452-455; iScreen.vb:1136 (F12 mutabakat UPDATE)
25MOD-CARIFiş numarası üretimi MAX(FisNo)+1 (silinmemişler) ve fiş bazlı toplu iptalCari.Islemler.FisNo (unique değil, IX_FisNo), IsDeleted; Program.KasaIdGetNewFisNo = Val(Select Max(FisNo) From Cari.Islemler Where IsDeleted='False') + 1 ; onIptalFisNoClick: Update Cari.Islemler Set IsDeleted='True' Where FisNo=@FisNo and KasaId=@KasaId(a) İki kullanıcı aynı anda aynı fiş numarasını alır (yarış). (b) Son fişin tüm satırları iptal edilince numara yeniden kullanılır; iptal edilen fişle yeni fiş aynı numarayı paylaşır. (c) Fiş-No ile iptal, tarih süzgeci olmadan kasadaki aynı numaralı tüm satırları (farklı günler dahil) sessizce iptal eder; açıklama/onay/karşı bacak kontrolü yapmaz.Eşzamanlı kayıt; son fişin iptali; aynı FisNo'ya sahip farklı günlerdeki satırlarYanlış işlemlerin toplu iptali (bakiye/stok geri alınır); fiş bakiyesi (GetFisBakiye FisNo<=) yanlışS2 – yanlış işlemlerin iptaliORTA85
SELECT FisNo,KasaId,COUNT(DISTINCT Tarih) FROM Cari.Islemler GROUP BY FisNo,KasaId HAVING COUNT(DISTINCT Tarih)>1; SELECT FisNo,COUNT(DISTINCT HesapId) FROM Cari.Islemler WHERE IsDeleted=0 GROUP BY FisNo HAVING COUNT(DISTINCT HesapId)>1
H-102, CTR-012, CTR-016Aynı kasada aynı FisNo yalnız tek bir güne ve tek bir hesaba ait olmalı.Class/Ext/Cari.IslemEx.vb:256-260; Controls/Islem Ekranı/Base Control/iScreen.vb:720-728
26MOD-CARIÇift kayıt (duplicate posting) – zaman aşımı/ağ kopması sonrası tekrar kayıtInsert (InternalDb.ExecuteScalar → hata MsgBox, RecId=0), RefNo (her nesnede yeni GUID), unique index yokTry RecId=db.ExecuteScalar() Catch … End Try ; If RecId>0 Then Id=RecId … Else Return FalseSunucu INSERT'i işledikten sonra yanıt istemciye ulaşmazsa (timeout 30 sn, ağ) uygulama hata gösterir ve kayıt başarısız sanılır; kullanıcı tekrar F2 basar. RefNo her nesnede yeni GUID olduğundan ve FisNo/hesap/tutar için benzersizlik yoktur, ikinci satır sessizce kabul edilir.Ağ kesintisi/uzun tetikleyici süresi (AcceptTransaction cursor + GetGerekliEvraklar) sırasında kayıtAynı işlem iki kez bakiye ve stoğa yazılırS2 – çift bakiye/stokORTA75
SELECT a.Id,b.Id FROM Cari.Islemler a JOIN Cari.Islemler b ON b.Id>a.Id AND b.HesapId=a.HesapId AND b.Tarih=a.Tarih AND b.IslemKodu=a.IslemKodu AND b.IslemTuru=a.IslemTuru AND ISNULL(b.Kodu,'')=ISNULL(a.Kodu,'') AND b.Miktar=a.Miktar AND b.Tutar=a.Tutar AND ABS(DATEDIFF(second,a.InsertDate,b.InsertDate))<=60 WHERE a.IsDeleted=0 AND b.IsDeleted=0
TD-01 teması; PRB-BAGLANTI-000Aynı hesap/tarih/kod/yön/miktar/tutar ile 60 sn içinde ikinci aktif işlem olmamalı.Class/Dao/Islem/Cari.Islem.vb:694-709; Class/Module/InternalDb.vb:69-81; dbclean/indexes.json (Cari.Islemler unique yalnız PK)
27MOD-CARIÇok adımlı kayıt zincirlerinde transaction yokluğu (Insert→RsAktar, Save→SendTo karşı bacak, parite iki bacak, Update→Takoz.RaporYaz)Cari.Islem.Insert/Update, iFormBase.SendTo, iFNakit.SaveCashTransactionRecId = db.ExecuteScalar() ; If RSAktar … db.ExecuteNonQuery("Cari.RsAktar " & RecId) ; … SendTo: I.Id=0; I.HesapId=karşı; I.IslemTuru=GetKarsiIslemTuru; I.Saveİlk bacak yazıldıktan sonra ikinci adım (karşı hesap limiti/evrak/pasif şube nedeniyle trigger reddi, ağ) başarısız olursa uyarı çıkar ama ilk bacak kalır: virman/parite/transfer tek taraflı, RsAktar eksik. İptalde RefNo+IslemKodu ile karşı bacak aranır; farklı IslemKodu'lu eşler (yoksa) bulunmaz.Karşı hesapta zorunlu evrak eksik, limit aşımı, şube pasif; ağ kesintisiİki hesabın bakiye toplamı sıfırlanmaz; parite ikinci döviz stoğu değişmezS2 – tek taraflı bakiye/stokORTA90
SELECT RefNo,COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=11 GROUP BY RefNo HAVING COUNT(*)<>2; parite: SELECT a.Id FROM Cari.Islemler a WHERE a.IsDeleted=0 AND a.IslemKodu=3 AND a.VaryantId=-1 AND NOT EXISTS(SELECT 1 FROM Cari.Islemler b WHERE b.VaryantId=a.Id AND b.IsDeleted=0)
TD-01, H-106, H-063, BR-VIRMAN-002Virman (IslemKodu=11) RefNo'su tam iki aktif satır taşımalı; parite birinci bacağının (VaryantId=-1) ikinci bacağı (VaryantId=Id) bulunmalı.Class/Dao/Islem/Cari.Islem.vb:694-700, 987-993; Controls/Islem Ekranı/Ekran/iFormBase.vb:218-264; iFNakit.vb:180-300
28MOD-CARICari.UpdateTransaction – çok satırlı UPDATE'te tek satır değişkeni; Mutabakat güncellemesi history üretmezInserted/Deleted (çok satır), Cari.IslemDetaylari.ETTNSelect @IsDeleted=I.IsDeleted, @IslemId=D.IslemId, @Ettn=D.ETTN from inserted I Left Join IslemDetaylari D … (tek değer) ; Set @Status=(Select top 1 … From Inserted) ; if NOT Update(Mutabakat) …RefNo/FisNo ile toplu iptalde yalnız rastgele bir satırın IslemDetaylari kaydı silinir/EIPTAL yapılır; diğer satırların belge detayları aktif kalır (belge havuzu görünümü iptal edilmiş işlemi belgeli sayabilir). Mutabakat ve Mutabakat ile birlikte başka alan değişen güncellemelerde hiç history yazılmaz.Birden çok satırı etkileyen UPDATE; Mutabakat kolonunu içeren UPDATEBelge havuzunda iptal edilmiş işlem 'F' durumunda kalır; history eksikS3 – belge/kontrol görünümü tutarsızlığıORTA85
SELECT D.IslemId FROM Cari.IslemDetaylari D JOIN Cari.Islemler I ON I.Id=D.IslemId WHERE I.IsDeleted=1 AND ISNULL(D.ETTN,'')='' ; SELECT I.Id FROM Cari.Islemler I WHERE NOT EXISTS(SELECT 1 FROM Cari.History H WHERE H.TransactionId=I.Id)
HAYIR (H-105 history okuma akışı)İptal edilmiş (IsDeleted=1) ve e-belgesi olmayan işlemin IslemDetaylari satırı kalmamalı; her işlemin en az bir History satırı olmalı.Cari.UpdateTransaction (modules.json)
29MOD-FINANSUygulama yuvarlama yardımcıları: .Round(n) uzantısı keser (truncate) ve hane parametresini yok sayar; Math.Round banker's; ToNumeric/TextN kültür varsayımıDouble değerler (BSMV, tutar), Utils.Culture (ondalık '.', binlik ',')Round(Value,Decimals): Values=Value.ToString.Split(".") ; Result=Values(0)+"."+Left(Values(1),2) ; Val(Result) ; ToNumeric = Val(Replace(Value,",","")) ; Math.Round(x,2) = MidpointRounding.ToEvenVadeli ve hızlı satışta BSMV = (Tutar×BSMV/1000).Round(2) her zaman aşağı kesilir (12,999→12,99), hane parametresi 2'ye sabittir, bilimsel gösterim (1E-05) ve kültür ayarı '.' değilse Catch ile yuvarlanmadan döner. Nakit/parite ekranı Math.Round (bankacı yuvarlama) kullanırken SQL Convert(decimal(18,2)) yarım-yukarı yuvarlar → 0,005'lik değerlerde ekran/rapor farkı. Parite tutarları 0 haneye yuvarlanır (Round(...,0)).BSMV küsuratı 3. hanede ≥5; tutar×fiyat tam yarım kuruş; kültür/ondalık ayarı farklı iş parçacığıVergi tutarı 1 kuruş eksik; ekran ile SQL raporu arasında kuruş farkı; parite TL bacağı ±0,5 TLS4 – kuruş düzeyinde sistematik sapma (vergi tarafında birikimli)YÜKSEK90
SELECT Id,Tutar,BSMV,ROUND((Tutar-BSMV)*(SELECT BSMV FROM Sistem.Settings)/1000,2) AS BSMVHesap FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (3,6) AND BSMV<>0 AND ABS(BSMV-ROUND((Tutar-BSMV)*(SELECT BSMV FROM Sistem.Settings)/1000,2))>0.011
CTR-010, BR-BSMV-003/004Kayıtlı BSMV, (Tutar−BSMV)×BSMVOran/1000 değerine ±0,01 toleransla eşit olmalı.Class/Module/Extention.vb:437-450, 366-368; Controls/Editor/TexBoxEdit.vb:100-105; iFVadeli.vb:755; HizliSatisEkrani.vb:688-737; iFNakit.vb:452,463-471; iFDoviz.vb:95-181
30MOD-FINANSNakit BSMV geri hesabı (Tutar'dan fiyat) ileri formülün tersi değilTxtTutar (BSMV dahil), GlobalSettings.BSMV (binde), IsBsmvİleri: BSMV = Net×BSMV/1000 ; TUTAR = Round(Net+BSMV,2) ; Geri (TxtTutar LostFocus): Net ≈ Tutar − Tutar×BSMV/1000 (brütten kesinti)Tutar elle girildiğinde net tutar ve fiyat yaklaşık hesaplanır; ardından TutarHesapla yeniden tetiklenirse Tutar ilk girilenden farklı olur (100.000 → 99.999,60). Kayıtlı BSMV ile Tutar arasındaki ilişki işlemden işleme değişir; e-belge vergi matrahı (Calc.BSMV) farklı formülle (BSMVOran) hesaplandığından belge ile işlem satırı uyuşmayabilir.IsBsmv ve Tutar elle girilmiş; BSMV ayarı Dahil/HariçBelge vergi tutarı ile işlem BSMV alanı farklı; tutar 40 kuruş saparS4 – kuruş/TL düzeyinde vergi farkı; mutabakat sorusuYÜKSEK85
SELECT Id,Tutar,BSMV,Miktar,Fiyat, Miktar*Fiyat AS Net FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu=3 AND BSMV<>0 AND ABS((Miktar*Fiyat+BSMV)-Tutar)>0.011
BR-BSMV-003, CTR-010Nakit satırında Tutar = Miktar×Fiyat + BSMV (±0,01) olmalı.Controls/Islem Ekranı/Ekran/iFNakit.vb:440-472; Class/Module/ExtensionEx.vb:16-44
31MOD-CARIMaliyet/İşçilik hesabı Double ile; negatif işçilik 0'a çekilir; kur 0 ise işçilik 0Miktar, AuMilyem, AnaBirim.Price, TutarBirim.Price, MaliyetBirim.Price (bellek kur listesi Alis)MiktarMaliyeti=(Miktar×AuMilyem)×AnaBirim.Price ; Giriş: Iscilik=(TutarMaliyeti−MiktarMaliyeti).Divide(MaliyetBirim.Price) ; If Iscilik<0 Then Iscilik=0 ; Maliyet=Satis=TutarMaliyetiMüşteriden metal değerinin altında alış (negatif işçilik = iskonto) 0 işçilikle kaydedilir; StokHaraketleri.Maliyet (=Iscilik×Kur) 0 olur, gerçek kazanç maliyet raporunda görünmez. Maliyet birimi kuru 0/eksikse Divide 0 döndürür ve işçilik sessizce 0 yazılır. Tüm hesap Double'dır; decimal(18,2) kolonlara dönüşümde bankacı/yarım-yukarı farkı.TutarMaliyeti < MiktarMaliyeti (iskontolu alış); MaliyetBirim kuru 0; kur listesi eksikKâr raporunda alış iskontosu kaybolur; maliyet 0S3 – kâr/maliyet raporuORTA80
SELECT Id,Miktar,AuMilyem,HasKur,Tutar,BirimKur,Iscilik FROM Cari.Islemler WHERE IsDeleted=0 AND IslemKodu IN (1,9) AND IslemTuru=0 AND IslemTipi NOT IN (1,2,5) AND Iscilik=0 AND (Tutar*BirimKur) < (Miktar*AuMilyem*HasKur)
BR-MALIYET-001, GAP-DOC-05, GAP-SEC-ISCILIK-02Girişte Iscilik×IscilikBirimKur ≈ Tutar×BirimKur − Miktar×AuMilyem×HasKur (negatif değer 0'a çekilmemeli).Class/Ext/Cari.IslemEx.vb:122-146, 185-212
32MOD-RAPORBilanco.OzetBilanco – kalemler farklı kesim tarihleri ve varsayımlarla toplanırCari.BakiyeIslem (Tarih<=@Tarih), masraf hesapları (HesapTuru=4, tarih süzgeci yok), IslemKodu=5 GELİR/GİDER (Tarih=@Tarih tek gün), takoz 0,6, GetKurListesi(@Tarih)BAKIYE: B.Tarih<=@Tarih … GELIR/GIDER(masraf bakiyesi): Where H.HesapTuru=4 (tarih yok) ; GELİR/GİDER(hizmet): Tarih>S.RevCostDate And Tarih=@Tarih ; TAKOZ: R='False' ⇒ Miktar*0.6 ; Net = Bol(Bakiye*K1.Alis, K2.Alis)Geçmiş tarihli bilanço masraf hesaplarının bugüne kadarki tüm bakiyesini içerirken diğer kalemler kesim tarihine kadar alınır; hizmet gelir/gideri yalnız kesim günü toplanır; raporsuz takoz bilançoda 0,6, pozisyonda 0 ile değerlenir; kur listesi eksikse Net 0. Uygulama KÂR/ZARAR = TOPLAM−DEVİR olarak önceki satırla hesaplandığından her hata bir sonraki güne taşınır (SaveAll o günü silip yeniden yazar).Geçmiş tarih için bilanço; masraf hareketi olan dönem; raporsuz takoz stoğu; kur eksik günBilanço eksi/artı sapar; günlük kâr-zarar yanlış; pozisyon ile bilanço tutmazS3 – yönetim raporu yanlış (karar riski)YÜKSEK70
Aynı @Tarih için Bilanco.OzetBilanco'yu iki farklı günde çalıştırıp Bilanco.Bilancolar arşiviyle karşılaştırın: SELECT Tarih,SubeId,Cinsi,Kodu,Bakiye FROM Bilanco.Bilancolar WHERE Tarih=@T EXCEPT SELECT @T,SubeId,Cinsi,Kodu,Bakiye FROM Bilanco.OzetBilanco(@Sube,@T)
H-128, H-129, H-130, CTR-SYM-TAKOZ-01, PRB-BILANCO-000Aynı kesim tarihi için bilanço yeniden hesaplandığında arşivlenen (Bilancolar) değerle eşit olmalı.Bilanco.OzetBilanco, Bilanco.SaveAll, Pozisyon.Write (modules.json); Class/Ext/Sistem.Bilanco.vb:172-211
33MOD-RAPORBilanco.GetIKar – parametre/sabit karışıklığı (KasaId=SubeId, BirimId=1=HAS, Satis kuru, ham bölme)Cari.BakiyeIslem.KasaId (SubeId parametresiyle karşılaştırılır), GetKurListesi BirimId=1, Kur.SatisWhere B.KasaId=@SubeId … Bakiye*Kur.Satis / kur1.Alis (Kur1.BirimId=1)Kasa kimliği şube kimliği yerine kullanılır (yalnız Id'ler çakışırsa sonuç döner); HAS için Id=1 varsayımı; bakiye satış kuruyla, stok alış kuruyla değerlenir; Fn.Bol yerine ham bölme (kur 0'da hata – sessiz değil ama kur yoksa NULL çarpımı sessiz NULL).KasaId≠SubeId kurulum; BirimId 1 ≠ HAS; kur eksikİşlem bazlı kâr raporu boş/yanlışS3 – raporORTA75
SELECT COUNT(*) FROM Sistem.Kasalar K WHERE K.Id<>K.SubeId; SELECT Kodu FROM Sistem.Birimler WHERE Id=1
HAYIR (PRB-RAPOR-000)Rapor fonksiyonları HAS birimini Settings.HasSymbol üzerinden çözmeli, sabit Id kullanmamalı.Bilanco.GetIKar (modules.json)
34MOD-SISTEMSistem.Devir (SQL) – açılış satırlarında has/milyem sıfır, takoz/pırlanta stokları ve tarihsiz satırlar düşer, 2 hane yuvarlamaStok.GetNakitStoklari/GetMadenStoklari(@Tarih-1), Stok.StokHaraketleri (StokTipi 1,2), Cari.BakiyeIslem (Tarih<@Tarih), GetKurListesi(getdate())#TBLStokHaraketleri(Miktar dec(18,2), Has dec(18,2)) ; maden açılış: 0 as Milyem, 0 as Has, Maliyet*K.Alis(bugün) ; truncate StokHaraketleri/BakiyeIslem ; yalnız StokTipi in (1,2) ; Tarih<@Tarih / Tarih>=@Tarih (NULL düşer)Devir sonrası maden açılış hareketinin Has=0 ve Milyem=0 olduğu için GetOrtMilyem/GetMadenStok has stoğu ve ortalama milyem sessizce bozulur; takoz (StokTipi 3) ve pırlanta (4) adet stokları sıfırlanır (GetTakozAdet 0 → 'takoz stokta yok'); Tarih NULL satırlar hiçbir dilime girmediği için kaybolur; miktar/has 2 haneye yuvarlanır; maliyet devir günü değil çalıştırma günü kuruyla çevrilir. Tetikleyiciler kapatılıp açılır; arada hata olursa açık kalmayabilir (H-006).Yıl sonu devri; devir öncesi alınıp sonra çıkılan takoz; Tarih NULL kayıt; devirin kesim tarihinden sonra çalıştırılmasıDevir sonrası stok has/milyem/maliyet yanlış; takoz çıkışı engellenir veya eksi adet; bakiye eksikS2 – devir sonrası stok ve bakiye tutarsızlığıORTA85
SELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND StokTipi=1 AND (Has=0 OR Milyem=0) AND Miktar<>0; SELECT COUNT(*) FROM Stok.StokHaraketleri WHERE Tarih IS NULL; SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE Tarih IS NULL; SELECT StokId,SUM(Adet) FROM Stok.StokHaraketleri WHERE StokTipi=3 GROUP BY StokId HAVING SUM(Adet)<0
H-108, H-111, H-130, GAP-DEVIR-SCOPE, CTR-034, PRB-DEVIR-000, H-006Devir açılış satırları (IslemId=-1) StokTipi 1 için Has ve Milyem taşımalı; StokHaraketleri/BakiyeIslem'de Tarih NULL satır olmamalı; devir öncesi/sonrası bakiye toplamları hesap+birim bazında eşit olmalı.Sistem.Devir (modules.json)
35MOD-SISTEMDevir.vb (uygulama devri) – Sum(Milyem) ile açılış satırı, tarih=çalıştırma günü, transaction yokStok.StokHaraketleri (StokTipi 1,2), Cari.BakiyeIslemINSERT #ERPStok Select -1,0,IslemTuru,Getdate(),SubeId,KasaId,StokTipi,StokId,Sum(Adet),Sum(Miktar),Sum(Milyem),Sum(Has),Sum(Maliyet),VaryantId … Group by IslemTuru,… ; Truncate Cari.Islemler/BakiyeIslem/History/StokHaraketleri/IslemDetaylari ; Insert …Milyem sütunu toplanır (100 satır × 0,916 = 91,6) → NetBakiye hesaplanan sütunu ve GetStokHareketleri'nin Has=Miktar×Milyem gösterimi anlamsız; giriş/çıkış satırları ayrı toplandığı için LIFO maliyet/ortalama milyem yalnız giriş satırlarını görür; takoz/pırlanta yine düşer; Tarih=GETDATE (kesim değil); truncate ile insert arasında transaction yok – hata halinde tablolar boş kalır (yedek dışında geri dönüş yok).Devir.vb ile devir; hareketli stok kartları; devir sırasında hataDevir açılış satırında Milyem>1; stok has/maliyet yanlış; tam veri kaybı riskiS2 – devir sonrası stok bozulması; S1 hata halindeORTA85
SELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND Milyem>1; SELECT * FROM Stok.StokHaraketleri WHERE IslemId=-1 AND StokTipi=1 AND ABS(Has - Miktar*Milyem)>0.01
CTR-034, GAP-PROCESS-03, H-108StokHaraketleri.Milyem ≤ 1 olmalı; açılış satırında Has = Miktar×Milyem tutmalı.Class/Module/Devir.vb:36-87, 128
36MOD-SISTEMRepair.BalanceRepair – güncel tetikleyiciden geride kalmış tam yeniden kurmaCari.Islemler (IsDeleted=0) – tümüTruncate Cari.BakiyeIslem ; Truncate Stok.StokHaraketleri ; cursor: eski kural seti (tip 11/12 hariç tutma yok; kod 14, 9, 8, 3/10, 5 dalları yok; nakit tip 4 istisnası yok; has satırında IslemTipi<>1 yok; IsRapor=0+XRF dalı yok; Bolum/VaryantId yazılmaz)Çalıştırılırsa devir (IslemId=-1), transfer (Bolum=2) ve üretim (Bolum=1) satırları kalıcı silinir; tip 11/12 satırları için bakiye/stok üretilir (tetikleyici üretmez); MAHSUP/belge tipleri bakiyeye girer; çeşni, model, pırlanta, hizmet (5), nakit emanet satırları eksik kalır; PEŞİN maden has bakiyesi yazılır. Hata mesajı yok; tablolar dolu görünür.Prosedürün elle çalıştırılması (destek/geliştirici)Tüm bakiyeler ve stoklar sistematik olarak farklı kural setiyle yeniden yazılır; devir/transfer verisi kaybıS1 – kurulum genelinde veri kaybıDÜŞÜK95
Çalıştırılmış mı: SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE IslemId=-1; SELECT COUNT(*) FROM Stok.StokHaraketleri WHERE Bolum<>0; sıfırsa ve devir/transfer geçmişi varsa çalıştırılmış olabilir; ayrıca tip 11/12 için BakiyeIslem var mı: SELECT COUNT(*) FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.IslemTipi IN (11,12)
TERM-REPAIR-BALANCEREPAIR, KNOWN_GAPS TD-BALANCEREPAIR, SYM-BAKIYE (çalıştırılmaz), proje notu erpgoldv2-balancerepair-riskiDevir (IslemId=-1) ve Bolum≠0 türetilmiş satırlar hiçbir onarımda silinmemeli; onarım kural seti tetikleyiciyle birebir olmalı.Repair.BalanceRepair (modules.json); karşılaştırma: Cari.AcceptTransaction satır 263, 281, 291-302, 311-330, 346, 363, 516
37MOD-SISTEMRepair.StokRepair – ikinci FETCH'te değişken sayısı uyumsuz (17 ≠ 18)Cari.Islemler (IsDeleted=0)Truncate Table Stok.StokHaraketleri ; FETCH NEXT … INTO 18 değişken (ilk) ; döngü sonunda FETCH NEXT … INTO 17 değişken (@VaryantId eksik)İlk satır işlendikten sonra ikinci FETCH 'number of variables … must match' hatasıyla durur; TRUNCATE zaten autocommit ile kalıcı olduğundan stok hareket tablosu tek satırla kalır. Prosedür hata verir ancak veri kaybı gerçekleşmiştir.Prosedürün çalıştırılmasıTüm stok hareketleri silinir; stok listeleri boşS1 – stok verisi kaybıDÜŞÜK90
Tanım karşılaştırması: OBJECT_DEFINITION(OBJECT_ID('Repair.StokRepair')) içindeki iki FETCH NEXT satırındaki değişken sayısı; çalıştırılmış mı: SELECT COUNT(*) FROM Stok.StokHaraketleri
TD-BALANCEREPAIR temasıOnarım prosedürleri TRUNCATE'i yalnız başarılı yeniden kurma ile aynı transaction içinde yapmalı.Repair.StokRepair (modules.json) – son FETCH satırı
38MOD-SISTEMSistem.Settings tek satır varsayımı; Save = TRUNCATE + INSERT (transaction yok)Sistem.Settings (HasSymbol, GumSymbol, PltSymbol, PldSymbol, BSMV, OnsCarpan, IslemKurFarki…)GlobalSettings.Save: Truncate Table Sistem.Settings ; Insert Into Sistem.Settings(...) Values('…') ; Trigger: @HasBirimId=(Select Id From Birimler Where Kodu=(Select HasSymbol From Sistem.Settings))INSERT başarısız olursa (tip dönüşümü, kolon uyumsuzluğu) tablo boş kalır: tetikleyici sembolleri NULL alır, takoz/çeşni bakiye satırları BirimId NULL ile yazılır (bakiye kartında görünmez), uygulama varsayılanlarla (BSMV=0, OnsCarpan=31,1035, IslemKurFarki=0) çalışır – kur farkı uyarısı ve BSMV sessizce kapanır. İki satır oluşursa trigger 'subquery returned more than 1 value' ile tüm işlemleri durdurur. Read() 'Do While Dr.Read' ile son satırı alır.Ayar kaydı sırasında hata; elle satır ekleme; sembolün Birimler'de olmamasıBirimId NULL bakiye satırları; vergi/uyarı kontrolleri kapanırS1 – kurulum genelinde bakiye/vergi hesabı bozulur (düşük olasılık)DÜŞÜK80
SELECT COUNT(*) FROM Sistem.Settings; SELECT COUNT(*) FROM Cari.BakiyeIslem WHERE BirimId IS NULL; SELECT s.HasSymbol FROM Sistem.Settings s WHERE NOT EXISTS(SELECT 1 FROM Sistem.Birimler b WHERE b.Kodu=s.HasSymbol AND b.IsDeleted=0)
GAP-DB-06Sistem.Settings tam 1 satır içermeli; sembol kolonları Birimler'de tekil eşleşmeli.Form/Settings/Settings.vb:121-138; AcceptTransaction satır 64-67; Uretim.TrBakiyeHesapla
39MOD-SISTEMSistem.Birimler.Kodu benzersiz değil; kur listesi ve bakiye toplamları kod ile birleştirilirSistem.Birimler (unique index yalnız PK), ToplamBakiye/OzetBilanco/Pozisyon.Write 'Kur.Birim = Kodu' join'leriLeft Join Sistem.GetKurListesi(Getdate()) Kur on Kur.Birim = Bak.KoduAynı kodlu iki birim (silinip yeniden açılan) kur listesinde iki satır üretir; koda göre join yapan bakiye/limit/bilanço/pozisyon sorguları satırları çiftler (bakiye iki kat).Birimler'de aynı Kodu ile IsDeleted=0 iki satırLimit, bilanço ve pozisyon çift sayımS2 – limit/pozisyon çift sayımDÜŞÜK85
SELECT Kodu,COUNT(*) FROM Sistem.Birimler WHERE IsDeleted=0 GROUP BY Kodu HAVING COUNT(*)>1
H-023, H-131Sistem.Birimler.Kodu silinmemiş satırlarda benzersiz olmalı.Cari.ToplamBakiye, Bilanco.OzetBilanco, Pozisyon.Write, Bakiye.DunkiBakiyeler (modules.json); indexes.json Sistem.Birimler
40MOD-SISTEMFN.GetKatki daima 0 döndürür; FN.Katsayı tablo dışı milyemde NULL → FN.AyarCevir 0Milyem1, Milyem2 (yalnız 0.333/0.375/0.417/0.585/0.750/0.875/0.916 tanımlı)GetKatki: … Set @Result=… ; return 0 ; AyarCevir = Bol(@Miktar, Katsayı(@Milyem1)) * Katsayı(@Milyem2) ; Katsayı: CASE … END (ELSE yok → NULL)Katkı hesabı her koşulda 0; ayar çevirici 0,995/0,9166 gibi listede olmayan milyemlerde 0 döndürür (Bol NULL→0). Sipariş girişinde çevrilen miktar sessizce 0 olur.Milyem tam olarak listedeki 7 değerden biri değilseSipariş/üretim miktarı 0 veya katkı 0S3 – üretim/sipariş miktarıDÜŞÜK90
SELECT FN.AyarCevir(10,0.995,0.585), FN.GetKatki(10,0.916,0.585) – beklenen 0 dışı, gelen 0
GAP-SEC-AYAR-01Ayar çevrimi tanımsız milyemde 0 yerine hata/uyarı üretmeli.FN.GetKatki, FN.Katsayı, FN.AyarCevir (modules.json); Form/Siparis/FrmSiparisGirisi.vb:194
41MOD-URETIMUretim.TrBakiyeHesapla – kasa seçimi sırasız TOP 1, has = Tutar×FiyatSistem.Kasalar (SubeId), UretimIslemleri@KasaId = (Select Top 1 Id From Sistem.Kasalar Where IsDeleted='False' And SubeId=@SubeId) ; URETIMGIRIS: StokHaraketleri(…, Miktar=@Tutar, Milyem=@Fiyat, Has=@Tutar*@Fiyat)Şubede birden çok kasa varsa üretim çıktısı rastgele kasaya yazılır (plan değişince kasa değişir); giriş satırında miktar/milyem alanları Tutar/Fiyat ile doldurulduğundan alan anlamı ekrana bağlıdır.Şubede >1 kasa; üretim modülü kullanan kurulumÜretimden gelen stok yanlış kasada; kasa stok listesi tutmazS4 – kuyumcu üretim kurulumlarında kasa bazlı stokDÜŞÜK60
SELECT SubeId,COUNT(*) FROM Sistem.Kasalar WHERE IsDeleted=0 GROUP BY SubeId HAVING COUNT(*)>1; SELECT KasaId,COUNT(*) FROM Stok.StokHaraketleri WHERE Bolum=1 GROUP BY KasaId
GAP-SEC-ATOLYE-02Bolum=1 stok hareketleri deterministik bir kasaya yazılmalı.Uretim.TrBakiyeHesapla (modules.json)
42MOD-CARITrigger hata iletimi ve uygulamanın algısıRAISERROR(…,16,1)+ROLLBACK → SqlException 3609; InternalDb MsgBox; Cari.Islem.Insert CatchInternalDb.ExecuteScalar: Catch ex → MsgBox(ex.Message); Result=Nothing ; Insert: RecId=0 → Return FalseTrigger reddi kullanıcıya SQL metniyle gösterilir (sessiz değil). Ancak RAISERROR olmadan hata yutulan yerler vardır: Insert sonrası 'Cari.RsAktar' ve Update sonrası 'Takoz.RaporYaz' hataları MsgBox ile geçilir ve ana kayıt tamam sayılır; GetCariLimit ExecuteScalar hatası Val('')=0 ile 'limit 0' gibi davranır (işlem reddedilir – tersine sessizlik).RsAktar/RaporYaz prosedür hatası; FN.GetCariLimit hataRs aktarımı eksik işlem; takoz raporu yazılmamış giriş; haksız limit reddiS3ORTA80
SELECT COUNT(*) FROM Cari.Islemler WHERE IsDeleted=0 AND RsAktar=1 AND NOT EXISTS(… Rs hedef tablosu …) [Rs hedefi kaynakta yok – GAP-CODE-05]
GAP-CODE-05, GAP-CODE-07Insert sonrası ikincil adımlar (RsAktar/RaporYaz) başarısızsa ana kayıt işaretlenmeli veya geri alınmalı.Class/Module/InternalDb.vb:53-81; Cari.Islem.vb:694-709; AcceptTransaction
43MOD-CARINakit NORMAL girişte yalnız karşılık birimi (TL) bakiyeye yazılır; döviz tarafı yalnız kasa stoğunaIslemKodu=3, BakiyeId=0 (Cari.IslemEx.vb:291-303), Tutar/BirimId, Miktar/StokIdsatır 401-432: Tutar satırı (BirimId, ±Tutar) ; has/miktar satırı yok (BakiyeId=0) ; Stok: StokHaraketleri(StokTipi=2, StokId, ±Miktar)Kullanıcı dokümanı (A-Z 2.6) EUR+TL iki satır bekler; kod yalnız TL yazar. Personel 'işlem eksik' sanıp ikinci kez döviz satırı girebilir (çift kayıt) ya da müşteri döviz bakiyesini elle takip eder.Nakit NORMAL/ EMANET dışı işlem; kullanıcı beklentisiYanlış düzeltme girişleri; çift kayıtS3 – operasyon hatasına zeminORTA90
SELECT COUNT(*) FROM Cari.BakiyeIslem B JOIN Cari.Islemler I ON I.Id=B.IslemId WHERE I.IslemKodu=3 AND B.BirimId<>I.BirimId AND I.IslemTipi<>10 – 0 beklenir
CTR-025, H-104Nakit işlemi (tip≠10) yalnız BirimId'li tek bakiye satırı üretmeli.Cari.AcceptTransaction (dbclean/modules.json def) satır 281-285, 401-432; Class/Ext/Cari.IslemEx.vb:291-303
44MOD-CARIPEŞİN (IslemTipi=1) işlemde bakiye/limit muafiyeti ve %5 karşılık toleransıCari.Islemler.IslemTipi=1; fişteki giriş/çıkış stok hareketleri TL karşılıkları; Sube.IsLimitControl; kullanıcı grubu PesinKontrolCari.GetFisPesinKontrol: Tutar = GIRIS>CIKIS ? (1 − Bol(CIKIS,GIRIS)) × 100 : Bol(CIKIS,GIRIS); sonuç > 5 ise 'karşılık bulunamadı' (yazdırma engellenir); limit kontrolü PEŞİN hariçPEŞİN tip bakiye satırı üretmediği ve limit kontrolünden muaf olduğu için, karşılığı eksik/ yanlış girilmiş peşin fiş sessizce bakiye dışı kalır; %5 tolerans yalnız PesinKontrol açık grupta ve yalnız fiş yazdırırken çalışır (F2 kayıt anında değil). Tolerans içindeki fark (≤%5) hiç uyarı vermez → kasa/stok farkı birikir.PesinKontrol kapalı grup; fiş yazdırılmadan kapatılan işlem; %5 altındaki farklar; GIRIS=0 (Bol 0 döner → fark %100 gibi ya da 0)Bakiyesi olmayan ama karşılığı da tam girilmemiş peşin işlem; kasa/stok farkı; limit aşımıS2 — kasa/stok farkı birikir, limit korumasızORTA75
INV-03 (PEŞİN işlemin bakiye satırı olmamalı) + fiş bazında giriş/çıkış TL karşılığı farkı: SELECT FisNo, SUM(CASE WHEN IslemTuru%2=0 THEN Tutar ELSE -Tutar END) FROM Cari.Islemler WHERE IslemTipi=1 AND IsDeleted=0 GROUP BY HesapId,FisNo HAVING ABS(SUM(...))>0
H-104 (PEŞİN tip bakiye üretmez), BR-DEFTER-URETIMI, BR-BAKIYE-016, BR-FATURA-008INV-03: IslemTipi=1 işlemin Cari.BakiyeIslem satırı olmamalı; PEŞİN fişte giriş/çıkış karşılığı dengeli olmalıCari.GetFisPesinKontrol · basecontrol/Base Control/iScreen.vb:98-101 · Cari.AcceptTransaction (tip 1 bakiye satırı üretmez)