--UPDATE HTEDAVITABELA SET TKIPTAL=0 WHERE HTEDAVITABELAID=46278
--SELECT DRID,KYUSER , * FROM  HTEDAVITABELA WHERE HTEDAVITABELAID=46278
--KULLANICI VE DR KONTROLU EKLENECEKSE DEĞERLERİ GİRELİM YOKSA BİŞEY YAZMAYA GEREK YOK KOTRL EKLENECEKSE AŞAĞIDAKİ GİBİ
--SP_TEDAVI_TABELASI_IPTAL 6760,46278,'SS',1
--KONTROL EKLENMEYECEKSE AŞAĞIDAKİ GİB OLUR
--SP_TEDAVI_TABELASI_IPTAL 6760,46278

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

CREATE PROCEDURE [dbo].[SP_TEDAVI_TABELASI_IPTAL]
    @HYATISID INT,
    @HTEDAVITABELAID INT,
    @USERKODU NVARCHAR(50) = NULL,
    @GDRID INT = NULL
AS
BEGIN
    
    SET NOCOUNT ON; 

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

    -- 2- HTEDAVITABELADETAY Kayıt Kontrolü
    IF NOT EXISTS (SELECT 1 FROM HTEDAVITABELADETAY WITH(NOLOCK) WHERE HTEDAVITABELAID = @HTEDAVITABELAID AND ISNULL(PASIF, 1) = 0)
    BEGIN
        RAISERROR(N'Tedavi tabelası için detay satır girilmemiş. Tabelayı siliniz.', 16, 1);
        RETURN;
    END

	-- Eğer @USERKODU veya @GDRID parametrelerinden en az biri dolu gelmişse kontrol yap
    IF (@USERKODU IS NOT NULL OR @GDRID IS NOT NULL)
    BEGIN
        IF NOT EXISTS (
            SELECT 1 
            FROM HTEDAVITABELA WITH(NOLOCK) 
            WHERE HTEDAVITABELAID = @HTEDAVITABELAID
              AND (
                  (@USERKODU IS NOT NULL AND KYUSER = @USERKODU)
                  OR 
                  (@GDRID IS NOT NULL AND DRID = @GDRID)
              )
        )
        BEGIN
            RAISERROR(N'Tedavi tabelasını, tabela doktoru veya kaydeden kullanıcı silebilir!', 16, 1);
            RETURN;
        END
    END

    -- 3- HTEDAVITABELAKULLANIM Uygulandı/Hesap İşlendi Kontrolü
    IF EXISTS (
        SELECT 1 
        FROM HTEDAVITABELAKULLANIM HK WITH(NOLOCK)
        INNER JOIN HTEDAVITABELADETAY HD WITH(NOLOCK) ON HD.HTEDAVITABELADETAYID = HK.HTEDAVITABELADETAYID 
        WHERE HD.HTEDAVITABELAID = @HTEDAVITABELAID AND (HK.UYGULANDI = 1 OR HK.HESAPISLID IS NOT NULL)
    )
    BEGIN
        RAISERROR(N'Tedavi Tabelasındaki işlem uygulandığından tedavi tabelası iptal edilemez!', 16, 1);
        RETURN;
    END

    -- 4- DEPOFIS Kontrolü
    IF EXISTS (
        SELECT 1 
        FROM DEPOFIS DF WITH(NOLOCK)
        INNER JOIN TALEPFIS TF WITH(NOLOCK) ON TF.TALEPFISID = DF.TALEPFISID 
        WHERE TF.HTEDAVITABELAID = @HTEDAVITABELAID
    )
    BEGIN
        RAISERROR(N'Tedavi Tabelasından oluşan talep fişi için depo fişi oluşturulmuş, tedavi tabelası iptal edilemez!', 16, 1);
        RETURN;
    END

    -- 5- TALEPFIS Durum Kontrolü
    IF EXISTS (
        SELECT 1 
        FROM TALEPFIS WITH(NOLOCK)
        WHERE HTEDAVITABELAID = @HTEDAVITABELAID AND (DURUM = N'İŞLEMDE' OR DURUM = N'VERİLDİ')
    )
    BEGIN
        RAISERROR(N'Talep fişi durumu islemde/verildi olan talep fişi bulunmaktadır. Tedavi tabelası iptal edilemez!', 16, 1);
        RETURN;
    END

    -- ==============================================================================
    -- SİLME VE GÜNCELLEME İŞLEMLERİ (AŞAMA 6 - 9)
    -- ==============================================================================
    
    BEGIN TRY
        -- 6- Transaction Başlat
        BEGIN TRANSACTION;

        -- 7-1 HTEDAVITABELAKULLANIM Toplu Silme (Set-Based)
        DELETE FROM HTEDAVITABELAKULLANIM 
        WHERE HTEDAVITABELADETAYID IN (
            SELECT HTEDAVITABELADETAYID 
            FROM HTEDAVITABELADETAY 
            WHERE HTEDAVITABELAID = @HTEDAVITABELAID AND ISNULL(PASIF, 1) = 0
        );

        -- 7-2 TALEPFISISL Toplu Silme (Set-Based)
        DELETE TALEPFISISL 
        FROM TALEPFIS 
        INNER JOIN TALEPFISISL ON TALEPFISISL.TALEPFISID = TALEPFIS.TALEPFISID 
        WHERE TALEPFISISL.HTEDAVITABELADETAYID IN (
            SELECT HTEDAVITABELADETAYID 
            FROM HTEDAVITABELADETAY 
            WHERE HTEDAVITABELAID = @HTEDAVITABELAID AND ISNULL(PASIF, 1) = 0
        )
        AND TALEPFIS.IADE = 0 
        AND TALEPFIS.DURUM = N'YENİ';

        -- 8- Kalan Talep Fişi İşlem Sayısı Kontrolü ve TALEPFIS Silme
        DECLARE @KalanSayi INT;
        SELECT @KalanSayi = COUNT(*) 
        FROM TALEPFIS WITH(NOLOCK) 
        INNER JOIN TALEPFISISL WITH(NOLOCK) ON TALEPFIS.TALEPFISID = TALEPFISISL.TALEPFISID 
        WHERE TALEPFIS.HTEDAVITABELAID = @HTEDAVITABELAID 
          AND TALEPFIS.IADE = 0 
          AND TALEPFIS.DURUM = N'YENİ';

        IF @KalanSayi = 0
        BEGIN
            DELETE FROM TALEPFIS 
            WHERE HTEDAVITABELAID = @HTEDAVITABELAID 
              AND IADE = 0 
              AND DURUM = N'YENİ';
        END

        -- 9- Tabelayı İptal Olarak İşaretleme
        UPDATE HTEDAVITABELA 
        SET TKIPTAL = 1 
        WHERE HTEDAVITABELAID = @HTEDAVITABELAID;

        
        COMMIT TRANSACTION;

        
        SELECT N'Tedavi tabelası 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