revisi back date dan dpjp login

This commit is contained in:
AnggerRevo5
2026-04-13 23:00:14 +07:00
parent cc6abb00ac
commit a6af3d5f3f
4 changed files with 38 additions and 10 deletions
+1
View File
@@ -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"`
+25 -1
View File
@@ -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
@@ -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
}
@@ -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 && (
<div className="mt-2 flex flex-wrap gap-2">
{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 (
<div key={t} className="flex items-center bg-blue-50 border border-blue-200 text-[#2591D0] rounded-full px-3 py-1 text-sm">
<div key={`${index}_${t}`} className="flex items-center bg-blue-50 border border-blue-200 text-[#2591D0] rounded-full px-3 py-1 text-sm">
<span className="mr-2">{t}</span>
<span className="text-xs text-gray-600 mr-2">Rp {harga.toLocaleString('id-ID')}</span>
<button
type="button"
onClick={() => handleRemoveTindakan(t)}
onClick={() => handleRemoveTindakan(index)}
className="text-red-500 hover:text-red-700 ml-1"
aria-label={`Hapus tindakan ${t}`}
>