Tip: STORED PROCEDURE · Şema: POS · Modül: MOD-POS · Temizlik sınıfı: MANUAL_REVIEW (kategori D, güven 90) · Kapsam: POS_VARIANT / ALL
Kullanım haritası (13.09.2026)
| Kategori | F — MANUAL REVIEW · F-EXTERNAL_PRODUCT |
| Güven | 90 |
| Gerekçe | ERPGOLD dışı ürün/servis şeması: ErpPosV2 / web banko (POS Aşama 0) — ERPGOLD kodu çağırmaz ama başka uygulama kullanır |
Bkz. Database Usage Map · Manual Review. Hiçbir DB değişikliği yapılmadı; SAFETY > CLEANUP.
Temizlik kanıtı
| Kontrol | Sonuç |
|---|---|
| app | NO |
| report | NO |
| config | NO |
| dynamic | NO |
| db_in | NO |
| db_out | YES |
| trigger | NO |
| fk | NO |
| computed | NO |
| crossdb | NO |
| runtime | UNKNOWN |
| external | RISK |
Gerekçe: EXTERNAL USE RISK: ErpPosV2 (POS / vezne uygulaması) — ERPGOLD dışı AIFASOFT ürünü; nesneler 2026-09-10 oluşturulmuş
KB-v1 gövdesi (2026-09-10 · kısmi kod kapsamı — kaynağı kadar güvenilir)
Tür: PROCEDURE (P) · Modül: MOD-POS · Uzunluk: 538 satır
Özet
[GAP] Kaynakta açıklama yorumu yok; davranış aşağıdaki SQL tanımından ve ilişkilerden okunur.
Parametreler
| # | Parametre | Tip | Çıktı |
|---|---|---|---|
| 1 | @KasaId | int | |
| 2 | @HesapId | int | |
| 3 | @UserId | int | |
| 4 | @Satirlar | FisSatirTablosu | |
| 5 | @Tarih | date | |
| 6 | @Aciklama | nvarchar | |
| 7 | @Kanal | nvarchar | |
| 8 | @Cihaz | nvarchar | |
| 9 | @Ip | nvarchar | |
| 10 | @Jeton | char | |
| 11 | @BeklenenToplam | decimal | |
| 12 | @FisNo | int | ✔ |
Bağımlılıklar (bu nesne → hedef)
| İlişki | Hedef | Tip |
|---|---|---|
| READS | Cari.Hesaplar | TABLE |
| WRITES | Cari.Islemler | TABLE |
| CALLS | POS.AnaBirimId | FUNCTION |
| CALLS | POS.BakiyeIdBul | FUNCTION |
| CALLS | POS.BSMVHesapla | FUNCTION |
| WRITES | POS.FisKanal | TABLE |
| CALLS | POS.GetKur | FUNCTION |
| CALLS | POS.GetKurAlis | FUNCTION |
| WRITES | POS.IzKaydi | TABLE |
| CALLS | POS.KarsiIslemTuru | FUNCTION |
| CALLS | POS.Sabit | FUNCTION |
| READS | Sistem.Birimler | TABLE |
| READS | Sistem.Kasalar | TABLE |
| READS | Sistem.Subeler | TABLE |
| READS | Sistem.Users | TABLE |
| READS | Stok.Maden | TABLE |
| READS | Stok.Nakit | TABLE |
SQL tanımı (AS-IMPLEMENTED, örnek DB)
CREATE PROCEDURE POS.FisKaydet
(
@KasaId int,
@HesapId int,
@UserId int,
@Satirlar POS.FisSatirTablosu READONLY,
@Tarih date = NULL,
@Aciklama nvarchar(500) = NULL,
@Kanal nvarchar(20) = N'BANKO',
@Cihaz nvarchar(100) = NULL,
@Ip nvarchar(64) = NULL,
@Jeton char(64) = NULL,
@BeklenenToplam decimal(18,2) = NULL, -- istemci hesabi, YALNIZ dogrulama icin
@FisNo int = NULL OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @Hata nvarchar(400);
DECLARE @TarihMetin nvarchar(20) = CONVERT(nvarchar(10), @Tarih, 120);
/* -------------------------------------------------------------------
0. TRIGGER KONTROLU
-------------------------------------------------------------------
AcceptTransaction, bakiye ve stogu tureten TEK mekanizma. Kapaliysa
buraya yazilan satirlar deftere HIC yansimaz - ve bu sessizce olur.
Demo veritabaninda dort trigger da kapali; uretimde acik.
------------------------------------------------------------------- */
IF NOT EXISTS (SELECT 1 FROM sys.triggers
WHERE parent_id = OBJECT_ID('Cari.Islemler') AND name = 'AcceptTransaction')
BEGIN
RAISERROR(N'Cari.AcceptTransaction trigger''i bulunamadi. Fis yazilmadi.', 16, 1);
RETURN;
END
IF EXISTS (SELECT 1 FROM sys.triggers
WHERE parent_id = OBJECT_ID('Cari.Islemler')
AND name = 'AcceptTransaction' AND is_disabled = 1)
BEGIN
RAISERROR(N'Cari.AcceptTransaction trigger''i KAPALI. Bakiye ve stok turetilemez; fis yazilmadi.', 16, 1);
RETURN;
END
/* -------------------------------------------------------------------
1. VARSAYILANLAR VE KAPSAM
------------------------------------------------------------------- */
SET @Tarih = ISNULL(@Tarih, CONVERT(date, GETDATE()));
SET @TarihMetin = CONVERT(nvarchar(10), @Tarih, 120);
IF NOT EXISTS (SELECT 1 FROM @Satirlar)
BEGIN RAISERROR(N'Fis bos. En az bir satir gerekli.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE IslemKodu NOT IN (1, 2, 3))
BEGIN RAISERROR(N'v1 kapsami disi IslemKodu. Yalniz 1 (MADEN), 2 (HURDA), 3 (NAKIT).', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE IslemTipi NOT IN (0, 1))
BEGIN RAISERROR(N'v1 kapsami disi IslemTipi. Yalniz 0 (NORMAL), 1 (PESIN).', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE IslemTuru NOT BETWEEN 0 AND 5)
BEGIN RAISERROR(N'Gecersiz IslemTuru. 0-5 arasi olmali.', 16, 1); RETURN; END
/* -------------------------------------------------------------------
2. KAPSAM DOGRULAMA (sube / kasa / hesap / kullanici)
------------------------------------------------------------------- */
DECLARE @SubeId int, @SirketId int, @RsAktar bit;
SELECT @SubeId = K.SubeId, @SirketId = K.SirketId
FROM Sistem.Kasalar K WHERE K.Id = @KasaId;
IF @SubeId IS NULL
BEGIN RAISERROR(N'Kasa bulunamadi (KasaId = %d).', 16, 1, @KasaId); RETURN; END
SELECT @RsAktar = ISNULL(S.RsAktar, 0) FROM Sistem.Subeler S WHERE S.Id = @SubeId;
IF @RsAktar IS NULL
BEGIN RAISERROR(N'Sube bulunamadi (SubeId = %d).', 16, 1, @SubeId); RETURN; END
IF ISNULL(@HesapId, 0) = 0
BEGIN RAISERROR(N'Hesap zorunlu. Gelen-gecen musteri icin perakende hesabinin Id''si verilmeli.', 16, 1); RETURN; END
IF NOT EXISTS (SELECT 1 FROM Cari.Hesaplar WHERE Id = @HesapId)
BEGIN RAISERROR(N'Hesap bulunamadi (HesapId = %d).', 16, 1, @HesapId); RETURN; END
IF NOT EXISTS (SELECT 1 FROM Sistem.Users WHERE Id = @UserId)
BEGIN RAISERROR(N'Kullanici bulunamadi (UserId = %d).', 16, 1, @UserId); RETURN; END
/* -------------------------------------------------------------------
3. SATIR DOGRULAMA
------------------------------------------------------------------- */
IF EXISTS (SELECT 1 FROM @Satirlar WHERE ISNULL(Miktar, 0) = 0)
BEGIN RAISERROR(N'Miktar sifir olamaz.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE Miktar < 0 OR Tutar < 0 OR Fiyat < 0 OR Adet < 0)
BEGIN RAISERROR(N'Negatif deger kabul edilmiyor. Yon IslemTuru ile belirtilir.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar S WHERE S.IslemKodu IN (1, 2)
AND NOT EXISTS (SELECT 1 FROM Stok.Maden M WHERE M.Id = S.StokId))
BEGIN RAISERROR(N'MADEN/HURDA satirinda gecersiz StokId.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar S WHERE S.IslemKodu = 3
AND NOT EXISTS (SELECT 1 FROM Stok.Nakit N WHERE N.Id = S.StokId))
BEGIN RAISERROR(N'NAKIT satirinda gecersiz StokId.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar S JOIN Stok.Maden M ON M.Id = S.StokId
WHERE S.IslemKodu = 1 AND M.IsHurda = 1)
BEGIN RAISERROR(N'IslemKodu 1 (MADEN) ile hurda stogu secilmis. Hurda icin IslemKodu 2 kullanilmali.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar S JOIN Stok.Maden M ON M.Id = S.StokId
WHERE S.IslemKodu = 2 AND M.IsHurda = 0)
BEGIN RAISERROR(N'IslemKodu 2 (HURDA) ile hurda olmayan stok secilmis.', 16, 1); RETURN; END
-- BirimId: PESIN -> Stok.Nakit.Id ; NORMAL -> Sistem.Birimler.Id
-- BirimId = 0 sentinel'ine izin var (saf mal hareketi, veride 2.281 satir)
IF EXISTS (SELECT 1 FROM @Satirlar S WHERE S.BirimId <> 0 AND S.IslemTipi = 1
AND NOT EXISTS (SELECT 1 FROM Stok.Nakit N WHERE N.Id = S.BirimId))
BEGIN RAISERROR(N'PESIN satirda BirimId bir Stok.Nakit kaydi olmali.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar S WHERE S.BirimId <> 0 AND S.IslemTipi <> 1
AND NOT EXISTS (SELECT 1 FROM Sistem.Birimler B WHERE B.Id = S.BirimId))
BEGIN RAISERROR(N'NORMAL satirda BirimId bir Sistem.Birimler kaydi olmali.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE BirimId = 0 AND (ISNULL(Tutar,0) <> 0 OR ISNULL(Fiyat,0) <> 0))
BEGIN RAISERROR(N'BirimId = 0 (para tarafi yok) satirinda Tutar ve Fiyat sifir olmali.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE ArbitrajGrup <> 0
GROUP BY ArbitrajGrup HAVING COUNT(*) <> 2)
BEGIN RAISERROR(N'Her arbitraj grubu tam iki satir icermeli.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE ArbitrajGrup <> 0 AND IslemKodu <> 3)
BEGIN RAISERROR(N'Arbitraj yalniz NAKIT (IslemKodu 3) satirlarinda olabilir.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar S WHERE S.KarsiHesapId <> 0
AND NOT EXISTS (SELECT 1 FROM Cari.Hesaplar H WHERE H.Id = S.KarsiHesapId))
BEGIN RAISERROR(N'Gecersiz KarsiHesapId.', 16, 1); RETURN; END
IF EXISTS (SELECT 1 FROM @Satirlar WHERE ArbitrajGrup <> 0 AND KarsiHesapId <> 0)
BEGIN RAISERROR(N'Arbitraj satirinda karsi kayit desteklenmiyor.', 16, 1); RETURN; END
/* -------------------------------------------------------------------
4. TURETME (set tabanli)
------------------------------------------------------------------- */
DECLARE @HasBirimId int = (SELECT Id FROM Sistem.Birimler WHERE Kodu = N'HAS');
DECLARE @HasKur decimal(18,5) = POS.GetKurAlis(@HasBirimId, @Tarih);
IF ISNULL(@HasKur, 0) = 0
BEGIN
RAISERROR(N'HAS kuru bulunamadi (%s). Kur girilmeden islem yazilamaz.', 16, 1, @TarihMetin);
RETURN;
END
DECLARE @GumKur decimal(18,5) = POS.GetKurAlis((SELECT Id FROM Sistem.Birimler WHERE Kodu = N'GUM'), @Tarih);
DECLARE @PltKur decimal(18,5) = POS.GetKurAlis((SELECT Id FROM Sistem.Birimler WHERE Kodu = N'PLT'), @Tarih);
DECLARE @PldKur decimal(18,5) = POS.GetKurAlis((SELECT Id FROM Sistem.Birimler WHERE Kodu = N'PLD'), @Tarih);
DECLARE @UsdKur decimal(18,5) = POS.GetKurAlis((SELECT Id FROM Sistem.Birimler WHERE Kodu = N'USD'), @Tarih);
DECLARE @EurKur decimal(18,5) = POS.GetKurAlis((SELECT Id FROM Sistem.Birimler WHERE Kodu = N'EUR'), @Tarih);
DECLARE @Sapma decimal(18,8) = ISNULL(POS.Sabit('FIYAT_SAPMA_YUZDE'), 0);
CREATE TABLE #S
(
SiraNo int PRIMARY KEY,
IslemKodu int, IslemTuru int,
IslemTipi int, Yon char(1),
StokId int, StokKodu nvarchar(100),
StokAnaBirimId int, StokMilyem decimal(18,5),
MaliyetBirimId int, FiyatTipi int,
BakiyeId int, BirimId int,
ParaAnaBirimId int, Birim nvarchar(100),
BirimKur decimal(18,5),
Adet int, Miktar decimal(18,2),
AuMilyem decimal(18,5), Fiyat decimal(18,8),
Tutar decimal(18,2),
Maliyet decimal(18,2), Satis decimal(18,2),
Iscilik decimal(18,2), IscilikBirimId int,
IscilikBirim nvarchar(100), IscilikBirimKur decimal(18,5),
BSMV decimal(18,2),
Vade date, Aciklama nvarchar(500),
ArbitrajGrup int, ArbitrajSira int,
KarsiHesapId int, RefNo nvarchar(72),
SistemKur decimal(18,5)
);
INSERT INTO #S
(
SiraNo, IslemKodu, IslemTuru, IslemTipi, Yon, StokId, StokKodu, StokAnaBirimId,
StokMilyem, MaliyetBirimId, FiyatTipi, BakiyeId, BirimId, ParaAnaBirimId,
Adet, Miktar, AuMilyem, Fiyat, Tutar, Vade, Aciklama,
ArbitrajGrup, ArbitrajSira, KarsiHesapId, RefNo
)
SELECT
S.SiraNo, S.IslemKodu, S.IslemTuru, S.IslemTipi,
CASE WHEN S.IslemTuru % 2 = 0 THEN 'A' ELSE 'S' END,
S.StokId,
CASE WHEN S.IslemKodu = 3 THEN N.Kodu ELSE M.Kodu END,
CASE WHEN S.IslemKodu = 3 THEN N.AnaBirimId ELSE M.AnaBirimId END,
ISNULL(M.Milyem, 0),
ISNULL(M.MaliyetBirimId, 0),
-- NAKIT'te FiyatTipi her zaman 1 (1.250.144/1.250.144 satirda dogrulandi)
CASE WHEN S.IslemKodu = 3 THEN 1 ELSE ISNULL(M.FiyatTipi, 1) END,
POS.BakiyeIdBul(S.IslemKodu, S.IslemTipi, S.StokId),
S.BirimId,
POS.AnaBirimId(S.IslemTipi, S.BirimId),
S.Adet, S.Miktar,
-- NAKIT'te AuMilyem her zaman 1 (1.250.144/1.250.144 satirda dogrulandi)
CASE WHEN S.IslemKodu = 3 THEN 1 ELSE S.AuMilyem END,
S.Fiyat, S.Tutar, S.Vade, S.Aciklama,
S.ArbitrajGrup,
CASE WHEN S.ArbitrajGrup = 0 THEN 0
ELSE ROW_NUMBER() OVER (PARTITION BY S.ArbitrajGrup ORDER BY S.SiraNo) END,
S.KarsiHesapId,
REPLACE(CONVERT(nvarchar(50), NEWID()), '-', '')
FROM @Satirlar S
LEFT JOIN Stok.Maden M ON M.Id = S.StokId AND S.IslemKodu IN (1, 2)
LEFT JOIN Stok.Nakit N ON N.Id = S.StokId AND S.IslemKodu = 3;
-- Birim kodu + defter kuru (ALIS)
UPDATE T
SET Birim = CASE WHEN T.BirimId = 0 THEN N''
WHEN T.IslemTipi = 1 THEN NK.Kodu ELSE BR.Kodu END,
BirimKur = CASE WHEN T.BirimId = 0 THEN 0
ELSE POS.GetKurAlis(T.ParaAnaBirimId, @Tarih) END
FROM #S T
LEFT JOIN Stok.Nakit NK ON NK.Id = T.BirimId AND T.IslemTipi = 1
LEFT JOIN Sistem.Birimler BR ON BR.Id = T.BirimId AND T.IslemTipi <> 1;
IF EXISTS (SELECT 1 FROM #S WHERE BirimId <> 0 AND ISNULL(BirimKur, 0) = 0)
BEGIN
SELECT TOP (1) @Hata = CONCAT(N'Birim kuru bulunamadi. SiraNo=', SiraNo, N', BirimId=', BirimId,
N', Tarih=', @TarihMetin)
FROM #S WHERE BirimId <> 0 AND ISNULL(BirimKur, 0) = 0;
RAISERROR(@Hata, 16, 1); RETURN;
END
-- Fiyat / Tutar tamamlama
UPDATE #S SET Fiyat = CONVERT(decimal(18,8), Tutar / NULLIF(Miktar, 0))
WHERE ISNULL(Fiyat, 0) = 0 AND ISNULL(Tutar, 0) <> 0;
UPDATE #S SET Tutar = CONVERT(decimal(18,2), Miktar * Fiyat)
WHERE ISNULL(Tutar, 0) = 0 AND ISNULL(Fiyat, 0) <> 0;
IF EXISTS (SELECT 1 FROM #S WHERE BirimId <> 0
AND ABS(Tutar - CONVERT(decimal(18,2), Miktar * Fiyat)) > 0.01)
BEGIN
SELECT TOP (1) @Hata = CONCAT(N'Tutar ile Miktar*Fiyat uyusmuyor. SiraNo=', SiraNo,
N' gelen=', Tutar,
N' hesaplanan=', CONVERT(decimal(18,2), Miktar * Fiyat))
FROM #S WHERE BirimId <> 0 AND ABS(Tutar - CONVERT(decimal(18,2), Miktar * Fiyat)) > 0.01;
RAISERROR(@Hata, 16, 1); RETURN;
END
-- Fiyat sapma kontrolu (parmak hatasi). @Sapma = 0 -> kapali.
IF @Sapma > 0
BEGIN
UPDATE T SET SistemKur = POS.GetKur(T.StokAnaBirimId, @Tarih, T.Yon) FROM #S T;
IF EXISTS (SELECT 1 FROM #S WHERE ISNULL(SistemKur,0) > 0 AND Fiyat > 0
AND ABS(Fiyat - SistemKur) / SistemKur * 100 > @Sapma)
BEGIN
SELECT TOP (1) @Hata = CONCAT(N'Fiyat sistem kurundan cok sapiyor. SiraNo=', SiraNo,
N' fiyat=', Fiyat, N' sistem=', SistemKur, N' sinir=%', @Sapma)
FROM #S WHERE ISNULL(SistemKur,0) > 0 AND Fiyat > 0
AND ABS(Fiyat - SistemKur) / SistemKur * 100 > @Sapma;
RAISERROR(@Hata, 16, 1); RETURN;
END
END
-- Maliyet / Satis
UPDATE #S
SET Maliyet = CASE WHEN IslemKodu IN (1, 2)
THEN CONVERT(decimal(18,2), Miktar * AuMilyem * @HasKur) ELSE 0 END,
Satis = CASE WHEN IslemKodu IN (1, 2)
THEN CONVERT(decimal(18,2), Miktar * AuMilyem * @HasKur)
ELSE CONVERT(decimal(18,2), Tutar * BirimKur) END;
-- Iscilik: yalniz MADEN/HURDA girisinde, para tarafi varsa
-- Ext/Cari.IslemEx.vb: Iscilik = (TutarMaliyeti - MiktarMaliyeti) / MaliyetBirim.Price
UPDATE T
SET IscilikBirimId = T.MaliyetBirimId,
IscilikBirim = ISNULL(MB.Kodu, N''),
IscilikBirimKur = ISNULL(MK.Kur, 0),
Iscilik = CASE WHEN ISNULL(MK.Kur, 0) = 0 THEN 0
ELSE CONVERT(decimal(18,2),
((T.Tutar * T.BirimKur) - (T.Miktar * T.AuMilyem * @HasKur)) / MK.Kur)
END
FROM #S T
LEFT JOIN Sistem.Birimler MB ON MB.Id = T.MaliyetBirimId
OUTER APPLY (SELECT Kur = POS.GetKurAlis(T.MaliyetBirimId, @Tarih)) MK
WHERE T.IslemKodu IN (1, 2)
AND T.IslemTuru % 2 = 0
AND T.BirimId <> 0
AND T.MaliyetBirimId <> 0;
UPDATE #S SET Iscilik = 0, IscilikBirimId = 0, IscilikBirim = N'', IscilikBirimKur = 0
WHERE Iscilik IS NULL;
-- BSMV: yalniz NAKIT satisinda, binde 2 dahil
UPDATE #S SET BSMV = POS.BSMVHesapla(IslemKodu, IslemTuru, Tutar, @Tarih);
-- Istemci toplami dogrulamasi
IF @BeklenenToplam IS NOT NULL
BEGIN
DECLARE @Toplam decimal(18,2) = (SELECT SUM(Tutar) FROM #S);
IF ABS(@Toplam - @BeklenenToplam) > 0.01
BEGIN
SET @Hata = CONCAT(N'Fis toplami uyusmuyor. Istemci=', @BeklenenToplam, N' Sunucu=', @Toplam);
RAISERROR(@Hata, 16, 1); RETURN;
END
END
/* -------------------------------------------------------------------
5. YAZIM - TEK TRANSACTION
------------------------------------------------------------------- */
DECLARE @SatirSayisi int = 0;
DECLARE @Grup int, @AnaId int;
BEGIN TRY
BEGIN TRANSACTION;
SET @FisNo = NEXT VALUE FOR POS.FisNoSeq;
/* 5a. Arbitraj disi butun satirlar - TEK INSERT
Trigger bir kez tetiklenir. */
INSERT INTO Cari.Islemler
(
SubeId, KasaId, HesapId, UserId, LoginId, HesapType, [Status],
FisNo, Tarih, Vade, IslemKodu, IslemTuru, IslemTipi,
StokId, Kodu, BakiyeId, BirimId, Birim, BirimKur,
Adet, Miktar, AuMilyem, AgMilyem, PldMilyem, PltMilyem, CesniMiktar,
Fiyat, FiyatTipi, Tutar, BSMV,
Maliyet, Satis, Iscilik, IscilikBirim, IscilikBirimKur, IscilikBirimId,
HasIsc, HasIscBirimId, HasIscBirimKur, GumIsc, GumIscBirimId, GumIscBirimKur,
IscilikDurumu, GumusDurumu, PlatinDurumu, PalladiumDurumu,
HasKur, GumKur, PltKur, PldKur, UsdKur, EurKur,
Aciklama, Kategori, Kategori2, Tag, Olcu,
AyarEviId, RaporNo, IsRapor, IsExtra,
VaryantId, OzelKodId, ProjeId, Locked, RsAktar,
OwnerRefNo, RefNo, FaturaIscilikTL
)
SELECT
@SubeId, @KasaId, @HesapId, @UserId, 0, 0, 0,
@FisNo, @Tarih, T.Vade, T.IslemKodu, T.IslemTuru, T.IslemTipi,
T.StokId, T.StokKodu, T.BakiyeId, T.BirimId, T.Birim, T.BirimKur,
T.Adet, T.Miktar, T.AuMilyem, 0, 0, 0, 0,
T.Fiyat, T.FiyatTipi, T.Tutar, T.BSMV,
T.Maliyet, T.Satis, T.Iscilik, T.IscilikBirim, T.IscilikBirimKur, T.IscilikBirimId,
0, 0, 0, 0, 0, 0,
CASE WHEN ISNULL(T.Iscilik, 0) <> 0 THEN 1 ELSE 0 END, 0, 0, 0,
@HasKur, @GumKur, @PltKur, @PldKur, @UsdKur, @EurKur,
ISNULL(T.Aciklama, ISNULL(@Aciklama, N'')), N'', N'', N'', N'',
0, N'', 0, 0,
0, 0, 0, 0, @RsAktar,
T.RefNo, T.RefNo, 0
FROM #S T
WHERE T.ArbitrajGrup = 0;
SET @SatirSayisi = @@ROWCOUNT;
/* 5b. Arbitraj ciftleri
Ilk ayak VaryantId = -1 (ana kayit), ikinci ayak VaryantId =
ilk ayagin Id'si. Id ancak yazildiktan sonra bilindigi icin
grup grup ilerleniyor; bir fiste tipik olarak bir grup olur.
SCOPE_IDENTITY kullaniliyor - @@IDENTITY trigger'in yazdigi
tablonun identity'sini dondururdu. */
DECLARE grup_cur CURSOR LOCAL FAST_FORWARD FOR
SELECT DISTINCT ArbitrajGrup FROM #S WHERE ArbitrajGrup <> 0 ORDER BY ArbitrajGrup;
OPEN grup_cur;
FETCH NEXT FROM grup_cur INTO @Grup;
WHILE @@FETCH_STATUS = 0
BEGIN
-- ilk ayak
INSERT INTO Cari.Islemler
(
SubeId, KasaId, HesapId, UserId, LoginId, HesapType, [Status],
FisNo, Tarih, Vade, IslemKodu, IslemTuru, IslemTipi,
StokId, Kodu, BakiyeId, BirimId, Birim, BirimKur,
Adet, Miktar, AuMilyem, AgMilyem, PldMilyem, PltMilyem, CesniMiktar,
Fiyat, FiyatTipi, Tutar, BSMV,
Maliyet, Satis, Iscilik, IscilikBirim, IscilikBirimKur, IscilikBirimId,
HasIsc, HasIscBirimId, HasIscBirimKur, GumIsc, GumIscBirimId, GumIscBirimKur,
IscilikDurumu, GumusDurumu, PlatinDurumu, PalladiumDurumu,
HasKur, GumKur, PltKur, PldKur, UsdKur, EurKur,
Aciklama, Kategori, Kategori2, Tag, Olcu,
AyarEviId, RaporNo, IsRapor, IsExtra,
VaryantId, OzelKodId, ProjeId, Locked, RsAktar,
OwnerRefNo, RefNo, FaturaIscilikTL
)
SELECT
@SubeId, @KasaId, @HesapId, @UserId, 0, 0, 0,
@FisNo, @Tarih, T.Vade, T.IslemKodu, T.IslemTuru, T.IslemTipi,
T.StokId, T.StokKodu, T.BakiyeId, T.BirimId, T.Birim, T.BirimKur,
T.Adet, T.Miktar, T.AuMilyem, 0, 0, 0, 0,
T.Fiyat, T.FiyatTipi, T.Tutar, T.BSMV,
T.Maliyet, T.Satis, 0, N'', 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
@HasKur, @GumKur, @PltKur, @PldKur, @UsdKur, @EurKur,
ISNULL(T.Aciklama, ISNULL(@Aciklama, N'')), N'', N'', N'', N'',
0, N'', 0, 0,
-1, -- ana kayit
0, 0, 0, @RsAktar,
T.RefNo, T.RefNo, 0
FROM #S T WHERE T.ArbitrajGrup = @Grup AND T.ArbitrajSira = 1;
SET @AnaId = CONVERT(int, SCOPE_IDENTITY());
SET @SatirSayisi = @SatirSayisi + 1;
-- ikinci ayak
INSERT INTO Cari.Islemler
(
SubeId, KasaId, HesapId, UserId, LoginId, HesapType, [Status],
FisNo, Tarih, Vade, IslemKodu, IslemTuru, IslemTipi,
StokId, Kodu, BakiyeId, BirimId, Birim, BirimKur,
Adet, Miktar, AuMilyem, AgMilyem, PldMilyem, PltMilyem, CesniMiktar,
Fiyat, FiyatTipi, Tutar, BSMV,
Maliyet, Satis, Iscilik, IscilikBirim, IscilikBirimKur, IscilikBirimId,
HasIsc, HasIscBirimId, HasIscBirimKur, GumIsc, GumIscBirimId, GumIscBirimKur,
IscilikDurumu, GumusDurumu, PlatinDurumu, PalladiumDurumu,
HasKur, GumKur, PltKur, PldKur, UsdKur, EurKur,
Aciklama, Kategori, Kategori2, Tag, Olcu,
AyarEviId, RaporNo, IsRapor, IsExtra,
VaryantId, OzelKodId, ProjeId, Locked, RsAktar,
OwnerRefNo, RefNo, FaturaIscilikTL
)
SELECT
@SubeId, @KasaId, @HesapId, @UserId, 0, 0, 0,
@FisNo, @Tarih, T.Vade, T.IslemKodu, T.IslemTuru, T.IslemTipi,
T.StokId, T.StokKodu, T.BakiyeId, T.BirimId, T.Birim, T.BirimKur,
T.Adet, T.Miktar, T.AuMilyem, 0, 0, 0, 0,
T.Fiyat, T.FiyatTipi, T.Tutar, T.BSMV,
T.Maliyet, T.Satis, 0, N'', 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
@HasKur, @GumKur, @PltKur, @PldKur, @UsdKur, @EurKur,
ISNULL(T.Aciklama, ISNULL(@Aciklama, N'')), N'', N'', N'', N'',
0, N'', 0, 0,
@AnaId, -- IsArbitiraj computed kolonu 1 olur
0, 0, 0, @RsAktar,
T.RefNo, T.RefNo, 0
FROM #S T WHERE T.ArbitrajGrup = @Grup AND T.ArbitrajSira = 2;
SET @SatirSayisi = @SatirSayisi + 1;
FETCH NEXT FROM grup_cur INTO @Grup;
END
CLOSE grup_cur;
DEALLOCATE grup_cur;
/* 5c. Karsi kayitlar - ayni FisNo, ayni RefNo, ters IslemTuru */
IF EXISTS (SELECT 1 FROM #S WHERE KarsiHesapId <> 0)
BEGIN
INSERT INTO Cari.Islemler
(
SubeId, KasaId, HesapId, UserId, LoginId, HesapType, [Status],
FisNo, Tarih, Vade, IslemKodu, IslemTuru, IslemTipi,
StokId, Kodu, BakiyeId, BirimId, Birim, BirimKur,
Adet, Miktar, AuMilyem, AgMilyem, PldMilyem, PltMilyem, CesniMiktar,
Fiyat, FiyatTipi, Tutar, BSMV,
Maliyet, Satis, Iscilik, IscilikBirim, IscilikBirimKur, IscilikBirimId,
HasIsc, HasIscBirimId, HasIscBirimKur, GumIsc, GumIscBirimId, GumIscBirimKur,
IscilikDurumu, GumusDurumu, PlatinDurumu, PalladiumDurumu,
HasKur, GumKur, PltKur, PldKur, UsdKur, EurKur,
Aciklama, Kategori, Kategori2, Tag, Olcu,
AyarEviId, RaporNo, IsRapor, IsExtra,
VaryantId, OzelKodId, ProjeId, Locked, RsAktar,
OwnerRefNo, RefNo, FaturaIscilikTL
)
SELECT
@SubeId, @KasaId, T.KarsiHesapId, @UserId, 0, 0, 0,
@FisNo, @Tarih, T.Vade, T.IslemKodu, POS.KarsiIslemTuru(T.IslemTuru), T.IslemTipi,
T.StokId, T.StokKodu, T.BakiyeId, T.BirimId, T.Birim, T.BirimKur,
T.Adet, T.Miktar, T.AuMilyem, 0, 0, 0, 0,
T.Fiyat, T.FiyatTipi, T.Tutar, 0,
T.Maliyet, T.Satis, 0, N'', 0, 0,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0,
@HasKur, @GumKur, @PltKur, @PldKur, @UsdKur, @EurKur,
ISNULL(T.Aciklama, ISNULL(@Aciklama, N'')), N'', N'', N'', N'',
0, N'', 0, 0,
0, 0, 0, 0, @RsAktar,
T.RefNo, T.RefNo, 0 -- ayni RefNo -> karsi kayit eslesir
FROM #S T WHERE T.KarsiHesapId <> 0;
SET @SatirSayisi = @SatirSayisi + @@ROWCOUNT;
END
/* 5d. Kanal izi */
INSERT INTO POS.FisKanal (FisNo, Kanal, KullaniciId, SubeId, KasaId, HesapId, Cihaz, Ip, Jeton, SatirSayisi)
VALUES (@FisNo, @Kanal, @UserId, @SubeId, @KasaId, @HesapId, @Cihaz, @Ip, @Jeton, @SatirSayisi);
INSERT INTO POS.IzKaydi (Olay, KullaniciId, SubeId, KasaId, FisNo, BasariliMi, Mesaj, Ip)
VALUES (N'fis', @UserId, @SubeId, @KasaId, @FisNo, 1, CONCAT(N'Fis yazildi. Satir=', @SatirSayisi), @Ip);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF CURSOR_STATUS('local', 'grup_cur') >= 0
BEGIN
CLOSE grup_cur;
DEALLOCATE grup_cur;
END
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
DECLARE @Msg nvarchar(2000) = ERROR_MESSAGE();
DECLARE @Kod char(8) = UPPER(LEFT(REPLACE(CONVERT(nvarchar(50), NEWID()), '-', ''), 8));
INSERT INTO POS.IzKaydi (Olay, KullaniciId, SubeId, KasaId, FisNo, BasariliMi, BasvuruKodu, Mesaj, Ip)
VALUES (N'hata', @UserId, @SubeId, @KasaId, NULL, 0, @Kod, @Msg, @Ip);
SET @FisNo = NULL;
SET @Hata = CONCAT(N'Fis yazilamadi. Basvuru kodu: ', @Kod);
RAISERROR(@Hata, 16, 1);
RETURN;
END CATCH
/* -------------------------------------------------------------------
6. SONUC
------------------------------------------------------------------- */
SELECT FisNo = @FisNo,
SatirSayisi = @SatirSayisi,
Tarih = @Tarih,
SubeId = @SubeId,
KasaId = @KasaId,
HesapId = @HesapId,
Toplam = (SELECT SUM(Tutar) FROM #S),
ToplamBSMV = (SELECT SUM(BSMV) FROM #S);
SELECT Id, FisNo, IslemKodu, IslemTuru, IslemTipi, Kodu, BakiyeId, BirimId, Birim,
Adet, Miktar, AuMilyem, Fiyat, Tutar, BSMV, VaryantId, IsArbitiraj, HesapId
FROM Cari.Islemler
WHERE FisNo = @FisNo
ORDER BY Id;
END
Kaynaklar
- SRC-DB-MODULES —
sys.sql_modulestanımı (salt okunur); gizli sabitler[REDACTED_SECRET]ile değiştirildi.
Bilinmeyenler
- Hangi sürümde eklendiği:
createdDB tarihi bir kurulumun tarihidir, ürün sürümü değil (GAP-VERSION-02).
