From a6af3d5f3f7807dc774e30d14f87f0e8312115f8 Mon Sep 17 00:00:00 2001 From: AnggerRevo5 Date: Mon, 13 Apr 2026 23:00:14 +0700 Subject: [PATCH] revisi back date dan dpjp login --- backendcareit_v4/models/models.go | 1 + backendcareit_v4/services/billing_pasien.go | 26 ++++++++++++++++++- .../services/riwayat_billing_pasien.go | 7 +++-- .../src/app/component/billing-pasien.tsx | 14 +++++----- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/backendcareit_v4/models/models.go b/backendcareit_v4/models/models.go index fe13be4..1b28ff5 100644 --- a/backendcareit_v4/models/models.go +++ b/backendcareit_v4/models/models.go @@ -228,6 +228,7 @@ type BillingRequest struct { Ruangan string `json:"ruangan" binding:"required"` Kelas string `json:"kelas" binding:"required"` Tindakan_RS []string `json:"tindakan_rs" binding:"required"` + Tanggal_Masuk string `json:"tanggal_masuk"` // ← Added: Tanggal masuk dari frontend (format: YYYY-MM-DD) Tanggal_Keluar string `json:"tanggal_keluar"` Billing_sign string `json:"billing_sign"` ICD9 []string `json:"icd9"` diff --git a/backendcareit_v4/services/billing_pasien.go b/backendcareit_v4/services/billing_pasien.go index f30e18a..e38524d 100644 --- a/backendcareit_v4/services/billing_pasien.go +++ b/backendcareit_v4/services/billing_pasien.go @@ -314,6 +314,30 @@ func DataFromFE(input models.BillingRequest) ( now := time.Now() + // Parse Tanggal_Masuk - accept multiple formats + var masukPtr *time.Time + if input.Tanggal_Masuk != "" && input.Tanggal_Masuk != "null" { + s := input.Tanggal_Masuk + var parsed time.Time + var err error + layouts := []string{time.RFC3339, "2006-01-02 15:04:05", "2006-01-02"} + for _, layout := range layouts { + parsed, err = time.Parse(layout, s) + if err == nil { + t := parsed + masukPtr = &t + break + } + } + if masukPtr == nil { + tx.Rollback() + return nil, nil, nil, nil, nil, fmt.Errorf("invalid tanggal_masuk format: %s", input.Tanggal_Masuk) + } + } else { + // Jika tidak ada input, default ke hari ini + masukPtr = &now + } + // Parse Tanggal_Keluar (frontend sends string). Accept multiple formats. var keluarPtr *time.Time if input.Tanggal_Keluar != "" && input.Tanggal_Keluar != "null" { @@ -355,7 +379,7 @@ func DataFromFE(input models.BillingRequest) ( billing = models.BillingPasien{ ID_Pasien: pasien.ID_Pasien, Cara_Bayar: input.Cara_Bayar, - Tanggal_masuk: &now, + Tanggal_masuk: masukPtr, Tanggal_keluar: keluarPtr, Total_Tarif_RS: input.Total_Tarif_RS, Total_Klaim: input.Total_Klaim_BPJS, // ← Changed: Use input value instead of hardcoded 0 diff --git a/backendcareit_v4/services/riwayat_billing_pasien.go b/backendcareit_v4/services/riwayat_billing_pasien.go index 82f3b09..d34f541 100644 --- a/backendcareit_v4/services/riwayat_billing_pasien.go +++ b/backendcareit_v4/services/riwayat_billing_pasien.go @@ -46,6 +46,7 @@ func GetRiwayatPasienAll(db *gorm.DB) ([]models.Riwayat_Pasien_all, error) { if err := db.Table("\"billing_tindakan\""). Where("\"ID_Billing\" IN ?", billingIDs). Select("\"ID_Billing\", \"ID_Tarif_RS\" as \"Kode\""). + Order("\"ID_Billing\" ASC, \"tanggal_tindakan\" ASC"). Scan(&tindakanRows).Error; err != nil { return nil, err } @@ -54,7 +55,7 @@ func GetRiwayatPasienAll(db *gorm.DB) ([]models.Riwayat_Pasien_all, error) { tindakanMap[t.ID_Billing] = append(tindakanMap[t.ID_Billing], t.Kode) } - // Ambil tanggal tindakan dari tabel billing_tindakan + // Ambil tanggal tindakan dari tabel billing_tindakan (ambil yang pertama aja per billing supaya konsisten) tindakanDateMap := make(map[int]*time.Time) var tindakanDateRows []struct { ID_Billing int @@ -64,12 +65,13 @@ func GetRiwayatPasienAll(db *gorm.DB) ([]models.Riwayat_Pasien_all, error) { if err := db.Table("\"billing_tindakan\""). Where("\"ID_Billing\" IN ?", billingIDs). Select("\"ID_Billing\", \"tanggal_tindakan\""). + Order("\"ID_Billing\" ASC, \"tanggal_tindakan\" ASC"). Scan(&tindakanDateRows).Error; err != nil { return nil, err } for _, t := range tindakanDateRows { - if t.Tanggal_Tindakan != nil { + if t.Tanggal_Tindakan != nil && tindakanDateMap[t.ID_Billing] == nil { tindakanDateMap[t.ID_Billing] = t.Tanggal_Tindakan } } @@ -262,6 +264,7 @@ func GetAllRiwayatpasien(db *gorm.DB) ([]models.Request_Admin_Inacbg, error) { if err := db.Table("\"billing_tindakan\""). Where("\"ID_Billing\" IN ?", billingIDs). Select("\"ID_Billing\", \"ID_Tarif_RS\" as \"Kode\""). + Order("\"ID_Billing\" ASC, \"tanggal_tindakan\" ASC"). Scan(&tindakanRows).Error; err != nil { return nil, err } diff --git a/frontendcareit_v4/src/app/component/billing-pasien.tsx b/frontendcareit_v4/src/app/component/billing-pasien.tsx index 68c0632..6c0bf47 100644 --- a/frontendcareit_v4/src/app/component/billing-pasien.tsx +++ b/frontendcareit_v4/src/app/component/billing-pasien.tsx @@ -620,7 +620,7 @@ const BillingPasien = ({ onEditBilling }: BillingPasienProps) => { // Tambah tindakan - nyimpen Deskripsi (bukan KodeRS) karena backend nyari pake Tindakan_RS (Deskripsi) const handleAddTindakan = (kode: string) => { const tarif = tarifRSList.find(t => (t as any).KodeRS === kode); - if (tarif && (tarif as any).Deskripsi && !selectedTindakan.includes((tarif as any).Deskripsi)) { + if (tarif && (tarif as any).Deskripsi && ((tarif as any).Deskripsi)) { setSelectedTindakan([...selectedTindakan, (tarif as any).Deskripsi]); setTindakanSearch(''); setTindakanDropdownOpen(false); @@ -654,9 +654,9 @@ const BillingPasien = ({ onEditBilling }: BillingPasienProps) => { (t as any).KodeRS?.toLowerCase().includes(tindakanSearch.toLowerCase()) ); - // Hapus tindakan - sekarang pake Deskripsi - const handleRemoveTindakan = (deskripsi: string) => { - setSelectedTindakan(selectedTindakan.filter(t => t !== deskripsi)); + // Hapus tindakan - sekarang support duplikat dengan remove by index + const handleRemoveTindakan = (index: number) => { + setSelectedTindakan(selectedTindakan.filter((_, i) => i !== index)); }; // Tambah ICD9 - nyimpen Prosedur (bukan Kode_ICD9) karena backend nyari pake Prosedur @@ -1379,16 +1379,16 @@ const BillingPasien = ({ onEditBilling }: BillingPasienProps) => { {/* Selected tindakan chips */} {selectedTindakan.length > 0 && (
- {selectedTindakan.map((t) => { + {selectedTindakan.map((t, index) => { const tarif = tarifRSList.find(tar => (tar as any).Deskripsi === t); const harga = (tarif as any)?.Harga || 0; return ( -
+
{t} Rp {harga.toLocaleString('id-ID')}