IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[SP_TEDAVI_TABELASI_SATIR_IPTAL]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
DROP PROCEDURE SP_TEDAVI_TABELASI_SATIR_IPTAL
GO 


CREATE PROCEDURE [dbo].[SP_TEDAVI_TABELASI_SATIR_IPTAL]
    @HYATISID INT,
    @HTEDAVITABELAID INT,
    @HTEDAVITABELADETAYID INT, -- Satır bazlı iptal için bu parametre şarttır
    @YETKILI NVARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON; 
	--SP_TEDAVI_TABELASI_SATIR_IPTAL 6789,46326,273649,'S'
	/*UPDATE HTEDAVITABELADETAY 
        SET PASIF = 0, 
            PASIFZAMANI = NULL,  
            PASIFNEDENIID = NULL, 
            PASIFYAPAN = NULL 
        WHERE HTEDAVITABELADETAYID = 273649;*/
   
    -- ==============================================================================
    -- DEĞİŞKEN TANIMLAMALARI
	-- TEST İÇİN EKLENDİ KONTRO EDİLİYOR 
    -- ==============================================================================
    DECLARE @TabelaKullanimKayidiVar BIT = 0;
    DECLARE @TalepFisiIslemKodu INT = 2;
    DECLARE @KodEkStr NVARCHAR(20);
    DECLARE @TalepfisDrm NVARCHAR(50);
    DECLARE @UygulanmisKullanimiVar BIT = 0;
    
    DECLARE @ToplamSorguSayisi INT = 0;
    DECLARE @KullanimSayisi INT = 0;
    DECLARE @PasifSayisi INT = 0;

    DECLARE @PASIFNEDENIID INT = 6; -- 6: Hatalı Giriş
    DECLARE @HSTDANKULLANILIR BIT = 0;
    DECLARE @PKULLANIMMIKTARI FLOAT = 0;
    DECLARE @GUNLUKKULLANIMSAYISI INT = 0;
    DECLARE @ITEMID INT = 0;
    DECLARE @YENIITEMID INT = 0;

    DECLARE @IlkAnaDepoID INT = NULL;
    DECLARE @TalepStokID INT;
    DECLARE @STOKBIRIMIKUTU BIT;
    DECLARE @KUTUICIADET FLOAT;
    DECLARE @Miktar FLOAT = 0;
    DECLARE @ISLEMKODU NVARCHAR(25);
    DECLARE @DEPOID INT;
    DECLARE @UYGBOLUMID INT;

    DECLARE @SUBEID INT;
    DECLARE @SUBEKODU NVARCHAR(50);
    DECLARE @HKIMLIKID INT;
    DECLARE @HADSOYAD NVARCHAR(100);
    DECLARE @HDOSYAID INT;

    -- ==============================================================================
    -- 1-2-3: TEMEL TABLO KONTROLLERİ
    -- ==============================================================================

    -- 1- HTedaviTabelaDetay kayıt sayısı sıfırsa kontrolü
    IF NOT EXISTS (SELECT 1 FROM HTEDAVITABELADETAY WITH(NOLOCK) WHERE HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID)
    BEGIN
        RAISERROR('Tedavi tabelasında satır yoktur!', 16, 1);
        RETURN;
    END

    -- 2- Satır PASIF kontrolü
    IF EXISTS (SELECT 1 FROM HTEDAVITABELADETAY WITH(NOLOCK) WHERE HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID AND PASIF = 1)
    BEGIN
        RAISERROR('Tedavi tabelası satırı pasif durumdadır!', 16, 1);
        RETURN;
    END

    -- 3- Tabela / Satır İptal Kontrolü
    IF EXISTS (SELECT 1 FROM HTEDAVITABELA WITH(NOLOCK) WHERE HTEDAVITABELAID = @HTEDAVITABELAID AND TKIPTAL = 1)
    BEGIN
        RAISERROR('Tedavi tabelası daha önceden iptal edilmiş!', 16, 1);
        RETURN;
    END

    -- ==============================================================================
    -- 4: KULLANIM KAYDI VE FİŞ DURUM KONTROLLERİ
    -- ==============================================================================

    -- Kayıt durumlarını tek sorguda alarak değişkenlere atıyoruz (Performans için)
    SELECT 
        @ToplamSorguSayisi = COUNT(*),
        @KullanimSayisi = SUM(CASE WHEN UYGULANDI = 1 THEN 1 ELSE 0 END),
        @PasifSayisi = SUM(CASE WHEN KULPASIF = 1 THEN 1 ELSE 0 END),
        @UygulanmisKullanimiVar = MAX(CASE WHEN (HESAPISLID IS NOT NULL OR UYGULANDI = 1) THEN 1 ELSE 0 END)
    FROM HTEDAVITABELAKULLANIM WITH(NOLOCK) 
    WHERE HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID;

    IF ISNULL(@ToplamSorguSayisi, 0) > 0 
        SET @TabelaKullanimKayidiVar = 1;

    -- 4-2: İşlem Kodu Config'den Alınması
    SELECT TOP 1 @KodEkStr = VALUESTR 
    FROM CONFIG WITH(NOLOCK) 
    WHERE SECTIONSTR = N'Talep' AND PROGNAME = N'MEDISOFT' AND KEYNAME = N'Talep Fişinde İşlem Kodu Alanı İçin Kullanılacak Temel Fiyat Kurumu No';

    IF ISNUMERIC(@KodEkStr) = 1
        SET @TalepFisiIslemKodu = CAST(@KodEkStr AS INT);
    ELSE
    BEGIN
        SET @TalepFisiIslemKodu = 2;
        SET @KodEkStr = '2';
    END

    -- 4-3: Kullanım kaydı varsa Talep Fişi kontrolü
    IF @TabelaKullanimKayidiVar = 1
    BEGIN
        SELECT TOP 1 @TalepfisDrm = TALEPFIS.DURUM 
        FROM TALEPFIS WITH(NOLOCK) 
        INNER JOIN TALEPFISISL WITH(NOLOCK) ON TALEPFIS.TALEPFISID = TALEPFISISL.TALEPFISID 
        WHERE TALEPFISISL.HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID;

        -- 4-3-1 İşlemde kontrolü
        IF @TalepfisDrm = N'İŞLEMDE'
        BEGIN
            RAISERROR('İşlemde durumunda talep fişi var tedavi tabelasındaki işlemi iptal edemezsiniz!', 16, 1);
            RETURN;
        END

        -- 4-3-2-1 Tümü uygulanmış mı kontrolü
        IF (@KullanimSayisi + @PasifSayisi) = @ToplamSorguSayisi AND @ToplamSorguSayisi > 0
        BEGIN
            RAISERROR('Tedavi tabelası uygulamalarının hepsi uygulanmış durumdadır. Tabela detayı iptal edilemez!', 16, 1);
            RETURN;
        END
    END

    -- ==============================================================================
    -- 5: DEĞİŞKENLERİN DOLDURULMASI
    -- ==============================================================================

    SELECT 
        @HSTDANKULLANILIR = ISNULL(HSTDANKULLANILIR, 0),
        @YENIITEMID = ISNULL(YENIITEMID, 0),
        @ITEMID = ISNULL(ITEMID, 0),
        @GUNLUKKULLANIMSAYISI = ISNULL(GUNLUKKULLANIMSAYISI, 0),
        @PKULLANIMMIKTARI = ISNULL(PKULLANIMMIKTARI, 0)
    FROM HTEDAVITABELADETAY WITH(NOLOCK) 
    WHERE HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID AND ISNULL(PASIF, 1) = 0;

    SELECT 
        @DEPOID = TBIRIM.DEPOID,
        @UYGBOLUMID = VWYATIS.UYGBOLUMID 
    FROM VWYATIS WITH(NOLOCK) 
    INNER JOIN TBIRIM WITH(NOLOCK) ON TBIRIM.BIRIMID = VWYATIS.UYGBIRIMID 
    WHERE VWYATIS.HYATISID = @HYATISID;

    -- ==============================================================================
    -- 6: SİLME VE GÜNCELLEME İŞLEMLERİ (TRANSACTION BAŞLAR)
    -- ==============================================================================
    
    BEGIN TRY
        BEGIN TRANSACTION;

        -- 4-1: Kullanım kaydı YOKSA detayı tamamen sil
        IF @TabelaKullanimKayidiVar = 0
        BEGIN
            DELETE FROM HTEDAVITABELADETAY WHERE HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID;
        END

        -- 7: KULLANIM KAYDI VARSA YÖNLENDİRME (İADE FİŞİ Mİ, SİLME Mİ?)
        IF @TabelaKullanimKayidiVar = 1
        BEGIN
            -- Depo fişinde işlenmiş mi diye IlkAnaDepoID'yi al
            IF (EXISTS (SELECT TOP 1  TALEPFIS.CDEPOID
            FROM DEPOFISISL WITH(NOLOCK)
            INNER JOIN DEPOFIS WITH(NOLOCK) ON DEPOFISISL.DEPOFISID = DEPOFIS.DEPOFISID 
            INNER JOIN TALEPFIS WITH(NOLOCK) ON TALEPFIS.TALEPFISID = DEPOFIS.TALEPFISID 
            INNER JOIN TALEPFISISL WITH(NOLOCK) ON TALEPFISISL.TALEPFISID = TALEPFIS.TALEPFISID 
                AND DEPOFISISL.STOKID = TALEPFISISL.STOKID 
            WHERE TALEPFISISL.HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID)) OR (@UygulanmisKullanimiVar = 1)

            -- İADE SÜRECİ (Talep Fişi Kes)
            --IF (@IlkAnaDepoID IS NOT NULL OR @UygulanmisKullanimiVar = 1)
            BEGIN
				SELECT TOP 1 @IlkAnaDepoID = TALEPFIS.CDEPOID
				FROM DEPOFISISL WITH(NOLOCK)
				INNER JOIN DEPOFIS WITH(NOLOCK) ON DEPOFISISL.DEPOFISID = DEPOFIS.DEPOFISID 
				INNER JOIN TALEPFIS WITH(NOLOCK) ON TALEPFIS.TALEPFISID = DEPOFIS.TALEPFISID 
				INNER JOIN TALEPFISISL WITH(NOLOCK) ON TALEPFISISL.TALEPFISID = TALEPFIS.TALEPFISID 
					AND DEPOFISISL.STOKID = TALEPFISISL.STOKID 
				WHERE TALEPFISISL.HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID

                IF @HSTDANKULLANILIR = 0
                BEGIN
                    DECLARE @SorgulanacakItemID INT = CASE WHEN @YENIITEMID <> 0 THEN @YENIITEMID ELSE @ITEMID END;

                    SELECT TOP 1 
                        @TalepStokID = STOKID, 
                        @KUTUICIADET = ISNULL(KUTUICIADET, 1), 
                        @STOKBIRIMIKUTU = ISNULL(STOKBIRIMIKUTU, 0),
                        @ISLEMKODU = CASE @KodEkStr  
                            WHEN '1' THEN ITEMKODU1  
                            WHEN '2' THEN ITEMKODU2  
                            WHEN '3' THEN ITEMKODU3  
                            WHEN '4' THEN ITEMKODU4  
                            WHEN '5' THEN ITEMKODU5  
                            WHEN '6' THEN ITEMKODU6  
                            ELSE ITEMKODU2 
                        END
                    FROM VWITEM WITH(NOLOCK) 
                    WHERE ITEMID = @SorgulanacakItemID;

                    IF @@ROWCOUNT = 0
                    BEGIN
                        RAISERROR('İşlem kaydı bulunamadı!', 16, 1);
                        RETURN;
                    END

                    -- Miktar Hesaplama
                    IF @STOKBIRIMIKUTU = 1 
                        SET @Miktar = (@GUNLUKKULLANIMSAYISI - (@KullanimSayisi + @PasifSayisi)) * @PKULLANIMMIKTARI / NULLIF(@KUTUICIADET, 0);
                    ELSE 
                        SET @Miktar = (@GUNLUKKULLANIMSAYISI - (@KullanimSayisi + @PasifSayisi)) * @PKULLANIMMIKTARI;

                    -- Hasta / Şube / Dosya Bilgileri (Küçük bir JOIN düzeltmesi uygulandı)
                    SELECT TOP 1
                        @SUBEID = HDOSYA.SUBEID,
                        @SUBEKODU = SUBELER.SUBEKODU,
                        @HKIMLIKID = HDOSYA.HKIMLIKID,
                        @HADSOYAD = HDOSYA.ADISOYADI,
                        @HDOSYAID = HDOSYA.HDOSYAID
                    FROM HYATIS WITH(NOLOCK)
                    INNER JOIN VWHDOSYA HDOSYA WITH(NOLOCK) ON HDOSYA.HDOSYAID = HYATIS.HDOSYAID -- Not: HYATISID yerine HDOSYAID linklendi (Mantıksal Düzeltme)
                    INNER JOIN SUBELER WITH(NOLOCK) ON SUBELER.SUBEID = HDOSYA.SUBEID -- Not: HDOSYAID yerine SUBEID linklendi (Mantıksal Düzeltme)
                    WHERE HYATIS.HYATISID = @HYATISID;
                    
					DECLARE @IslemTarihi DATETIME;
					SET @IslemTarihi = dbo.TARIHAL(GETDATE());
                    
					-- Iade Fişi Kesimi
                    EXEC HTEDAVITABELA_TALEPFISI_KES 
                        @TalepStokID, @SUBEID, @SUBEKODU, @IlkAnaDepoID, @DEPOID, 
                       @IslemTarihi,
                        @UYGBOLUMID, 0, @Miktar, @YETKILI, @ISLEMKODU, @HKIMLIKID, 
                        @HTEDAVITABELAID, @HTEDAVITABELADETAYID, @HDOSYAID, @HADSOYAD, 1, 0;

                END
            END
            ELSE -- KULLANIM VAR AMA UYGULANMAMIŞ VE DEPODAN ÇIKMAMIŞ (Fiziksel Silme)
            BEGIN
                DELETE FROM HTEDAVITABELAKULLANIM WHERE HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID;
                
                DELETE TALEPFISISL 
                FROM TALEPFIS 
                INNER JOIN TALEPFISISL ON TALEPFISISL.TALEPFISID = TALEPFIS.TALEPFISID  
                WHERE TALEPFISISL.HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID AND TALEPFIS.IADE = 0;

                -- Kalan fiş detayı yoksa Fiş Başlığını da sil
                DECLARE @KalanFisSayisi INT;
                SELECT @KalanFisSayisi = COUNT(*) 
                FROM TALEPFIS WITH(NOLOCK) 
                INNER JOIN TALEPFISISL WITH(NOLOCK) ON TALEPFIS.TALEPFISID = TALEPFISISL.TALEPFISID  
                WHERE TALEPFIS.HTEDAVITABELAID = @HTEDAVITABELAID AND TALEPFIS.IADE = 0;
                
                IF @KalanFisSayisi = 0 
                BEGIN
                    DELETE FROM TALEPFIS WHERE HTEDAVITABELAID = @HTEDAVITABELAID AND IADE = 0;
                END
            END

			---else
          -- RaiseException('Kullanım planı ve talep fişi silinmeden tedavi tabelası satırı silinemez!');
        END

        -- 8: Satır Pasife Çekilir (Eğer 4-1'de silinmemişse burası çalışıp pasife alır)
        UPDATE HTEDAVITABELADETAY 
        SET PASIF = 1, 
            PASIFZAMANI = GETDATE(),  
            PASIFNEDENIID = @PASIFNEDENIID, 
            PASIFYAPAN = @YETKILI 
        WHERE HTEDAVITABELADETAYID = @HTEDAVITABELADETAYID;

        -- İşlem Başarılı
        COMMIT TRANSACTION;

        SELECT 'Tedavi tabelası SATIRI iptal edildi.' AS Mesaj;

    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;

        DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
        RAISERROR(@ErrorMessage, 16, 1);
    END CATCH
END
GO