diff --git a/src/module/pendaftaran_sidsem/entity/pendaftaran_sidsem.go b/src/module/pendaftaran_sidsem/entity/pendaftaran_sidsem.go
index edbf4fe4cb099065e4245f8eab8d04ec0381ab6f..b5d63ab9358854f1f1fc15eca0584e5093a3ba48 100644
--- a/src/module/pendaftaran_sidsem/entity/pendaftaran_sidsem.go
+++ b/src/module/pendaftaran_sidsem/entity/pendaftaran_sidsem.go
@@ -150,6 +150,11 @@ type UpdateJadwalReq struct {
 	IdSidSem   string `json:"id_sidsem"`
 }
 
+type UpdateDosenReq struct {
+	Dosujis  []Dosuji `json:"dosen_uji"`
+	IdSidSem string   `json:"id_sidsem"`
+}
+
 type Placeholders struct {
 	Nama         string `json:"nama"`
 	Nim          string `json:"nim"`
@@ -229,3 +234,14 @@ type Ruangan struct {
 	ID   string `json:"id"`
 	Nama string `json:"nama"`
 }
+
+type Dosuji struct {
+	ID   string `json:"id"`
+	Nama string `json:"nama"`
+}
+
+type PengujiSidsem struct {
+	ID       string `json:"id"`
+	SidsemID string `json:"sidsem_id"`
+	DosenID  string `json:"dosen_id"`
+}
diff --git a/src/module/pendaftaran_sidsem/internal/repository/pendaftaran_sidsem.go b/src/module/pendaftaran_sidsem/internal/repository/pendaftaran_sidsem.go
index d8aa92956d95c3d08fac610c691fcd5b532241ee..a1462a2303456676ed08a5b37dcc822adf56e797 100644
--- a/src/module/pendaftaran_sidsem/internal/repository/pendaftaran_sidsem.go
+++ b/src/module/pendaftaran_sidsem/internal/repository/pendaftaran_sidsem.go
@@ -653,3 +653,42 @@ func (repo *PendaftaranSidSemRepo) UpdateJadwalSidsem(waktuMulai string, waktuSe
 	}
 	return nil
 }
