Parent Corporate

This commit is contained in:
R
2022-09-01 16:03:52 +07:00
parent 2eb955467d
commit 2215f61db4
9 changed files with 190 additions and 21 deletions

View File

@@ -34,8 +34,10 @@ class CorporateController extends Controller
->withCount([
'employees',
'corporatePlans',
'corporateBenefits'
'corporateBenefits',
'subCorporates'
])
->where('type', 'corporate')
->paginate(10);
return $corporates;
@@ -47,7 +49,16 @@ class CorporateController extends Controller
*/
public function create()
{
return view('internal::create');
$corporateGroups = Corporate::whereNull('parent_id')->get()->map(function($corporate) {
return [
'value' => $corporate->id,
'label' => $corporate->name,
];
});
return response()->json([
'corporate_groups' => $corporateGroups
]);
}
/**
@@ -75,19 +86,22 @@ class CorporateController extends Controller
DB::beginTransaction();
$newCorporate = Corporate::create($request->all());
$newCorporate->policies()->create([
'code' => $request->policy_code ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
'minimal_alert_percentage' => $request->policy_minimal_alert_percentage ?? NULL,
'minimal_alert_net' => $request->policy_minimal_alert_net ?? NULL,
'minimal_stop_service_percentage' => $request->policy_stop_service_percentage ?? NULL,
'minimal_stop_service_net' => $request->policy_stop_service_net ?? NULL,
'start' => $request->policy_start ?? NULL,
'end' => $request->policy_end ?? NULL,
'active' => $request->policy_active ?? true,
]);
if ($request->has('policy_code') && !empty($request->policy_code)) {
// dd($request->policy_code, 'fuck you');
$newCorporate->policies()->create([
'code' => $request->policy_code ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
'minimal_alert_percentage' => $request->policy_minimal_alert_percentage ?? NULL,
'minimal_alert_net' => $request->policy_minimal_alert_net ?? NULL,
'minimal_stop_service_percentage' => $request->policy_stop_service_percentage ?? NULL,
'minimal_stop_service_net' => $request->policy_stop_service_net ?? NULL,
'start' => $request->policy_start ?? NULL,
'end' => $request->policy_end ?? NULL,
'active' => $request->policy_active ?? true,
]);
}
DB::commit();
} catch (\Exception $e) {

View File

@@ -12,6 +12,8 @@ class Corporate extends Model
use HasFactory, SoftDeletes, Blameable;
protected $fillable = [
'type',
'parent_id',
'code',
'name',
'welcome_message',
@@ -89,4 +91,14 @@ class Corporate extends Model
{
return $this->hasMany(CorporateService::class, 'corporate_id');
}
public function parent()
{
return $this->belongsTo(Corporate::class, 'parent_id');
}
public function subCorporates()
{
return $this->hasMany(Corporate::class, 'parent_id');
}
}

View File

@@ -15,6 +15,8 @@ return new class extends Migration
{
Schema::create('corporates', function (Blueprint $table) {
$table->id();
$table->string('type')->nullable();
$table->foreignId('parent_id')->nullable();
$table->string('code');
$table->string('name')->nullable();
$table->text('welcome_message')->nullable();

View File

@@ -18,7 +18,10 @@ class DatabaseSeeder extends Seeder
$this->call([
DummyMemberSeeder::class,
DummyCorporateSeeder::class
DrugSeeder::class,
IcdSeeder::class,
ServiceSeeder::class,
SpecialitiesSeeder::class,
]);
}
}

View File

@@ -19,7 +19,7 @@
<!-- Using Local Font -->
<link rel="stylesheet" type="text/css" href="/fonts/index.css" />
<title>Minimal UI Kit</title>
<title>Dashboard</title>
<meta name="description"
content="The starting point for your next project with Minimal UI Kit, built on the newest version of Material-UI ©, ready to be customized to your style" />
<meta name="keywords" content="react,material,kit,application,dashboard,admin,template" />

View File

@@ -50,6 +50,7 @@
"@mui/x-data-grid": "^5.14.0",
"@mui/x-date-pickers": "5.0.0-beta.2",
"@vitejs/plugin-react": "^1.3.2",
"apexcharts": "^3.35.5",
"axios": "^0.27.2",
"change-case": "^4.1.2",
"csstype": "^3.1.0",
@@ -63,6 +64,7 @@
"nprogress": "^0.2.0",
"numeral": "^2.0.6",
"react": "^17.0.2",
"react-apexcharts": "^1.4.0",
"react-dom": "^17.0.2",
"react-dropzone": "^14.2.2",
"react-helmet-async": "^1.3.0",

View File

@@ -26,6 +26,7 @@ specifiers:
'@typescript-eslint/eslint-plugin': ^5.30.7
'@typescript-eslint/parser': ^5.30.7
'@vitejs/plugin-react': ^1.3.2
apexcharts: ^3.35.5
axios: ^0.27.2
change-case: ^4.1.2
csstype: ^3.1.0
@@ -52,6 +53,7 @@ specifiers:
numeral: ^2.0.6
prettier: ^2.7.1
react: ^17.0.2
react-apexcharts: ^1.4.0
react-dom: ^17.0.2
react-dropzone: ^14.2.2
react-helmet-async: ^1.3.0
@@ -85,6 +87,7 @@ dependencies:
'@mui/x-data-grid': 5.14.0_jme7ixtmk52br6jr4ylfw5kcgy
'@mui/x-date-pickers': 5.0.0-beta.2_ehiw5wpabbvfr6l3cdf73755vi
'@vitejs/plugin-react': 1.3.2
apexcharts: 3.35.5
axios: 0.27.2
change-case: 4.1.2
csstype: 3.1.0
@@ -98,6 +101,7 @@ dependencies:
nprogress: 0.2.0
numeral: 2.0.6
react: 17.0.2
react-apexcharts: 1.4.0_vi3rbmehlu6egtlq2bz7addea4
react-dom: 17.0.2_react@17.0.2
react-dropzone: 14.2.2_react@17.0.2
react-helmet-async: 1.3.0_sfoxds7t5ydpegc3knd667wn6m
@@ -2661,6 +2665,17 @@ packages:
color-convert: 2.0.1
dev: true
/apexcharts/3.35.5:
resolution: {integrity: sha512-Bi3aq35xWntI71JlywXTBBAOhuKTbB4wijKw4ClkIAFV904YDkHPIJ8N9LcZq9fvVb0VX1AEmyOFBOB2Vwsuew==}
dependencies:
svg.draggable.js: 2.2.2
svg.easing.js: 2.0.0
svg.filter.js: 2.0.2
svg.pathmorphing.js: 0.1.3
svg.resize.js: 1.4.3
svg.select.js: 3.0.1
dev: false
/argparse/2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
dev: true
@@ -4925,6 +4940,17 @@ packages:
safe-buffer: 5.2.1
dev: true
/react-apexcharts/1.4.0_vi3rbmehlu6egtlq2bz7addea4:
resolution: {integrity: sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q==}
peerDependencies:
apexcharts: ^3.18.0
react: '>=0.13'
dependencies:
apexcharts: 3.35.5
prop-types: 15.8.1
react: 17.0.2
dev: false
/react-dom/17.0.2_react@17.0.2:
resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==}
peerDependencies:
@@ -5444,6 +5470,60 @@ packages:
resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
dev: false
/svg.draggable.js/2.2.2:
resolution: {integrity: sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==}
engines: {node: '>= 0.8.0'}
dependencies:
svg.js: 2.7.1
dev: false
/svg.easing.js/2.0.0:
resolution: {integrity: sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==}
engines: {node: '>= 0.8.0'}
dependencies:
svg.js: 2.7.1
dev: false
/svg.filter.js/2.0.2:
resolution: {integrity: sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==}
engines: {node: '>= 0.8.0'}
dependencies:
svg.js: 2.7.1
dev: false
/svg.js/2.7.1:
resolution: {integrity: sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==}
dev: false
/svg.pathmorphing.js/0.1.3:
resolution: {integrity: sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==}
engines: {node: '>= 0.8.0'}
dependencies:
svg.js: 2.7.1
dev: false
/svg.resize.js/1.4.3:
resolution: {integrity: sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==}
engines: {node: '>= 0.8.0'}
dependencies:
svg.js: 2.7.1
svg.select.js: 2.1.2
dev: false
/svg.select.js/2.1.2:
resolution: {integrity: sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==}
engines: {node: '>= 0.8.0'}
dependencies:
svg.js: 2.7.1
dev: false
/svg.select.js/3.0.1:
resolution: {integrity: sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==}
engines: {node: '>= 0.8.0'}
dependencies:
svg.js: 2.7.1
dev: false
/temp-dir/2.0.0:
resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
engines: {node: '>=8'}

View File

@@ -3,7 +3,7 @@ import { useSnackbar } from 'notistack';
import { useNavigate } from 'react-router-dom';
import { useCallback, useEffect, useMemo, useState } from 'react';
// form
import { useForm } from 'react-hook-form';
import { Controller, useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
// @mui
import { styled } from '@mui/material/styles';
@@ -11,8 +11,15 @@ import { LoadingButton } from '@mui/lab';
import {
Box,
Card,
FormControl,
FormHelperText,
Grid,
InputLabel,
Menu,
MenuItem,
OutlinedInput,
Select,
SelectChangeEvent,
Stack,
Typography,
} from '@mui/material';
@@ -29,6 +36,7 @@ import {
RHFMultiCheckbox,
RHFCheckbox,
RHFCustomMultiCheckbox,
RHFSelect,
} from '../../components/hook-form';
import { Corporate } from '../../@types/corporates';
import axios from '../../utils/axios';
@@ -52,6 +60,7 @@ type Props = {
export default function CorporateForm({ isEdit, currentCorporate }: Props) {
const navigate = useNavigate();
const [corporate_groups, setCorporateGroups] = useState([])
// const [ errors, setErrors ] = useState<{ [key: string]: string }>({});
@@ -61,6 +70,11 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
name: Yup.string().required('Name is required'),
code: Yup.string().required('Corporate Code is required'),
active: Yup.boolean().required('Corporate Status is required'),
type: Yup.string().required('Type is required'),
parent_id: Yup.string().when("type", {
is: 'subcorporate',
then: Yup.string().required("Corporate is required because type is Sub Corporate")
})
});
const defaultValues = useMemo(
@@ -82,6 +96,7 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
policy_start: currentCorporate?.current_policy?.start || '',
policy_end: currentCorporate?.current_policy?.end || '',
linking_rules: currentCorporate?.linking_rules || ['nrik', 'nik', 'member_id'],
type: currentCorporate?.type || 'corporate'
}),
// eslint-disable-next-line react-hooks/exhaustive-deps
[currentCorporate]
@@ -113,6 +128,14 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
reset(defaultValues);
}
axios.get('/corporates/create')
.then((res) => {
setCorporateGroups(res.data.corporate_groups)
})
.catch((err) => {
enqueueSnackbar("Opps, failed to get Corporate Group List", "error")
})
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isEdit, currentCorporate]);
@@ -222,6 +245,20 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
"label" : "E-Mail"
},
]
const types = [
{
"value" : "corporate",
"label" : "Corporate"
},
{
"value" : "subcorporate",
"label" : "Sub Corporate"
},
]
const handleTypeChange = (event: SelectChangeEvent) => {
setValue('type', event.target.value)
}
return (
@@ -232,6 +269,25 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
<Card sx={{ p: 3 }}>
<Stack spacing={3}>
<Grid item xs={12}><Typography variant='h5'>Corporate Profile</Typography></Grid>
<RHFSelect name="type" label="Type" placeholder="Type">
<option value="" />
{types.map((option, index) => (
<option key={index} value={option.value}>
{option.label}
</option>
))}
</RHFSelect>
{/* // TODO Use Autocomplete */}
{( values.type == 'subcorporate' && <RHFSelect name="parent_id" label="Parent Corporate Group" placeholder="Parent Corporate Group">
<option value="" />
{corporate_groups.map((option, index) => (
<option key={index} value={option.value}>
{option.label}
</option>
))}
</RHFSelect> )}
<RHFTextField name="code" label="Corporate Code" />
@@ -290,7 +346,7 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
</Stack>
</Grid>
<Grid item xs={12} md={12}>
{( values.type == 'corporate' && <Grid item xs={12} md={12}>
{/* <Card sx={{ p:3, mb:3, background: 'gray', color: 'white' }}><Typography>Policy Detail</Typography></Card> */}
<Card sx={{ p: 3 }}>
<Stack spacing={3} mt={2}>
@@ -354,7 +410,7 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
</Stack>
</Card>
</Grid>
</Grid> )}
<Grid item xs={12} md={4}>
<LoadingButton type="submit" variant="contained" size="large" fullWidth={true} loading={isSubmitting}>

View File

@@ -116,7 +116,7 @@ export default function PlanList() {
}
const handleInactiveAction = (formularium : any) => {
enqueueSnackbar('Fuck yuo'), { variant: 'error' });
enqueueSnackbar('Fuck yuo'), { variant: 'error' };
axios
.put('/corporates/'+corporate_id+'/formulariums/'+formularium.id+'/activate')
.then(() => {