USE [GrpInsurance]

--ALTER Procedure [dbo].[proc_ProsesKlaimOnlineNew]
DECLARE
  @Kode_Provider varchar(6) = '2064',
  @IdKlaim       varchar(11) = '2015.18569',
  @CreateBy      varchar(4) = 'USR',
  @NoKlaim       varchar(11),  --OUTPUT,
  @JmlDibayar    FLOAT,        --OUTPUT,
  @JmlDitolak    FLOAT,        --OUTPUT,
  @KodeTolakan   varchar(10),  --OUTPUT,
  @DescTolakan   varchar(255) --OUTPUT

BEGIN
  SET NOCOUNT ON
  
  DECLARE @RETURN_VALUE INT
  DECLARE @Status_Lama varchar(1)
  DECLARE @Desc_Tolakan varchar(50)
  DECLARE @No_Klaim varchar(11)
  DECLARE @Jenis_Pembayaran varchar(1)
  DECLARE @Uang_Muka float
  DECLARE @Jenis Int
  DECLARE @Paket_Keluarga bit
  DECLARE @AdMedika_Ya bit
  DECLARE @No_Proposal varchar(9)
  DECLARE @No_Polis varchar(11)
  DECLARE @grade_peserta int
  DECLARE @No_Santunan varchar(12)
  DECLARE @No_Peserta varchar(12)
  DECLARE @Id_Produk varchar(10)

  DECLARE @Kode_Santunan varchar(10)
  DECLARE @Kode_Tolakan varchar(10)
  DECLARE @Tgl_Lahir Datetime
  DECLARE @No_Prs varchar(9)
  DECLARE @Tgl_Kwitansi Datetime
  DECLARE @Sub_Kelompok varchar(10)
  DECLARE @Create_Date Datetime
  DECLARE @Create_Date_Fixed Datetime
  DECLARE @Tahun smallint

  DECLARE @Jml_Benefit float
  DECLARE @Jml_Diajukan float
  DECLARE @Jml_Deductible float
  DECLARE @Jml_Dispensasi float
  DECLARE @Jml_Dibayar float
  DECLARE @Jml_Ditolak float
  DECLARE @Tot_Diajukan float
  
  SET @Create_Date = GetDate()
  SET @Create_Date_Fixed = dbo.func_FixedDate(@Create_Date)
  
  SET @No_Klaim = ''

  -- Data klaim header untuk diproses belum masuk -> Data tidak ada
  IF NOT EXISTS (SELECT * FROM Klaim_Header_OnLine WHERE Id_Klaim = @IdKlaim AND Kode_Provider = @Kode_Provider)
  BEGIN
    SET @DescTolakan = 'Data klaim header tidak ada.'
    PRINT @DescTolakan
    --RETURN 1 
  END
  
  -- Data klaim header untuk diproses belum masuk -> Data tidak ada
  IF NOT EXISTS (SELECT * FROM Klaim_Detail_OnLine WHERE Id_Klaim = @IdKlaim AND Kode_Provider = @Kode_Provider)
  BEGIN
    SET @DescTolakan = 'Data klaim detail tidak ada.'
    PRINT @DescTolakan
    --RETURN 1 
  END

  -- Cek selisih jumlah diajukan antara header dan detail
  --DECLARE @p_selisih_diajukan float

  --SELECT
  --  @p_selisih_diajukan = kho.Jml_Diajukan - SUM(kdo.Jml_Diajukan)
  --FROM 
  --  Klaim_Header_Online kho
  --  LEFT JOIN
  --  Klaim_Detail_Online kdo
  --  ON (kho.Id_Klaim = kdo.Id_Klaim) AND
  --     (kho.Kode_Provider = kdo.Kode_Provider)
  --WHERE
  --  (kho.Kode_provider = @Kode_Provider) AND 
  --  (kho.id_Klaim = @IdKlaim)
  --GROUP BY
  --  kho.Jml_Diajukan

  --IF (@p_selisih_diajukan <> 0)
  --BEGIN
  --  SET @DescTolakan = 'Data klaim header dan detail tidak valid.'
  --  RETURN 1 
  --END

  -- Update jumlah diajukan di klaim header = jumlah diajukan di klaim detail
  --UPDATE kho
  --SET
  --  kho.Jml_Diajukan = kdo.Jml_Diajukan
  SELECT
    kho.*
  FROM 
    Klaim_Header_Online kho
    INNER JOIN
    (
      SELECT 
        Id_Klaim,
        Kode_Provider,
        SUM(Jml_Diajukan) AS Jml_Diajukan
      FROM Klaim_Detail_Online
      WHERE
        (Kode_provider = @Kode_Provider) AND 
        (id_Klaim = @IdKlaim)
      GROUP BY
        Id_Klaim,
        Kode_Provider
    ) kdo
    ON (kho.Id_Klaim = kdo.Id_Klaim) AND
       (kho.Kode_Provider = kdo.Kode_Provider)

  IF @@ERROR <> 0
  BEGIN
    SET @DescTolakan = 'Jumlah total diajukan salah'
    PRINT @DescTolakan
    PRINT 'Error updating table klaim_header_online'
    --RETURN 1 
  END

  -- Jika data valid maka ambil data yang diperlukan
  SELECT 
    @No_Klaim = No_Klaim, 
    @No_Peserta = No_Peserta, 
    @Sub_Kelompok = Sub_Kelompok, 
    @Tgl_Kwitansi = Tgl_Kuitansi, 
    @Tgl_Lahir = Tgl_Lahir 
  FROM Klaim_Header_OnLine 
  WHERE 
    (Id_Klaim = @IdKlaim) AND 
    (Kode_Provider = @Kode_Provider)

  --Cari data polis
  DECLARE @COUNT INT

  SELECT 
    @COUNT = COUNT(p.No_Proposal) 
  FROM 
    Peserta p
    INNER JOIN
    Polis_Asuransi pa
    ON p.No_Proposal = pa.No_Proposal
  WHERE
    (p.No_Peserta = @No_Peserta)

  IF ISNULL(@COUNT, 0) = 0
  BEGIN
    SET @DescTolakan = 'Peserta tidak ada.'
    PRINT @DescTolakan
    --RETURN 1
  END
  ELSE
  -- Peserta terdaftar di lebih dari satu proposal
  IF ISNULL(@COUNT, 0) > 1
  BEGIN
    IF NOT EXISTS (SELECT * FROM peserta WHERE (No_Peserta = @No_Peserta) AND (Tgl_Lahir = @Tgl_Lahir))
    BEGIN
      SET @DescTolakan = 'Tanggal lahir salah.'
      PRINT @DescTolakan
      --RETURN 1
    END
  END
  
  SELECT 
    @COUNT = COUNT(DISTINCT pa.No_Polis) 
  FROM
    Peserta p
    INNER JOIN
    Polis_Asuransi pa
    ON p.No_Proposal = pa.No_Proposal
  WHERE
    (p.No_Peserta = @No_Peserta) AND 
    (p.Tgl_Mulai <= @Tgl_Kwitansi) AND 
    (p.Tgl_Selesai >= @Tgl_Kwitansi)

  IF ISNULL(@COUNT, 0) = 0
  BEGIN
    SET @DescTolakan = 'Tanggal kuitansi harus dalam masa asuransi.'
    PRINT @DescTolakan
    --RETURN 1 
  END

  -- Jika peserta terdaftar di > 1 polis
  IF @COUNT > 1 
  BEGIN
    PRINT 'Terdaftar di lebih dari satu polis'
  
    SELECT 
      @No_Prs = pa.No_Prs, 
      @No_Proposal = p.No_Proposal, 
      @No_Polis = pa.No_Polis,
      @grade_peserta = p.grade
    FROM 
      Peserta p
      INNER JOIN 
      Polis_Asuransi pa
      ON p.No_Proposal = pa.No_Proposal
    WHERE
      (p.No_Peserta = @No_Peserta) AND 
      (p.Tgl_Mulai <= @Tgl_Kwitansi) AND 
      (p.Tgl_Selesai >= @Tgl_Kwitansi) AND 
      (p.Tgl_Lahir = @Tgl_Lahir)
    ORDER BY 
      p.No_Proposal DESC
  END
  ELSE
  -- Jika peserta terdaftar di 1 polis
  BEGIN
    PRINT 'Terdaftar di satu polis'
  
    SELECT 
      @No_Prs = pa.No_Prs, 
      @No_Proposal = p.No_Proposal,  
      @No_Polis = pa.No_Polis,
      @grade_peserta = p.grade
    FROM   
      dbo.Peserta p
      INNER JOIN
      dbo.Polis_Asuransi pa
      ON p.No_Proposal = pa.No_Proposal
    WHERE  
      (p.No_Peserta = @No_Peserta) AND 
      (p.Tgl_Mulai <= @Tgl_Kwitansi) AND 
      (p.Tgl_Selesai >= @Tgl_Kwitansi)
    ORDER BY 
      p.No_Proposal desc
  END
  
  PRINT @No_Proposal  

  --Inisialisasi 
  SET @AdMedika_Ya = 0
  SET @Jenis_Pembayaran = 'P'
  SET @Uang_Muka = 0
  SET @Jml_Deductible = 0
  SET @Jml_Dibayar = 0
  SET @Jml_Ditolak = 0
  SET @Jml_Dispensasi = 0
    
 --Cari data produk
  SELECT  
    @Id_Produk = dbo.Peserta_Produk.Id_Produk, 
    @Paket_Keluarga = dbo.Produk_Polis.Keluarga    
  FROM 
    dbo.Peserta_Produk 
    INNER JOIN
    dbo.Produk_Polis 
    ON (dbo.Peserta_Produk.Id_Produk = dbo.Produk_Polis.Id_Produk) AND 
       (dbo.Peserta_Produk.No_Proposal = dbo.Produk_Polis.No_Proposal) 
  WHERE 
    (dbo.Peserta_Produk.Sub_Kelompok = @Sub_Kelompok) AND 
    (dbo.Produk_Polis.No_Proposal = @No_Proposal) AND
    (dbo.Produk_Polis.Status = 'I') AND
    (dbo.Peserta_Produk.no_peserta = 
      CASE 
        WHEN dbo.Produk_Polis.Keluarga = 0 THEN @No_Peserta 
        ELSE LEFT(@No_Peserta,11) + '0' 
      END
    )

  IF ISNULL(@Paket_Keluarga, 0) = 0 
    SET @No_Santunan = @No_Peserta
  ELSE 
    SET @No_Santunan = LEFT(@No_Peserta, 11) + '0'

  --IF EXISTS(SELECT * FROM Klaim_Header_OnLine WHERE Id_Klaim=@IdKlaim AND Kode_Provider=@Kode_Provider)
  --SELECT @No_Klaim=No_Klaim FROM Klaim_Header_OnLine WHERE Id_Klaim=@IdKlaim AND Kode_Provider=@Kode_Provider
  
  -- Jika belum ada no_klaim
  IF ISNULL(@No_Klaim, '') = ''
  BEGIN
    SET @Tahun = Year(@Create_Date)
    --EXEC gproc_SetNo 1, 100, @Tahun, 5
    EXEC @RETURN_VALUE = gproc_GetNo 1, @Create_Date, 'No_Klaim', @No_Klaim OUTPUT
    
    IF @RETURN_VALUE <> 0
    BEGIN
      PRINT 'Error generating no_klaim'
      --RETURN 1
    END
  END
  ELSE 
  -- Jika sudah ada no_klaim
  BEGIN
    IF EXISTS(SELECT * FROM Klaim_Peserta WHERE No_Klaim = @No_Klaim)
    BEGIN
      SELECT @Status_Lama = Status FROM Klaim_Peserta WHERE No_Klaim = @No_Klaim
      
      IF ISNULL(@Status_Lama,'') <> 'I' 
      BEGIN    
        --DELETE FROM Klaim_Peserta WHERE No_Klaim = @No_Klaim
        --DELETE FROM Klaim_Detail  WHERE No_Klaim = @No_Klaim
        PRINT 'DELETE FROM Klaim_Detail  WHERE No_Klaim = ' + @No_Klaim
      END
      ELSE 
      BEGIN
        SET @DescTolakan = 'Klaim sudah diproses (Status="I")'
        PRINT @DescTolakan
        --RETURN 1 -- 
      END
    END
  END
  
  PRINT @No_Polis

  -- Jika polis non GT group
  --IF RIGHT(@No_Polis, 1) <> '0' 
  IF (RIGHT(@No_Polis, 1) <> '0') AND 
     (@No_Polis <> '1991.0203.1') -- POLIS BANK GANESHA
  BEGIN
    PRINT 'check'
  
    IF NOT EXISTS(SELECT * FROM Mapping_Produk WHERE No_Proposal = @No_Proposal) 
    BEGIN
      SET @DescTolakan = 'Mapping tarip tidak ada.'
      PRINT @DescTolakan
      --RETURN 1
    END
  END
  
PRINT 'No Klaim: ' + @No_Klaim

END