+
+func (repo *PendaftaranSidSemRepo) DeleteDosujiSidsem(dosUjis []entity.Dosuji, idSidsem string) error {
+	// Delete dulu
+	var ids []string
+	for _, dosUji := range dosUjis {
+		ids = append(ids, dosUji.ID)
+	}
+	if err := repo.DBWrite.Table("penguji_sidsem").Where("sidsem_id = ? AND dosen_id NOT IN ?", idSidsem, ids).Delete(&entity.PengujiSidsem{}).Error; err != nil {
+		return err
+	}
+	return nil
+}
+
+func (repo *PendaftaranSidSemRepo) UpdateDosujiSidsem(dosUjis []entity.PengujiSidsem, idSidsem string) error {
+	if err := repo.DBWrite.Table("penguji_sidsem").Create(&dosUjis).Error; err != nil {
+		return err
+	}
+	return nil
+}
+
+func (repo *PendaftaranSidSemRepo) GetDosujiByIdSidSem(idSidsem string) ([]entity.PengujiSidsem, error) {
+	var dosUjis []entity.PengujiSidsem
+	if err := repo.DBRead.Table("penguji_sidsem").Where("sidsem_id = ?", idSidsem).Find(&dosUjis).Error; err != nil {
+		return []entity.PengujiSidsem{}, err
+	}
+	return dosUjis, nil
+}
+
+func (repo *PendaftaranSidSemRepo) GetDosuji(idSidsem string) ([]entity.Dosuji, error) {
+	var dosUjis []entity.Dosuji
+	err := repo.DBRead.Table("pengguna").
+		Select("pengguna.id, pengguna.nama").
+		Where("? = ANY(pengguna.roles) AND pengguna.id NOT IN (SELECT p.id FROM pengguna p JOIN penguji_sidsem ps ON p.id = ps.dosen_id WHERE ps.sidsem_id = ?)", "S1_PENGUJI", idSidsem).
+		Scan(&dosUjis).Error
+	if err != nil {
+		return nil, err
+	}
+	return dosUjis, nil
+}
diff --git a/src/module/pendaftaran_sidsem/internal/usecase/pendaftaran_sidsem.go b/src/module/pendaftaran_sidsem/internal/usecase/pendaftaran_sidsem.go
index d145269acf95aee163d02bf4af02cc3a5072d7e8..5cbeb7efc35cf0442574042675af0139dfde8625 100644
--- a/src/module/pendaftaran_sidsem/internal/usecase/pendaftaran_sidsem.go
+++ b/src/module/pendaftaran_sidsem/internal/usecase/pendaftaran_sidsem.go
@@ -27,6 +27,8 @@ type PendaftaranSidSemUsecase interface {
 	GetSidSemDetailTA(IdSidSem string) (entity.DetailSidSemTA, error)
 	UpdateRuanganSidSem(namaRuangan string, idPendaftaranSidSem string) error
 	UpdateJadwalSidsem(waktuMulai string, idPendaftaranSidSem string) error
+	GetDosuji(idPendaftaranSidSem string) ([]entity.Dosuji, error)
+	UpdateDosujiSidsem(dosUjis []entity.Dosuji, idPendaftaranSidSem string) error
 }
 
 type PendaftaranSidSemUc struct {
@@ -290,3 +292,50 @@ func (uc *PendaftaranSidSemUc) UpdateJadwalSidsem(waktuMulai string, idPendaftar
 
 	return nil
 }
+
+func (uc *PendaftaranSidSemUc) GetDosuji(idPendaftaranSidSem string) ([]entity.Dosuji, error) {
+	dosUjis, err := uc.pendaftaransidsemrepo.GetDosuji(idPendaftaranSidSem)
+	if err != nil {
+		return []entity.Dosuji{}, err
+	}
+
+	return dosUjis, nil
+}
+
+func (uc *PendaftaranSidSemUc) UpdateDosujiSidsem(dosUjis []entity.Dosuji, idPendaftaranSidSem string) error {
+	err := uc.pendaftaransidsemrepo.DeleteDosujiSidsem(dosUjis, idPendaftaranSidSem)
+	if err != nil {
+		return err
+	}
+
+	assignedDosUjis, err := uc.pendaftaransidsemrepo.GetDosujiByIdSidSem(idPendaftaranSidSem)
+	if err != nil {
+		return err
+	}
+
+	var filteredDosUjis []entity.PengujiSidsem
+	for _, dosUji := range dosUjis {
+		found := false
+		for _, assignedDosUji := range assignedDosUjis {
+			if dosUji.ID == assignedDosUji.DosenID {
+				found = true
+				break
+			}
+		}
+		if !found {
+			pengujiSidsem := entity.PengujiSidsem{
+				ID:       uuid.New().String(),
+				SidsemID: idPendaftaranSidSem,
+				DosenID:  dosUji.ID,
+			}
+			filteredDosUjis = append(filteredDosUjis, pengujiSidsem)
+		}
+	}
+	if len(filteredDosUjis) > 0 {
+		err = uc.pendaftaransidsemrepo.UpdateDosujiSidsem(filteredDosUjis, idPendaftaranSidSem)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
diff --git a/src/module/pendaftaran_sidsem/internal/usecase/repository.go b/src/module/pendaftaran_sidsem/internal/usecase/repository.go
index 4117854e0c6c097cc5d99a1bd075fb69d3229a0d..e0e6d574637a9f67a731cddd09a8abd0b3eb9383 100644
--- a/src/module/pendaftaran_sidsem/internal/usecase/repository.go
+++ b/src/module/pendaftaran_sidsem/internal/usecase/repository.go
@@ -32,4 +32,8 @@ type PendaftaranSidSemRepository interface {
 	AddRuanganIfNotExist(namaRuangan string) (string, error)
 	UpdateRuanganSidSem(idSidsem string, idRuangan string) error
 	UpdateJadwalSidsem(waktuMulai string, waktuAkhir string, idSidsem string) error
+	GetDosuji(idSidsem string) ([]entity.Dosuji, error)
+	DeleteDosujiSidsem(dosUjis []entity.Dosuji, idSidsem string) error
+	GetDosujiByIdSidSem(idSidsem string) ([]entity.PengujiSidsem, error)
+	UpdateDosujiSidsem(dosUjis []entity.PengujiSidsem, idSidsem string) error
 }
diff --git a/src/module/pendaftaran_sidsem/transport/timta_handler.go b/src/module/pendaftaran_sidsem/transport/timta_handler.go
index f0510b25a049d4ce6f78628be3553ea219c5ff90..11e3dd85658571fc2640ba3fe39c1657ba602246 100644
--- a/src/module/pendaftaran_sidsem/transport/timta_handler.go
+++ b/src/module/pendaftaran_sidsem/transport/timta_handler.go
@@ -32,6 +32,8 @@ func (t *TIMTAPendaftaranSidSemHandler) MountTIMTA(group *echo.Group) {
 	group.PATCH("/pendaftaran-ditolak", t.EditDitolak)
 	group.PATCH("/update-ruangan-sidsem", t.UpdateRuanganSidSem)
 	group.PATCH("/update-jadwal-sidsem", t.UpdateJadwalSidsem)
+	group.PATCH("/update-dosuji-sidsem", t.UpdateDosujiSidsem)
+	group.GET("/get-dosuji", t.GetDosuji)
 
 }
 
@@ -103,3 +105,26 @@ func (t *TIMTAPendaftaranSidSemHandler) UpdateJadwalSidsem(c echo.Context) error
 
 	return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "Jadwal successfully updated", nil))
 }
+
+func (t *TIMTAPendaftaranSidSemHandler) GetDosuji(c echo.Context) error {
+	idSidsem := c.QueryParam("id")
+	dosUjis, err := t.pendaftaransidsemUsecase.GetDosuji(idSidsem)
+	if err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+
+	return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "Dosujis successfully retrieved", dosUjis))
+}
+
+func (t *TIMTAPendaftaranSidSemHandler) UpdateDosujiSidsem(c echo.Context) error {
+	request := new(entity.UpdateDosenReq)
+	if err := c.Bind(&request); err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+	err := t.pendaftaransidsemUsecase.UpdateDosujiSidsem(request.Dosujis, request.IdSidSem)
+	if err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+
+	return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "Dosujis successfully updated", err))
+}