feat(cpone): support company lab registrations
This commit is contained in:
@@ -115,13 +115,11 @@ func validateLabRegistration(payload map[string]any) (validatedLabRegistration,
|
|||||||
return validatedLabRegistration{}, "Dokter pengirim atau perujuk wajib diisi"
|
return validatedLabRegistration{}, "Dokter pengirim atau perujuk wajib diisi"
|
||||||
}
|
}
|
||||||
|
|
||||||
patientType, patientTypePresent, message := optionalString(payload, "jenis_pasien_id", 0)
|
patientType, message := requiredString(payload, "jenis_pasien_id", 20, "Jenis pasien wajib diisi")
|
||||||
if message != "" {
|
if message != "" {
|
||||||
return validatedLabRegistration{}, message
|
return validatedLabRegistration{}, message
|
||||||
}
|
}
|
||||||
if patientTypePresent && patientType != "0" {
|
patientType = strings.TrimSpace(patientType)
|
||||||
return validatedLabRegistration{}, "Registrasi laboratorium API saat ini hanya mendukung pasien umum"
|
|
||||||
}
|
|
||||||
|
|
||||||
tariffPeriodID, message := requiredInteger(payload, "periode_tarif_id", "Periode tarif wajib diisi")
|
tariffPeriodID, message := requiredInteger(payload, "periode_tarif_id", "Periode tarif wajib diisi")
|
||||||
if message != "" {
|
if message != "" {
|
||||||
@@ -131,6 +129,60 @@ func validateLabRegistration(payload map[string]any) (validatedLabRegistration,
|
|||||||
return validatedLabRegistration{}, "The periode tarif id must be at least 1."
|
return validatedLabRegistration{}, "The periode tarif id must be at least 1."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companyID, companyPresent, message := optionalString(payload, "perusahaan_id", 50)
|
||||||
|
if message != "" {
|
||||||
|
return validatedLabRegistration{}, message
|
||||||
|
}
|
||||||
|
insuranceID, insurancePresent, message := optionalString(payload, "asuransi_id", 50)
|
||||||
|
if message != "" {
|
||||||
|
return validatedLabRegistration{}, message
|
||||||
|
}
|
||||||
|
providerID, _, message := optionalString(payload, "provider_id", 50)
|
||||||
|
if message != "" {
|
||||||
|
return validatedLabRegistration{}, message
|
||||||
|
}
|
||||||
|
policyNumber, _, message := optionalString(payload, "nomer_polis", 100)
|
||||||
|
if message != "" {
|
||||||
|
return validatedLabRegistration{}, message
|
||||||
|
}
|
||||||
|
employeeID, _, message := optionalString(payload, "nik_karyawan", 100)
|
||||||
|
if message != "" {
|
||||||
|
return validatedLabRegistration{}, message
|
||||||
|
}
|
||||||
|
employeeName, _, message := optionalString(payload, "nama_karyawan", 255)
|
||||||
|
if message != "" {
|
||||||
|
return validatedLabRegistration{}, message
|
||||||
|
}
|
||||||
|
|
||||||
|
var groupTariffID int64
|
||||||
|
if value, present := nullableValue(payload, "group_tarif_id"); present {
|
||||||
|
parsed, ok := parseInteger(value)
|
||||||
|
if !ok {
|
||||||
|
return validatedLabRegistration{}, "The group tarif id must be an integer."
|
||||||
|
}
|
||||||
|
if parsed < 1 && patientType != "0" {
|
||||||
|
return validatedLabRegistration{}, "The group tarif id must be at least 1."
|
||||||
|
}
|
||||||
|
groupTariffID = parsed
|
||||||
|
}
|
||||||
|
|
||||||
|
if patientType != "0" {
|
||||||
|
if !companyPresent || strings.TrimSpace(companyID) == "" {
|
||||||
|
return validatedLabRegistration{}, "Perusahaan wajib diisi untuk pasien penjamin"
|
||||||
|
}
|
||||||
|
if !insurancePresent || strings.TrimSpace(insuranceID) == "" {
|
||||||
|
return validatedLabRegistration{}, "Asuransi/penanggung wajib diisi untuk pasien penjamin"
|
||||||
|
}
|
||||||
|
if groupTariffID < 1 {
|
||||||
|
return validatedLabRegistration{}, "Group tarif wajib diisi untuk pasien penjamin"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
companyID = ""
|
||||||
|
insuranceID = ""
|
||||||
|
providerID = ""
|
||||||
|
groupTariffID = 0
|
||||||
|
}
|
||||||
|
|
||||||
classID, classPresent, message := optionalString(payload, "kelas_id", 50)
|
classID, classPresent, message := optionalString(payload, "kelas_id", 50)
|
||||||
if message != "" {
|
if message != "" {
|
||||||
return validatedLabRegistration{}, message
|
return validatedLabRegistration{}, message
|
||||||
@@ -184,7 +236,15 @@ func validateLabRegistration(payload map[string]any) (validatedLabRegistration,
|
|||||||
DoctorID: doctorID,
|
DoctorID: doctorID,
|
||||||
SenderDoctorID: senderDoctorID,
|
SenderDoctorID: senderDoctorID,
|
||||||
Referrer: referrer,
|
Referrer: referrer,
|
||||||
|
PatientType: patientType,
|
||||||
TariffPeriodID: tariffPeriodID,
|
TariffPeriodID: tariffPeriodID,
|
||||||
|
CompanyID: strings.TrimSpace(companyID),
|
||||||
|
InsuranceID: strings.TrimSpace(insuranceID),
|
||||||
|
ProviderID: strings.TrimSpace(providerID),
|
||||||
|
GroupTariffID: groupTariffID,
|
||||||
|
PolicyNumber: strings.TrimSpace(policyNumber),
|
||||||
|
EmployeeID: strings.TrimSpace(employeeID),
|
||||||
|
EmployeeName: strings.TrimSpace(employeeName),
|
||||||
ClassID: classID,
|
ClassID: classID,
|
||||||
DailyShiftID: dailyShiftID,
|
DailyShiftID: dailyShiftID,
|
||||||
WorkingDiagnosis: workingDiagnosis,
|
WorkingDiagnosis: workingDiagnosis,
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ func TestRegisterLabValidPayloadAndResponseParity(t *testing.T) {
|
|||||||
if recorder.Code != http.StatusCreated {
|
if recorder.Code != http.StatusCreated {
|
||||||
t.Fatalf("status = %d, want %d; body=%s", recorder.Code, http.StatusCreated, recorder.Body.String())
|
t.Fatalf("status = %d, want %d; body=%s", recorder.Code, http.StatusCreated, recorder.Body.String())
|
||||||
}
|
}
|
||||||
const expected = `{"success":true,"status":"registered","message":"Registrasi laboratorium berhasil disimpan","data":{"registration":{"RegID":"CPLAB2608180001","MEDRECID":"00001234","Tanggal":"2026-08-18 10:11:12","DepartemenID":"LAB","DokterID":"DR01","JenisPasienID":0,"JenisRegID":3,"PeriodeTarifID":10},"transaction":{"TrxDepartemenID":99,"TrxID":"CPLAB2608180001","GrandTotal":0},"layanan":[]}}` + "\n"
|
const expected = `{"success":true,"status":"registered","message":"Registrasi laboratorium berhasil disimpan","data":{"registration":{"RegID":"CPLAB2608180001","MEDRECID":"00001234","Tanggal":"2026-08-18 10:11:12","DepartemenID":"LAB","DokterID":"DR01","JenisPasienID":0,"JenisRegID":3,"PeriodeTarifID":10,"PerusahaanID":null,"AsuransiID":null,"ProviderID":null,"GroupTarifID":null,"NomerPolis":null},"transaction":{"TrxDepartemenID":99,"TrxID":"CPLAB2608180001","GrandTotal":0},"layanan":[]}}` + "\n"
|
||||||
if recorder.Body.String() != expected {
|
if recorder.Body.String() != expected {
|
||||||
t.Fatalf("body mismatch\n got: %s\nwant: %s", recorder.Body.String(), expected)
|
t.Fatalf("body mismatch\n got: %s\nwant: %s", recorder.Body.String(), expected)
|
||||||
}
|
}
|
||||||
@@ -96,12 +96,57 @@ func TestRegisterLabValidPayloadAndResponseParity(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRegisterLabCompanyPayload(t *testing.T) {
|
||||||
|
repo := &fakeLabRegistrationRepository{outcome: repository.LabRegistrationOutcome{
|
||||||
|
HTTPStatus: http.StatusCreated,
|
||||||
|
Success: true,
|
||||||
|
Status: "registered",
|
||||||
|
Message: "Registrasi laboratorium berhasil disimpan",
|
||||||
|
}}
|
||||||
|
handler := Handler{labRepo: repo}
|
||||||
|
body := `{
|
||||||
|
"medrec_id":"00409575",
|
||||||
|
"departemen_id":"MED-PNJ-LAB",
|
||||||
|
"dokter_id":"SPP01_003",
|
||||||
|
"dokter_pengirim_id":"Luar",
|
||||||
|
"perujuk":"DOKTER PERUJUK LUAR",
|
||||||
|
"jenis_pasien_id":"1",
|
||||||
|
"periode_tarif_id":7,
|
||||||
|
"perusahaan_id":"PE260700001",
|
||||||
|
"asuransi_id":"PE260700001",
|
||||||
|
"provider_id":"",
|
||||||
|
"group_tarif_id":1980,
|
||||||
|
"nomer_polis":"POLIS-001",
|
||||||
|
"nik_karyawan":"TSB2026002",
|
||||||
|
"nama_karyawan":"INTAN SEPTIANI",
|
||||||
|
"kelas_id":"Default",
|
||||||
|
"shift_harian_id":48049,
|
||||||
|
"diagnosa_kerja":"Test diagnosa"
|
||||||
|
}`
|
||||||
|
|
||||||
|
request := httptest.NewRequest(http.MethodPost, "/api/cpone/patients/lab-registration", strings.NewReader(body))
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
handler.RegisterLab(recorder, request)
|
||||||
|
|
||||||
|
if recorder.Code != http.StatusCreated {
|
||||||
|
t.Fatalf("status = %d, want %d; body=%s", recorder.Code, http.StatusCreated, recorder.Body.String())
|
||||||
|
}
|
||||||
|
params := repo.params
|
||||||
|
if params.PatientType != "1" || params.CompanyID != "PE260700001" || params.InsuranceID != "PE260700001" || params.GroupTariffID != 1980 {
|
||||||
|
t.Fatalf("company guarantor params mismatch: %+v", params)
|
||||||
|
}
|
||||||
|
if params.PolicyNumber != "POLIS-001" || params.EmployeeID != "TSB2026002" || params.EmployeeName != "INTAN SEPTIANI" {
|
||||||
|
t.Fatalf("company employee params mismatch: %+v", params)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRegisterLabValidationParity(t *testing.T) {
|
func TestRegisterLabValidationParity(t *testing.T) {
|
||||||
baseline := map[string]any{
|
baseline := map[string]any{
|
||||||
"medrec_id": "00001234",
|
"medrec_id": "00001234",
|
||||||
"departemen_id": "LAB",
|
"departemen_id": "LAB",
|
||||||
"dokter_id": "DR01",
|
"dokter_id": "DR01",
|
||||||
"dokter_pengirim_id": "DR02",
|
"dokter_pengirim_id": "DR02",
|
||||||
|
"jenis_pasien_id": "0",
|
||||||
"periode_tarif_id": 10,
|
"periode_tarif_id": 10,
|
||||||
"diagnosa_kerja": "Pemeriksaan laboratorium",
|
"diagnosa_kerja": "Pemeriksaan laboratorium",
|
||||||
}
|
}
|
||||||
@@ -130,9 +175,14 @@ func TestRegisterLabValidationParity(t *testing.T) {
|
|||||||
message: "Dokter pengirim atau perujuk wajib diisi",
|
message: "Dokter pengirim atau perujuk wajib diisi",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "non-general patient",
|
name: "missing company for guarantor",
|
||||||
mutate: func(payload map[string]any) { payload["jenis_pasien_id"] = "1" },
|
mutate: func(payload map[string]any) { payload["jenis_pasien_id"] = "1" },
|
||||||
message: "Registrasi laboratorium API saat ini hanya mendukung pasien umum",
|
message: "Perusahaan wajib diisi untuk pasien penjamin",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "missing patient type",
|
||||||
|
mutate: func(payload map[string]any) { delete(payload, "jenis_pasien_id") },
|
||||||
|
message: "Jenis pasien wajib diisi",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "invalid tariff period type",
|
name: "invalid tariff period type",
|
||||||
@@ -203,7 +253,7 @@ func TestRegisterLabRepositoryErrorsMatchLaravelEnvelope(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
const validBody = `{"medrec_id":"00001234","departemen_id":"LAB","dokter_id":"DR01","dokter_pengirim_id":"DR02","periode_tarif_id":10,"diagnosa_kerja":"Pemeriksaan laboratorium"}`
|
const validBody = `{"medrec_id":"00001234","departemen_id":"LAB","dokter_id":"DR01","dokter_pengirim_id":"DR02","jenis_pasien_id":"0","periode_tarif_id":10,"diagnosa_kerja":"Pemeriksaan laboratorium"}`
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
t.Run(test.name, func(t *testing.T) {
|
t.Run(test.name, func(t *testing.T) {
|
||||||
handler := Handler{labRepo: &fakeLabRegistrationRepository{err: test.err}}
|
handler := Handler{labRepo: &fakeLabRegistrationRepository{err: test.err}}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ func TestAddLabServicesValidPayloadAndResponseParity(t *testing.T) {
|
|||||||
if recorder.Code != http.StatusCreated {
|
if recorder.Code != http.StatusCreated {
|
||||||
t.Fatalf("status = %d; body=%s", recorder.Code, recorder.Body.String())
|
t.Fatalf("status = %d; body=%s", recorder.Code, recorder.Body.String())
|
||||||
}
|
}
|
||||||
const expected = `{"success":true,"status":"services_added","message":"Layanan laboratorium berhasil ditambahkan","data":{"registration":{"RegID":"CPLAB2608180001","MEDRECID":"00001234","Tanggal":"2026-08-18 10:11:12","DepartemenID":"LAB","DokterID":"DR01","JenisPasienID":0,"JenisRegID":3,"PeriodeTarifID":10},"transaction":{"TrxDepartemenID":99,"TrxID":"CPLAB2608180001","GrandTotal":125000},"layanan":[],"added_layanan_ids":["6413"],"skipped_layanan_ids":["6414"]}}` + "\n"
|
const expected = `{"success":true,"status":"services_added","message":"Layanan laboratorium berhasil ditambahkan","data":{"registration":{"RegID":"CPLAB2608180001","MEDRECID":"00001234","Tanggal":"2026-08-18 10:11:12","DepartemenID":"LAB","DokterID":"DR01","JenisPasienID":0,"JenisRegID":3,"PeriodeTarifID":10,"PerusahaanID":null,"AsuransiID":null,"ProviderID":null,"GroupTarifID":null,"NomerPolis":null},"transaction":{"TrxDepartemenID":99,"TrxID":"CPLAB2608180001","GrandTotal":125000},"layanan":[],"added_layanan_ids":["6413"],"skipped_layanan_ids":["6414"]}}` + "\n"
|
||||||
if recorder.Body.String() != expected {
|
if recorder.Body.String() != expected {
|
||||||
t.Fatalf("body mismatch\n got: %s\nwant: %s", recorder.Body.String(), expected)
|
t.Fatalf("body mismatch\n got: %s\nwant: %s", recorder.Body.String(), expected)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,15 @@ type LabRegistrationParams struct {
|
|||||||
DoctorID string
|
DoctorID string
|
||||||
SenderDoctorID string
|
SenderDoctorID string
|
||||||
Referrer string
|
Referrer string
|
||||||
|
PatientType string
|
||||||
TariffPeriodID int64
|
TariffPeriodID int64
|
||||||
|
CompanyID string
|
||||||
|
InsuranceID string
|
||||||
|
ProviderID string
|
||||||
|
GroupTariffID int64
|
||||||
|
PolicyNumber string
|
||||||
|
EmployeeID string
|
||||||
|
EmployeeName string
|
||||||
ClassID string
|
ClassID string
|
||||||
DailyShiftID *int64
|
DailyShiftID *int64
|
||||||
WorkingDiagnosis string
|
WorkingDiagnosis string
|
||||||
@@ -54,6 +62,11 @@ type LabRegistration struct {
|
|||||||
JenisPasienID int64 `json:"JenisPasienID"`
|
JenisPasienID int64 `json:"JenisPasienID"`
|
||||||
JenisRegID *int64 `json:"JenisRegID"`
|
JenisRegID *int64 `json:"JenisRegID"`
|
||||||
PeriodeTarifID int64 `json:"PeriodeTarifID"`
|
PeriodeTarifID int64 `json:"PeriodeTarifID"`
|
||||||
|
PerusahaanID *string `json:"PerusahaanID"`
|
||||||
|
AsuransiID *string `json:"AsuransiID"`
|
||||||
|
ProviderID *string `json:"ProviderID"`
|
||||||
|
GroupTarifID *int64 `json:"GroupTarifID"`
|
||||||
|
NomerPolis *string `json:"NomerPolis"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LabTransaction struct {
|
type LabTransaction struct {
|
||||||
@@ -91,6 +104,11 @@ type dbLabRegistration struct {
|
|||||||
JenisPasienID int64
|
JenisPasienID int64
|
||||||
JenisRegID sql.NullInt64
|
JenisRegID sql.NullInt64
|
||||||
PeriodeTarifID int64
|
PeriodeTarifID int64
|
||||||
|
PerusahaanID sql.NullString
|
||||||
|
AsuransiID sql.NullString
|
||||||
|
ProviderID sql.NullString
|
||||||
|
GroupTarifID sql.NullInt64
|
||||||
|
NomerPolis sql.NullString
|
||||||
}
|
}
|
||||||
|
|
||||||
type dbLabTransaction struct {
|
type dbLabTransaction struct {
|
||||||
@@ -161,6 +179,9 @@ func registerLabInTransaction(ctx context.Context, tx *sql.Tx, params LabRegistr
|
|||||||
if !departmentActive {
|
if !departmentActive {
|
||||||
return LabRegistrationOutcome{}, ValidationError{Message: "Departemen tujuan bukan departemen laboratorium aktif"}
|
return LabRegistrationOutcome{}, ValidationError{Message: "Departemen tujuan bukan departemen laboratorium aktif"}
|
||||||
}
|
}
|
||||||
|
if err := validateLabGuarantor(ctx, tx, params); err != nil {
|
||||||
|
return LabRegistrationOutcome{}, err
|
||||||
|
}
|
||||||
|
|
||||||
patient, found, err := findLabPatientForUpdate(ctx, tx, params.MedrecID)
|
patient, found, err := findLabPatientForUpdate(ctx, tx, params.MedrecID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -175,6 +196,15 @@ func registerLabInTransaction(ctx context.Context, tx *sql.Tx, params LabRegistr
|
|||||||
return LabRegistrationOutcome{}, err
|
return LabRegistrationOutcome{}, err
|
||||||
}
|
}
|
||||||
if found {
|
if found {
|
||||||
|
if !sameLabGuarantor(existing, params) {
|
||||||
|
return labOutcome(
|
||||||
|
409,
|
||||||
|
false,
|
||||||
|
"registration_guarantor_conflict",
|
||||||
|
"Pasien sudah memiliki registrasi laboratorium pada hari yang sama dengan penjamin berbeda",
|
||||||
|
nil,
|
||||||
|
), nil
|
||||||
|
}
|
||||||
trx, trxFound, err := findLabTransaction(ctx, tx, existing.RegID, params.DepartmentID)
|
trx, trxFound, err := findLabTransaction(ctx, tx, existing.RegID, params.DepartmentID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return LabRegistrationOutcome{}, err
|
return LabRegistrationOutcome{}, err
|
||||||
@@ -223,10 +253,11 @@ func registerLabInTransaction(ctx context.Context, tx *sql.Tx, params LabRegistr
|
|||||||
INSERT INTO regpas (
|
INSERT INTO regpas (
|
||||||
RegID, MEDRECID, Nama, ALAMATEXTPAS, TELPEXTPAS, TglLahir, JnsKelamin,
|
RegID, MEDRECID, Nama, ALAMATEXTPAS, TELPEXTPAS, TglLahir, JnsKelamin,
|
||||||
KunjunganKe, Tanggal, JenisPasienID, PeriodeTarifID, PerusahaanID,
|
KunjunganKe, Tanggal, JenisPasienID, PeriodeTarifID, PerusahaanID,
|
||||||
GroupTarifID, AsuransiID, ProviderID, DepartemenID, Perujuk, JenisRegID,
|
GroupTarifID, AsuransiID, ProviderID, NomerPolis, NIK, NamaKaryawan,
|
||||||
|
DepartemenID, Perujuk, JenisRegID,
|
||||||
DokterID, DokterID2, KelasID, MataUang, Rate, Pulang, BolehPulang, Lunas,
|
DokterID, DokterID2, KelasID, MataUang, Rate, Pulang, BolehPulang, Lunas,
|
||||||
BatalDaftar, Catatan, ShiftHarianIDDaftar, LoginBuat, TanggalBuat, NA
|
BatalDaftar, Catatan, ShiftHarianIDDaftar, LoginBuat, TanggalBuat, NA
|
||||||
) VALUES (?, ?, ?, '', '', ?, ?, ?, ?, '0', ?, '', '0', '', '', ?, ?, '3', ?, ?, ?, 'IDR', 1, 'N', 'N', 'N', 'N', ?, ?, ?, ?, 'N')`,
|
) VALUES (?, ?, ?, '', '', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '3', ?, ?, ?, 'IDR', 1, 'N', 'N', 'N', 'N', ?, ?, ?, ?, 'N')`,
|
||||||
regID,
|
regID,
|
||||||
patient.MEDRECID,
|
patient.MEDRECID,
|
||||||
patient.Nama,
|
patient.Nama,
|
||||||
@@ -234,7 +265,15 @@ func registerLabInTransaction(ctx context.Context, tx *sql.Tx, params LabRegistr
|
|||||||
nullStringValue(patient.Kelamin),
|
nullStringValue(patient.Kelamin),
|
||||||
previousVisits+1,
|
previousVisits+1,
|
||||||
nowText,
|
nowText,
|
||||||
|
params.PatientType,
|
||||||
params.TariffPeriodID,
|
params.TariffPeriodID,
|
||||||
|
params.CompanyID,
|
||||||
|
params.GroupTariffID,
|
||||||
|
params.InsuranceID,
|
||||||
|
params.ProviderID,
|
||||||
|
params.PolicyNumber,
|
||||||
|
params.EmployeeID,
|
||||||
|
params.EmployeeName,
|
||||||
params.DepartmentID,
|
params.DepartmentID,
|
||||||
strings.TrimSpace(params.Referrer),
|
strings.TrimSpace(params.Referrer),
|
||||||
params.DoctorID,
|
params.DoctorID,
|
||||||
@@ -295,11 +334,108 @@ func registerLabInTransaction(ctx context.Context, tx *sql.Tx, params LabRegistr
|
|||||||
return labOutcome(201, true, "registered", "Registrasi laboratorium berhasil disimpan", &data), nil
|
return labOutcome(201, true, "registered", "Registrasi laboratorium berhasil disimpan", &data), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateLabGuarantor(ctx context.Context, tx *sql.Tx, params LabRegistrationParams) error {
|
||||||
|
if params.PatientType == "0" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
active, err := exists(ctx, tx, `
|
||||||
|
SELECT EXISTS(
|
||||||
|
SELECT 1 FROM jenispasien
|
||||||
|
WHERE JenisPasienID = ? AND NA = 'N'
|
||||||
|
)`, params.PatientType)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !active {
|
||||||
|
return ValidationError{Message: "Jenis pasien penjamin tidak ditemukan atau sudah tidak aktif"}
|
||||||
|
}
|
||||||
|
|
||||||
|
guarantors := []struct {
|
||||||
|
label string
|
||||||
|
id string
|
||||||
|
}{
|
||||||
|
{label: "Perusahaan", id: params.CompanyID},
|
||||||
|
{label: "Asuransi/penanggung", id: params.InsuranceID},
|
||||||
|
{label: "Provider", id: params.ProviderID},
|
||||||
|
}
|
||||||
|
for _, guarantor := range guarantors {
|
||||||
|
if guarantor.id == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
active, err = exists(ctx, tx, `
|
||||||
|
SELECT EXISTS(
|
||||||
|
SELECT 1 FROM perusahaan
|
||||||
|
WHERE PerusahaanID = ? AND NA = 'N'
|
||||||
|
)`, guarantor.id)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !active {
|
||||||
|
return ValidationError{Message: guarantor.label + " tidak ditemukan atau sudah tidak aktif"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var tariffPeriodID int64
|
||||||
|
err = tx.QueryRowContext(ctx, `
|
||||||
|
SELECT pg.PeriodeTarifID
|
||||||
|
FROM perusahaan_grouptarif AS pg
|
||||||
|
INNER JOIN perusahaan_tarif AS pt
|
||||||
|
ON pt.Perusahaan_TarifID = pg.Perusahaan_TarifID
|
||||||
|
WHERE pg.GroupTarifID = ?
|
||||||
|
AND pt.PerusahaanID = ?
|
||||||
|
AND pg.NA = 'N'
|
||||||
|
AND DATE(pg.TanggalBerlaku) <= ?
|
||||||
|
AND DATE(pg.TanggalBerakhir) >= ?
|
||||||
|
LIMIT 1`,
|
||||||
|
params.GroupTariffID,
|
||||||
|
params.CompanyID,
|
||||||
|
params.RegistrationDate.Format("2006-01-02"),
|
||||||
|
params.RegistrationDate.Format("2006-01-02"),
|
||||||
|
).Scan(&tariffPeriodID)
|
||||||
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
|
return ValidationError{Message: "Group tarif tidak aktif, tidak berlaku pada tanggal registrasi, atau bukan milik perusahaan yang dipilih"}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if tariffPeriodID != params.TariffPeriodID {
|
||||||
|
return ValidationError{Message: fmt.Sprintf("Periode tarif harus %d sesuai group tarif yang dipilih", tariffPeriodID)}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func sameLabGuarantor(existing dbLabRegistration, params LabRegistrationParams) bool {
|
||||||
|
return strconv.FormatInt(existing.JenisPasienID, 10) == params.PatientType &&
|
||||||
|
existing.PeriodeTarifID == params.TariffPeriodID &&
|
||||||
|
nullInt64(existing.GroupTarifID) == params.GroupTariffID &&
|
||||||
|
strings.TrimSpace(nullableString(existing.PerusahaanID)) == params.CompanyID &&
|
||||||
|
strings.TrimSpace(nullableString(existing.AsuransiID)) == params.InsuranceID &&
|
||||||
|
strings.TrimSpace(nullableString(existing.ProviderID)) == params.ProviderID &&
|
||||||
|
strings.TrimSpace(nullableString(existing.NomerPolis)) == params.PolicyNumber
|
||||||
|
}
|
||||||
|
|
||||||
|
func nullInt64(value sql.NullInt64) int64 {
|
||||||
|
if !value.Valid {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return value.Int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func nullableString(value sql.NullString) string {
|
||||||
|
if !value.Valid {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return value.String
|
||||||
|
}
|
||||||
|
|
||||||
func findLabRegistrationByID(ctx context.Context, tx *sql.Tx, regID string) (dbLabRegistration, error) {
|
func findLabRegistrationByID(ctx context.Context, tx *sql.Tx, regID string) (dbLabRegistration, error) {
|
||||||
var registration dbLabRegistration
|
var registration dbLabRegistration
|
||||||
err := tx.QueryRowContext(ctx, `
|
err := tx.QueryRowContext(ctx, `
|
||||||
SELECT RegID, MEDRECID, Tanggal, DepartemenID, DokterID,
|
SELECT RegID, MEDRECID, Tanggal, DepartemenID, DokterID,
|
||||||
JenisPasienID, JenisRegID, PeriodeTarifID
|
JenisPasienID, JenisRegID, PeriodeTarifID, PerusahaanID,
|
||||||
|
AsuransiID, ProviderID, GroupTarifID, NomerPolis
|
||||||
FROM regpas WHERE RegID = ? LIMIT 1`, regID).Scan(
|
FROM regpas WHERE RegID = ? LIMIT 1`, regID).Scan(
|
||||||
®istration.RegID,
|
®istration.RegID,
|
||||||
®istration.MEDRECID,
|
®istration.MEDRECID,
|
||||||
@@ -309,6 +445,11 @@ func findLabRegistrationByID(ctx context.Context, tx *sql.Tx, regID string) (dbL
|
|||||||
®istration.JenisPasienID,
|
®istration.JenisPasienID,
|
||||||
®istration.JenisRegID,
|
®istration.JenisRegID,
|
||||||
®istration.PeriodeTarifID,
|
®istration.PeriodeTarifID,
|
||||||
|
®istration.PerusahaanID,
|
||||||
|
®istration.AsuransiID,
|
||||||
|
®istration.ProviderID,
|
||||||
|
®istration.GroupTarifID,
|
||||||
|
®istration.NomerPolis,
|
||||||
)
|
)
|
||||||
return registration, err
|
return registration, err
|
||||||
}
|
}
|
||||||
@@ -355,7 +496,8 @@ func findExistingLabRegistrationForUpdate(
|
|||||||
var registration dbLabRegistration
|
var registration dbLabRegistration
|
||||||
err := tx.QueryRowContext(ctx, `
|
err := tx.QueryRowContext(ctx, `
|
||||||
SELECT RegID, MEDRECID, Tanggal, DepartemenID, DokterID,
|
SELECT RegID, MEDRECID, Tanggal, DepartemenID, DokterID,
|
||||||
JenisPasienID, JenisRegID, PeriodeTarifID
|
JenisPasienID, JenisRegID, PeriodeTarifID, PerusahaanID,
|
||||||
|
AsuransiID, ProviderID, GroupTarifID, NomerPolis
|
||||||
FROM regpas
|
FROM regpas
|
||||||
WHERE MEDRECID = ?
|
WHERE MEDRECID = ?
|
||||||
AND DepartemenID = ?
|
AND DepartemenID = ?
|
||||||
@@ -371,6 +513,11 @@ func findExistingLabRegistrationForUpdate(
|
|||||||
®istration.JenisPasienID,
|
®istration.JenisPasienID,
|
||||||
®istration.JenisRegID,
|
®istration.JenisRegID,
|
||||||
®istration.PeriodeTarifID,
|
®istration.PeriodeTarifID,
|
||||||
|
®istration.PerusahaanID,
|
||||||
|
®istration.AsuransiID,
|
||||||
|
®istration.ProviderID,
|
||||||
|
®istration.GroupTarifID,
|
||||||
|
®istration.NomerPolis,
|
||||||
)
|
)
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
return dbLabRegistration{}, false, nil
|
return dbLabRegistration{}, false, nil
|
||||||
@@ -544,6 +691,11 @@ func buildLabRegistrationData(ctx context.Context, tx *sql.Tx, registration dbLa
|
|||||||
JenisPasienID: registration.JenisPasienID,
|
JenisPasienID: registration.JenisPasienID,
|
||||||
JenisRegID: nullInt64Ptr(registration.JenisRegID),
|
JenisRegID: nullInt64Ptr(registration.JenisRegID),
|
||||||
PeriodeTarifID: registration.PeriodeTarifID,
|
PeriodeTarifID: registration.PeriodeTarifID,
|
||||||
|
PerusahaanID: nullStringPtr(registration.PerusahaanID),
|
||||||
|
AsuransiID: nullStringPtr(registration.AsuransiID),
|
||||||
|
ProviderID: nullStringPtr(registration.ProviderID),
|
||||||
|
GroupTarifID: nullInt64Ptr(registration.GroupTarifID),
|
||||||
|
NomerPolis: nullStringPtr(registration.NomerPolis),
|
||||||
},
|
},
|
||||||
Layanan: make([]LabService, 0),
|
Layanan: make([]LabService, 0),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user