Project

General

Profile

Bug #4181 » sp_hr_md_emp_mutasi_20260206.sql

Tri Rizqiaty, 02/06/2026 03:46 PM

 
1
??USE [MinovaHR_BANK_MEGA_Development]
2

3
GO
4

5
/****** Object:  StoredProcedure [dbo].[sp_hr_md_emp_mutasi]    Script Date: 06/02/2026 10.57.20 ******/
6

7
SET ANSI_NULLS ON
8

9
GO
10

11
SET QUOTED_IDENTIFIER ON
12

13
GO
14

15
ALTER PROCEDURE [dbo].[sp_hr_md_emp_mutasi]
16

17

18

19
@EffectiveDate VARCHAR (10),
20

21
@Position VARCHAR (MAX),
22

23
@YearsFrom INT,
24

25
@MonthFrom INT,
26

27
@YearsTo INT,
28

29
@MonthTo INT,
30

31
@user_id VARCHAR (MAX)
32

33

34

35
AS
36

37

38

39
--DECLARE @EffectiveDate VARCHAR (10) ='20260206'
40

41
--DECLARE @Position VARCHAR (MAX) =''
42

43
--DECLARE @YearsFrom INT =''
44

45
--DECLARE @MonthFrom INT=''
46

47
--DECLARE @YearsTo INT =''
48

49
--DECLARE @MonthTo INT=''
50

51
--DECLARE @user_id VARCHAR (MAX)='all'
52

53

54

55
DECLARE @now VARCHAR(12) = dbo.fn_formatdatetime(GETDATE(), 'yyyymmdd')
56

57
DECLARE @EffectiveDate2 VARCHAR(12) = @EffectiveDate
58

59

60

61

62

63
-----------------------// User ID Authorization // -----------------------------
64

65
select * into #userid
66

67
from hr_cust_authorization id
68

69
where id.[user_id]=@user_id
70

71
--select * from #userid
72

73

74

75
DECLARE @CompanyID VARCHAR (10)=''
76

