[Improvement] add fitur delete request log

This commit is contained in:
2024-01-26 11:07:13 +07:00
parent 908a8aff0a
commit 74f87e150a
8 changed files with 351 additions and 109 deletions

View File

@@ -163,6 +163,7 @@ class RequestLogController extends Controller
$results = DB::table('request_logs') $results = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id') ->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->where('request_logs.deleted_at', null)
->when($request->input('search'), function ($query, $search) { ->when($request->input('search'), function ($query, $search) {
$query->where(function ($query) use ($search) { $query->where(function ($query) use ($search) {
$query->orWhere('request_logs.code', 'like', "%" . $search . "%") $query->orWhere('request_logs.code', 'like', "%" . $search . "%")

View File

@@ -52,6 +52,10 @@ class RequestLogController extends Controller
public function index(Request $request) public function index(Request $request)
{ {
$requestLog = RequestLog::query() $requestLog = RequestLog::query()
->where('deleted_at', null)
->when($request->final_log, function($q, $final_log) {
$q->where('final_log', $final_log);
})
->when($request->search, function ($q, $search) { ->when($request->search, function ($q, $search) {
$q->where('code', 'LIKE', "%".$search."%"); $q->where('code', 'LIKE', "%".$search."%");
$q->orWhereHas('member', function ($subQuery) use ($search) { $q->orWhereHas('member', function ($subQuery) use ($search) {
@@ -66,9 +70,6 @@ class RequestLogController extends Controller
->when(empty($request->orderBy), function ($q) { ->when(empty($request->orderBy), function ($q) {
$q->orderBy('created_at', 'desc'); $q->orderBy('created_at', 'desc');
}) })
->when($request->final_log, function($q, $final_log) {
$q->where('final_log', $final_log);
})
->when($request->service_code, function($q, $service_code) { ->when($request->service_code, function($q, $service_code) {
if ($service_code == 'IP'){ // Penjagaan sementara agar ini hanya muncul di inpatient monitoring if ($service_code == 'IP'){ // Penjagaan sementara agar ini hanya muncul di inpatient monitoring
$q->where('service_code', $service_code); $q->where('service_code', $service_code);
@@ -252,16 +253,12 @@ class RequestLogController extends Controller
$requestLog->reason = $request->reason; $requestLog->reason = $request->reason;
} }
// Simpan perubahan pada entitas
$requestLog->save();
if ($request->status){ if ($request->status){
$requestLog->status = $request->status; $requestLog->status = $request->status;
$requestLog->approved_by = auth()->user()->id;
$requestLog->approved_at = Carbon::now();
} }
$requestLog->approved_by = auth()->user()->id;
$requestLog->approved_at = Carbon::now();
$requestLog->save(); $requestLog->save();
// update nirc member // update nirc member
@@ -284,9 +281,27 @@ class RequestLogController extends Controller
* @param int $id * @param int $id
* @return Renderable * @return Renderable
*/ */
public function destroy($id) public function destroy(Request $request, $id)
{ {
// $requestLog = RequestLog::findOrFail($id);
$requestLog->reason = 'Reason Delete ' .$request->reason;
$requestLog->deleted_at = Carbon::now();
$requestLog->deleted_by = auth()->user()->id;
// Delete the record
$requestLog->save();
}
public function deleteFinalLog(Request $request, $id){
$requestLog = RequestLog::findOrFail($id);
$requestLog->status_final_log = null;
$requestLog->final_log = 0;
$requestLog->reason_final = 'Reason Delete ' .$request->reason;
$requestLog->save();
return response()->json([
'error' => false,
'message' => 'Delete Final LOG',
'data' => $requestLog],
200);
} }
/** /**

View File

@@ -258,6 +258,8 @@ Route::prefix('internal')->group(function () {
Route::post('customer-service/request', [RequestLogController::class, 'createNew']); Route::post('customer-service/request', [RequestLogController::class, 'createNew']);
Route::put('customer-service/request/{id}', [RequestLogController::class, 'update']); Route::put('customer-service/request/{id}', [RequestLogController::class, 'update']);
Route::get('customer-service/request/{id}', [RequestLogController::class, 'show']); Route::get('customer-service/request/{id}', [RequestLogController::class, 'show']);
Route::put('customer-service/request/{id}', [RequestLogController::class, 'destroy']);
Route::put('customer-service/request/final_log/{id}', [RequestLogController::class, 'deleteFinalLog']);
Route::get('customer-service/request/{id}/download', [RequestLogController::class, 'generateRequestLog']); Route::get('customer-service/request/{id}/download', [RequestLogController::class, 'generateRequestLog']);
Route::post('customer-service/request/import', [RequestLogController::class, 'importRequestLog']); Route::post('customer-service/request/import', [RequestLogController::class, 'importRequestLog']);
Route::get('customer-service/request/data', [RequestLogController::class, 'generateDataRequestLogExcel']); Route::get('customer-service/request/data', [RequestLogController::class, 'generateDataRequestLogExcel']);

View File

@@ -50,6 +50,8 @@ import TableMoreMenu from '@/components/table/TableMoreMenu';
import { Import } from '@/@types/claims'; import { Import } from '@/@types/claims';
import { FinalLogType } from '../../CustomerService/FinalLog/Model/Types'; import { FinalLogType } from '../../CustomerService/FinalLog/Model/Types';
import DialogDeleteFinalLOG from '@/pages/CustomerService/FinalLog/Components/DialogDeleteFinalLOG';
import { Delete } from '@mui/icons-material';
// import LoadingButton from '@/theme/overrides/LoadingButton'; // import LoadingButton from '@/theme/overrides/LoadingButton';
export default function List() { export default function List() {
@@ -301,17 +303,9 @@ export default function List() {
setSearchParams(filter); setSearchParams(filter);
}; };
const handleApprove = (claimRequest) => { // Handel Delete Final LOG
axios const [idFinalLog, setidFinalLog] = useState<number>();
.post(`claim-requests/${claimRequest.id}/approve`) const [openDialogDeleteFinalLog, setDialogDeleteFinalLog] = useState(false)
.then((response) => {
enqueueSnackbar('Success Approve', { variant: 'success' });
loadDataTableData();
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
});
};
useEffect(() => { useEffect(() => {
loadDataTableData(); loadDataTableData();
@@ -379,6 +373,14 @@ export default function List() {
<FindInPageOutlinedIcon /> <FindInPageOutlinedIcon />
Detail Detail
</MenuItem> </MenuItem>
<MenuItem onClick={() => {
setidFinalLog(row.id)
setDialogDeleteFinalLog(true)
}}
>
<Delete color='error'/>
Delete
</MenuItem>
</> </>
} /> } />
</TableCell> </TableCell>
@@ -534,30 +536,6 @@ export default function List() {
</Table> </Table>
); );
} }
// ---------------------------------------------------------
// Dialog Detail Claim Request
const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false);
const [loadingClaimDetail, setLoadingClaimDetail] = useState(true);
const [currentClaim, setCurrentClaim] = useState(null);
function handleShowClaim(claimRequest) {
setLoadingClaimDetail(true);
setOpenDialogDetailClaim(true);
axios
.get(`/claim-requests/${claimRequest.id}`)
.then(({ data }) => {
setCurrentClaim(data.data);
setLoadingClaimDetail(false);
})
.catch((err) => {
enqueueSnackbar(err.message, { variant: 'error' });
});
}
function handleDownloadLog() {}
return ( return (
<Grid container> <Grid container>
<Grid item sm={12}> <Grid item sm={12}>
@@ -574,12 +552,12 @@ export default function List() {
/> />
</Grid> </Grid>
<Grid item sm={12}> <Grid item sm={12}>
<DialogDetailClaim {/* Dialog Delete */}
openDialog={openDialogDetailClaim} <DialogDeleteFinalLOG
setOpenDialog={setOpenDialogDetailClaim} id={idFinalLog}
title={{ name: 'Claim Request Detail' }} openDialog={openDialogDeleteFinalLog}
data={{ claim: currentClaim, isLoading: loadingClaimDetail, handleDownloadLog }} setOpenDialog={setDialogDeleteFinalLog}
></DialogDetailClaim> />
</Grid> </Grid>
</Grid> </Grid>
); );

View File

@@ -0,0 +1,132 @@
import MuiDialog from "@/components/MuiDialog";
import { Autocomplete, Button, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material";
import { Paper } from "@mui/material";
import { Stack } from '@mui/material';
import React, { useState } from 'react';
import { fDateTimesecond, toTitleCase } from "@/utils/formatTime";
import axios from "@/utils/axios";
import { enqueueSnackbar } from "notistack";
import { useNavigate } from "react-router";
import { TextField } from "@mui/material";
type DialogDeleteType = {
openDialog: boolean;
setOpenDialog: any;
onSubmit?: void;
id: number|undefined;
}
export default function DialogDeleteFinalLOG({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) {
const style1 = {
color: '#919EAB',
width: '30%'
}
const style2 = {
width: '70%'
}
const marginBottom2 = {
marginBottom: 2,
}
const handleCloseDialog = () => {
setOpenDialog(false);
resetForm();
}
const [isReasonSelected, setIsReasonSelected] = useState(false);
const reasons = [
{ value: 'agreement', label: 'Agreement changed' },
{ value: 'endorsement', label: 'Endorsement' },
{ value: 'renewal', label: 'Renewal' },
{ value: 'wrong_setting', label: 'Wrong Setting' },
// Add more options as needed
];
const [formData, setFormData] = useState({
reason: null
});
const resetForm = () => {
setFormData({
reason: null
});
};
const handleChange = (field, value) => {
setFormData((prevData) => ({
...prevData,
[field]: value,
}));
if (field === 'reason') {
setIsReasonSelected(!!value);
}
};
const handleSubmit = () => {
if (isReasonSelected && formData.reason !== '') {
axios
.put(`customer-service/request/final_log/${id}`, formData)
.then((response) => {
enqueueSnackbar('Request LOG has Deleted', { variant: 'success' });
setOpenDialog(false);
window.location.reload()
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
});
} else {
setIsReasonSelected(false);
alert('Silakan pilih alasan sebelum menghapus data.');
}
}
const getContent = () => (
<Stack spacing={1} marginTop={2}>
<Typography variant="subtitle2">Are you sure to delete this detail LOG ?</Typography>
<Grid item xs={12} md={12} marginTop={4}>
<Card sx={{padding:2, marginTop:2}} >
<Stack direction='row' spacing={2} sx={marginBottom2}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Reason*</Typography>
<Autocomplete
options={reasons}
getOptionLabel={(option) => option.label}
fullWidth
value={reasons.find((r) => r.value === formData.reason) || null} // Use find to match the default value
onChange={(e, newValue) => handleChange('reason', newValue?.value)}
renderInput={(params) => (
<TextField
{...params}
label="Reason"
variant="outlined"
required
error={!isReasonSelected} // Menandai input sebagai salah jika opsi tidak dipilih
helperText={!isReasonSelected ? 'Alasan harus dipilih' : ''}
/>
)}
/>
</Stack>
</Card>
</Grid>
<DialogActions>
<Button variant="outlined" sx={{color: '#212B36', borderColor: '#919EAB52'}} onClick={handleCloseDialog}>Cancel</Button>
<Button color="error" variant="contained" onClick={handleSubmit}>Delete</Button>
</DialogActions>
</Stack>
);
return (
<MuiDialog
title={{name: "Delete Final LOG"}}
openDialog={openDialog}
setOpenDialog={setOpenDialog}
content={getContent()}
maxWidth="xs"
/>
);
}

View File

@@ -50,6 +50,8 @@ import TableMoreMenu from '@/components/table/TableMoreMenu';
import { Import } from '@/@types/claims'; import { Import } from '@/@types/claims';
import { FinalLogType } from '../FinalLog/Model/Types'; import { FinalLogType } from '../FinalLog/Model/Types';
import DialogDeleteFinalLOG from './Components/DialogDeleteFinalLOG';
import { Delete } from '@mui/icons-material';
// import LoadingButton from '@/theme/overrides/LoadingButton'; // import LoadingButton from '@/theme/overrides/LoadingButton';
export default function List() { export default function List() {
@@ -301,17 +303,9 @@ export default function List() {
setSearchParams(filter); setSearchParams(filter);
}; };
const handleApprove = (claimRequest) => { // Handel Delete Final LOG
axios const [idFinalLog, setidFinalLog] = useState<number>();
.post(`claim-requests/${claimRequest.id}/approve`) const [openDialogDeleteFinalLog, setDialogDeleteFinalLog] = useState(false)
.then((response) => {
enqueueSnackbar('Success Approve', { variant: 'success' });
loadDataTableData();
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
});
};
useEffect(() => { useEffect(() => {
loadDataTableData(); loadDataTableData();
@@ -379,6 +373,14 @@ export default function List() {
<FindInPageOutlinedIcon /> <FindInPageOutlinedIcon />
Detail Detail
</MenuItem> </MenuItem>
<MenuItem onClick={() => {
setidFinalLog(row.id)
setDialogDeleteFinalLog(true)
}}
>
<Delete color='error'/>
Delete
</MenuItem>
</> </>
} /> } />
</TableCell> </TableCell>
@@ -574,12 +576,12 @@ export default function List() {
/> />
</Grid> </Grid>
<Grid item sm={12}> <Grid item sm={12}>
<DialogDetailClaim {/* Dialog Delete */}
openDialog={openDialogDetailClaim} <DialogDeleteFinalLOG
setOpenDialog={setOpenDialogDetailClaim} id={idFinalLog}
title={{ name: 'Claim Request Detail' }} openDialog={openDialogDeleteFinalLog}
data={{ claim: currentClaim, isLoading: loadingClaimDetail, handleDownloadLog }} setOpenDialog={setDialogDeleteFinalLog}
></DialogDetailClaim> />
</Grid> </Grid>
</Grid> </Grid>
); );

View File

@@ -0,0 +1,132 @@
import MuiDialog from "@/components/MuiDialog";
import { Button, Card, Checkbox, DialogActions, Grid, TextField, Typography } from "@mui/material";
import { Paper } from "@mui/material";
import { Stack } from '@mui/material';
import React, { useState } from 'react';
import { fDateTimesecond, toTitleCase } from "@/utils/formatTime";
import axios from "@/utils/axios";
import { enqueueSnackbar } from "notistack";
import { useNavigate } from "react-router";
import { Autocomplete } from "@mui/material";
type DialogDeleteType = {
openDialog: boolean;
setOpenDialog: any;
onSubmit?: void;
id: number|undefined;
}
export default function DialogDeleteRequestLOG({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) {
const style1 = {
color: '#919EAB',
width: '30%'
}
const style2 = {
width: '70%'
}
const marginBottom2 = {
marginBottom: 2,
}
const handleCloseDialog = () => {
setOpenDialog(false);
resetForm();
}
const [isReasonSelected, setIsReasonSelected] = useState(false);
const reasons = [
{ value: 'agreement', label: 'Agreement changed' },
{ value: 'endorsement', label: 'Endorsement' },
{ value: 'renewal', label: 'Renewal' },
{ value: 'wrong_setting', label: 'Wrong Setting' },
// Add more options as needed
];
const [formData, setFormData] = useState({
reason: null
});
const resetForm = () => {
setFormData({
reason: null
});
};
const handleChange = (field, value) => {
setFormData((prevData) => ({
...prevData,
[field]: value,
}));
if (field === 'reason') {
setIsReasonSelected(!!value);
}
};
const handleSubmit = () => {
if (isReasonSelected && formData.reason !== '') {
axios
.put(`customer-service/request/${id}`, formData)
.then((response) => {
enqueueSnackbar('Request LOG has Deleted', { variant: 'success' });
setOpenDialog(false);
window.location.reload()
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
});
} else {
setIsReasonSelected(false);
alert('Silakan pilih alasan sebelum menghapus data.');
}
}
const getContent = () => (
<Stack spacing={1} marginTop={2}>
<Typography variant="subtitle2">Are you sure to delete this detail LOG ?</Typography>
<Grid item xs={12} md={12} marginTop={4}>
<Card sx={{padding:2, marginTop:2}} >
<Stack direction='row' spacing={2} sx={marginBottom2}>
<Typography variant='subtitle2' sx={style1} gutterBottom>Reason*</Typography>
<Autocomplete
options={reasons}
getOptionLabel={(option) => option.label}
fullWidth
value={reasons.find((r) => r.value === formData.reason) || null} // Use find to match the default value
onChange={(e, newValue) => handleChange('reason', newValue?.value)}
renderInput={(params) => (
<TextField
{...params}
label="Reason"
variant="outlined"
required
error={!isReasonSelected} // Menandai input sebagai salah jika opsi tidak dipilih
helperText={!isReasonSelected ? 'Alasan harus dipilih' : ''}
/>
)}
/>
</Stack>
</Card>
</Grid>
<DialogActions>
<Button variant="outlined" sx={{color: '#212B36', borderColor: '#919EAB52'}} onClick={handleCloseDialog}>Cancel</Button>
<Button color="error" variant="contained" onClick={handleSubmit}>Delete</Button>
</DialogActions>
</Stack>
);
return (
<MuiDialog
title={{name: "Delete Request LOG"}}
openDialog={openDialog}
setOpenDialog={setOpenDialog}
content={getContent()}
maxWidth="xs"
/>
);
}

View File

@@ -55,6 +55,8 @@ import { Import } from '@/@types/claims';
import { RequestLogType } from '../Request/Model/Types'; import { RequestLogType } from '../Request/Model/Types';
// import SvgIconStyle from '@/components/SvgIconStyle'; // import SvgIconStyle from '@/components/SvgIconStyle';
import SvgIconStyle from '../../../components/SvgIconStyle'; import SvgIconStyle from '../../../components/SvgIconStyle';
import { Delete } from '@mui/icons-material';
import DialogDeleteRequestLOG from '../Request/Components/DialogDeleteRequestLOG';
// import LoadingButton from '@/theme/overrides/LoadingButton'; // import LoadingButton from '@/theme/overrides/LoadingButton';
export default function List() { export default function List() {
@@ -313,17 +315,9 @@ export default function List() {
setSearchParams(filter); setSearchParams(filter);
}; };
const handleApprove = (claimRequest) => { // Handel Delete Request LOG
axios const [idRequestLog, setidRequestLog] = useState<number>();
.post(`claim-requests/${claimRequest.id}/approve`) const [openDialogDeleteRequestLog, setDialogDeleteRequestLog] = useState(false)
.then((response) => {
enqueueSnackbar('Success Approve', { variant: 'success' });
loadDataTableData();
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
});
};
useEffect(() => { useEffect(() => {
loadDataTableData(); loadDataTableData();
@@ -390,6 +384,14 @@ export default function List() {
<FindInPageOutlinedIcon /> <FindInPageOutlinedIcon />
Detail Detail
</MenuItem> </MenuItem>
<MenuItem onClick={() => {
setidRequestLog(row.id)
setDialogDeleteRequestLog(true)
}}
>
<Delete color='error'/>
Delete
</MenuItem>
</> </>
} /> } />
@@ -548,28 +550,6 @@ export default function List() {
} }
// --------------------------------------------------------- // ---------------------------------------------------------
// Dialog Detail Claim Request
const [openDialogDetailClaim, setOpenDialogDetailClaim] = useState(false);
const [loadingClaimDetail, setLoadingClaimDetail] = useState(true);
const [currentClaim, setCurrentClaim] = useState(null);
function handleShowClaim(claimRequest) {
setLoadingClaimDetail(true);
setOpenDialogDetailClaim(true);
axios
.get(`/claim-requests/${claimRequest.id}`)
.then(({ data }) => {
setCurrentClaim(data.data);
setLoadingClaimDetail(false);
})
.catch((err) => {
enqueueSnackbar(err.message, { variant: 'error' });
});
}
function handleDownloadLog() {}
return ( return (
<Grid container> <Grid container>
<Grid item sm={12}> <Grid item sm={12}>
@@ -586,12 +566,12 @@ export default function List() {
/> />
</Grid> </Grid>
<Grid item sm={12}> <Grid item sm={12}>
<DialogDetailClaim {/* Dialog Delete */}
openDialog={openDialogDetailClaim} <DialogDeleteRequestLOG
setOpenDialog={setOpenDialogDetailClaim} id={idRequestLog}
title={{ name: 'Claim Request Detail' }} openDialog={openDialogDeleteRequestLog}
data={{ claim: currentClaim, isLoading: loadingClaimDetail, handleDownloadLog }} setOpenDialog={setDialogDeleteRequestLog}
></DialogDetailClaim> />
</Grid> </Grid>
</Grid> </Grid>
); );