add edit provider prime center

This commit is contained in:
ivan-sim
2026-04-13 14:48:29 +07:00
parent 5dbad1f6a2
commit 7dad4e8004
7 changed files with 159 additions and 25 deletions

View File

@@ -31,6 +31,16 @@ class OrganizationController extends Controller
return response()->json(OrganizationResource::collection($organizations)); return response()->json(OrganizationResource::collection($organizations));
} }
public function organizations()
{
$data = Organization::hospital()->select('id', 'name', 'code')->get();
return response()->json([
'status' => 'success',
'data' => OrganizationResource::collection($data)
]);
}
/** /**
* Show the form for creating a new resource. * Show the form for creating a new resource.
* @return Renderable * @return Renderable

View File

@@ -56,6 +56,7 @@ use Modules\Internal\Http\Controllers\ClaimEncounterController;
use Modules\Linksehat\Http\Controllers\Api\AutocompleteController; use Modules\Linksehat\Http\Controllers\Api\AutocompleteController;
use Modules\HospitalPortal\Http\Controllers\Api\MemberController as MemberControllerHospitalPortal; use Modules\HospitalPortal\Http\Controllers\Api\MemberController as MemberControllerHospitalPortal;
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController as RequestLogControllerHospitalPortal; use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController as RequestLogControllerHospitalPortal;
use Modules\Primaya\Http\Controllers\Api\MasterController;
@@ -397,6 +398,8 @@ Route::prefix('internal')->group(function () {
Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']); Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']);
Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']); Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']);
Route::resource('organizations', OrganizationController::class); Route::resource('organizations', OrganizationController::class);
Route::get('organizations', [MasterController::class, 'organizations']);
Route::resource('appointments', AppointmentController::class); Route::resource('appointments', AppointmentController::class);
Route::get('live-chat/export', [LivechatController::class, 'export']); Route::get('live-chat/export', [LivechatController::class, 'export']);
Route::resource('live-chat', LivechatController::class); Route::resource('live-chat', LivechatController::class);

View File

@@ -22,6 +22,7 @@ use App\Models\ClaimRequest;
use App\Models\CorporateBenefit; use App\Models\CorporateBenefit;
use App\Models\RequestLogBenefit; use App\Models\RequestLogBenefit;
use App\Models\Speciality; use App\Models\Speciality;
use Modules\Internal\Transformers\OrganizationResource;
class MasterController extends Controller class MasterController extends Controller
{ {
@@ -53,11 +54,11 @@ class MasterController extends Controller
public function organizations() public function organizations()
{ {
$data = Organization::select('id', 'name', 'code')->get(); $data = Organization::hospital()->select('id', 'name', 'code')->get();
return response()->json([ return response()->json([
'status' => 'success', 'status' => 'success',
'data' => $data 'data' => OrganizationResource::collection($data)
]); ]);
} }
} }

View File

@@ -14,7 +14,7 @@ type DialogConfirmationType = {
openDialog: boolean; openDialog: boolean;
setOpenDialog: any; setOpenDialog: any;
onSubmit?: void; onSubmit?: void;
requestLog: DetailFinalLogType|undefined; requestLog: DetailFinalLogType|undefined;
} }
export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialog, onSubmit} : DialogConfirmationType ) { export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialog, onSubmit} : DialogConfirmationType ) {
@@ -28,11 +28,13 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
catatan: requestLog?.catatan, catatan: requestLog?.catatan,
icdCodes: requestLog?.diagnosis, icdCodes: requestLog?.diagnosis,
reason: requestLog?.reason, reason: requestLog?.reason,
type_of_member: requestLog?.type_of_member type_of_member: requestLog?.type_of_member,
organization_id: requestLog?.organization_id || 0,
}); });
const [error, setError] = useState(false); const [error, setError] = useState(false);
const [icdOptions, setIcdOptions] = useState([ const [icdOptions, setIcdOptions] = useState([
{ value: '-', label: '-' } { value: '-', label: '-' }
]); ]);
@@ -48,9 +50,9 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
.catch((error) => { .catch((error) => {
console.error('Error fetching ICD options:', error); console.error('Error fetching ICD options:', error);
}); });
}, []); // useEffect dijalankan hanya sekali saat komponen dimount }, []); // useEffect dijalankan hanya sekali saat komponen dimount
useEffect(() => { useEffect(() => {
setFormData({ setFormData({
discharge_date: requestLog?.discharge_date|| '', discharge_date: requestLog?.discharge_date|| '',
@@ -61,7 +63,10 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
icdCodes: requestLog?.diagnosis|| [], icdCodes: requestLog?.diagnosis|| [],
reason: requestLog?.reason|| '', reason: requestLog?.reason|| '',
type_of_member: requestLog?.type_of_member|| '', type_of_member: requestLog?.type_of_member|| '',
organization_id: requestLog?.organization_id || 0,
}); });
setIdProvider(requestLog?.organization_id || 0);
}, [requestLog]); }, [requestLog]);
@@ -93,13 +98,13 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
console.error('Error fetching ICD options:', error); console.error('Error fetching ICD options:', error);
}); });
} }
const handleSubmit = () => { const handleSubmit = () => {
if (formData.type_of_member == "" && requestLog?.corporate_id == 5) { if (formData.type_of_member == "" && requestLog?.corporate_id == 5) {
setError(true); setError(true);
alert('Silakan pilih Type Of Member sebelum mengirimkan data.'); alert('Silakan pilih Type Of Member sebelum mengirimkan data.');
} }
else if (isReasonSelected && formData.reason !== '') { else if (isReasonSelected && formData.reason !== '') {
axios axios
.post(`customer-service/request/final-log`, formData) .post(`customer-service/request/final-log`, formData)
@@ -117,7 +122,7 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
alert('Silakan pilih alasan sebelum mengirimkan data.'); alert('Silakan pilih alasan sebelum mengirimkan data.');
} }
} }
const style1 = { const style1 = {
color: '#919EAB', color: '#919EAB',
width: '30%' width: '30%'
@@ -140,12 +145,14 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
invoice_no: requestLog?.invoice_no ?? '', invoice_no: requestLog?.invoice_no ?? '',
catatan: requestLog?.catatan ?? '', catatan: requestLog?.catatan ?? '',
icdCodes: requestLog?.diagnosis ?? [], icdCodes: requestLog?.diagnosis ?? [],
reason: requestLog?.reason ?? '', reason: requestLog?.reason ?? '',
type_of_member: requestLog?.type_of_member ?? '', type_of_member: requestLog?.type_of_member ?? '',
organization_id: requestLog?.organization_id || 0,
}); });
}; };
const [isReasonSelected, setIsReasonSelected] = useState(true); const [isReasonSelected, setIsReasonSelected] = useState(true);
const handleCloseDialog = () => { const handleCloseDialog = () => {
setOpenDialog(false); setOpenDialog(false);
resetForm(); resetForm();
@@ -161,6 +168,27 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
// console.log(formData.type_of_member) // console.log(formData.type_of_member)
const [providers, setProviders] = useState([]);
const [idProvider, setIdProvider] = useState(0);
useEffect(() => {
axios
.get('/organizations')
.then((res) => {
setProviders(res.data.data || []);
})
.catch((err) => console.error(err));
}, []);
useEffect(() => {
if (requestLog?.organization_id) {
console.log(requestLog?.organization_id);
setIdProvider(requestLog.organization_id);
console.log(idProvider);
}
}, [requestLog]);
const getContent = () => ( const getContent = () => (
<Stack spacing={1} marginTop={2}> <Stack spacing={1} marginTop={2}>
<Typography variant="subtitle2">Are you sure to edit this final log ?</Typography> <Typography variant="subtitle2">Are you sure to edit this final log ?</Typography>
@@ -193,6 +221,26 @@ export default function DialogEditFinalLOG({requestLog, setOpenDialog, openDialo
</Card> </Card>
<Card sx={{padding:2, marginTop:2}} > <Card sx={{padding:2, marginTop:2}} >
<Stack direction="row" spacing={2} sx={marginBottom2}>
<Typography variant="subtitle2" sx={style1} gutterBottom>
Provider
</Typography>
<Autocomplete
options={providers}
getOptionLabel={(option) => option.name?.trim() || '-'}
value={providers.find((item) => item.id == idProvider) || null}
onChange={(event, newValue) => {
const id = newValue?.id || 0;
setIdProvider(id);
handleChange('organization_id', id);
}}
renderInput={(params) => (
<TextField {...params} label="Provider" fullWidth />
)}
fullWidth
/>
</Stack>
<Stack direction='row' spacing={2} sx={marginBottom2}> <Stack direction='row' spacing={2} sx={marginBottom2}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Invoice Provider</Typography> <Typography variant='subtitle2' sx={style1} gutterBottom>Invoice Provider</Typography>
<TextField <TextField

View File

@@ -49,6 +49,8 @@ import { LoadingButton } from '@mui/lab';
import { makeFormData } from '@/utils/jsonToFormData'; import { makeFormData } from '@/utils/jsonToFormData';
import TextField from '@mui/material/TextField'; import TextField from '@mui/material/TextField';
import { fPostFormat } from '@/utils/formatTime'; import { fPostFormat } from '@/utils/formatTime';
import { parse } from 'date-fns';
@@ -86,16 +88,29 @@ import { format } from 'date-fns';
export default function Detail() { export default function Detail() {
//dari hospital portal //dari hospital portal
const [dischargeDate, setDischargeDate] = useState<string>(format(new Date(), "yyyy MMM d HH:mm:ss")); // const [dischargeDate, setDischargeDate] = useState<string>(format(new Date(), "yyyy MMM d HH:mm:ss"));
const [serviceOptions, setServiceOptions] = useState([ const [dischargeDate, setDischargeDate] = useState<Date | null>(null)
{ value: '-', label: '-' }
]);
const [specialisOptions, setSpecialisOptions] = useState([ // const [serviceOptions, setServiceOptions] = useState([
{ value: '-', label: '-' } // { value: '-', label: '-' }
]); // ]);
// const [specialisOptions, setSpecialisOptions] = useState([
// { value: '-', label: '-' }
// ]);
const [serviceOptions, setServiceOptions] = useState<
{ value: string; label: string }[]
>([])
const [specialisOptions, setSpecialisOptions] = useState<
{ value: number; label: string }[]
>([])
const [serviceCode, setServiceCode] = useState<string>(""); const [serviceCode, setServiceCode] = useState<string>("");
const [idSpecialities, setIdSpecialities] = useState(""); const [idSpecialities, setIdSpecialities] = useState<number | null>(null)
const [inputDppj, setInputDppj] = useState(""); const [inputDppj, setInputDppj] = useState("");
const [requestLog, setRequestLog] = useState<DetailFinalLogType>();
function submitRequestFinalLog() { function submitRequestFinalLog() {
if(dischargeDate == '') if(dischargeDate == '')
{ {
@@ -120,6 +135,7 @@ function submitRequestFinalLog() {
// result_files: fileHasilPenunjangs, // result_files: fileHasilPenunjangs,
// diagnosa_files: fileDiagnosas, // diagnosa_files: fileDiagnosas,
// kondisi_files: fileKondisis, // kondisi_files: fileKondisis,
request_logs_id: requestLog?.id,
discharge_date: fPostFormat(dischargeDate, 'yyyy-MM-dd HH:mm:ss'), discharge_date: fPostFormat(dischargeDate, 'yyyy-MM-dd HH:mm:ss'),
service_code: serviceCode, service_code: serviceCode,
spescialis_id: idSpecialities, spescialis_id: idSpecialities,
@@ -147,7 +163,7 @@ function submitRequestFinalLog() {
const navigate = useNavigate(); const navigate = useNavigate();
const { themeStretch } = useSettings(); const { themeStretch } = useSettings();
const [requestLog, setRequestLog] = useState<DetailFinalLogType>();
const [isReversal, setIsReversal] = useState(false); const [isReversal, setIsReversal] = useState(false);
const [submitLoading, setSubmitLoading] = useState(false); const [submitLoading, setSubmitLoading] = useState(false);
@@ -337,6 +353,40 @@ function submitRequestFinalLog() {
); );
}; };
useEffect(() => {
if (requestLog?.discharge_date) {
setDischargeDate(
parse(
requestLog.discharge_date,
'yyyy-MM-dd HH:mm:ss',
new Date()
)
)
}
}, [requestLog?.discharge_date])
useEffect(() => {
if (!requestLog) return
setServiceCode(requestLog.service_code ?? '')
setIdSpecialities(requestLog.specialitiesID ?? null)
setInputDppj(requestLog.dppj ?? '')
}, [requestLog])
const selectedService = useMemo(
() =>
serviceOptions.find(
(o) => String(o.value) === String(serviceCode)
) || null,
[serviceOptions, serviceCode]
)
console.log(serviceOptions);
console.log(serviceCode);
const selectedSpecialis = useMemo(
() =>
specialisOptions.find(
(o) => Number(o.value) === Number(idSpecialities)
) || null,
[specialisOptions, idSpecialities]
)
return ( return (
<Page title='Detail'> <Page title='Detail'>
<Container maxWidth={themeStretch ? false : 'xl'}> <Container maxWidth={themeStretch ? false : 'xl'}>
@@ -354,7 +404,7 @@ function submitRequestFinalLog() {
Detail Detail
</Typography> </Typography>
</Grid> </Grid>
{requestLog?.status_final_log != 'requested' ? ( {requestLog?.status_final_log != 'approved' ? (
<Grid item xs={6} sx={{ display: 'flex', placeContent: 'end' }}> <Grid item xs={6} sx={{ display: 'flex', placeContent: 'end' }}>
<MoreMenu <MoreMenu
actions={ actions={
@@ -531,7 +581,7 @@ function submitRequestFinalLog() {
{/* Kolom Service Type */} {/* Kolom Service Type */}
<Stack spacing={2} sx={{ flex: 1 }}> <Stack spacing={2} sx={{ flex: 1 }}>
<Typography variant="subtitle1">Tipe Service </Typography> <Typography variant="subtitle1">Tipe Service </Typography>
<Autocomplete {/* <Autocomplete
id="service_type" id="service_type"
options={serviceOptions} options={serviceOptions}
getOptionLabel={(option) => option.label || ""} getOptionLabel={(option) => option.label || ""}
@@ -542,7 +592,17 @@ function submitRequestFinalLog() {
renderInput={(params) => ( renderInput={(params) => (
<TextField {...params} label='Tipe Service' fullWidth /> <TextField {...params} label='Tipe Service' fullWidth />
)} )}
/> /> */}
<Autocomplete
options={serviceOptions}
value={selectedService}
getOptionLabel={(o) => o.label}
isOptionEqualToValue={(o, v) => o.value === v.value}
onChange={(_, v) => setServiceCode(v?.value ?? '')}
renderInput={(params) => (
<TextField {...params} label="Tipe Service" fullWidth />
)}
/>
<FormHelperText style={{ color: "red" }}></FormHelperText> <FormHelperText style={{ color: "red" }}></FormHelperText>
</Stack> </Stack>
</Stack> </Stack>
@@ -551,7 +611,7 @@ function submitRequestFinalLog() {
<Stack direction="row" spacing={2}> <Stack direction="row" spacing={2}>
<Stack spacing={2} sx={{ width: '100%' }}> <Stack spacing={2} sx={{ width: '100%' }}>
<Typography variant='subtitle1'>Spesialis </Typography> <Typography variant='subtitle1'>Spesialis </Typography>
<Autocomplete {/* <Autocomplete
id='specialities' id='specialities'
options={specialisOptions} options={specialisOptions}
getOptionLabel={(option) => option.label || ''} getOptionLabel={(option) => option.label || ''}
@@ -562,6 +622,16 @@ function submitRequestFinalLog() {
renderInput={(params) => ( renderInput={(params) => (
<TextField {...params} label="Spesialis" fullWidth /> <TextField {...params} label="Spesialis" fullWidth />
)} )}
/> */}
<Autocomplete
options={specialisOptions}
value={selectedSpecialis}
getOptionLabel={(o) => o.label}
isOptionEqualToValue={(o, v) => o.value === v.value}
onChange={(_, v) => setIdSpecialities(v?.value ?? null)}
renderInput={(params) => (
<TextField {...params} label="Spesialis" fullWidth />
)}
/> />
<FormHelperText style={{ color: 'red' }}></FormHelperText> <FormHelperText style={{ color: 'red' }}></FormHelperText>
</Stack> </Stack>

View File

@@ -35,6 +35,7 @@ export type DetailFinalLogType = {
id : number, id : number,
code : string, code : string,
member_id : string, member_id : string,
organization_id : any,
id_member : string, id_member : string,
service_code : string, service_code : string,
specialitiesID : any, specialitiesID : any,

View File

@@ -35,6 +35,7 @@ export type DetailFinalLogType = {
id : number, id : number,
code : string, code : string,
member_id : string, member_id : string,
organization_id : any,
id_member : string, id_member : string,
service_code : string, service_code : string,
specialitiesID : any, specialitiesID : any,