USE [HRIS]
GO


-- query ini diambil dari trigger [dbo].[generate_absensi] ON [dbo].[SPG_ABSENSI_DUMP] AFTER INSERT AS

DECLARE
	@id_spg_absensi_dump INT = 15576597	-- jalanin untuk 15576597 dan 15576598
BEGIN
	declare @xtanggal datetime;
	declare @xtanggalbatasmasuk datetime;
	declare @xtanggalbataskeluar datetime;
	declare @xnip varchar(15);
	declare @xkodepwk varchar(3);
	declare @xabsensitime datetime;
	declare @v_kd_unit_org varchar(16);
	declare @v_kd_kantor varchar(20);
	declare @v_max_id integer;
	declare @v_nip_exist integer;
	declare @v_batas_masuk datetime;
	declare @v_batas_keluar datetime;
	declare @v_pembagitime datetime;
	declare @v_masuk_exist datetime;
	declare @v_keluar_exist datetime;
	declare @_id int;
	declare @_term_id varchar(100);
	declare @_fp_id varchar(100);
	declare @_t_date datetime
	declare @_fkey int;
	declare @_ref_id int;

	-- yang dimodifikasi disini
	SELECT
		@_id = ID,
		@_term_id = TERM_ID,
		@_fp_id = FP_ID,
		@_t_date = T_DATE,
		@_fkey = FKEY,
		@_ref_id = REF_ID
	FROM
		SPG_ABSENSI_DUMP 
	WHERE 
		ID = @id_spg_absensi_dump

	-- Insert statements for trigger here
	BEGIN
	   TRY
	   select
	      @xnip = NIP
	   from
	      spg_data_current
	   where
	      FP_ID = @_fp_id;
	select
	   @xabsensitime = CONVERT(datetime, CONVERT(VARCHAR(17), @_t_date, 120) + '00', 120);
	select
	   @v_kd_kantor = kd_kantor,
	   @v_kd_unit_org = kd_unit_org
	from
	   spg_data_current
	where
	   nip = @xnip
	   select
	      -- batas masuk
	      @xtanggalbatasmasuk = dbo.getjamabsensi(DATEADD(day, - 1, @xabsensitime), @xnip, 3, default, @_ref_id),
	      -- batas keluar
	      @xtanggalbataskeluar = dbo.getjamabsensi(DATEADD(day, - 1, @xabsensitime), @xnip, 4, 1, @_ref_id);
	print @xabsensitime;
	if ((@xtanggalbatasmasuk <= @xabsensitime)
	and
	(
	   @xtanggalbataskeluar >= @xabsensitime
	)
	)
	begin
	   -- data yg diambil batas masuk, batas masuk dgn tgl masuk hrs ditanggal yg sama. kalo tdk sama yg diambil tgl masuk.
	   SET
	      @xtanggal = @xtanggalbatasmasuk;
	end
	else
	   begin
	   SET
	      @xtanggal = @xabsensitime;
	   end
	   declare @isNon varchar(1);
	select
	   @isNon = isNon
	from
	   cekIsNonPegawaiAbsensi(@xtanggal, @xnip);
	select
	   -- pengganti function cekISnonPegawaiabsensi
	   -- batas masuk
	   @v_batas_masuk = dbo.getjamabsensi(@xtanggal, @xnip, 3, default, @_ref_id),
	   -- batas keluar
	   @v_batas_keluar = dbo.getjamabsensi(@xtanggal, @xnip, 4, 1, @_ref_id),
	   -- pembagai, sebagai acuan pembagi waktu kalau sebelumnya berarti masuk atau sebaliknya keluar
	   @v_pembagitime =
	   case
	      @isNon
	      when
	         'y'
	      then
	         -- untuk pegawai shift
	         -- dbo.getjamabsensi(@xtanggal,@xnip,1) +
	         convert(datetime, convert(float,
	         (
	            dbo.getjamabsensi(@xtanggal, @xnip, 2, 1, @_ref_id) + dbo.getjamabsensi(@xtanggal, @xnip, 1, default, @_ref_id)
	         )
	) / 2)
	      else
	         -- jika bukan pegawai shift
	         CONVERT(datetime, CONVERT(VARCHAR(10), @xtanggal, 120) + ' 12:00')
	   end
	   -- Cek apakah data presensi utk nip dan tanggal tersebut sudah ada di spg_absensi
	   ----------------------------------------------------------------------------------
	   select
	      @v_nip_exist = count(*)
	   from
	      spg_absensi
	   where
	      tanggal_absen = convert(varchar, @v_batas_masuk, 112)
	      and nip = @xnip ;
	-- Kalau belum ada data diinsert langsung
	if (@v_nip_exist < 1)
	begin
	   --insert into procedure_log values ('insert dgn pembagi:' || to_char(v_pembagitime,'YYYYMMDD hh24:mi'));
	   -- Ambil id terakhir untuk next_id
	   --select @v_max_id =isnull(max(id),0)+1 from spg_absensi;
	   -- Kalau jam kurang dari 12 berarti jam masuk
	   if (@xabsensitime <= @v_pembagitime) 	-- to_number(xjam)<12 then
	   begin
	      --insert into procedure_log values ('jammasuk');
	      -- Absen yang diambil hanya yang sesudah jam 6:30
	      if (@xabsensitime >= @v_batas_masuk) 		--xwaktu>='063000' then
	      begin
	         insert into
	            spg_absensi (nip, masuk, keluar, tanggal_absen, masuk_term_id, kd_kantor)
	         values
	            (
	               @xnip,
	               @xabsensitime,
	               null,
	               convert(varchar, @v_batas_masuk, 112),
	               @_term_id,
	               @_ref_id
	            )
	;
	      end
	   end
	   -- kalau lebih berarti jam keluar
	   else
	      begin
	         --insert into procedure_log values ('jamkeluar');
	         -- Absen yang diambil hanya yang sebelum jam 21:00
	         if (@xabsensitime <= @v_batas_keluar) 			--xwaktu<'210000' then
	         begin
	            insert into
	               spg_absensi (nip, masuk, keluar, tanggal_absen, keluar_term_id, kd_kantor)
	            values
	               (
	                  @xnip,
	                  null,
	                  @xabsensitime,
	                  convert(varchar, @v_batas_masuk, 112),
	                  @_term_id,
	                  @_ref_id
	               )
	;
	         end
	      end
	      -- data presensi sudah ada, proses update
	end
	else
	   begin
	      -- Ambil jam masuk dan keluar pada data sebelumnya, karena jam masuk diambil yg paling pagi dan jam pulang yang paling malam
	      select
	         @v_masuk_exist = masuk,
	         --to_char(masuk,'HH24MISS') as masuk_exist,
	         @v_keluar_exist = keluar 			--to_char(keluar,'HH24MISS') as keluar_exist
	      from
	         spg_absensi
	      where
	         tanggal_absen = convert(varchar, @v_batas_masuk, 112)
	         and nip = @xnip;
	-- Kalau jam kurang dari 12 berarti jam masuk
	if (@xabsensitime <= @v_pembagitime) --to_number(xjam)<12 then
	begin
	   -- Absen yang diambil hanya yang sesudah jam 6:30
	   if ((@xabsensitime >= @v_batas_masuk 	--xwaktu>='063000'
	   and @xabsensitime < @v_masuk_exist)
	   or @v_masuk_exist is NULL)
	   begin
	      update
	         spg_absensi
	      set
	         masuk = @xabsensitime,
	         masuk_term_id = @_term_id,
	         kd_kantor = @_ref_id
	      where
	         tanggal_absen = convert(varchar, @v_batas_masuk, 112)
	         and nip = @xnip ;
	   end
	   -- kalau lebih berarti jam keluar
	end
	else
	   begin
	      -- Absen yang diambil hanya yang sebelum jam 21:00
	      if ((@xabsensitime <= @v_batas_keluar 		-- xwaktu<'210000'
	      and @xabsensitime > @v_keluar_exist)
	      or @v_keluar_exist is NULL)
	      begin
	         update
	            spg_absensi
	         set
	            keluar = @xabsensitime,
	            keluar_term_id = @_term_id,
	            kd_kantor = @_ref_id
	         where
	            tanggal_absen = convert(varchar, @v_batas_masuk, 112)
	            and nip = @xnip ;
	      end
	   end
	   end
	END
	TRY
	BEGIN
	   CATCH ROLLBACK TRANSACTION
	   insert into
	      spg_absensi_dump_error (term_id, FP_ID, T_DATE, FKEY, REF_ID)
	      SELECT
	         @_term_id,
	         @_fp_id,
	         @_t_date,
	         @_fkey,
	         @_ref_id
	END
	CATCH
END