diff --git a/Modules/Internal/Http/Controllers/Api/ClaimController.php b/Modules/Internal/Http/Controllers/Api/ClaimController.php index f1e089e4..b2d35344 100644 --- a/Modules/Internal/Http/Controllers/Api/ClaimController.php +++ b/Modules/Internal/Http/Controllers/Api/ClaimController.php @@ -565,9 +565,162 @@ class ClaimController extends Controller ->get(); $results['request_documents'] = $request_documents; + $claim_services = DB::table('claim_services') + ->where('claim_services.claim_request_id', $claim_id) + ->select( + 'claim_services.id', + 'claim_services.addmission_date', + 'claim_services.discharge_date', + 'claim_services.service_id', + DB::raw('(SELECT services.name FROM services WHERE id = claim_services.service_id LIMIT 1) AS name_services'), + 'claim_services.hospital_id', + DB::raw('(SELECT corporate_hospitals.name FROM corporate_hospitals WHERE id = claim_services.hospital_id LIMIT 1) AS name_hospitals'), + ) + ->groupBy('claim_services.id') + ->first(); + $results['claim_services'] = $claim_services; + + $claim_service_benefits = DB::table('claim_service_benefits') + ->where('claim_service_id', $claim_services->id) + ->select( + 'claim_service_benefits.claim_service_id', + 'claim_service_benefits.benefit_id', + DB::raw('(SELECT benefits.description FROM benefits WHERE id = claim_service_benefits.benefit_id LIMIT 1) AS name_benefits') + ) + ->get(); + foreach ($claim_service_benefits as $item) { + $claimServiceId = $item->claim_service_id; + $nameBenefits = $item->name_benefits; + $benefitId = $item->benefit_id.""; + if (!isset($output[$claimServiceId])) { + $output[$claimServiceId] = (object)[ + "claim_service_id" => $claimServiceId, + "name_benefits" => $nameBenefits, + "benefit_id" => [$benefitId], + ]; + } else { + $output[$claimServiceId]->name_benefits .= ", " . $nameBenefits; + $output[$claimServiceId]->benefit_id[] = $benefitId.""; + } + } + $output = array_values($output); + + $results['claim_service_benefits'] = $output[0]; + return Helper::responseJson($results); } + public function getServices($claim_id) + { + //Corporate_id + $corporate_id = DB::table('claim_requests') + ->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id') + ->leftJoin('members', 'claim_requests.member_id', '=', 'members.id') + ->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id') + ->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id') + ->where('claim_requests.id', '=', $claim_id) + ->select('corporates.id') + ->first(); + + //Service Type + $service_type = DB::table('corporate_services') + ->leftJoin('services','corporate_services.service_code', 'services.code') + ->where('corporate_services.corporate_id', $corporate_id->id) + ->select('services.name', 'services.code', 'services.id') + ->get(); + $results['service_type'] = $service_type; + + //Benefit Name + $benefit_name = DB::table('corporate_benefits') + ->leftJoin('benefits', 'corporate_benefits.benefit_id', 'benefits.id') + ->where('corporate_benefits.corporate_id', $corporate_id->id) + ->select('benefits.code', 'benefits.description', 'benefits.id') + ->get(); + $results['benefit_name'] = $benefit_name; + + //Hospital + $hospital = DB::table('corporate_hospitals') + ->where('corporate_hospitals.corporate_id', $corporate_id->id) + ->where('corporate_hospitals.active', 1) + ->select('corporate_hospitals.code', 'corporate_hospitals.name', 'corporate_hospitals.id') + ->get(); + $results['hospital'] = $hospital; + + return Helper::responseJson($results); + } + + public function saveServices(Request $request) + { + $request->validate([ + 'claim_request_id' => 'required', + 'dateAdd' => 'required', + 'dateDisc' => 'required', + 'serviceType' => 'required', + 'hospital' => 'required', + 'benefitName' => 'required', + ]); + if($request->flagAddService === 'add') + { + $data = [ + 'claim_request_id' => $request->claim_request_id, + 'service_id' => $request->serviceType, + 'hospital_id' => $request->hospital, + 'addmission_date' => $request->dateAdd, + 'discharge_date' => $request->dateDisc, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => null, + ]; + $id = DB::table('claim_services') + ->insertGetId($data); + foreach ($request->benefitName as $value) + { + DB::table('claim_service_benefits') + ->insert([ + 'claim_service_id' => $id, + 'benefit_id' => $value, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]); + } + } + else if($request->flagAddService === 'edit') + { + $data = [ + 'claim_request_id' => $request->claim_request_id, + 'service_id' => $request->serviceType, + 'hospital_id' => $request->hospital, + 'addmission_date' => $request->dateAdd, + 'discharge_date' => $request->dateDisc, + 'created_by' =>auth()->user()->id, + 'created_at' => null, + 'updated_at' => date('Y-m-d H:i:s'), + ]; + DB::table('claim_services') + ->where('claim_services.id', $request->idService) + ->update($data); + + DB::table('claim_service_benefits') + ->where('claim_service_id', $request->idService) + ->delete(); + + foreach ($request->benefitName as $value) + { + DB::table('claim_service_benefits') + ->insert([ + 'claim_service_id' => $request->idService, + 'benefit_id' => $value, + 'created_by' =>auth()->user()->id, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]); + } + } + + return Helper::responseJson([]); + } + public function requestDocuments(Request $request) { $request->validate([ diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index fa7dcf5b..b74e7fd4 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -224,6 +224,8 @@ Route::prefix('internal')->group(function () { Route::get('claims/1/data-claim', [ClaimController::class, 'dataClaimReport']); Route::get('claims/detail/{id}', [ClaimController::class, 'getDetailClaims']); Route::post('claims/request-documents', [ClaimController::class, 'requestDocuments']); + Route::get('claims/get-services/{id}', [ClaimController::class, 'getServices']); + Route::post('claims/save-services', [ClaimController::class, 'saveServices']); Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']); Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']); diff --git a/database/migrations/2023_10_30_115027_create_claim_services_table.php b/database/migrations/2023_10_30_115027_create_claim_services_table.php new file mode 100644 index 00000000..dd12ed2e --- /dev/null +++ b/database/migrations/2023_10_30_115027_create_claim_services_table.php @@ -0,0 +1,37 @@ +id(); + $table->bigInteger('claim_request_id'); + $table->bigInteger('service_id'); + $table->bigInteger('hospital_id'); + $table->dateTime('addmission_date'); + $table->dateTime('discharge_date'); + $table->bigInteger('created_by')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_services'); + } +}; diff --git a/database/migrations/2023_10_30_133300_create_claim_service_benefits_table.php b/database/migrations/2023_10_30_133300_create_claim_service_benefits_table.php new file mode 100644 index 00000000..1c8a2bcb --- /dev/null +++ b/database/migrations/2023_10_30_133300_create_claim_service_benefits_table.php @@ -0,0 +1,34 @@ +id(); + $table->bigInteger('claim_service_id'); + $table->bigInteger('benefit_id'); + $table->bigInteger('created_by')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('claim_service_benefits'); + } +}; diff --git a/frontend/dashboard/src/pages/Claims/Detail.tsx b/frontend/dashboard/src/pages/Claims/Detail.tsx index 3ddf04ba..6b2b2529 100644 --- a/frontend/dashboard/src/pages/Claims/Detail.tsx +++ b/frontend/dashboard/src/pages/Claims/Detail.tsx @@ -1,5 +1,21 @@ // mui -import { Container, Grid, Stack, Typography, Card, TextField, Divider, ButtonBase, Box, IconButton } from '@mui/material'; +import { + Container, + Grid, + Stack, + Typography, + Card, + TextField, + Divider, + ButtonBase, + Box, + IconButton, + FormControl, + InputLabel, + Select, + FormHelperText, + MenuItem, +} from '@mui/material'; // components import Page from '../../components/Page'; // utils @@ -19,9 +35,17 @@ import CloseIcon from '@mui/icons-material/Close'; import FormGroup from '@mui/material/FormGroup'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; +import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import { fPostFormat } from '@/utils/formatTime'; +import { fDate, fDateTime } from '../../utils/formatTime'; +import ListItemText from '@mui/material/ListItemText'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import TableMoreMenu from '@/components/table/TableMoreMenu'; import { enqueueSnackbar } from 'notistack'; import BenefitConfigurationList from './components/BenefitConfigurationList'; +import { map } from 'lodash'; // ---------------------------------------------------------------------- @@ -35,6 +59,8 @@ export default function Detail() { const [customerData, setCustomerData] = useState(null); const [documentData, setDocumentData] = useState(null); const [requestDocumentData, setRequestDocumentData] = useState(null); + const [serviceData, setServiceData] = useState(null); + const [serviceBenefitData, setServiceBenefitData] = useState(null); const { id } = useParams(); @@ -45,10 +71,13 @@ export default function Detail() { setCustomerData(response.data.data.customer_data); setDocumentData(response.data.data.documents); setRequestDocumentData(response.data.data.request_documents); + setServiceData(response.data.data.claim_services); + setServiceBenefitData(response.data.data.claim_service_benefits); }) .catch((error) => { console.error(error); }); + getService(); }, []); @@ -69,8 +98,9 @@ export default function Detail() { marginBottom: 1, } + //Request const [openDialogRequest, setOpenDialogRequest] = useState(false); - const handleCloseDialogUpdate = () => { + const handleCloseDialogRequest = () => { setOpenDialogRequest(false); } @@ -115,6 +145,118 @@ export default function Detail() { enqueueSnackbar('Something Went Wrong', { variant: 'error' }); }) } + //Service + const [openDialogService, setOpenDialogService] = useState(false); + const handleCloseDialogService = () => { + setOpenDialogService(false); + } + const handleConditionChangeService = (event) => { + const selectedItem = event.target.value; + + if (valBenefitNames.includes(selectedItem)) { + // Item is already selected, remove it + setValBenefitNames(valBenefitNames.filter(item => item !== selectedItem)); + } else { + // Item is not selected, add it + setValBenefitNames([...valBenefitNames, selectedItem]); + } + }; + + //Data + const [serviceTypeData, setServiceTypeData] = useState(null); + const [benefitNameData, setBenefitNameData] = useState(null); + const [hospitalData, setHospitalData] = useState(null); + //Field + const currentDate = new Date(); + const formattedCurrentDate = format(currentDate, 'dd MMM yyyy'); + //Date Addmissions + const [dateAd, setDateAd] = useState(currentDate); + //Date Discharge + const [dateDis, setDateDis] = useState(currentDate); + //Service Type + const [valServiceType, setValServiceType] = useState(''); + const [valServiceTypeError, setValServiceTypeError] = useState(''); + //Benefit Name + const [valBenefitNames, setValBenefitNames] = useState([]); + const [valBenefitNameError, setValBenefitNameError] = useState(''); + //Hospital + const [valHospital, setValHospital] = useState(''); + const [valHospitalError, setValHospitalError] = useState(''); + //txt name + const [txtName, setTxtName] = useState('Add Service'); + //flag add or edit service + const [flagAddService, setFlagAddService] = useState('add'); + //id claim_services + const [idService, setIdService] = useState(null); + + + const isRequiredFieldsServiceType = () => { + return dateAd !== '' && dateDis !== '' && valServiceType !== '' && valBenefitNames.length > 0 && valHospital !== ''; + }; + + const getService = async () => { + try { + const response = await axios.get('/claims/get-services/' + id); + setServiceTypeData(response.data.data.service_type); + setBenefitNameData(response.data.data.benefit_name); + setHospitalData(response.data.data.hospital); + await Promise.all([ + setServiceTypeData(response.data.data.service_type), + setBenefitNameData(response.data.data.benefit_name), + setHospitalData(response.data.data.hospital), + ]); + + } catch (error) { + } + } + + + const handleAddService = async () => { + setTxtName('Add Service'); + setFlagAddService('add'); + setOpenDialogService(true); + } + + const handleEditService = async () => { + setDateAd(serviceData.addmission_date); + setDateDis(serviceData.discharge_date); + setIdService(serviceData.id); + + setOpenDialogService(true); + setTxtName('Edit Service'); + setFlagAddService('edit'); + + if (serviceTypeData) { + setValServiceType(serviceData.service_id); + setValHospital(serviceData.hospital_id); + setValBenefitNames(serviceBenefitData.benefit_id); + } + } + + const handelSaveServiceType = () => { + const dateAdd = dateAd ? fPostFormat(dateAd, 'yyyy-MM-dd') : null; + const dateDisc = dateDis ? fPostFormat(dateDis, 'yyyy-MM-dd') : null; + const data = { + flagAddService : flagAddService, + idService: idService, + claim_request_id: id, + dateAdd : dateAdd, + dateDisc : dateDisc, + serviceType : valServiceType, + benefitName : valBenefitNames, + hospital : valHospital + }; + axios + .post('/claims/save-services', data) + .then((response) => { + enqueueSnackbar('Success '+(flagAddService == 'add' ? 'Add' : 'Edit')+' Service', { variant: 'success' }); + handleCloseDialogService(); + window.location.reload(); + }) + .catch((error) => { + enqueueSnackbar('Something Went Wrong', { variant: 'error' }); + }) + } return ( @@ -223,13 +365,14 @@ export default function Detail() { ))} - + {/* Dialog Request Documents */} + Request Document - + @@ -250,9 +393,11 @@ export default function Detail() { label="Supporting Result Document" /> + + Notes* + { setNoteField(e.target.value); @@ -266,7 +411,7 @@ export default function Detail() { - + @@ -310,12 +455,199 @@ export default function Detail() { Service - + ) : ( + + + handleEditService()}> + + Edit + + + } + /> + + )} - - + {serviceData ? ( + <> + + Admission Date + {serviceData && serviceData.addmission_date ? fDateTime(serviceData.addmission_date) : ''} + + + Discharge Date + {serviceData && serviceData.discharge_date ? fDateTime(serviceData.discharge_date) : ''} + + + Serice Type + {serviceData && serviceData.name_services ? serviceData.name_services : ''} + + + Benefit Name + {serviceBenefitData && serviceBenefitData.name_benefits ? serviceBenefitData.name_benefits : ''} + + + Hospital + {serviceData && serviceData.name_hospitals ? serviceData.name_hospitals : ''} + + + ): ''} + + {/* Dialog Service */} + + + + + {txtName} + + + + + + + + + + + + Admission Date* + + + { + setDateAd(newValue); + }} + inputFormat="dd MMM yyyy" + renderInput={(params) => } + /> + + + + + Discharge Date* + + + { + setDateDis(newValue); + }} + inputFormat="dd MMM yyyy" + renderInput={(params) => } + /> + + + + + + Service Type* + + + Service Type + + + {valServiceTypeError} + + + + + + Benefit Name* + + + Benefit Name + + + {valBenefitNameError} + + + + + + Hospital* + + + Hospital + + + {valHospitalError} + + + + + + + + + +