diff --git a/internal/http/paket_test.go b/internal/http/paket_test.go index 22ba10e..afabba5 100644 --- a/internal/http/paket_test.go +++ b/internal/http/paket_test.go @@ -92,12 +92,17 @@ func TestListPaketValidationParity(t *testing.T) { } func TestGetPaketResponseAndNotFoundParity(t *testing.T) { + keteranganPeriode := "Tarif Dasar 2026" detail := &repository.PaketDetail{ PaketID: "DISP-260800002", Nama: "Test paket", JenisPaket: "DIA", RI: 1, TglDari: "2026-08-06", TglSampai: "2026-08-31", KelasID: "KelasII", JumlahHari: 1, TotalHarga: "1550913.00", StatusID: 2, LoginBuat: "API_CRM", TanggalBuat: "2026-08-05T10:05:03.000000Z", LoginEdit: "API_CRM", TanggalEdit: "2026-08-19T06:05:20.000000Z", NA: "N", + PeriodeTarif: &repository.PaketPeriodeTarif{ + PeriodeTarifID: 42, Keterangan: &keteranganPeriode, + TanggalBerlaku: "2026-01-01", TanggalBerakhir: "2026-12-31", + }, Layanan: []repository.PaketLayanan{{HargaDasar: "100,000"}}, Operasi: []repository.PaketOperasi{{HargaDasar: "250,000.00"}}, Item: []repository.PaketItem{{HargaDasar: "50,000.00"}}, @@ -113,6 +118,7 @@ func TestGetPaketResponseAndNotFoundParity(t *testing.T) { t.Fatalf("status=%d id=%q body=%s", recorder.Code, repo.detailID, recorder.Body.String()) } for _, expected := range []string{ + `"PeriodeTarif":{"PeriodeTarifID":42,"Keterangan":"Tarif Dasar 2026","TanggalBerlaku":"2026-01-01","TanggalBerakhir":"2026-12-31"}`, `"HargaDasar":"100,000"`, `"HargaDasar":"250,000.00"`, `"HargaDasar":"50,000.00"`, diff --git a/internal/repository/paket.go b/internal/repository/paket.go index 29caf24..6db1ab0 100644 --- a/internal/repository/paket.go +++ b/internal/repository/paket.go @@ -50,29 +50,37 @@ type PaketSummary struct { } type PaketDetail struct { - PaketID string `json:"PaketID"` - Nama string `json:"Nama"` - JenisPaket string `json:"JenisPaket"` - RJ int `json:"RJ"` - RI int `json:"RI"` - TglDari string `json:"TglDari"` - TglSampai string `json:"TglSampai"` - MultiVisit int `json:"MultiVisit"` - HeaderPaket string `json:"HeaderPaket"` - KelasID string `json:"KelasID"` - JumlahHari int `json:"JumlahHari"` - TotalHarga string `json:"TotalHarga"` - Keterangan string `json:"Keterangan"` - StatusID int `json:"StatusID"` - LoginBuat string `json:"LoginBuat"` - TanggalBuat string `json:"TanggalBuat"` - LoginEdit string `json:"LoginEdit"` - TanggalEdit string `json:"TanggalEdit"` - NA string `json:"NA"` - Layanan []PaketLayanan `json:"layanan"` - Operasi []PaketOperasi `json:"operasi"` - Item []PaketItem `json:"item"` - Kamar []PaketKamar `json:"kamar"` + PaketID string `json:"PaketID"` + Nama string `json:"Nama"` + JenisPaket string `json:"JenisPaket"` + RJ int `json:"RJ"` + RI int `json:"RI"` + TglDari string `json:"TglDari"` + TglSampai string `json:"TglSampai"` + MultiVisit int `json:"MultiVisit"` + HeaderPaket string `json:"HeaderPaket"` + KelasID string `json:"KelasID"` + JumlahHari int `json:"JumlahHari"` + TotalHarga string `json:"TotalHarga"` + Keterangan string `json:"Keterangan"` + StatusID int `json:"StatusID"` + LoginBuat string `json:"LoginBuat"` + TanggalBuat string `json:"TanggalBuat"` + LoginEdit string `json:"LoginEdit"` + TanggalEdit string `json:"TanggalEdit"` + NA string `json:"NA"` + PeriodeTarif *PaketPeriodeTarif `json:"PeriodeTarif"` + Layanan []PaketLayanan `json:"layanan"` + Operasi []PaketOperasi `json:"operasi"` + Item []PaketItem `json:"item"` + Kamar []PaketKamar `json:"kamar"` +} + +type PaketPeriodeTarif struct { + PeriodeTarifID int64 `json:"PeriodeTarifID"` + Keterangan *string `json:"Keterangan"` + TanggalBerlaku string `json:"TanggalBerlaku"` + TanggalBerakhir string `json:"TanggalBerakhir"` } type PaketLayanan struct { @@ -243,10 +251,11 @@ func (r MySQLLayananRepository) GetPaket(ctx context.Context, id string) (*Paket result.TanggalBuat = laravelDateJSON(tanggalBuat) result.TanggalEdit = laravelDateJSON(tanggalEdit) - tariffTable, err := r.activePaketTariffTable(ctx) + periodeTarif, tariffTable, err := r.activePaketTariff(ctx) if err != nil { return nil, err } + result.PeriodeTarif = periodeTarif pricing := newPaketBasePricing() if result.Layanan, err = r.paketLayanan(ctx, id, result.KelasID, tariffTable, pricing); err != nil { return nil, err @@ -275,29 +284,37 @@ func newPaketBasePricing() *paketBasePricing { } } -func (r MySQLLayananRepository) activePaketTariffTable(ctx context.Context) (string, error) { - var periodID int64 +func (r MySQLLayananRepository) activePaketTariff(ctx context.Context) (*PaketPeriodeTarif, string, error) { + var period PaketPeriodeTarif + var keterangan sql.NullString err := r.db.QueryRowContext(ctx, ` - SELECT PeriodeTarifID + SELECT PeriodeTarifID, Keterangan, + CAST(TanggalBerlaku AS CHAR), CAST(TanggalBerakhir AS CHAR) FROM periode_tarif WHERE DATE(TanggalBerlaku) <= CURRENT_DATE() AND DATE(TanggalBerakhir) >= CURRENT_DATE() AND NA = 'N' ORDER BY PeriodeTarifID DESC - LIMIT 1`).Scan(&periodID) + LIMIT 1`).Scan( + &period.PeriodeTarifID, + &keterangan, + &period.TanggalBerlaku, + &period.TanggalBerakhir, + ) if err == sql.ErrNoRows { - return "", nil + return nil, "", nil } if err != nil { - return "", err + return nil, "", err } + period.Keterangan = nullStringPtr(keterangan) - tableName := "harga_layanan_" + strconv.FormatInt(periodID, 10) + tableName := "harga_layanan_" + strconv.FormatInt(period.PeriodeTarifID, 10) exists, err := r.tableExists(ctx, tableName) if err != nil || !exists { - return "", err + return &period, "", err } - return tableName, nil + return &period, tableName, nil } func (r MySQLLayananRepository) paketLayanan(