77
SET @CompanyID = (select company_id from  #userid)
78

79

80

81
DECLARE @EmployeeType VARCHAR (10)=''
82

83
SET @EmployeeType = (select employee_type from  #userid)
84

85

86

87
DECLARE @EmployeeSubType VARCHAR (10)=''
88

89
SET @EmployeeSubType = (select employee_subtype from  #userid)
90

91

92

93
DECLARE @Regional VARCHAR (10)=''
94

95
SET @Regional = (select employee_region from  #userid)
96

97

98

99
DECLARE @Employee_Area VARCHAR (10)=''
100

101
SET @Employee_Area = (select employee_area from  #userid)
102

103

104

105
DECLARE @EmployeeOffice VARCHAR (10)=''
106

107
SET @EmployeeOffice = (select employee_office from  #userid)
108

109

110

111
DECLARE @PayrollGroup VARCHAR (10)=''
112

113
SET @PayrollGroup = (select payroll_group from  #userid)
114

115

116

117
DECLARE @GradeMin VARCHAR (10)=''
118

119
SET @GradeMin = (select grade_min from  #userid)
120

121

122

123
DECLARE @GradeMax VARCHAR (10)=''
124

125
SET @GradeMax = (select grade_max from  #userid)
126

127

128

129
SELECT DISTINCT
130

131
                a.org_id_01 AS level1,
132

133
                a.org_name_01 AS level1_desc,
134

135
                md2.emp_id AS emp_id
136

137
				INTO #tbl_1
138

139
        FROM    dbo.GetOrgInOrgWide('00007696', @now, '100') AS a
140

141
                INNER JOIN dbo.hr_md_emp_md0002 AS md2 ON a.org_id = md2.organization
142

143
                                                          AND md2.start_date <= @now
144

145
                                                          AND md2.end_date >= @now  
146

147

148

149
SELECT DISTINCT
150

151
                a.org_id_01 AS level1,
152

153
                a.org_name_01 AS level1_desc,
154

155
                md2.emp_id AS emp_id
156

157
				INTO #tbl_2
158

159
        FROM    dbo.GetOrgInOrgWide('00005246', @now, '100') AS a
160

161
                INNER JOIN dbo.hr_md_emp_md0002 AS md2 ON a.org_id = md2.organization
162

163
                                                          AND md2.start_date <= @now
164

165
                                                          AND md2.end_date >= @now 
166

167
SELECT DISTINCT
168

169
                a.org_id_01 AS level1,
170

171
                a.org_name_01 AS level1_desc,
172

173
                md2.emp_id AS emp_id
174

175
				INTO #tbl_3
176

177
        FROM    dbo.GetOrgInOrgWide('00001174', @now, '100') AS a
178

179
                INNER JOIN dbo.hr_md_emp_md0002 AS md2 ON a.org_id = md2.organization
180

181
                                                          AND md2.start_date <= @now
182

183
                                                          AND md2.end_date >= @now 
184

185
SELECT DISTINCT
186

187
                a.org_id_01 AS level1,
188

189
                a.org_name_01 AS level1_desc,
190

191
                md2.emp_id AS emp_id
192

193
				INTO #tbl_4
194

195
        FROM    dbo.GetOrgInOrgWide('00006649', @now, '100') AS a
196

197
                INNER JOIN dbo.hr_md_emp_md0002 AS md2 ON a.org_id = md2.organization
198

199
                                                          AND md2.start_date <= @now
200

201
                                                          AND md2.end_date >= @now                                                   	 
202

203

204

205
-----------------------// Get Grade Maximum // -----------------------------
206

207
select distinct emp_id, max(grade) as grade into #grademax
208

209
from hr_md_emp_md0008 
210

211
group by emp_id
212

213
-----------------------// Position Character Replace // -----------------------------
214

215
set @Position=REPLACE( @Position,'&','and') 
216

217

218

219
--------------// Years od Service //-------------------------------
220

221
declare @table as table
222

223
(
224

225
number int,
226

227
_sequence int,
228

229
start_date varchar(max),
230

231
end_date varchar(max),
232

233
emp_id varchar(max),
234

235
position varchar(max),
236

237
organization varchar(max),
238

239
orggroup VARCHAR(max),
240

241
stdtorggroup VARCHAR(max)
242

243
)
244

245

246

247
insert into @table
248

249
select distinct
250

251
ROW_NUMBER()  OVER (ORDER BY (SELECT null)) as number,
252

253
ROW_NUMBER()  OVER (partition by md2.emp_id order by emp_id) as _sequence,
254

255
md2.start_date,md2.end_date,md2.emp_id,pos.description as position,md2.organization  
256

257
,oo.org_group ,md2.start_date AS stdtorggroup
258

259
FROM hr_md_emp_md0002 md2 
260

261
left join hr_md_orm_object pos on md2.position=pos.object  and pos.class='P'
262

263
LEFT JOIN hr_md_orm_o_o oo ON md2.organization = oo.object
264

265
where md2.position !=''  
266

267
order by number asc
268

269

270

271
select convert(varchar(max),'')as number,min(start_date)as start_date,max(end_date)as end_date,emp_id,position,convert(varchar(max),'')as organization  into #temp2  from @table group by  emp_id,position
272

273

274

275
--SELECT * from #temp2 where emp_id='12111686'
276

277

278

279
update #temp2 set
280

281
number=a.number,
282

283
organization =a.organization from (select number,organization,emp_id,end_date,position from @table )a where #temp2.emp_id+#temp2.end_date+#temp2.position = a.emp_id+a.end_date+a.position
284

285

286

287
--select * from #temp2 where emp_id='12111686'
288

289

290

291

292

293
DECLARE @CounterData INT =1 
294

295
WHILE ( @CounterData = ( select count(distinct emp_id) from @table ) )
296

297
BEGIN
298

299

300

301
    DECLARE @CounterDataeMP INT =(select CONVERT(INT, number) from @table WHERE _sequence=( select MAX(_sequence)AS_sequence from @table) ) 
302

303
    declare @LastPosition varchar(max) =(select position from @table WHERE _sequence=@CounterDataeMP)
304

305
    WHILE ( @CounterDataeMP > 0 )
306

307
        BEGIN
308

309
            declare @positions varchar(max) = ( select position from @table WHERE _sequence=@CounterDataeMP)
310

311
            if @positions !=@LastPosition
312

313
            begin
314

315
                    update #temp2 set
316

317
                    start_date = a.start_date
318

319
                    from( select * from @table WHERE _sequence=@CounterDataeMP+1    )a where #temp2.emp_id+#temp2.position = a.emp_id+a.position
320

321
            BREAK
322

323
            end
324

325
           SET @CounterDataeMP  = @CounterDataeMP - 1
326

327
        END
328

329
    SET @CounterData  = @CounterData  + 1
330

331
END
332

333

334

335
--select * from #temp2 where emp_id='12111686'
336

337

338

339
----//---- mutasi berdasarkan orggroup start
340

341
select convert(varchar(max),'')as number,min(start_date)as start_date,max(end_date)as end_date,emp_id,convert(varchar(max),'')as organization, orggroup into #temp3  from @table group by  emp_id,orggroup
342

343

344

345
--SELECT * from #temp3 where emp_id='12111686'
346

347

348

349
update #temp3 set
350

351
number=a.number,
352

353
organization =a.organization from (select number,organization,emp_id,end_date, orggroup from @table )a where #temp3.emp_id+#temp3.end_date+#temp3.orggroup = a.emp_id+a.end_date+a.orggroup
354

355

356

357
--select * from #temp3 where emp_id='12111686'
358

359

360

361
DECLARE @CounterData1 INT =1 
362

363
WHILE ( @CounterData1 = ( select count(distinct emp_id) from @table ) )
364

365
BEGIN
366

367

368

369
    DECLARE @CounterDataeMP1 INT =(select CONVERT(INT, number) from @table WHERE _sequence=( select MAX(_sequence)AS_sequence from @table) ) 
370

371
    declare @LastPosition1 varchar(max) =(select orggroup from @table WHERE _sequence=@CounterDataeMP1)
372

373
    WHILE ( @CounterDataeMP1 > 0 )
374

375
        BEGIN
376

377
            declare @positions1 varchar(max) = ( select orggroup from @table WHERE _sequence=@CounterDataeMP1)
378

379
            if @positions1 !=@LastPosition1
380

381
            begin
382

383
                    update #temp3 set
384

385
                    start_date = a.start_date
386

387
                    from( select * from @table WHERE _sequence=@CounterDataeMP+1    )a where #temp3.emp_id+#temp3.orggroup = a.emp_id+a.orggroup
388

389
            BREAK
390

391
            end
392

393
           SET @CounterDataeMP1  = @CounterDataeMP1 - 1
394

395
        END
396

397
    SET @CounterData1  = @CounterData1  + 1
398

399
END
400

401

402

403
--select * from #temp3 where emp_id='12111686'
404

405

406

407
----//----  mutasi berdasarkan orggroup end 
408

409

410

411
-------------------// Result //-------------------------------
412

413
select distinct md01.emp_id
414

415
,CAST(@EffectiveDate2 AS Date) AS DateParam
416

417
,md01.full_name
418

419
--,md02.employee_status
420

421
,CAST(md15.hiring_date AS DATE) AS EffectifeDate
422

423
,md02.position
424

425
,pos.description AS JobTitle
426

427
,org.description AS Organization
428

429
,oog.code AS OrgNum
430

431
--,oo.location as test
432

433
,oog.description AS OrgGroup
434

435
,md02.regional
436

437
,tbl_1.level1 AS Direktorat
438

439
,tbl_1.level1_desc AS DirektoratDesc
440

441
,regional.description AS Regional
442

443
,CAST(yos.start_date AS Date) AS MulaiPosisi
444

445
--,CONCAT(datediff(day, yos.start_date, @now)/365, ' Thn')AS Years				----// comment mutasi berdasarkan orggroup
446

447
--,CONCAT((datediff(day, yos.start_date, @now) % 365)/30, ' Bln') AS Months		----// comment mutasi berdasarkan orggroup
448

449
--,yos1.start_date AS stdtorg													----// test mutasi berdasarkan orggroup
450

451
,CONCAT(datediff(day, yos1.start_date, @now)/365, ' Thn')AS Years1
452

453
,CONCAT((datediff(day, yos1.start_date, @now) % 365)/30, ' Bln') AS Months1
454

455
from hr_md_emp_md0001 md01
456

457
--inner join hr_md_emp_md0039 md39 on md39.emp_id=md01.emp_id and md39.date_type='01'
458

459
inner join hr_md_emp_md0002 md02 on md01.emp_id=md02.emp_id and md02.payroll_group='01' and md02.start_date<=@EffectiveDate and md02.end_date>=@EffectiveDate
460

461
-- VALIDASI PAYROLL GROUP 02 -shofwan
462

463
left join hr_md_orm_object pos on md02.position=pos.object  and pos.class='P' and pos.end_date='99991231'
464

465
left join hr_md_orm_object org on md02.organization=org.object  and org.class='O' and org.end_date='99991231'
466

467
left join hr_md_orm_o_o oo on  org.object= oo.object AND oo.start_date <= @EffectiveDate  AND oo.end_date >= @EffectiveDate
468

469
left join base_cust_ref_emp_office as locs on oo.location=locs.emp_subarea
470

471
left join base_cust_ref_regional regional on md02.regional=regional.regional
472

473
left join #temp2 yos on yos.emp_id=md01.emp_id and yos.position=pos.description
474

475
left join #temp3 yos1 on yos1.emp_id=md01.emp_id and yos1.organization= md02.organization
476

477
left join base_cust_ref_org_level orglvl on orglvl.code=oo.org_level
478

479
left join hr_md_emp_md0002 directorat on directorat.emp_id=md01.emp_id and directorat.end_date='99991231'
480

481
left join hr_md_orm_relationship relation on directorat.organization=relation.object  and relation.end_date='99991231' and relation.class='O' and relation.rel_dir='B' and relation.rel_class='O'
482

483
left join hr_md_orm_o_o relation2 on relation.rel_object=relation2.object
484

485
left join hr_md_orm_relationship relation3 on relation2.object=relation3.object  and relation3.end_date='99991231' and relation3.class='O' and relation3.rel_dir='B' and relation3.rel_class='O'
486

487
left join hr_md_orm_object relation4 on relation3.rel_object=relation4.object and relation4.class='O'
488

489
left join hr_md_orm_o_o relation5 on relation3.rel_object=relation5.object 
490

491
LEFT JOIN base_cust_ref_OrgGroup oog on oo.org_group=oog.code
492

493
left join hr_md_emp_md0015 md15 on md01.emp_id=md15.emp_id
494

495
left join #grademax grade_max  on md01.emp_id=grade_max.emp_id
496

497
left join (select * from #tbl_1
498

499
	union all
500

501
	select * from #tbl_2
502

503
	union all
504

505
	select * from #tbl_3
506

507
	union all
508

509
	select * from #tbl_4) tbl_1 on md01.emp_id=tbl_1.emp_id
510

511
where (pos.description =@Position or (SUBSTRING(pos.description,0,CHARINDEX('&',pos.description,0)) = SUBSTRING(@Position, 0, charindex('and', @Position, 0))and SUBSTRING(@Position,CHARINDEX('and',@Position)+4,LEN(@Position))=SUBSTRING(pos.description,CHARINDEX('&',pos.description)+2,LEN(pos.description)))
512

513
or md02.position in 
514

515
(
516

517
    Select RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
518

519
    From (Select x = Cast('<x>'+ Replace(@Position,',','bb  </x><x>')+'</x>' as xml).query('.')) as A 
520

521
    Cross Apply x.nodes('x') AS B(i)
522

523
) or pos.description in
524

525
(
526

527
	Select RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
528

529
    From (Select x = Cast('<x>'+ Replace(@Position,',','</x><x>')+'</x>' as xml).query('.')) as A 
530

531
    Cross Apply x.nodes('x') AS B(i)
532

533
)
534

535
 or @Position=''
536

537
)
538

539
and 
540

541
((datediff(day, yos.start_date, @now)/365>=@YearsFrom or @YearsFrom='')and((datediff(day, yos.start_date, @now) % 365)/30>=@MonthFrom or @MonthFrom=''))
542

543
and
544

545
((datediff(day, yos.start_date, @now)/365<=@YearsTo or @YearsTo='')and((datediff(day, yos.start_date, @now) % 365)/30<=@MonthTo or @MonthTo=''))
546

547
--and
548

549
--(md01.external_id like '________' or md01.external_id like '_________')
550

551
and
552

553
(md02.employee_status='01')
554

555
and
556

557
(md02.company_id=@CompanyID or @CompanyID='*')
558

559
and
560

561
(md02.employee_type=@EmployeeType or @EmployeeType='*')
562

563
and
564

565
(md02.employee_subtype=@EmployeeSubType or @EmployeeSubType='*')
566

567
and
568

569
(md02.regional=@Regional or @Regional='*')
570

571
and
572

573
(md02.employee_area=@Employee_Area or @Employee_Area='*')
574

575
and
576

577
(md02.employee_office=@EmployeeOffice or @EmployeeOffice='*')
578

579
and
580

581
(md02.payroll_group=@PayrollGroup or @PayrollGroup='*')
582

583
and
584

585
(grade_max.grade>=@GradeMin or @GradeMin='*')
586

587
and
588

589
(grade_max.grade<=@GradeMax or @GradeMax='*')
590

591
and
592

593
(md01.end_date='99991231')
594

595
--and
596

597
--(md01.emp_id='00101571')
598

599
--VALIDASI EXTERNAL ID
600

601

602

603
drop table #temp2
604

605
drop table #temp3
606

607
drop table #userid
608

609
drop table #grademax
610

611

612

613
drop table #tbl_1
614

615
drop table #tbl_2
616

617
drop table #tbl_3
618

619
drop table #tbl_4
(4-4/6)