Update reason benefit
This commit is contained in:
@@ -34,6 +34,7 @@ class CorporateBenefitController extends Controller
|
|||||||
|
|
||||||
$benefit = CorporateBenefit::findOrFail($benefit_id);
|
$benefit = CorporateBenefit::findOrFail($benefit_id);
|
||||||
$benefit->active = $request->active == '1';
|
$benefit->active = $request->active == '1';
|
||||||
|
$benefit->reason = $request->reason;
|
||||||
|
|
||||||
if ($benefit->save()) {
|
if ($benefit->save()) {
|
||||||
return response()->json([
|
return response()->json([
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ class CorporateController extends Controller
|
|||||||
$request->validate([
|
$request->validate([
|
||||||
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
|
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
|
||||||
'name' => 'required',
|
'name' => 'required',
|
||||||
|
'payor_id' => 'required',
|
||||||
// 'logo' => 'required',
|
// 'logo' => 'required',
|
||||||
'policy_code' => 'required_with:policy_id',
|
'policy_code' => 'required_with:policy_id',
|
||||||
'policy_total_premi' => 'required_with:policy_code',
|
'policy_total_premi' => 'required_with:policy_code',
|
||||||
@@ -101,6 +102,7 @@ class CorporateController extends Controller
|
|||||||
if ($request->has('policy_code') && !empty($request->policy_code)) {
|
if ($request->has('policy_code') && !empty($request->policy_code)) {
|
||||||
$newCorporate->policies()->create([
|
$newCorporate->policies()->create([
|
||||||
'code' => $request->policy_code ?? NULL,
|
'code' => $request->policy_code ?? NULL,
|
||||||
|
'payor_id' => $request->payor_id ?? NULL,
|
||||||
'total_premi' => $request->policy_total_premi ?? NULL,
|
'total_premi' => $request->policy_total_premi ?? NULL,
|
||||||
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
|
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
|
||||||
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
|
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
|
||||||
@@ -302,6 +304,7 @@ class CorporateController extends Controller
|
|||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
|
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
|
||||||
|
'payor_id' => 'required',
|
||||||
'name' => 'required',
|
'name' => 'required',
|
||||||
'policy_code' => 'required_with:policy_id',
|
'policy_code' => 'required_with:policy_id',
|
||||||
'policy_total_premi' => 'required_with:policy_code',
|
'policy_total_premi' => 'required_with:policy_code',
|
||||||
@@ -328,6 +331,7 @@ class CorporateController extends Controller
|
|||||||
['id' => $request->policy_id],
|
['id' => $request->policy_id],
|
||||||
[
|
[
|
||||||
'code' => $request->policy_code ?? NULL,
|
'code' => $request->policy_code ?? NULL,
|
||||||
|
'payor_id' => $request->payor_id ?? NULL,
|
||||||
'total_premi' => $request->policy_total_premi ?? NULL,
|
'total_premi' => $request->policy_total_premi ?? NULL,
|
||||||
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
|
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
|
||||||
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
|
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ class CorporateMemberController extends Controller
|
|||||||
|
|
||||||
$member = Member::findOrFail($member_id);
|
$member = Member::findOrFail($member_id);
|
||||||
$member->active = $request->active == '1';
|
$member->active = $request->active == '1';
|
||||||
|
$member->reason = $request->reason;
|
||||||
|
|
||||||
if ($member->save()) {
|
if ($member->save()) {
|
||||||
return response()->json([
|
return response()->json([
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ Route::prefix('internal')->group(function () {
|
|||||||
Route::post('corporates/{corporate_id}/import-plan-benefit', [CorporateController::class, 'importPlanBenefit']);
|
Route::post('corporates/{corporate_id}/import-plan-benefit', [CorporateController::class, 'importPlanBenefit']);
|
||||||
Route::get('corporates/{corporate_id}/data-plan-benefit', [CorporateController::class, 'dataPlanBenefit']);
|
Route::get('corporates/{corporate_id}/data-plan-benefit', [CorporateController::class, 'dataPlanBenefit']);
|
||||||
Route::get('corporates/{corporate_id}/code', [CorporateController::class, 'corporateCode']);
|
Route::get('corporates/{corporate_id}/code', [CorporateController::class, 'corporateCode']);
|
||||||
|
Route::get('corporates/{corporate_id}/payor_id', [CorporateController::class, 'corporatePayorId']);
|
||||||
|
|
||||||
Route::get('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'index']);
|
Route::get('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'index']);
|
||||||
Route::post('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'store']);
|
Route::post('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'store']);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class Corporate extends Model
|
|||||||
'parent_id',
|
'parent_id',
|
||||||
'code',
|
'code',
|
||||||
'name',
|
'name',
|
||||||
|
'payor_id',
|
||||||
'reason',
|
'reason',
|
||||||
'welcome_message',
|
'welcome_message',
|
||||||
'help_text',
|
'help_text',
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ class CorporateBenefit extends Model
|
|||||||
'show_benefit_item',
|
'show_benefit_item',
|
||||||
'show_benefit_value',
|
'show_benefit_value',
|
||||||
'active',
|
'active',
|
||||||
|
'reason'
|
||||||
];
|
];
|
||||||
|
|
||||||
public static $doc_headers_to_field_map = [
|
public static $doc_headers_to_field_map = [
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ use Illuminate\Support\ServiceProvider;
|
|||||||
use App\Models\Corporate;
|
use App\Models\Corporate;
|
||||||
use App\Models\CorporateService;
|
use App\Models\CorporateService;
|
||||||
use App\Models\CorporatePlan;
|
use App\Models\CorporatePlan;
|
||||||
|
use App\Models\CorporateBenefit;
|
||||||
|
use App\Models\Member;
|
||||||
use App\Models\AuditTrail;
|
use App\Models\AuditTrail;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Str;
|
use Str;
|
||||||
@@ -52,6 +54,15 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
$this->logAuditTrail($model, 'deleted');
|
$this->logAuditTrail($model, 'deleted');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Member::updated(function ($model) {
|
||||||
|
|
||||||
|
$this->logAuditTrail($model, 'updated');
|
||||||
|
});
|
||||||
|
|
||||||
|
Member::deleted(function ($model) {
|
||||||
|
$this->logAuditTrail($model, 'deleted');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
// Corporate Service
|
// Corporate Service
|
||||||
CorporateService::updated(function ($model) {
|
CorporateService::updated(function ($model) {
|
||||||
@@ -73,6 +84,16 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
$this->logAuditTrail($model, 'deleted');
|
$this->logAuditTrail($model, 'deleted');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Corporate Benefits
|
||||||
|
CorporateBenefit::updated(function ($model) {
|
||||||
|
|
||||||
|
$this->logAuditTrail($model, 'updated');
|
||||||
|
});
|
||||||
|
|
||||||
|
CorporateBenefit::deleted(function ($model) {
|
||||||
|
$this->logAuditTrail($model, 'deleted');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('corporate_benefits', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->string('reason')->after('active')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('corporate_benefits', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->dropColumn('reason');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('members', function (Blueprint $table) {
|
||||||
|
$table->string('reason')->after('active')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('members', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->dropColumn('reason');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('corporates', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->string('payor_id')->after('parent_id')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('corporates', function (Blueprint $table) {
|
||||||
|
//
|
||||||
|
$table->dropColumn('payor_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -33,11 +33,12 @@ import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
|
|||||||
import AddIcon from '@mui/icons-material/Add';
|
import AddIcon from '@mui/icons-material/Add';
|
||||||
import UploadIcon from '@mui/icons-material/Upload';
|
import UploadIcon from '@mui/icons-material/Upload';
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
|
import HistoryIcon from '@mui/icons-material/History';
|
||||||
|
|
||||||
// hooks
|
// hooks
|
||||||
import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react';
|
import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react';
|
||||||
import useSettings from '../../../hooks/useSettings';
|
import useSettings from '../../../hooks/useSettings';
|
||||||
import { useParams, useSearchParams } from 'react-router-dom';
|
import {Link, useParams, useSearchParams } from 'react-router-dom';
|
||||||
// components
|
// components
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -61,12 +62,27 @@ import { LaravelPaginatedData } from '../../../@types/paginated-data';
|
|||||||
import BasePagination from '../../../components/BasePagination';
|
import BasePagination from '../../../components/BasePagination';
|
||||||
import { enqueueSnackbar } from 'notistack';
|
import { enqueueSnackbar } from 'notistack';
|
||||||
import { LoadingButton } from '@mui/lab';
|
import { LoadingButton } from '@mui/lab';
|
||||||
|
import DialogLog from './sections/DialogLog';
|
||||||
|
|
||||||
export default function PlanList() {
|
export default function PlanList() {
|
||||||
const { themeStretch } = useSettings();
|
const { themeStretch } = useSettings();
|
||||||
const { corporate_id } = useParams();
|
const { corporate_id } = useParams();
|
||||||
const [searchParams, setSearchParams] = useSearchParams();
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
const [importResult, setImportResult] = useState(null);
|
const [importResult, setImportResult] = useState(null);
|
||||||
|
|
||||||
|
const [openDialog, setOpenDialog] = useState(false);
|
||||||
|
const [isDialog, setIsDialog] = useState('');
|
||||||
|
const [edit, setEdit] = useState({});
|
||||||
|
const clickHandler = (isDialog: string) => {
|
||||||
|
switch (isDialog) {
|
||||||
|
case 'edit':
|
||||||
|
setIsDialog(isDialog);
|
||||||
|
setOpenDialog(true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
function SearchInput(props: any) {
|
function SearchInput(props: any) {
|
||||||
// SEARCH
|
// SEARCH
|
||||||
@@ -339,7 +355,9 @@ export default function PlanList() {
|
|||||||
color="success"
|
color="success"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleActivate(row, 'inactive');
|
// handleActivate(row, 'inactive');
|
||||||
|
clickHandler('edit');
|
||||||
|
setEdit({id: row.id, service_code: row.service_code, status: 'inactive'});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Active
|
Active
|
||||||
@@ -351,7 +369,9 @@ export default function PlanList() {
|
|||||||
color="error"
|
color="error"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleActivate(row, 'active');
|
// handleActivate(row, 'active');
|
||||||
|
clickHandler('edit');
|
||||||
|
setEdit({id: row.id, service_code: row.service_code, status: 'active'});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Inactive
|
Inactive
|
||||||
@@ -372,6 +392,11 @@ export default function PlanList() {
|
|||||||
>
|
>
|
||||||
{openEdit ? 'Save' : 'Edit'}
|
{openEdit ? 'Save' : 'Edit'}
|
||||||
</Button>
|
</Button>
|
||||||
|
<Link to={`/corporate/${corporate_id}/benefits/${row.id}/history`}>
|
||||||
|
<Button variant="outlined" color="primary" size="small" style={{marginLeft: "10px"}} startIcon={<HistoryIcon />}>
|
||||||
|
History
|
||||||
|
</Button>
|
||||||
|
</Link>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
{/* COLLAPSIBLE ROW */}
|
{/* COLLAPSIBLE ROW */}
|
||||||
@@ -832,6 +857,14 @@ export default function PlanList() {
|
|||||||
|
|
||||||
<BasePagination paginationData={dataTableData} onPageChange={handlePageChange} />
|
<BasePagination paginationData={dataTableData} onPageChange={handlePageChange} />
|
||||||
</Card>
|
</Card>
|
||||||
|
{isDialog === 'edit' && (
|
||||||
|
<DialogLog
|
||||||
|
data={edit}
|
||||||
|
openDialog={openDialog}
|
||||||
|
setOpenDialog={setOpenDialog}
|
||||||
|
title={{ name: 'Reason For Update' }}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ const DialogTopUpLimit = ({ title, openDialog, setOpenDialog, data }: MuiDialogP
|
|||||||
// const { plan_id } = useParams();
|
// const { plan_id } = useParams();
|
||||||
const handleActivate = (model: any, status: string) => {
|
const handleActivate = (model: any, status: string) => {
|
||||||
axios
|
axios
|
||||||
.put(`/plans/${id}/activation`, {
|
.put(`/benefits/${id}/activation`, {
|
||||||
// service_code: service.service_code,
|
// service_code: service.service_code,
|
||||||
active: status == 'active',
|
active: status == 'active',
|
||||||
reason: model.reason
|
reason: model.reason
|
||||||
@@ -135,7 +135,6 @@ const DialogTopUpLimit = ({ title, openDialog, setOpenDialog, data }: MuiDialogP
|
|||||||
reason : row.reason,
|
reason : row.reason,
|
||||||
id : id,
|
id : id,
|
||||||
}
|
}
|
||||||
console.log(data)
|
|
||||||
handleActivate(data, status)
|
handleActivate(data, status)
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.log('data gagal', data);
|
console.log('data gagal', data);
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export default function CustomizedAccordions() {
|
|||||||
|
|
||||||
const { themeStretch } = useSettings();
|
const { themeStretch } = useSettings();
|
||||||
|
|
||||||
const { corporate_id, plan_id } = useParams();
|
const { corporate_id, benefit_id } = useParams();
|
||||||
|
|
||||||
const [corporate, setCorporate] = useState<Corporate | null>();
|
const [corporate, setCorporate] = useState<Corporate | null>();
|
||||||
const [currentCorporate, setCurrentCorporate ] = useState<Corporate>();
|
const [currentCorporate, setCurrentCorporate ] = useState<Corporate>();
|
||||||
@@ -98,8 +98,8 @@ export default function CustomizedAccordions() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setCorporate(configuredCorporateContext.currentCorporate);
|
setCorporate(configuredCorporateContext.currentCorporate);
|
||||||
const model = 'App\\Models\\CorporatePlan';
|
const model = 'App\\Models\\CorporateBenefit';
|
||||||
const url = `/audittrail/${plan_id}?model=${model}`;
|
const url = `/audittrail/${benefit_id}?model=${model}`;
|
||||||
axios.get(url)
|
axios.get(url)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
setCurrentCorporate(res.data);
|
setCurrentCorporate(res.data);
|
||||||
|
|||||||
@@ -74,14 +74,7 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
|
|||||||
NewCorporateSchema = Yup.object().shape({
|
NewCorporateSchema = Yup.object().shape({
|
||||||
isEdited: Yup.boolean(),
|
isEdited: Yup.boolean(),
|
||||||
name: Yup.string().required('Name is required'),
|
name: Yup.string().required('Name is required'),
|
||||||
code: Yup.string().required('Corporate Code is required').test(
|
code: Yup.string().required('Corporate Code is required'),
|
||||||
'unique-code',
|
|
||||||
'Code must be unique',
|
|
||||||
async function (value) {
|
|
||||||
const existingCodes = await getExistingCodes();
|
|
||||||
return !existingCodes.includes(value);
|
|
||||||
}
|
|
||||||
),
|
|
||||||
active: Yup.boolean().required('Corporate Status is required'),
|
active: Yup.boolean().required('Corporate Status is required'),
|
||||||
type: Yup.string().required('Type is required'),
|
type: Yup.string().required('Type is required'),
|
||||||
welcome_message: Yup.string().required('Welcome Message is required'),
|
welcome_message: Yup.string().required('Welcome Message is required'),
|
||||||
@@ -200,11 +193,41 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getExistingPayorId() {
|
||||||
|
// axios
|
||||||
|
// .get('/corporates/create')
|
||||||
|
// .then((res) => {
|
||||||
|
// setCorporateGroups(res.data.corporate_groups);
|
||||||
|
// })
|
||||||
|
// .catch((err) => {
|
||||||
|
// enqueueSnackbar('Opps, failed to get Corporate Group List', { variant: 'error' });
|
||||||
|
// });
|
||||||
|
|
||||||
|
try {
|
||||||
|
let response = await axios.get('/corporates/1/code'); // get data all corporate
|
||||||
|
let codeCurrent = ""
|
||||||
|
if (isEdit){
|
||||||
|
let responseCodeCurrent = await axios.get(`/corporates/${currentCorporate?.id}/edit`); // get data current corporate
|
||||||
|
codeCurrent = responseCodeCurrent.data.payor_id; // get data code corporate current
|
||||||
|
}
|
||||||
|
// console.log(response.data);
|
||||||
|
let existingCodes = response.data.map(item => item); // get data code corporate all
|
||||||
|
|
||||||
|
let filteredArray = existingCodes.filter(e => e != codeCurrent)
|
||||||
|
console.log(filteredArray);
|
||||||
|
return filteredArray;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
enqueueSnackbar('Failed to fetch existing codes', { variant: 'error' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const defaultValues = useMemo(
|
const defaultValues = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
code: currentCorporate?.code || '',
|
code: currentCorporate?.code || '',
|
||||||
name: currentCorporate?.name || '',
|
name: currentCorporate?.name || '',
|
||||||
reason: currentCorporate?.reason || '',
|
reason: currentCorporate?.reason || '',
|
||||||
|
payor_id: currentCorporate?.payor_id || '',
|
||||||
welcome_message: currentCorporate?.welcome_message || '',
|
welcome_message: currentCorporate?.welcome_message || '',
|
||||||
help_text: currentCorporate?.help_text || '',
|
help_text: currentCorporate?.help_text || '',
|
||||||
active: currentCorporate?.id ? currentCorporate?.active === 1 : true,
|
active: currentCorporate?.id ? currentCorporate?.active === 1 : true,
|
||||||
@@ -285,6 +308,7 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
|
|||||||
formData.append('reason', data.reason);
|
formData.append('reason', data.reason);
|
||||||
formData.append('help_text', data.help_text);
|
formData.append('help_text', data.help_text);
|
||||||
formData.append('policy_id', data.policy_id);
|
formData.append('policy_id', data.policy_id);
|
||||||
|
formData.append('payor_id', data.payor_id);
|
||||||
formData.append('policy_code', data.policy_code);
|
formData.append('policy_code', data.policy_code);
|
||||||
formData.append('policy_total_premi', data.policy_total_premi);
|
formData.append('policy_total_premi', data.policy_total_premi);
|
||||||
formData.append('policy_minimal_deposit_percentage', data.policy_minimal_deposit_percentage);
|
formData.append('policy_minimal_deposit_percentage', data.policy_minimal_deposit_percentage);
|
||||||
@@ -494,6 +518,8 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
|
|||||||
<RHFTextField name="code" label="Corporate Code" disabled={isDisabled} />
|
<RHFTextField name="code" label="Corporate Code" disabled={isDisabled} />
|
||||||
|
|
||||||
<RHFTextField name="name" label="Corporate Name" disabled={isDisabled} />
|
<RHFTextField name="name" label="Corporate Name" disabled={isDisabled} />
|
||||||
|
|
||||||
|
<RHFTextField name="payor_id" label="Payor ID" disabled={isDisabled} />
|
||||||
|
|
||||||
{isEdit && (
|
{isEdit && (
|
||||||
<RHFTextField name="reason" label="Reason for update" />
|
<RHFTextField name="reason" label="Reason for update" />
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';
|
|||||||
// hooks
|
// hooks
|
||||||
import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react';
|
import React, { ChangeEvent, Component, useEffect, useRef, useState } from 'react';
|
||||||
import useSettings from '../../../hooks/useSettings';
|
import useSettings from '../../../hooks/useSettings';
|
||||||
import { useParams, useSearchParams } from 'react-router-dom';
|
import {Link, useParams, useSearchParams } from 'react-router-dom';
|
||||||
// components
|
// components
|
||||||
import axios from '../../../utils/axios';
|
import axios from '../../../utils/axios';
|
||||||
import { Plan } from '../../../@types/corporates';
|
import { Plan } from '../../../@types/corporates';
|
||||||
@@ -47,6 +47,7 @@ import BasePagination from '../../../components/BasePagination';
|
|||||||
import { enqueueSnackbar } from 'notistack';
|
import { enqueueSnackbar } from 'notistack';
|
||||||
import { LoadingButton } from '@mui/lab';
|
import { LoadingButton } from '@mui/lab';
|
||||||
import DialogLog from './sections/DialogLog';
|
import DialogLog from './sections/DialogLog';
|
||||||
|
import HistoryIcon from '@mui/icons-material/History';
|
||||||
|
|
||||||
export default function CorporatePlanList() {
|
export default function CorporatePlanList() {
|
||||||
const { themeStretch } = useSettings();
|
const { themeStretch } = useSettings();
|
||||||
@@ -54,6 +55,20 @@ export default function CorporatePlanList() {
|
|||||||
const [searchParams, setSearchParams] = useSearchParams();
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
const [importResult, setImportResult] = useState(null);
|
const [importResult, setImportResult] = useState(null);
|
||||||
|
|
||||||
|
const [openDialog, setOpenDialog] = useState(false);
|
||||||
|
const [isDialog, setIsDialog] = useState('');
|
||||||
|
const [edit, setEdit] = useState({});
|
||||||
|
const clickHandler = (isDialog: string) => {
|
||||||
|
switch (isDialog) {
|
||||||
|
case 'edit':
|
||||||
|
setIsDialog(isDialog);
|
||||||
|
setOpenDialog(true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Dummy Default Data
|
// Dummy Default Data
|
||||||
const [dataTableIsLoading, setDataTableLoading] = React.useState(true);
|
const [dataTableIsLoading, setDataTableLoading] = React.useState(true);
|
||||||
const [dataTableData, setDataTableData] = React.useState<LaravelPaginatedData>({
|
const [dataTableData, setDataTableData] = React.useState<LaravelPaginatedData>({
|
||||||
@@ -405,7 +420,9 @@ export default function CorporatePlanList() {
|
|||||||
color="success"
|
color="success"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleActivate(row, 'inactive');
|
// handleActivate(row, 'inactive');
|
||||||
|
clickHandler('edit');
|
||||||
|
setEdit({id: row.id, service_code: row.service_code, status: 'inactive'});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Active
|
Active
|
||||||
@@ -417,14 +434,22 @@ export default function CorporatePlanList() {
|
|||||||
color="error"
|
color="error"
|
||||||
size="small"
|
size="small"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
handleActivate(row, 'active');
|
// handleActivate(row, 'active');
|
||||||
|
clickHandler('edit');
|
||||||
|
setEdit({id: row.id, service_code: row.service_code, status: 'active'});
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Inactive
|
Inactive
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
</TableCell>
|
</TableCell>
|
||||||
{/* <TableCell align="right"><Button variant="outlined" color="success" size="small">Edit</Button></TableCell> */}
|
<TableCell align="right">
|
||||||
|
<Link to={`/corporate/${corporate_id}/members/${row.id}/history`}>
|
||||||
|
<Button variant="outlined" color="primary" size="small" style={{marginLeft: "10px"}} startIcon={<HistoryIcon />}>
|
||||||
|
History
|
||||||
|
</Button>
|
||||||
|
</Link>
|
||||||
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
{/* COLLAPSIBLE ROW */}
|
{/* COLLAPSIBLE ROW */}
|
||||||
<TableRow>
|
<TableRow>
|
||||||
@@ -606,6 +631,9 @@ export default function CorporatePlanList() {
|
|||||||
<TableCell style={headStyle} align="center">
|
<TableCell style={headStyle} align="center">
|
||||||
Status
|
Status
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
<TableCell style={headStyle} align="center">
|
||||||
|
Action
|
||||||
|
</TableCell>
|
||||||
{/* <TableCell style={headStyle} align="center">
|
{/* <TableCell style={headStyle} align="center">
|
||||||
Action
|
Action
|
||||||
</TableCell> */}
|
</TableCell> */}
|
||||||
@@ -639,6 +667,14 @@ export default function CorporatePlanList() {
|
|||||||
|
|
||||||
<BasePagination paginationData={dataTableData} onPageChange={handlePageChange} />
|
<BasePagination paginationData={dataTableData} onPageChange={handlePageChange} />
|
||||||
</Card>
|
</Card>
|
||||||
|
{isDialog === 'edit' && (
|
||||||
|
<DialogLog
|
||||||
|
data={edit}
|
||||||
|
openDialog={openDialog}
|
||||||
|
setOpenDialog={setOpenDialog}
|
||||||
|
title={{ name: 'Reason For Update' }}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,36 @@
|
|||||||
// react
|
import * as Yup from 'yup';
|
||||||
import { ReactElement, useEffect, useState } from 'react';
|
import { enqueueSnackbar, useSnackbar } from 'notistack';
|
||||||
// mui
|
import { useNavigate } from 'react-router-dom';
|
||||||
import {
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||||
Card,
|
import { useForm } from 'react-hook-form';
|
||||||
Checkbox,
|
import { yupResolver } from '@hookform/resolvers/yup';
|
||||||
Divider,
|
// @mui
|
||||||
Grid,
|
|
||||||
Input,
|
|
||||||
Link,
|
|
||||||
Stack,
|
|
||||||
Table,
|
|
||||||
TableCell,
|
|
||||||
TableContainer,
|
|
||||||
TableRow,
|
|
||||||
Typography,
|
|
||||||
} from '@mui/material';
|
|
||||||
import { styled } from '@mui/material/styles';
|
import { styled } from '@mui/material/styles';
|
||||||
// Component
|
|
||||||
import MuiDialog from '@/components/MuiDialog';
|
|
||||||
import { Box } from '@mui/material';
|
|
||||||
import { TextField } from '@mui/material';
|
|
||||||
import { DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers';
|
|
||||||
import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
|
|
||||||
import { fPostFormat } from '@/utils/formatTime';
|
|
||||||
import { LoadingButton } from '@mui/lab';
|
import { LoadingButton } from '@mui/lab';
|
||||||
import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';
|
import { Box, Button, Grid, Stack, Typography, Chip, Autocomplete } from '@mui/material';
|
||||||
import axios from '@/utils/axios';
|
import { CorporateService } from '../../../../@types/corporates';
|
||||||
import { enqueueSnackbar } from 'notistack';
|
// components
|
||||||
|
import { FormProvider, RHFTextField, RHFSwitch } from '../../../../components/hook-form';
|
||||||
|
import axios from '../../../../utils/axios';
|
||||||
|
import { LaravelPaginatedData } from '../../../../@types/paginated-data';
|
||||||
|
|
||||||
|
// import { Contact } from '../../../../@types/contact';
|
||||||
|
import { Link, useParams, useSearchParams } from 'react-router-dom';
|
||||||
|
|
||||||
|
// @mui
|
||||||
|
// components
|
||||||
|
import MuiDialog from '../../../../components/MuiDialog';
|
||||||
|
// React
|
||||||
|
import { ReactElement } from 'react';
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
const HeaderStyle = styled('header')(({ theme }) => ({
|
||||||
|
display: 'flex',
|
||||||
|
alignItems: 'center',
|
||||||
|
padding: theme.spacing(2),
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
}));
|
||||||
type DataContent = {
|
type DataContent = {
|
||||||
info: string;
|
info: string;
|
||||||
date: string;
|
date: string;
|
||||||
@@ -45,159 +48,165 @@ type MuiDialogProps = {
|
|||||||
data?: DataContent[];
|
data?: DataContent[];
|
||||||
};
|
};
|
||||||
|
|
||||||
const ItemNotificationStyle = styled(Card)(({ theme }) => ({
|
type FormValuesProps = {
|
||||||
boxShadow: 'none',
|
value: string;
|
||||||
padding: theme.spacing(1),
|
active: boolean;
|
||||||
borderRadius: 0.5,
|
};
|
||||||
color: 'black',
|
|
||||||
}));
|
|
||||||
|
|
||||||
const DialogLog = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => {
|
// ----------------------------------------------------------------------
|
||||||
const [openDialogClaim, setOpenDialogClaim] = useState(false);
|
|
||||||
const [dialogTitleClaim, setDialogTitleClaim] = useState('');
|
|
||||||
const [dateOfAdmission, setDateOfAdmission] = useState(new Date());
|
|
||||||
const [checkedBenefitIds, setCheckedBenefitIds] = useState([]);
|
|
||||||
const [benefitIds, setBenefitIds] = useState([]);
|
|
||||||
const [loadingLog, setLoadingLog] = useState(false);
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
const DialogTopUpLimit = ({ title, openDialog, setOpenDialog, data }: MuiDialogProps) => {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const [dataTableData, setDataTableData] = useState<LaravelPaginatedData>({
|
||||||
|
current_page: 1,
|
||||||
|
data: [],
|
||||||
|
path: '',
|
||||||
|
first_page_url: '',
|
||||||
|
last_page: 1,
|
||||||
|
last_page_url: '',
|
||||||
|
next_page_url: '',
|
||||||
|
prev_page_url: '',
|
||||||
|
per_page: 10,
|
||||||
|
from: 0,
|
||||||
|
to: 0,
|
||||||
|
total: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { id, service_code, status } = data;
|
||||||
|
|
||||||
|
const isEdit = id ? true : false;
|
||||||
|
|
||||||
|
const NewCorporateSchema = Yup.object().shape({
|
||||||
|
reason: Yup.string().required('Corporate Status is required'),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
const methods = useForm<FormValuesProps>({
|
||||||
|
resolver: yupResolver(NewCorporateSchema),
|
||||||
|
});
|
||||||
|
const {
|
||||||
|
reset,
|
||||||
|
watch,
|
||||||
|
handleSubmit,
|
||||||
|
formState: { isSubmitting },
|
||||||
|
} = methods;
|
||||||
|
|
||||||
|
const values = watch();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setBenefitIds(data.member.current_plan?.benefits.filter((benefit) => benefit.pivot.active == 1).map((benefit) => benefit.id))
|
if (openDialog === false) {
|
||||||
setCheckedBenefitIds(benefitIds)
|
reset();
|
||||||
console.log('Check All', benefitIds, 'X', data.member.current_plan?.benefits.map((benefit) => benefit.id))
|
}
|
||||||
}, [])
|
}, [openDialog, reset]);
|
||||||
|
|
||||||
const clickHandler = () => {
|
// const { plan_id } = useParams();
|
||||||
setDialogTitleClaim('Claim Details');
|
const handleActivate = (model: any, status: string) => {
|
||||||
setOpenDialogClaim(true);
|
axios
|
||||||
|
.put(`/members/${id}/activation`, {
|
||||||
|
// service_code: service.service_code,
|
||||||
|
active: status == 'active',
|
||||||
|
reason: model.reason
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
// Memuat ulang halaman saat ini
|
||||||
|
setOpenDialog(false)
|
||||||
|
window.location.reload();
|
||||||
|
// setDataTableData({
|
||||||
|
// ...dataTableData,
|
||||||
|
// data: dataTableData.data.map((service) => {
|
||||||
|
// let updatedService = service;
|
||||||
|
// if (id == service.id) {
|
||||||
|
// updatedService.status = res.data.status;
|
||||||
|
// }
|
||||||
|
// return updatedService;
|
||||||
|
// }),
|
||||||
|
// });
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleCheckAll = (event) => {
|
const onSubmit = async (row : ReturnType<typeof createData>) => {
|
||||||
if (event.target.checked) {
|
try {
|
||||||
setCheckedBenefitIds(benefitIds)
|
const data = {
|
||||||
} else {
|
service_code : service_code,
|
||||||
setCheckedBenefitIds([])
|
reason : row.reason,
|
||||||
|
id : id,
|
||||||
|
}
|
||||||
|
handleActivate(data, status)
|
||||||
|
} catch (error: any) {
|
||||||
|
console.log('data gagal', data);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const handleCheckChange = (event, benefit) => {
|
const ascent = document?.querySelector('ascent');
|
||||||
if ( event.target.checked ) {
|
if (ascent != null) {
|
||||||
setCheckedBenefitIds([...checkedBenefitIds, benefit.id])
|
ascent.innerHTML = '';
|
||||||
} else {
|
|
||||||
// setCheckedBenefitIds([])
|
|
||||||
setCheckedBenefitIds(checkedBenefitIds.filter((benefitId) => benefitId !== benefit.id))
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
const handleDownloadLog = (row) => {
|
function createData(corporateService: CorporateService): CorporateService {
|
||||||
setLoadingLog(true);
|
return {
|
||||||
axios
|
...corporateService,
|
||||||
.post(`generate-log/${row.id}`, {
|
};
|
||||||
date_of_admission : dateOfAdmission,
|
|
||||||
benefit_ids : checkedBenefitIds
|
|
||||||
}, {
|
|
||||||
responseType: 'blob',
|
|
||||||
})
|
|
||||||
.then((response) => {
|
|
||||||
window.open(URL.createObjectURL(response.data));
|
|
||||||
setLoadingLog(false);
|
|
||||||
setOpenDialog(false);
|
|
||||||
})
|
|
||||||
.catch((response) => {
|
|
||||||
enqueueSnackbar(response.message, { variant: 'error' });
|
|
||||||
setLoadingLog(false);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const getContent = () => (
|
const getContent = (props: { row: ReturnType<typeof createData> }) => (
|
||||||
<Stack sx={{ marginTop: 2 }}>
|
<FormProvider methods={methods} onSubmit={handleSubmit(onSubmit)}>
|
||||||
<ItemNotificationStyle>
|
<Stack spacing={3}>
|
||||||
<Stack>
|
<Box sx={{ width: '100%', typography: 'body1', p: 2, mt: 1 }}>
|
||||||
<Grid container spacing={2}>
|
<Grid item xs={12}>
|
||||||
<Grid item xs={12}>
|
<RHFTextField name="reason" label="Reason for update" />
|
||||||
<LocalizationProvider dateAdapter={AdapterDateFns}>
|
|
||||||
<DesktopDatePicker
|
|
||||||
inputFormat="dd/MM/Y"
|
|
||||||
value={dateOfAdmission}
|
|
||||||
onChange={(value) => {
|
|
||||||
setDateOfAdmission(new Date(fPostFormat(value)));
|
|
||||||
// console.log('value')
|
|
||||||
}}
|
|
||||||
renderInput={(params) => (
|
|
||||||
<TextField
|
|
||||||
{...params}
|
|
||||||
fullWidth
|
|
||||||
label="Date of Admission"
|
|
||||||
placeholder="dd/mm/yyyy"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</LocalizationProvider>
|
|
||||||
</Grid>
|
|
||||||
<Grid item xs={12} sx={{marginTop: 2}}>
|
|
||||||
<Stack direction="row" alignItems="center" justifyContent={'space-between'}>
|
|
||||||
<Typography variant="body1" fontWeight={800}>List Of Benefit</Typography>
|
|
||||||
|
|
||||||
<Stack direction="row" alignItems="center">
|
|
||||||
<Typography>All</Typography>
|
|
||||||
<Checkbox onChange={handleCheckAll} checked={benefitIds.length == checkedBenefitIds.length}/>
|
|
||||||
</Stack>
|
|
||||||
</Stack>
|
|
||||||
</Grid>
|
|
||||||
<Grid item xs={12}>
|
|
||||||
<Stack divider={<Divider flexItem />}>
|
|
||||||
{ data.member.current_plan?.benefits && (
|
|
||||||
data.member.current_plan?.benefits.filter((benefit) => benefit.pivot.active == 1).map((benefit, index) => (
|
|
||||||
<Stack direction="row" alignItems="center" key={index}>
|
|
||||||
<Box sx={{ width: '100%' }}>
|
|
||||||
<Typography>{benefit.code} {benefit.description ? ` - ${benefit.description} ` : ''}</Typography>
|
|
||||||
</Box>
|
|
||||||
<Checkbox checked={checkedBenefitIds.includes(benefit.id)} onClick={(event) => {handleCheckChange(event, benefit)} } />
|
|
||||||
</Stack>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</Stack>
|
|
||||||
{/* <TableContainer>
|
|
||||||
<Table>
|
|
||||||
<TableRow>
|
|
||||||
<TableCell>
|
|
||||||
ASD
|
|
||||||
</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
ASD
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
</Table>
|
|
||||||
</TableContainer> */}
|
|
||||||
</Grid>
|
|
||||||
<Grid item xs={12}>
|
|
||||||
|
|
||||||
<LoadingButton
|
|
||||||
id="upload-button"
|
|
||||||
variant="outlined"
|
|
||||||
fullWidth
|
|
||||||
startIcon={<InsertDriveFileIcon />}
|
|
||||||
onClick={() => {handleDownloadLog(data.member)}}
|
|
||||||
loading={loadingLog}
|
|
||||||
>
|
|
||||||
Download LOG
|
|
||||||
</LoadingButton>
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</Stack>
|
|
||||||
</ItemNotificationStyle>
|
<Box sx={{ pt: 5 }}>
|
||||||
</Stack>
|
<Stack
|
||||||
|
alignItems="center"
|
||||||
|
justifyContent="flex-end"
|
||||||
|
direction={{ xs: 'column', md: 'row' }}
|
||||||
|
// sx={{ textAlign: { xs: 'center', md: 'left' } }}
|
||||||
|
spacing={2}
|
||||||
|
>
|
||||||
|
<Stack direction="row" spacing={1}>
|
||||||
|
<Button
|
||||||
|
sx={{
|
||||||
|
boxShadow: 'none',
|
||||||
|
}}
|
||||||
|
variant="outlined"
|
||||||
|
size="medium"
|
||||||
|
fullWidth={true}
|
||||||
|
onClick={() => setOpenDialog(false)}
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</Button>
|
||||||
|
<LoadingButton
|
||||||
|
sx={{ boxShadow: '0px 2px 4px rgba(0, 0, 0, 0.1)' }}
|
||||||
|
type="submit"
|
||||||
|
variant="contained"
|
||||||
|
size="medium"
|
||||||
|
fullWidth={true}
|
||||||
|
loading={isSubmitting}
|
||||||
|
>
|
||||||
|
Save
|
||||||
|
</LoadingButton>
|
||||||
|
</Stack>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
|
</FormProvider>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<MuiDialog
|
||||||
<MuiDialog
|
title={title}
|
||||||
title={title}
|
openDialog={openDialog}
|
||||||
openDialog={openDialog}
|
setOpenDialog={setOpenDialog}
|
||||||
setOpenDialog={setOpenDialog}
|
content={getContent()}
|
||||||
content={getContent()}
|
maxWidth="sm"
|
||||||
/>
|
/>
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default DialogLog;
|
export default DialogTopUpLimit;
|
||||||
@@ -0,0 +1,177 @@
|
|||||||
|
// @mui
|
||||||
|
import {
|
||||||
|
Box,
|
||||||
|
Button,
|
||||||
|
Card,
|
||||||
|
Collapse,
|
||||||
|
Container,
|
||||||
|
FormControl,
|
||||||
|
Grid,
|
||||||
|
IconButton,
|
||||||
|
InputLabel,
|
||||||
|
MenuItem,
|
||||||
|
OutlinedInput,
|
||||||
|
Paper,
|
||||||
|
Select,
|
||||||
|
SelectChangeEvent,
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableContainer,
|
||||||
|
TableHead,
|
||||||
|
TableRow,
|
||||||
|
TextField,
|
||||||
|
Typography,
|
||||||
|
Badge,
|
||||||
|
Stack,
|
||||||
|
} from '@mui/material';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { useParams } from 'react-router-dom';
|
||||||
|
import { styled } from '@mui/material/styles';
|
||||||
|
import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp';
|
||||||
|
import MuiAccordion, { AccordionProps } from '@mui/material/Accordion';
|
||||||
|
import { useContext, useEffect, useState } from 'react';
|
||||||
|
import MuiAccordionSummary, {
|
||||||
|
AccordionSummaryProps,
|
||||||
|
} from '@mui/material/AccordionSummary';
|
||||||
|
import useSettings from '../../../../hooks/useSettings';
|
||||||
|
import axios from '../../../../utils/axios';
|
||||||
|
import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext';
|
||||||
|
import MuiAccordionDetails from '@mui/material/AccordionDetails';
|
||||||
|
import HeaderBreadcrumbs from '../../../../components/HeaderBreadcrumbs';
|
||||||
|
import { Corporate } from '@/@types/corporates';
|
||||||
|
import { fDate, fDateTime } from '@/utils/formatTime';
|
||||||
|
|
||||||
|
const Accordion = styled((props: AccordionProps) => (
|
||||||
|
<MuiAccordion disableGutters elevation={0} square {...props} />
|
||||||
|
))(({ theme }) => ({
|
||||||
|
border: `1px solid ${theme.palette.divider}`,
|
||||||
|
'&:not(:last-child)': {
|
||||||
|
borderBottom: 0,
|
||||||
|
},
|
||||||
|
'&:before': {
|
||||||
|
display: 'none',
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
const AccordionSummary = styled((props: AccordionSummaryProps) => (
|
||||||
|
<MuiAccordionSummary
|
||||||
|
expandIcon={<ArrowForwardIosSharpIcon sx={{ fontSize: '0.9rem' }} />}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
))(({ theme }) => ({
|
||||||
|
backgroundColor:
|
||||||
|
theme.palette.mode === 'dark'
|
||||||
|
? 'rgba(255, 255, 255, .05)'
|
||||||
|
: 'rgba(0, 0, 0, .03)',
|
||||||
|
flexDirection: 'row-reverse',
|
||||||
|
'& .MuiAccordionSummary-expandIconWrapper.Mui-expanded': {
|
||||||
|
transform: 'rotate(90deg)',
|
||||||
|
},
|
||||||
|
'& .MuiAccordionSummary-content': {
|
||||||
|
marginLeft: theme.spacing(1),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({
|
||||||
|
padding: theme.spacing(2),
|
||||||
|
borderTop: '1px solid rgba(0, 0, 0, .125)',
|
||||||
|
}));
|
||||||
|
|
||||||
|
export default function CustomizedAccordions() {
|
||||||
|
const [expanded, setExpanded] = React.useState<string | false>('panel1');
|
||||||
|
|
||||||
|
const handleChange =
|
||||||
|
(panel: string) => (event: React.SyntheticEvent, newExpanded: boolean) => {
|
||||||
|
setExpanded(newExpanded ? panel : false);
|
||||||
|
};
|
||||||
|
const pageTitle = 'Audittrail Corporate';
|
||||||
|
|
||||||
|
const { themeStretch } = useSettings();
|
||||||
|
|
||||||
|
const { corporate_id, member_id } = useParams();
|
||||||
|
|
||||||
|
const [corporate, setCorporate] = useState<Corporate | null>();
|
||||||
|
const [currentCorporate, setCurrentCorporate ] = useState<Corporate>();
|
||||||
|
|
||||||
|
const configuredCorporateContext = useContext(ConfiguredCorporateContext);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setCorporate(configuredCorporateContext.currentCorporate);
|
||||||
|
const model = 'App\\Models\\Member';
|
||||||
|
const url = `/audittrail/${member_id}?model=${model}`;
|
||||||
|
axios.get(url)
|
||||||
|
.then((res) => {
|
||||||
|
setCurrentCorporate(res.data);
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Terjadi kesalahan:', error);
|
||||||
|
});
|
||||||
|
|
||||||
|
}, [configuredCorporateContext]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<HeaderBreadcrumbs
|
||||||
|
heading={pageTitle}
|
||||||
|
links={[
|
||||||
|
{
|
||||||
|
name: 'Corporates',
|
||||||
|
href: '/corporates',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: corporate?.name ?? '-',
|
||||||
|
href: '/corporate/' + corporate_id + '/members',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Audittrail Corporate',
|
||||||
|
href: '/corporate/' + corporate_id + '/members',
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
{currentCorporate?.data.map((item, index) => (
|
||||||
|
<Accordion
|
||||||
|
key={index}
|
||||||
|
expanded={expanded === `panel${index}`}
|
||||||
|
onChange={handleChange(`panel${index}`)}
|
||||||
|
>
|
||||||
|
<AccordionSummary
|
||||||
|
aria-controls={`panel${index}d-content`}
|
||||||
|
id={`panel${index}d-header`}
|
||||||
|
>
|
||||||
|
<Typography>{`Data has ${item.action} by ${item.user_id} on ${fDateTime(item.updated_at)}`}</Typography>
|
||||||
|
</AccordionSummary>
|
||||||
|
<AccordionDetails>
|
||||||
|
<TableHead>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell align="center">Field</TableCell>
|
||||||
|
<TableCell align="center">Old Value</TableCell>
|
||||||
|
<TableCell align="center">New Values</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
</TableHead>
|
||||||
|
<TableBody>
|
||||||
|
{Object.entries(item.old_values).map(([key, value]) => {
|
||||||
|
let renderedValue;
|
||||||
|
if (key !== 'reason') {
|
||||||
|
return null; // Melewati iterasi saat key adalah 'deleted_by'
|
||||||
|
}
|
||||||
|
renderedValue = item.new_values[key];
|
||||||
|
|
||||||
|
const field = key.charAt(0).toUpperCase() + key.slice(1);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TableRow key={key} sx={{ '&:last-child td, &:last-child th': { border: 0 } }}>
|
||||||
|
<TableCell>{`${field}`}</TableCell>
|
||||||
|
<TableCell align="center">{`${value}`}</TableCell>
|
||||||
|
<TableCell align="center">{renderedValue}</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
|
||||||
|
</TableBody>
|
||||||
|
</AccordionDetails>
|
||||||
|
</Accordion>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -129,11 +129,18 @@ export default function Router() {
|
|||||||
path: ':corporate_id/benefits',
|
path: ':corporate_id/benefits',
|
||||||
element: <Benefits />,
|
element: <Benefits />,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: ':corporate_id/benefits/:benefit_id/history',
|
||||||
|
element: <CorporateBenefitsHistory />,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: ':corporate_id/members',
|
path: ':corporate_id/members',
|
||||||
element: <CorporateMembers />,
|
element: <CorporateMembers />,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: ':corporate_id/members/:member_id/history',
|
||||||
|
element: <CorporateHistoryMembers />,
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
path: ':corporate_id/divisions',
|
path: ':corporate_id/divisions',
|
||||||
@@ -363,6 +370,7 @@ const CorporateDivisionsCreate = Loadable(
|
|||||||
);
|
);
|
||||||
|
|
||||||
const CorporateMembers = Loadable(lazy(() => import('../pages/Corporates/Member/Index')));
|
const CorporateMembers = Loadable(lazy(() => import('../pages/Corporates/Member/Index')));
|
||||||
|
const CorporateHistoryMembers = Loadable(lazy(() => import('../pages/Corporates/Member/sections/History')));
|
||||||
|
|
||||||
const BenefitCreate = Loadable(lazy(() => import('../pages/Corporates/Benefit/Create')));
|
const BenefitCreate = Loadable(lazy(() => import('../pages/Corporates/Benefit/Create')));
|
||||||
const Benefits = Loadable(lazy(() => import('../pages/Corporates/Benefit/Index')));
|
const Benefits = Loadable(lazy(() => import('../pages/Corporates/Benefit/Index')));
|
||||||
@@ -373,6 +381,9 @@ const CorporateBenefitsCreate = Loadable(
|
|||||||
const CorporateBenefits = Loadable(
|
const CorporateBenefits = Loadable(
|
||||||
lazy(() => import('../pages/Corporates/CorporateBenefit/Index'))
|
lazy(() => import('../pages/Corporates/CorporateBenefit/Index'))
|
||||||
);
|
);
|
||||||
|
const CorporateBenefitsHistory = Loadable(
|
||||||
|
lazy(() => import('../pages/Corporates/Benefit/sections/History'))
|
||||||
|
);
|
||||||
|
|
||||||
const CorporatePlanCreate = Loadable(
|
const CorporatePlanCreate = Loadable(
|
||||||
lazy(() => import('../pages/Corporates/CorporatePlan/CreateUpdate'))
|
lazy(() => import('../pages/Corporates/CorporatePlan/CreateUpdate'))
|
||||||
|
|||||||
Reference in New Issue
Block a user