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)) +}