AIFA AKADEMI · Kurumsal Wiki
4.310 makale
Ana sayfa Kurumsal Wiki › Veritabanı › StoredProcedures › SP-POS.FISKAYDET

POS.FisKaydet

PROCEDUREMOD-POSPOS_VARIANTMANUAL_REVIEWVERY_HIGH[SOURCE_IMPLEMENTED]
Kanonik kaynak: markdown · bu sayfa üretilmiş görünümdür

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)

KategoriF — MANUAL REVIEW · F-EXTERNAL_PRODUCT
Güven90
GerekçeERPGOLD 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_modules tanımı (salt okunur); gizli sabitler [REDACTED_SECRET] ile değiştirildi.

Bilinmeyenler

  • Hangi sürümde eklendiği: created DB tarihi bir kurulumun tarihidir, ürün sürümü değil (GAP-VERSION-02).