create view komponen_gaji_v as 
// Gaji Pokok
select
	gj.id ID,
	p.nip_pns NIP,
	p.objectdetailkategorypegawaifk KategoriPegawai,
	p.namalengkap NamaLengkap,
	gp.golonganpegawai Golongan,
	pdk.Pendidikan Pendidikan,
	date_part('year',
	now()) - date_part('year',
	p.tglmasuk) MasaKerja,
	kh.id IdKomponenGaji,
	kh.komponenharga KomponenGaji,
	gjmkp.hargasatuan Harga
from
	pegawaiskgaji_m gj
left join pegawai_m p on
	gj.objectpegawaifk = p.id
left join golonganpegawai_m gp on
	p.ObjectGolonganPegawaiFk = gp.id
left join pendidikan_m pdk on
	p.objectpendidikanterakhirfk = pdk.id
left join komponenharga_m kh on
	gj.objectkomponenhargafk = kh.id
left join pegawaistrukturgajibymakape_m gjmkp on
	gjmkp.kdkomponenhargafk = gj.objectkomponenhargafk
where
	kh.komponenharga = 'Gaji Pokok'
	and gjmkp.kdpendidikanfk = p.objectpendidikanterakhirfk
	and gjmkp.kddetailkategorypegawaifk = p.objectdetailkategorypegawaifk // kategori pegawai (sample data invalid->returned row 0)
	and gjmkp.kdrangemasakerjafk =(
	select
		r.id
	from
		range_m r
	where
		r.namarange = 'Range Masa Kerja'
		and date_part('year',
		now()) - date_part('year',
		p.tglmasuk) between r.rangemin and r.rangemax)
union

// Tunjangan Fungsional
select
	distinct(gj.id) ID,
	p.nip_pns NIP,
	p.objectdetailkategorypegawaifk KategoriPegawai,
	p.namalengkap NamaLengkap,
	gp.golonganpegawai Golongan,
	pdk.Pendidikan Pedidikan,
	date_part('year',
	now()) - date_part('year',
	p.tglmasuk) MasaKerja,
	kh.id IdKomponenGaji,
	kh.komponenharga KomponenGaji,
	gjjp.hargasatuan Harga
from
	pegawaiskgaji_m as gj
left join pegawai_m p on
	gj.objectpegawaifk = p.id
left join golonganpegawai_m gp on
	p.ObjectGolonganFk = gp.id
left join pendidikan_m pdk on
	p.objectpendidikanterakhirfk = pdk.id
left join komponenharga_m kh on
	gj.objectkomponenhargafk = kh.id
left join pegawaistrukturgajibyjape_m gjjp on
	gjjp.kdkomponenhargafk = gj.objectkomponenhargafk
where
	kh.komponenharga = 'Tunjangan Fungsional'
	and gjjp.kdpendidikan = p.objectpendidikanterakhirfk
	and gjjp.kdjabatanfk = p.objectjabatanfungsionalfk
union

// Tunjangan Bahaya Radiasi
select
	distinct(gj.id) ID,
	p.nip_pns NIP,
	p.objectdetailkategorypegawaifk KategoriPegawai,
	p.namalengkap,
	gp.golonganpegawai Golongan,
	pdk.Pendidikan,
	date_part('year',
	now()) - date_part('year',
	p.tglmasuk) MasaKerja,
	kh.id IdKomponenGaji,
	kh.komponenharga KomponenGaji,
	gjlj.hargasatuan as Harga
from
	pegawaiskgaji_m gj
left join pegawai_m p on
	gj.objectpegawaifk = p.id
left join golonganpegawai_m gp on
	p.ObjectGolonganFk = gp.id
left join pendidikan_m pdk on
	p.objectpendidikanterakhirfk = pdk.id
left join komponenharga_m kh on
	gj.objectkomponenhargafk = kh.id
