Update customer service

This commit is contained in:
2023-12-19 08:56:18 +07:00
parent e76c480ce9
commit 40371bd53a
42 changed files with 1027 additions and 2328 deletions

View File

@@ -23,14 +23,15 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo
const navigate = useNavigate();
const handleSubmit = () => {
const formData = {
status : approve
status : approve,
id: requestLog?.id
}
axios
.put(`customer-service/request/${requestLog?.id}`, formData)
.post(`customer-service/request/final-log`, formData)
.then((response) => {
enqueueSnackbar('Verification Request LOG Success', { variant: 'success' });
enqueueSnackbar('Verification Final LOG Success', { variant: 'success' });
setOpenDialog(false);
navigate('/custormer-service/request')
navigate('/custormer-service/final-log')
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
@@ -54,7 +55,7 @@ export default function DialogConfirmation({requestLog, setOpenDialog, openDialo
const getContent = () => (
<Stack spacing={1} marginTop={2}>
<Typography variant="subtitle2">Are you sure to {approve == 'approved' ? 'approve' : 'deciline'} this request ?</Typography>
<Typography variant="subtitle2">Are you sure to {approve == 'approved' ? 'approve' : 'deciline'} this final log ?</Typography>
<Grid item xs={12} md={12} marginTop={4}>
<Card sx={{padding:2, marginTop:2}} >
<Stack direction='row' spacing={2} sx={marginBottom1}>

View File

@@ -66,4 +66,55 @@ export default function DialogDelete({id, setOpenDialog, openDialog,onSubmit} :
maxWidth="xs"
/>
);
}
export function DialogDeleteMedicine({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) {
const handleSubmit = () => {
axios
.delete(`customer-service/request/medicine-data/${id}`)
.then((response) => {
enqueueSnackbar('Benefit Data has Deleted', { variant: 'success' });
setOpenDialog(false);
window.location.reload()
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
});
}
const style1 = {
color: '#919EAB',
width: '30%'
}
const style2 = {
width: '70%'
}
const marginBottom1 = {
marginBottom: 1,
}
const handleCloseDialog = () => {
setOpenDialog(false);
}
const getContent = () => (
<Stack spacing={1} marginTop={2}>
<Typography variant="subtitle2">Are you sure to delete this detail medicine ?</Typography>
<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 Medicine"}}
openDialog={openDialog}
setOpenDialog={setOpenDialog}
content={getContent()}
maxWidth="xs"
/>
);
}

View File

@@ -0,0 +1,69 @@
import MuiDialog from "@/components/MuiDialog";
import { 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 { DetailFinalLogType } from "../Model/Types";
import { fDateTimesecond, toTitleCase } from "@/utils/formatTime";
import axios from "@/utils/axios";
import { enqueueSnackbar } from "notistack";
import { useNavigate } from "react-router";
type DialogDeleteType = {
openDialog: boolean;
setOpenDialog: any;
onSubmit?: void;
id: number|undefined;
}
export default function DialogDeleteMedicine({id, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) {
const handleSubmit = () => {
axios
.delete(`customer-service/request/medicine-data/${id}`)
.then((response) => {
enqueueSnackbar('Benefit Data has Deleted', { variant: 'success' });
setOpenDialog(false);
window.location.reload()
})
.catch(({ response }) => {
enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' });
});
}
const style1 = {
color: '#919EAB',
width: '30%'
}
const style2 = {
width: '70%'
}
const marginBottom1 = {
marginBottom: 1,
}
const handleCloseDialog = () => {
setOpenDialog(false);
}
const getContent = () => (
<Stack spacing={1} marginTop={2}>
<Typography variant="subtitle2">Are you sure to delete this detail medicine ?</Typography>
<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 Medicine"}}
openDialog={openDialog}
setOpenDialog={setOpenDialog}
content={getContent()}
maxWidth="xs"
/>
);
}

View File

@@ -24,7 +24,7 @@ type DialogDeleteType = {
setOpenDialog: any;
onSubmit?: void;
data: BenefitConfigurationListType|undefined;
id: number;
id: number|undefined;
}
export default function DialogEditBenefit({id, data, setOpenDialog, openDialog,onSubmit} : DialogDeleteType ) {

View File

@@ -1,9 +1,13 @@
import * as Yup from 'yup';
import { yupResolver } from '@hookform/resolvers/yup';
import MuiDialog from "@/components/MuiDialog";
import { Button, Autocomplete, Card, Checkbox, DialogActions, Grid, Typography } from "@mui/material";
import { Paper } from "@mui/material";
import { Stack } from '@mui/material';
import React, { useState } from 'react';
import React, { useEffect, useState } from 'react';
import { DetailFinalLogType } from "../Model/Types";
import { MedicineType } from "../Model/Types";
import { fDateTimesecond, toTitleCase } from "@/utils/formatTime";
import { useFieldArray, useForm } from 'react-hook-form';
import { FormProvider, RHFDatepicker, RHFSelect, RHFTextField } from '@/components/hook-form';
@@ -13,8 +17,10 @@ import { enqueueSnackbar } from "notistack";
import { useNavigate } from "react-router";
import { LoadingButton } from '@mui/lab';
import AddIcon from '@mui/icons-material/Add';
import RemoveIcon from '@mui/icons-material/Remove';
import RHFTextFieldMoney from "@/components/hook-form/v2/RHFTextFieldMoney";
import { IconButton } from '@mui/material';
import { postAddMedince } from '../Model/Functions';
type DialogConfirmationType = {
openDialog: boolean;
@@ -23,128 +29,133 @@ type DialogConfirmationType = {
requestLog: DetailFinalLogType|undefined;
}
export default function DialogHMedicine({requestLog, setOpenDialog, openDialog } : DialogConfirmationType ) {
interface FormValuesProps extends Partial<DetailFinalLogType> {
taxes: boolean;
inStock: boolean;
}
const onSubmit = async (data: DetailFinalLogType) => {
reset();
}
export default function DialogMedicine({requestLog, setOpenDialog, openDialog } : DialogConfirmationType ) {
const handleCloseDialogMedicine = () => {
setOpenDialog(false)
setMedicines([])
setOpenDialog(false);
}
const [medicines, setMedicines] = useState([]);
const addMedicine = () => {
setMedicines((prevMedicines) => [...prevMedicines, { medicine: '', price: '' }]);
const requestID = requestLog?.id
const defaultValues: MedicineType = {
medicine : [{
id: 0,
medicine_name: '',
medicine_price: 0,
request_log_id: requestID,
medicine: '', // input to database
price: 0, // input to database
}],
};
const handleDelete = (index) => {
// Update the medicines state to remove the medicine at the given index
setMedicines((prevMeds) => prevMeds.filter((med, medIndex) => medIndex !== index));
};
const validationSchema = Yup.object().shape({
medicine: Yup.array().of(
Yup.object().shape({
medicine_name : Yup.string().typeError('').required(''),
medicine_price : Yup.number().typeError('').required(''),
request_log_id : Yup.number().typeError('').required(''),
})
)
})
const removeMedicene = (i:number) => {
const index = medicines.indexOf(i);
if (index > -1) { // only splice array when item is found
medicines.splice(index, 1); // 2nd parameter means remove one item only
const methods = useForm<any>({
resolver: yupResolver(validationSchema),
defaultValues
});
const {fields, append, remove} = useFieldArray({name: 'medicine',control: methods.control})
useEffect(() => {
let temp = fields.map((item, i) => {
return {
medicine_name: 'test',
medicine_price: 0,
request_log_id: 3,
}
})
reset({medicine: temp})
}, [])
const { handleSubmit, reset, watch, setValue, formState: { isDirty, isSubmitting, errors } } = methods;
// Submit Form
// =====================================
const submitHandler = async (data: MedicineType) => {
const response = await postAddMedince(data);
if (response == true) {
reset();
// navigate('custormer-service/final-log/detail/'+requestLog?.id);
window.location.reload()
}
}
const methods = useForm<DetailFinalLogType>();
const {
reset,
watch,
control,
setValue,
getValues,
setError,
handleSubmit,
resetField,
formState: { isSubmitting },
} = methods;
const {fields, append, remove} = useFieldArray<FormValuesProps>({name: "secondary_diagnosis_id", control})
const getContent = () => (
<FormProvider methods={methods} onSubmit={handleSubmit(onSubmit)}>
<FormProvider methods={methods} onSubmit={handleSubmit(submitHandler)}>
<Stack spacing={2} sx={{marginTop: 2, padding: 2}}>
<Grid container spacing={2}>
{/* Medicine */}
<Grid item xs={12}>
<Stack direction="row" alignItems="center" sx={{marginBottom: 4}}>
<Typography variant='subtitle1' gutterBottom>Medicine*</Typography>
<Button color="inherit" variant="outlined" startIcon={<AddIcon/>} sx={{marginLeft: 'auto'}} onClick={addMedicine}>
<Button color="inherit" variant="outlined" startIcon={<AddIcon/>} sx={{marginLeft: 'auto'}} onClick={() => append({medicine_name: '', medicine_price: 0, request_log_id: requestLog?.id })}>
<Typography variant="button" display="block">Medicine</Typography>
</Button>
</Stack>
</Grid>
{/* Listing */}
<Grid item xs={6}>
<RHFTextField
name={`medicine[0].name`}
label="Medicine"
required
placeholder="Medicine"
/>
</Grid>
<Grid item xs={6}>
<RHFTextFieldMoney
name={`medicine[0].price`}
label="Price"
required
placeholder="Price"
/>
</Grid>
{medicines.map((medicine, index) => (
<React.Fragment key={index+1}>
{fields.map((field, index) => (
<React.Fragment key={index}>
<Grid item xs={6}>
<RHFTextField
name={`medicine[${index+1}].name`}
id='medicine_name'
key={field.id}
name={`medicine.${index}.medicine_name`}
label="Medicine"
required
placeholder="Medicine"
/>
</Grid>
<Grid item xs={6}>
<Grid item xs={5}>
<RHFTextFieldMoney
name={`medicine[${index+1}].price`}
id='medicine_price'
key={field.id}
name={`medicine.${index}.medicine_price`}
label="Price"
required
placeholder="Price"
/>
</Grid>
{/* <Grid item xs={1}>
<Button variant="contained" color="error" onClick={() => handleDelete(index)}>
Delete
</Button>
</Grid> */}
{
index != (fields.length-1) ?
(
<Grid item xs={1} sx={{ textAlign: 'center' }}>
<IconButton size='large' color='error' onClick={() => remove(index)}>
<RemoveIcon />
</IconButton>
</Grid>
) : null
}
</React.Fragment>
))}
</Grid>
</Stack>
<DialogActions>
<Stack direction="row" alignItems="center" justifyContent="space-between" spacing={2}>
<Button color="inherit" variant="outlined" onClick={handleCloseDialogMedicine}><Typography>Cancel</Typography></Button>
<LoadingButton disabled={!isDirty} type="submit" variant="contained" loading={isSubmitting}>
Add
</LoadingButton>
</Stack>
</DialogActions>
</FormProvider>
);
const getAction = () => (
<Stack direction="row" alignItems="center" justifyContent="space-between" spacing={2}>
<Button color="inherit" variant="outlined" onClick={handleCloseDialogMedicine}><Typography>Cancel</Typography></Button>
<Button variant="contained"><Typography>Add</Typography></Button>
</Stack>
);
const getAction = () => null;
return (

View File

@@ -11,6 +11,7 @@ import {
Collapse,
AccordionSummary,
AccordionDetails,
IconButton,
} from '@mui/material';
// components
import Page from '../../../components/Page';
@@ -37,19 +38,22 @@ import AddIcon from '@mui/icons-material/Add';
import CardDetail from '../Components/CardDetail';
import CardService from '../Components/CardService';
import CardExclusion from '../Components/CardExclusion';
import CardBenefit from '../Components/CardBenefit';
// Import Dialog
import DialogHospitalCare from './Components/DialogHospitalCare';
import DialogBenefit from './Components/DialogBenefit';
import DialogMedicine from './Components/DialogMedicine';
import DetailBenefit from '../Components/DetailBenefit';
import DialogDelete from './Components/DialogDelete';
import DialogEditBenefit from './Components/DialogEditBenefit';
import { DialogDeleteMedicine } from './Components/DialogDelete';
import MoreMenu from '@/components/MoreMenu';
import { MenuItem } from '@mui/material';
import { fNumber } from '@/utils/formatNumber';
import palette from '@/theme/palette';
import DialogDelete from './Components/DialogDelete';
import CardMedicine from '../Components/CardMedicine';
import CardFile from '../Components/CardFile';
// ----------------------------------------------------------------------
@@ -299,7 +303,13 @@ export default function Detail() {
</Card>
{/* PR Buat pindahin ke componen */}
{/* <CardBenefit
requestLog={requestLog}
>
</CardBenefit> */}
<DialogBenefit
requestLog={requestLog}
@@ -335,37 +345,45 @@ export default function Detail() {
<Typography variant="button" display="block">Medicine</Typography>
</Button>
</Stack>
</Card>
<DialogMedicine
requestLog={requestLog}
openDialog={openDialogMedicine}
setOpenDialog={setDialogMedicine}
/>
{requestLog?.medicine.map((item, index) => (
<Grid
container
direction="row"
alignItems="center"
justifyContent="space-between" // Menempatkan item ke sebelah kiri dan kanan
sx={{ marginBottom: 2 }}
>
<Typography variant='subtitle1'>{item.medicine}</Typography>
<Typography variant="subtitle1">Rp. {fNumber(item.price)}
<IconButton size='large' color='error' onClick={() => {
setIdBenefitData(item.id)
setDialogDeleteBenefit(true)
}}>
<Delete color='error'/>
</IconButton>
</Typography>
</Grid>
))}
<DialogMedicine
requestLog={requestLog}
openDialog={openDialogMedicine}
setOpenDialog={setDialogMedicine}
/>
<DialogDeleteMedicine
id={idBenefitData}
openDialog={openDialogDeleteBenefit}
setOpenDialog={setDialogDeleteBenefit}
/>
</Card>
</Grid>
{/* File */}
<Grid item xs={12} md={12}>
<Card sx={{padding:2}} >
<Stack direction="row" alignItems="center" sx={{marginBottom: 4}}>
<Stack direction="column" spacing={2} sx={{marginBottom: 2}}>
<Typography variant='subtitle1' sx={{color: '#19BBBB'}} gutterBottom>Files History</Typography>
{requestLog?.files?.map((documentType, index) => (
<Stack direction="column" spacing={2} key={index}>
<Stack direction="row" spacing={1} sx={{color: '#19BBBB'}}>
<a
href={documentType.url}
style={{ cursor: 'pointer', textDecoration: 'none', color: '#19BBBB' }}
target="_blank"
>
<Typography variant="body2" gutterBottom>{documentType.original_name ? documentType.original_name : '-'}</Typography>
</a>
</Stack>
</Stack>
))}
</Stack>
</Stack>
</Card>
<CardFile
requestLog={requestLog}
/>
</Grid>
{requestLog?.status_final_log == 'requested' ? (

View File

@@ -1,6 +1,6 @@
import axios from '@/utils/axios';
import { enqueueSnackbar } from 'notistack';
import { MemberListType } from './Types';
import { MedicineType, MemberListType } from './Types';
import { BenefitConfigurationListType } from './Types';
import { makeFormData } from '@/utils/jsonToFormData';
@@ -119,7 +119,7 @@ export const postAddBenefit = async (data: BenefitConfigurationListType):Promise
/**
* Edit Benefit
*/
export const postEditBenefit = async (id:number, data: BenefitConfigurationListType):Promise<boolean> => {
export const postEditBenefit = async (id:number|undefined, data: BenefitConfigurationListType):Promise<boolean> => {
const response = await axios.put(`customer-service/request/benefit_data/${id}`, {
...data
})
@@ -151,3 +151,40 @@ export const postEditBenefit = async (id:number, data: BenefitConfigurationListT
return response;
}
/**
* Add Medicine
*/
export const postAddMedince = async (data: MedicineType):Promise<boolean> => {
const response = await axios.post(`customer-service/request/medicine-data`, {
...data
})
.then((res) =>{
enqueueSnackbar(res.data.message, {
variant: 'success',
});
return true;
})
.catch((res) => {
if (res.response.status == 400) {
let arr_message = res.response.data.message;
// for (const key in arr_message) {
enqueueSnackbar(arr_message, {
variant: 'warning',
});
// }
}
else {
enqueueSnackbar("server error !", {
variant: 'error',
});
}
return false;
});
return response;
}

View File

@@ -14,6 +14,7 @@ export type FinalLogType = {
id : number,
code : string,
member : Member,
member_name : string,
submission_date : string,
service_name : string,
payment_type_name : string,
@@ -41,6 +42,7 @@ export type DetailFinalLogType = {
benefit_data : BenefitData[],
config_service : ConfigService,
exclusion : Exclusion[],
medicine : Medicine[],
files : file[],
}
@@ -51,9 +53,26 @@ export type BenefitData = {
excess_paid : number,
keterangan : string,
benefit : Benefit,
request_log_id : number,
benefit_name : string,
description : string,
id : number,
}
export type BenefitConfigurationListType = {
request_log_id: number|undefined,
benefit_name: string,
benefit: {
description: string
},
amount_incurred: number,
amount_approved: number,
amount_not_approved: number,
excess_paid: number,
keterangan: string,
description: string,
}
export type Benefit = {
id: number,
code: string,
@@ -104,15 +123,17 @@ export type Rule = {
}
export type BenefitConfigurationListType = {
request_log_id: number|undefined,
benefit_name: string,
amount_incurred: number,
amount_approved: number,
amount_not_approved: number,
excess_paid: number,
keterangan: string,
description: string,
export type MedicineType = {
medicine: Medicine[],
}
export type Medicine = {
id: number,
medicine_name: string,
medicine_price: number,
medicine: string,
price: number,
request_log_id: number|undefined,
}