menambahkan filter report request log
This commit is contained in:
@@ -17,6 +17,7 @@ use Illuminate\Support\Facades\Storage;
|
|||||||
use App\Exceptions\ImportRowException;
|
use App\Exceptions\ImportRowException;
|
||||||
use App\Events\RequestLoged;
|
use App\Events\RequestLoged;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
|
||||||
use Maatwebsite\Excel\Facades\Excel;
|
use Maatwebsite\Excel\Facades\Excel;
|
||||||
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
|
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
|
||||||
@@ -41,39 +42,52 @@ class ReportLogController extends Controller
|
|||||||
|
|
||||||
public function index(Request $request)
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
$requestLog = RequestLog::query()
|
// Membuat objek DateTime dari string tanggal
|
||||||
->where('deleted_at', null)
|
$start_date = $request->start_date ? Carbon::parse($request->start_date)->toDateTimeString() : null;
|
||||||
->when($request->final_log, function($q, $final_log) {
|
$end_date = $request->end_date ? Carbon::parse($request->end_date) : null;
|
||||||
$q->where('final_log', $final_log);
|
|
||||||
})
|
|
||||||
->when($request->search, function ($q, $search) {
|
|
||||||
$q->where('code', 'LIKE', "%".$search."%");
|
|
||||||
$q->orWhereHas('member', function ($subQuery) use ($search) {
|
|
||||||
$subQuery->where('name', 'LIKE', "%".$search."%");
|
|
||||||
});
|
|
||||||
})
|
|
||||||
->when($request->orderBy, function ($q, $orderBy) use ($request) {
|
|
||||||
if (in_array($orderBy, ['submission_date', 'code', 'service_code', 'status'])) {
|
|
||||||
$q->orderBy($orderBy, $request->order);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
->when(empty($request->orderBy), function ($q) {
|
|
||||||
$q->orderBy('submission_date', 'desc');
|
|
||||||
})
|
|
||||||
->when($request->service_code, function($q, $service_code) {
|
|
||||||
if ($service_code == 'IP'){ // Penjagaan sementara agar ini hanya muncul di inpatient monitoring
|
|
||||||
$q->where('service_code', $service_code);
|
|
||||||
} else {
|
|
||||||
$q->where('service_code', '!=', 'IP'); // Dan selain IP muncul di final LOG
|
|
||||||
}
|
|
||||||
})
|
|
||||||
// ->where('status', $request->status)
|
|
||||||
->with(['member', 'files', 'service', 'member.currentPolicy'])
|
|
||||||
->paginate();
|
|
||||||
|
|
||||||
|
$requestLog = RequestLog::query()
|
||||||
|
->where('deleted_at', null)
|
||||||
|
->when($request->final_log, function ($q, $final_log) {
|
||||||
|
$q->where('final_log', $final_log);
|
||||||
|
})
|
||||||
|
->when($request->start_date, function ($q) use ($request) {
|
||||||
|
$q->where('created_at', '>=', $request->start_date);
|
||||||
|
})
|
||||||
|
->when($request->end_date, function ($q) use ($request) {
|
||||||
|
$q->where('created_at', '<=', Carbon::parse($request->end_date)->addDay());
|
||||||
|
})
|
||||||
|
->when($request->search, function ($q, $search) {
|
||||||
|
$q->where(function ($subQuery) use ($search) {
|
||||||
|
$subQuery->where('code', 'LIKE', '%' . $search . '%')
|
||||||
|
->orWhereHas('member', function ($subSubQuery) use ($search) {
|
||||||
|
$subSubQuery->where('name', 'LIKE', '%' . $search . '%');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
->when($request->orderBy, function ($q, $orderBy) use ($request) {
|
||||||
|
if (in_array($orderBy, ['submission_date', 'code', 'service_code', 'status'])) {
|
||||||
|
$q->orderBy($orderBy, $request->order);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
->when(empty($request->orderBy), function ($q) {
|
||||||
|
$q->orderBy('submission_date', 'desc');
|
||||||
|
})
|
||||||
|
->when($request->service_code, function ($q, $service_code) {
|
||||||
|
if ($service_code == 'IP') {
|
||||||
|
$q->where('service_code', $service_code);
|
||||||
|
} else {
|
||||||
|
$q->where('service_code', '!=', 'IP');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
->with(['member', 'files', 'service', 'member.currentPolicy']);
|
||||||
|
|
||||||
|
$requestLog = $requestLog->paginate();
|
||||||
return Helper::paginateResources(ReportLogResource::collection($requestLog));
|
return Helper::paginateResources(ReportLogResource::collection($requestLog));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the form for creating a new resource.
|
* Show the form for creating a new resource.
|
||||||
* @return Renderable
|
* @return Renderable
|
||||||
@@ -145,7 +159,7 @@ class ReportLogController extends Controller
|
|||||||
* Generate Export Excel Request LOG
|
* Generate Export Excel Request LOG
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public function generateDataRequestLogExcel(){
|
public function generateDataRequestLogExcel(Request $request){
|
||||||
Helper::setCustomPHPIniSettings();
|
Helper::setCustomPHPIniSettings();
|
||||||
$file_name = 'Data Request LOG';
|
$file_name = 'Data Request LOG';
|
||||||
// Membuat penulis entitas Spout
|
// Membuat penulis entitas Spout
|
||||||
@@ -178,9 +192,16 @@ class ReportLogController extends Controller
|
|||||||
$writer->addRow($headerRow);
|
$writer->addRow($headerRow);
|
||||||
|
|
||||||
$dataRequestLog = RequestLog::query()
|
$dataRequestLog = RequestLog::query()
|
||||||
|
->where('deleted_at', null)
|
||||||
// ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
|
// ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
|
||||||
// $corporatePlan->where('corporate_id', $corporate_id);
|
// $corporatePlan->where('corporate_id', $corporate_id);
|
||||||
// })
|
// })
|
||||||
|
->when($request->start_date, function ($q) use ($request) {
|
||||||
|
$q->where('created_at', '>=', $request->start_date);
|
||||||
|
})
|
||||||
|
->when($request->end_date, function ($q) use ($request) {
|
||||||
|
$q->where('created_at', '<=', Carbon::parse($request->end_date)->addDay());
|
||||||
|
})
|
||||||
->with('member')
|
->with('member')
|
||||||
->orderBy('id', 'desc')
|
->orderBy('id', 'desc')
|
||||||
->get()->toArray();
|
->get()->toArray();
|
||||||
|
|||||||
@@ -39,13 +39,15 @@ import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../../@typ
|
|||||||
import DataTable from '../../../components/LaravelTable';
|
import DataTable from '../../../components/LaravelTable';
|
||||||
import { LoadingButton } from '@mui/lab';
|
import { LoadingButton } from '@mui/lab';
|
||||||
import { enqueueSnackbar } from 'notistack';
|
import { enqueueSnackbar } from 'notistack';
|
||||||
import { fDateTimesecond } from '@/utils/formatTime';
|
import { fDateOnly, fDateTimesecond } from '@/utils/formatTime';
|
||||||
import { capitalizeFirstLetter } from '@/utils/formatString';
|
import { capitalizeFirstLetter } from '@/utils/formatString';
|
||||||
import Label from '@/components/Label';
|
import Label from '@/components/Label';
|
||||||
import TableMoreMenu from '@/components/table/TableMoreMenu';
|
import TableMoreMenu from '@/components/table/TableMoreMenu';
|
||||||
import { Import } from '@/@types/claims';
|
import { Import } from '@/@types/claims';
|
||||||
// import DialogDeleteRequestLOG from '../Request/Components/DialogDeleteRequestLOG';
|
// import DialogDeleteRequestLOG from '../Request/Components/DialogDeleteRequestLOG';
|
||||||
import { HeadCell, Order } from '@/@types/table';
|
import { HeadCell, Order } from '@/@types/table';
|
||||||
|
import {DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers';
|
||||||
|
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
|
||||||
import { ReportLog } from './Model/Type';
|
import { ReportLog } from './Model/Type';
|
||||||
// import LoadingButton from '@/theme/overrides/LoadingButton';
|
// import LoadingButton from '@/theme/overrides/LoadingButton';
|
||||||
|
|
||||||
@@ -60,12 +62,26 @@ export default function List() {
|
|||||||
// SEARCH
|
// SEARCH
|
||||||
const searchInput = useRef<HTMLInputElement>(null);
|
const searchInput = useRef<HTMLInputElement>(null);
|
||||||
const [searchText, setSearchText] = useState('');
|
const [searchText, setSearchText] = useState('');
|
||||||
|
const [selectedStartDate, setSelectedStartDate] = useState(null);
|
||||||
|
const [selectedEndDate, setSelectedEndDate] = useState('');
|
||||||
|
// Start Date
|
||||||
|
// con
|
||||||
|
|
||||||
const handleSearchChange = (event: any) => {
|
const handleSearchChange = (event: any) => {
|
||||||
const newSearchText = event.target.value ?? '';
|
const newSearchText = event.target.value ?? '';
|
||||||
setSearchText(newSearchText);
|
setSearchText(newSearchText);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleStartDateChange = (date: any) => {
|
||||||
|
setSelectedStartDate(date);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleEndDateChange = (date: any) => {
|
||||||
|
setSelectedEndDate(date);
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(selectedEndDate)
|
||||||
|
|
||||||
const handleSearchSubmit = (event: any) => {
|
const handleSearchSubmit = (event: any) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
props.onSearch({ search: searchText }); // Trigger to Parent
|
props.onSearch({ search: searchText }); // Trigger to Parent
|
||||||
@@ -77,17 +93,77 @@ export default function List() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form onSubmit={handleSearchSubmit} style={{ width: '100%' }}>
|
<form style={{ width: '100%' }}>
|
||||||
<TextField
|
<Grid container spacing={2} >
|
||||||
id="search-input"
|
<Grid item md={8}>
|
||||||
ref={searchInput}
|
<TextField
|
||||||
label="Search"
|
id="search-input"
|
||||||
variant="outlined"
|
ref={searchInput}
|
||||||
fullWidth
|
label="Search"
|
||||||
onChange={handleSearchChange}
|
variant="outlined"
|
||||||
value={searchText}
|
fullWidth
|
||||||
placeholder='Search Code or Name...'
|
onChange={handleSearchChange}
|
||||||
/>
|
onKeyDown={(event) => {
|
||||||
|
if (event.key === 'Enter') {
|
||||||
|
// handleSearchSubmit(event);
|
||||||
|
|
||||||
|
const filter = Object.fromEntries([
|
||||||
|
...searchParams.entries(),
|
||||||
|
['search', searchText],
|
||||||
|
]);
|
||||||
|
setSearchParams(filter);
|
||||||
|
loadDataTableData(filter);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
value={searchText}
|
||||||
|
placeholder='Search Code or Name...'
|
||||||
|
/>
|
||||||
|
</Grid>
|
||||||
|
<Grid item md={2}>
|
||||||
|
<LocalizationProvider dateAdapter={AdapterDateFns}>
|
||||||
|
<DesktopDatePicker
|
||||||
|
label="Create GL Date From"
|
||||||
|
value={searchParams.get('start_date')}
|
||||||
|
inputFormat="dd/MM/yyyy"
|
||||||
|
onChange={(value) => {
|
||||||
|
try {
|
||||||
|
if (value && !!Date.parse(value)) {
|
||||||
|
const date:string = value ? fDateOnly(value) : '';
|
||||||
|
var entries = [...searchParams.entries(), ['start_date', date ?? '']];
|
||||||
|
const filter = Object.fromEntries(entries);
|
||||||
|
setSearchParams(filter);
|
||||||
|
loadDataTableData(filter);
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
}}
|
||||||
|
renderInput={(params) => <TextField {...params} variant="outlined" />}
|
||||||
|
/>
|
||||||
|
</LocalizationProvider>
|
||||||
|
</Grid>
|
||||||
|
<Grid item md={2}>
|
||||||
|
<LocalizationProvider dateAdapter={AdapterDateFns}>
|
||||||
|
<DesktopDatePicker
|
||||||
|
label="Create GL Date To"
|
||||||
|
inputFormat="MM/dd/yyyy"
|
||||||
|
value={searchParams.get('end_date')}
|
||||||
|
onChange={(value) => {
|
||||||
|
try {
|
||||||
|
if (value && !!Date.parse(value)) {
|
||||||
|
const date = fDateOnly(value);
|
||||||
|
var entries = [...searchParams.entries(), ['end_date', date ?? '']];
|
||||||
|
const filter = Object.fromEntries(entries);
|
||||||
|
handleEndDateChange(date)
|
||||||
|
setSearchParams(filter);
|
||||||
|
loadDataTableData(filter);
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
}}
|
||||||
|
renderInput={(params) => <TextField {...params} variant="outlined" />}
|
||||||
|
/>
|
||||||
|
</LocalizationProvider>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -99,7 +175,6 @@ export default function List() {
|
|||||||
const createMenu = Boolean(anchorEl);
|
const createMenu = Boolean(anchorEl);
|
||||||
const importForm = useRef<HTMLInputElement>(null);
|
const importForm = useRef<HTMLInputElement>(null);
|
||||||
const [currentImportFileName, setCurrentImportFileName] = useState(null);
|
const [currentImportFileName, setCurrentImportFileName] = useState(null);
|
||||||
const [importLoading, setImportLoading] = useState(false);
|
|
||||||
|
|
||||||
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
|
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
|
||||||
setAnchorEl(event.currentTarget);
|
setAnchorEl(event.currentTarget);
|
||||||
@@ -117,11 +192,6 @@ export default function List() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleCancelImportButton = () => {
|
|
||||||
importForm.current.value = '';
|
|
||||||
importForm.current.dispatchEvent(new Event('change', { bubbles: true }));
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleImportChange = (event: any) => {
|
const handleImportChange = (event: any) => {
|
||||||
if (event.target.files[0]) {
|
if (event.target.files[0]) {
|
||||||
setCurrentImportFileName(event.target.files[0].name);
|
setCurrentImportFileName(event.target.files[0].name);
|
||||||
@@ -130,56 +200,31 @@ export default function List() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleUpload = () => {
|
|
||||||
if (importForm.current?.files.length) {
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('file', importForm.current?.files[0]);
|
|
||||||
|
|
||||||
setImportLoading(true);
|
|
||||||
axios
|
|
||||||
.post(`customer-service/request/import`, formData)
|
|
||||||
.then((response) => {
|
|
||||||
handleCancelImportButton();
|
|
||||||
loadDataTableData();
|
|
||||||
setImportResult(response.data);
|
|
||||||
// alert('Succesfully read '+ response.data.total_successed_row + ' with ' + response.data.total_failed_row + ' failed rows');
|
|
||||||
setImportLoading(false);
|
|
||||||
})
|
|
||||||
.catch((response) => {
|
|
||||||
enqueueSnackbar(
|
|
||||||
'Looks like something went wrong. Please check your data and try again. ' +
|
|
||||||
response.message,
|
|
||||||
{ variant: 'error' }
|
|
||||||
);
|
|
||||||
setImportLoading(false);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
enqueueSnackbar('No File Selected', { variant: 'warning' });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleGetTemplate = (type :string) => {
|
|
||||||
axios.get('corporates/import-document-example/' + type)
|
|
||||||
.then((response) => {
|
|
||||||
const link = document.createElement('a');
|
|
||||||
link.href = response.data.data.file_url;
|
|
||||||
link.setAttribute('download', response.data.data.file_name);
|
|
||||||
document.body.appendChild(link);
|
|
||||||
link.click();
|
|
||||||
handleClose();
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleGetData = (type :string) => {
|
const handleGetData = (type :string) => {
|
||||||
axios.get(`report/logs/export`)
|
const parameters =
|
||||||
.then((response) => {
|
Object.keys(appliedParams).length !== 0
|
||||||
const link = document.createElement('a');
|
? appliedParams
|
||||||
link.href = response.data.data.file_url;
|
: Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]);
|
||||||
link.setAttribute('download', response.data.data.file_name);
|
|
||||||
document.body.appendChild(link);
|
axios.get('/report/logs/export', {
|
||||||
link.click();
|
params: { ...parameters },
|
||||||
handleClose();
|
}).then((response) => {
|
||||||
})
|
const link = document.createElement('a');
|
||||||
|
link.href = response.data.data.file_url;
|
||||||
|
link.setAttribute('download', response.data.data.file_name);
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
handleClose();
|
||||||
|
});
|
||||||
|
// axios.get(`report/logs/export`)
|
||||||
|
// .then((response) => {
|
||||||
|
// const link = document.createElement('a');
|
||||||
|
// link.href = response.data.data.file_url;
|
||||||
|
// link.setAttribute('download', response.data.data.file_name);
|
||||||
|
// document.body.appendChild(link);
|
||||||
|
// link.click();
|
||||||
|
// handleClose();
|
||||||
|
// })
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -216,54 +261,6 @@ export default function List() {
|
|||||||
</Menu>
|
</Menu>
|
||||||
</Stack>
|
</Stack>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{currentImportFileName && (
|
|
||||||
<Stack direction={'row'} spacing={2} sx={{ p: 2 }}>
|
|
||||||
<ButtonGroup variant="outlined" aria-label="outlined button group" fullWidth>
|
|
||||||
<Button onClick={handleImportButton} fullWidth>
|
|
||||||
{currentImportFileName ?? 'No File Selected'}
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
onClick={handleCancelImportButton}
|
|
||||||
size="small"
|
|
||||||
fullWidth={false}
|
|
||||||
sx={{ p: 1.8 }}
|
|
||||||
>
|
|
||||||
<CancelIcon color="error" />
|
|
||||||
</Button>
|
|
||||||
</ButtonGroup>
|
|
||||||
|
|
||||||
<LoadingButton
|
|
||||||
id="upload-button"
|
|
||||||
variant="outlined"
|
|
||||||
startIcon={<UploadIcon />}
|
|
||||||
sx={{ p: 1.8 }}
|
|
||||||
onClick={handleUpload}
|
|
||||||
loading={importLoading}
|
|
||||||
>
|
|
||||||
Upload
|
|
||||||
</LoadingButton>
|
|
||||||
</Stack>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{importResult && (
|
|
||||||
<Stack direction={'row'} sx={{ px: 2, pb: 2 }}>
|
|
||||||
<Box sx={{ color: 'text.secondary' }}>
|
|
||||||
Last Import Result :{' '}
|
|
||||||
<Box sx={{ color: 'success.main', display: 'inline' }}>
|
|
||||||
{importResult.total_success_row ?? 0}
|
|
||||||
</Box>{' '}
|
|
||||||
Row Processed,{' '}
|
|
||||||
<Box sx={{ color: 'error.main', display: 'inline' }}>
|
|
||||||
{importResult.total_failed_row}
|
|
||||||
</Box>{' '}
|
|
||||||
Failed, Report :{' '}
|
|
||||||
<a href={importResult.result_file?.url ?? '#'}>
|
|
||||||
{importResult.result_file?.name ?? '-'}
|
|
||||||
</a>
|
|
||||||
</Box>
|
|
||||||
</Stack>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -281,9 +278,9 @@ export default function List() {
|
|||||||
? appliedParams
|
? appliedParams
|
||||||
: Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]);
|
: Object.fromEntries([...searchParams.entries(), ['order', order], ['orderBy', orderBy]]);
|
||||||
|
|
||||||
const response = await axios.get('/report/logs', {
|
const response = await axios.get('/report/logs', {
|
||||||
params: { ...parameters },
|
params: { ...parameters },
|
||||||
});
|
});
|
||||||
|
|
||||||
setDataTableLoading(false);
|
setDataTableLoading(false);
|
||||||
setDataTableData(response.data);
|
setDataTableData(response.data);
|
||||||
|
|||||||
Reference in New Issue
Block a user