left join pegawaistrukturgajibyltja_m gjlj on
	gjlj.kdkomponenhargafk = gj.objectkomponenhargafk
where
	kh.komponenharga = 'Tunjangan Bahaya Radiasi'
	and gjlj.kdjabatanfk = p.objectjabatanInternalfk
	and gjlj.kdleveltingkatfk = p.leveltingkatfk;

// Gaji kotor
create view komponen_gaji_bruto_v as
select
	vg.id,
	vg.nip,
	vg.kategoripegawai,
	vg.namalengkap,
	vg.golongan,
	vg.pendidikan,
	vg.masakerja,
	kh.id IdKomponenGaji,
	kh.komponenharga KomponenGaji,
	(
	select
		sum(vbs.harga)
	from
		komponen_gaji_v vbs
	where
		vg.nip = vbs.nip
	group by
		vbs.nip) harga
from
	komponen_gaji_v vg,
	komponenharga_m kh
where
	kh.id = 78;

// Pajak
create view komponen_pajak_v as
select
	p.id ID,
	p.nip_pns NIP,
	p.objectdetailkategorypegawaifk KategoriPegawai,
	p.namalengkap NamaLengkap,
	gp.golonganpegawai Golongan,
	pdk.Pendidikan,
	date_part('year',
	now()) - date_part('year',
	p.tglmasuk) MasaKerja,
	62 IdKomponenGaji,
	'Persen Pajak' KomponenGaji,
	pj.persenpajak Harga
from
	pegawaiskpajak_m pj
left join pegawai_m p on
	pj.objectgolonganpegawaifk = p.objectgolonganpegawaifk
left join golonganpegawai_m gp on
	p.objectgolonganpegawaifk = gp.id
left join pendidikan_m pdk on
	p.objectpendidikanterakhirfk = pdk.id
left join komponenharga_m kh on
	pj.objectobjekpajakfk = kh.id;

// Tunjangan pajak
create view komponen_tunjangan_pajak_v as
select
	g.id,
	g.nip,
	g.kategoripegawai,
	g.namalengkap,
	g.golongan,
	g.pendidikan,
	g.masakerja,
	62 IdKomponenGaji,
	'Tunjangan Pajak' KomponenGaji,
	(
	select
		vp.harga / 100 * gb.harga
	from
		komponen_pajak_v vp,
		komponen_gaji_bruto_v gb
	where
		vp.nip = gb.nip
		and g.nip = vp.nip) as harga
from
	komponen_gaji_v g;

// Potongan pajak
create view komponen_potongan_pajak_v as
select
	g.id,
	g.nip,
	g.kategoripegawai,
	g.namalengkap,
	g.golongan,
	g.pendidikan,
	g.masakerja,
	66 IdKomponenGaji,
	'Potongan Pajak' KomponenGaji,
	(
	select
		vp.harga / 100 * gb.harga
	from
		komponen_pajak_v vp,
		komponen_gaji_bruto_v gb
	where
		vp.nip = gb.nip
		and g.nip = vp.nip) as harga
from
	komponen_gaji_v g;

// gaji bersih
create view komponen_gaji_bersih_v as
select
	g.id,
	g.nip,
	g.kategoripegawai,
	g.namalengkap,
	g.golongan,
	g.pendidikan,
	g.masakerja,
	0 IdKomponenGaji,
	'Gaji Bersih' KomponenGaji,
	gb.harga - vpp.harga harga
from
	komponen_gaji_v g,
	komponen_gaji_bruto_v gb,
	komponen_potongan_pajak_v vpp
where
	g.nip = gb.nip
	and gb.nip = vpp.nip;

create view summary_gaji_v as
select
	*
from
	komponen_gaji_v
union
select
	*
from
	komponen_gaji_bruto_v
union
select
	*
from
	komponen_tunjangan_pajak_v
union
select
	*
from
	komponen_potongan_pajak_v
union
select
	*
from
	komponen_gaji_bersih_v;