feat: include tariff period in package detail
This commit is contained in:
@@ -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"`,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user