feat: include tariff period in package detail

This commit is contained in:
2026-08-22 11:46:43 +07:00
parent d183e321e8
commit 412e926a65
2 changed files with 56 additions and 33 deletions

View File

@@ -92,12 +92,17 @@ func TestListPaketValidationParity(t *testing.T) {
} }
func TestGetPaketResponseAndNotFoundParity(t *testing.T) { func TestGetPaketResponseAndNotFoundParity(t *testing.T) {
keteranganPeriode := "Tarif Dasar 2026"
detail := &repository.PaketDetail{ detail := &repository.PaketDetail{
PaketID: "DISP-260800002", Nama: "Test paket", JenisPaket: "DIA", PaketID: "DISP-260800002", Nama: "Test paket", JenisPaket: "DIA",
RI: 1, TglDari: "2026-08-06", TglSampai: "2026-08-31", KelasID: "KelasII", RI: 1, TglDari: "2026-08-06", TglSampai: "2026-08-31", KelasID: "KelasII",
JumlahHari: 1, TotalHarga: "1550913.00", StatusID: 2, LoginBuat: "API_CRM", JumlahHari: 1, TotalHarga: "1550913.00", StatusID: 2, LoginBuat: "API_CRM",
TanggalBuat: "2026-08-05T10:05:03.000000Z", LoginEdit: "API_CRM", TanggalBuat: "2026-08-05T10:05:03.000000Z", LoginEdit: "API_CRM",
TanggalEdit: "2026-08-19T06:05:20.000000Z", NA: "N", 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"}}, Layanan: []repository.PaketLayanan{{HargaDasar: "100,000"}},
Operasi: []repository.PaketOperasi{{HargaDasar: "250,000.00"}}, Operasi: []repository.PaketOperasi{{HargaDasar: "250,000.00"}},
Item: []repository.PaketItem{{HargaDasar: "50,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()) t.Fatalf("status=%d id=%q body=%s", recorder.Code, repo.detailID, recorder.Body.String())
} }
for _, expected := range []string{ for _, expected := range []string{
`"PeriodeTarif":{"PeriodeTarifID":42,"Keterangan":"Tarif Dasar 2026","TanggalBerlaku":"2026-01-01","TanggalBerakhir":"2026-12-31"}`,
`"HargaDasar":"100,000"`, `"HargaDasar":"100,000"`,
`"HargaDasar":"250,000.00"`, `"HargaDasar":"250,000.00"`,
`"HargaDasar":"50,000.00"`, `"HargaDasar":"50,000.00"`,

View File

@@ -50,29 +50,37 @@ type PaketSummary struct {
} }
type PaketDetail struct { type PaketDetail struct {
PaketID string `json:"PaketID"` PaketID string `json:"PaketID"`
Nama string `json:"Nama"` Nama string `json:"Nama"`
JenisPaket string `json:"JenisPaket"` JenisPaket string `json:"JenisPaket"`
RJ int `json:"RJ"` RJ int `json:"RJ"`
RI int `json:"RI"` RI int `json:"RI"`
TglDari string `json:"TglDari"` TglDari string `json:"TglDari"`
TglSampai string `json:"TglSampai"` TglSampai string `json:"TglSampai"`
MultiVisit int `json:"MultiVisit"` MultiVisit int `json:"MultiVisit"`
HeaderPaket string `json:"HeaderPaket"` HeaderPaket string `json:"HeaderPaket"`
KelasID string `json:"KelasID"` KelasID string `json:"KelasID"`
JumlahHari int `json:"JumlahHari"` JumlahHari int `json:"JumlahHari"`
TotalHarga string `json:"TotalHarga"` TotalHarga string `json:"TotalHarga"`
Keterangan string `json:"Keterangan"` Keterangan string `json:"Keterangan"`
StatusID int `json:"StatusID"` StatusID int `json:"StatusID"`
LoginBuat string `json:"LoginBuat"` LoginBuat string `json:"LoginBuat"`
TanggalBuat string `json:"TanggalBuat"` TanggalBuat string `json:"TanggalBuat"`
LoginEdit string `json:"LoginEdit"` LoginEdit string `json:"LoginEdit"`
TanggalEdit string `json:"TanggalEdit"` TanggalEdit string `json:"TanggalEdit"`
NA string `json:"NA"` NA string `json:"NA"`
Layanan []PaketLayanan `json:"layanan"` PeriodeTarif *PaketPeriodeTarif `json:"PeriodeTarif"`
Operasi []PaketOperasi `json:"operasi"` Layanan []PaketLayanan `json:"layanan"`
Item []PaketItem `json:"item"` Operasi []PaketOperasi `json:"operasi"`
Kamar []PaketKamar `json:"kamar"` 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 { type PaketLayanan struct {
@@ -243,10 +251,11 @@ func (r MySQLLayananRepository) GetPaket(ctx context.Context, id string) (*Paket
result.TanggalBuat = laravelDateJSON(tanggalBuat) result.TanggalBuat = laravelDateJSON(tanggalBuat)
result.TanggalEdit = laravelDateJSON(tanggalEdit) result.TanggalEdit = laravelDateJSON(tanggalEdit)
tariffTable, err := r.activePaketTariffTable(ctx) periodeTarif, tariffTable, err := r.activePaketTariff(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
result.PeriodeTarif = periodeTarif
pricing := newPaketBasePricing() pricing := newPaketBasePricing()
if result.Layanan, err = r.paketLayanan(ctx, id, result.KelasID, tariffTable, pricing); err != nil { if result.Layanan, err = r.paketLayanan(ctx, id, result.KelasID, tariffTable, pricing); err != nil {
return nil, err return nil, err
@@ -275,29 +284,37 @@ func newPaketBasePricing() *paketBasePricing {
} }
} }
func (r MySQLLayananRepository) activePaketTariffTable(ctx context.Context) (string, error) { func (r MySQLLayananRepository) activePaketTariff(ctx context.Context) (*PaketPeriodeTarif, string, error) {
var periodID int64 var period PaketPeriodeTarif
var keterangan sql.NullString
err := r.db.QueryRowContext(ctx, ` err := r.db.QueryRowContext(ctx, `
SELECT PeriodeTarifID SELECT PeriodeTarifID, Keterangan,
CAST(TanggalBerlaku AS CHAR), CAST(TanggalBerakhir AS CHAR)
FROM periode_tarif FROM periode_tarif
WHERE DATE(TanggalBerlaku) <= CURRENT_DATE() WHERE DATE(TanggalBerlaku) <= CURRENT_DATE()
AND DATE(TanggalBerakhir) >= CURRENT_DATE() AND DATE(TanggalBerakhir) >= CURRENT_DATE()
AND NA = 'N' AND NA = 'N'
ORDER BY PeriodeTarifID DESC ORDER BY PeriodeTarifID DESC
LIMIT 1`).Scan(&periodID) LIMIT 1`).Scan(
&period.PeriodeTarifID,
&keterangan,
&period.TanggalBerlaku,
&period.TanggalBerakhir,
)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return "", nil return nil, "", nil
} }
if err != 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) exists, err := r.tableExists(ctx, tableName)
if err != nil || !exists { if err != nil || !exists {
return "", err return &period, "", err
} }
return tableName, nil return &period, tableName, nil
} }
func (r MySQLLayananRepository) paketLayanan( func (r MySQLLayananRepository) paketLayanan(