diff --git a/Modules/Client/Http/Controllers/Api/ClaimReportController.php b/Modules/Client/Http/Controllers/Api/ClaimReportController.php index b3edd3a6..b83234ad 100644 --- a/Modules/Client/Http/Controllers/Api/ClaimReportController.php +++ b/Modules/Client/Http/Controllers/Api/ClaimReportController.php @@ -25,6 +25,7 @@ class ClaimReportController extends Controller $corporateEmployee->where('corporate_id', $corporateId); }); }) + ->whereHas('claim', fn ($query) => $query->where('status', 'approved')) ->where('status', 'approved') ->get(); @@ -38,10 +39,21 @@ class ClaimReportController extends Controller ->where('status', 'approved') ->get(); + $disbrusments = ClaimRequest::query() + ->whereHas('member', function ($query) use ($corporateId) { + $query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) { + $corporateEmployee->where('corporate_id', $corporateId); + }); + }) + ->whereHas('claim', fn ($query) => $query->where('status', 'disbrusmented')) + ->where('status', 'approved') + ->get(); + return Helper::responseJson([ 'requesteds' => count($requesteds), 'approveds' => count($approveds), - 'rejecteds' => count($rejecteds) + 'rejecteds' => count($rejecteds), + 'disbrusments' => count($disbrusments) ]); } diff --git a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php index 05032d18..58266885 100644 --- a/Modules/Client/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Client/Http/Controllers/Api/CorporateMemberController.php @@ -12,6 +12,7 @@ use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMember use Modules\Client\Transformers\Dashboard\MemberResources as ClaimSubmitMemberResources; use Modules\Client\Transformers\Dashboard\MemberResources as DashboardMemberResources; use Modules\Client\Transformers\Dashboard\MemberAlarmCenterResources as DashboardMemberAlarmResources; +use Modules\Client\Transformers\Dashboard\MemberEmployeeDataResources as DashboardMemberEmployeeDataResources; use Modules\Client\Transformers\DataMemberResource; use Illuminate\Support\Facades\DB; @@ -29,8 +30,8 @@ class CorporateMemberController extends Controller { switch ($request->input('type')) { case 'employee-data': - $members = $this->corporateMemberService->getAllMemberAlarmCenter($corporate_id, $request); - return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members))); + $members = $this->corporateMemberService->getAllMemberEmployeeData($corporate_id, $request); + return response()->json(Helper::paginateResources(DashboardMemberEmployeeDataResources::collection($members))); case 'claim-report': $members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request); return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members))); diff --git a/Modules/Client/Transformers/ClaimReport/MemberResources.php b/Modules/Client/Transformers/ClaimReport/MemberResources.php index a798dfcf..18f5e077 100644 --- a/Modules/Client/Transformers/ClaimReport/MemberResources.php +++ b/Modules/Client/Transformers/ClaimReport/MemberResources.php @@ -16,13 +16,13 @@ class MemberResources extends JsonResource { return [ 'id' => $this->id, - 'codeRequest' => $this->code, - 'memberId' => $this->member_id, - 'fullName' => $this->full_name, - 'division' => $this->division_name ?? '', + 'code' => $this->code, + 'member_id' => $this->member_id, + 'full_name' => $this->full_name, + 'division_name' => $this->division_name ?? '', 'status' => $this->status, 'claimRequestId' => $this->claim_request_id, - 'submissionDate' => $this->submission_date, + 'submission_date' => $this->submission_date, ]; } } diff --git a/Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php b/Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php new file mode 100644 index 00000000..23d66c0e --- /dev/null +++ b/Modules/Client/Transformers/Dashboard/MemberEmployeeDataResources.php @@ -0,0 +1,27 @@ + $this->id, + 'personId' => $this->person_id, + 'memberId' => $this->member_id, + 'fullName' => $this->full_name, + 'service' => $this->service_code, + 'start_date' => $this->start_date, + 'end_date' => $this->end_date, + 'status' => $this->active, + ]; + } +} diff --git a/app/Services/CorporateMemberService.php b/app/Services/CorporateMemberService.php index 8eb40c0a..3a6192df 100644 --- a/app/Services/CorporateMemberService.php +++ b/app/Services/CorporateMemberService.php @@ -6,6 +6,7 @@ use App\Models\Member; use App\Models\Encounter; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; class CorporateMemberService { @@ -47,42 +48,43 @@ class CorporateMemberService { $limit = $request->has('perPage') ? $request->input('perPage') : 10; - return Member::query() - ->joinClaimRequests('right') - ->joinCorporateEmployees('left') - ->joinCorporateDivisions('left') - ->with('person:id,name_prefix,name_suffix,gender,name,birth_date') - ->withSum('claims', 'total_claim') - ->whereHas('employeds', function (Builder $corporateEmployee) use ($corporateId) { - $corporateEmployee->where('corporate_id', $corporateId); - }) - ->when($request->input('search'), function (Builder $query, $search) { - $query->where(function (Builder $query) use ($search) { - $query->orWhere('members.member_id', 'like', "%" . $search . "%") - ->orWhere('members.name', 'like', "%" . $search . "%"); - }); - }) - ->when($request->input('division'), function (Builder $division, $value) { - $division->whereHas('division', function (Builder $corporateEmployee) use ($value) { - $corporateEmployee->where('division_id', $value); - }); - }) - ->when($request->has('orderBy'), function (Builder $query) use ($request) { - $orderBy = match ($request->orderBy) { - 'memberId' => 'member_id', - 'fullName' => 'name', - 'codeRequest' => 'code', - default => '' - }; + $results = 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('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id') + ->where('corporate_employees.corporate_id', '=', $corporateId) + ->when($request->input('search'), function ($query, $search) { + $query->where(function ($query) use ($search) { + $query->orWhere('claim_requests.code', 'like', "%" . $search . "%") + ->orWhere('members.member_id', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%") + ->orWhere('corporate_divisions.name', 'like', "%" . $search . "%") + ->orWhere('claim_requests.status', 'like', "%" . $search . "%") + ->orWhere('claim_requests.submission_date', 'like', "%" . $search . "%"); + }); + }) + ->when($request->has('orderBy'), function ($query) use ($request) { + $orderBy = $request->orderBy; + $direction = $request->order ?? 'asc'; - if (in_array($orderBy, ['member_id', 'name', 'active', 'code'])) { - $query->getQuery()->orderBy($orderBy, $request->order); - } elseif ($request->orderBy === 'division') { - $query->getQuery()->orderBy('corporate_divisions.name', $request->order); - } - }) - ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'corporate_divisions.name AS division_name', 'claim_requests.status', 'claim_requests.code', 'claim_requests.id AS claim_request_id','claim_requests.submission_date']) - ->paginate($limit); + $query->orderBy($orderBy, $direction); + }) + ->select('members.id', 'claim_requests.code','members.member_id', 'members.name as full_name', 'corporate_divisions.name AS division_name', + DB::raw(' + CASE + WHEN claim_requests.status = "requested" THEN "requested" + WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved" + WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined" + WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented" + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending" + WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "review" + ELSE "" + END AS status + '), + 'claim_requests.id AS claim_request_id', 'claim_requests.submission_date') + ->paginate($limit); + return $results; } public function getAllMemberClaimSubmits(int $corporateId, Request $request) @@ -165,6 +167,44 @@ class CorporateMemberService ->paginate($limit); } + public function getAllMemberEmployeeData(int $corporateId, Request $request) + { + $limit = $request->has('perPage') ? $request->input('perPage') : 10; + + return Member::query() + ->joinCorporateEmployees('left') + ->joinMemberPlans('left') + ->joinPlans('left') + ->with(['currentPlan', 'person']) + ->where('corporate_employees.corporate_id', $corporateId) + ->when($request->input('search'), function (Builder $query, $search) { + $query->where(function (Builder $query) use ($search) { + $query->orWhere('members.member_id', 'like', "%" . $search . "%") + ->orWhere('members.name', 'like', "%" . $search . "%"); + }); + }) + ->when($request->input('division'), function (Builder $query, $value) { + $query->where('corporate_employees.division_id', $value); + }) + ->when($request->has('orderBy'), function (Builder $query) use ($request) { + $orderBy = match ($request->input('orderBy')) { + 'memberId' => 'member_id', + 'fullName' => 'name', + 'status' => 'active', + 'start_date' => 'member_plans.start', + 'end_date' => 'member_plans.end', + 'service' => 'plans.service_code', + + default => '' + }; + + $query->getQuery()->orderBy($orderBy, $request->order); + }) + ->select(['members.id', 'members.person_id', 'members.member_id', 'members.name', 'member_plans.start AS start_date', 'member_plans.end AS end_date', 'plans.active', 'plans.service_code']) + ->selectRaw("(select sum(`claims`.`total_claim`) from `claims` where `members`.`id` = `claims`.`member_id` AND `claims`.`deleted_at` IS NULL) AS `claims_sum_total_claim`") + ->paginate($limit); + } + public function getAllEncounter(int $corporateId) { return Encounter::query()->select(['id'])->paginate(10); diff --git a/frontend/client-portal/src/pages/ClaimReport/Index.tsx b/frontend/client-portal/src/pages/ClaimReport/Index.tsx index fc83c0e9..053634e8 100644 --- a/frontend/client-portal/src/pages/ClaimReport/Index.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/Index.tsx @@ -15,6 +15,7 @@ import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate import List from './List'; // theme import palette from '../../theme/palette'; +import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; interface ClaimStatusType { name: string; @@ -35,17 +36,22 @@ export default function Drugs() { { name: 'Requested', value: claimStatus.data.data.requesteds, - color: palette.dark.primary.dark, + color: '#159C9C', }, { name: 'Approval', value: claimStatus.data.data.approveds, - color: palette.dark.warning.dark, + color: '#229A16', }, { - name: 'Rejected', + name: 'Disbrusment', + value: claimStatus.data.data.disbrusments, + color: '#BF6919', + }, + { + name: 'Decline', value: claimStatus.data.data.rejecteds, - color: palette.dark.error.dark, + color: '#B72136', }, ]); })(); @@ -54,6 +60,13 @@ export default function Drugs() { return ( + diff --git a/frontend/client-portal/src/pages/ClaimReport/List.tsx b/frontend/client-portal/src/pages/ClaimReport/List.tsx index 5c86067e..03d3db7d 100644 --- a/frontend/client-portal/src/pages/ClaimReport/List.tsx +++ b/frontend/client-portal/src/pages/ClaimReport/List.tsx @@ -1,5 +1,5 @@ /* ---------------------------------- @mui ---------------------------------- */ -import { Stack, Button } from '@mui/material'; +import { Stack, Button, MenuItem } from '@mui/material'; /* ---------------------------------- axios --------------------------------- */ // import axios from 'axios'; import axios from '../../utils/axios'; @@ -15,6 +15,12 @@ import { UserCurrentCorporateContext } from '../../contexts/UserCurrentCorporate import { HeadCell, Order, PaginationTableProps } from '../../@types/table'; import { useSearchParams, useNavigate } from 'react-router-dom'; import { fDate } from '../../utils/formatTime'; +import Typography from '@mui/material/Typography'; +import { format } from 'date-fns'; +import TableMoreMenu from '../../components/table/TableMoreMenu'; +import VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined'; +import HistoryIcon from '@mui/icons-material/History'; +import SearchIcon from '@mui/icons-material/Search'; export default function List() { const navigate = useNavigate(); @@ -47,7 +53,7 @@ export default function List() { /* ------------------------------ handle order ------------------------------ */ const [order, setOrder] = useState('desc'); - const [orderBy, setOrderBy] = useState('codeRequest'); + const [orderBy, setOrderBy] = useState('code'); const orders = { order: order, @@ -109,41 +115,41 @@ export default function List() { /* -------------------------------- headCell -------------------------------- */ const headCells: HeadCell[] = [ { - id: 'memberId', + id: 'submission_date', + align: 'center', + label: 'Request Date', + isSort: true, + }, + { + id: 'member_id', align: 'left', label: 'Member ID', isSort: true, }, { - id: 'codeRequest', + id: 'code', align: 'left', - label: 'Code Request', + label: 'Claim Code', isSort: true, }, { - id: 'submissionDate', - align: 'left', - label: 'Request Date', - isSort: true, - }, - { - id: 'fullName', + id: 'full_name', align: 'left', label: 'Name', isSort: true, }, { - id: 'division', + id: 'division_name', align: 'left', - label: 'Divisi', - isSort: false, + label: 'Division', + isSort: true, }, { id: 'status', align: 'center', label: 'Status', - isSort: false, + isSort: true, }, { id: 'action', @@ -168,49 +174,99 @@ export default function List() { params: { ...parameters, type: 'claim-report' }, }); + console.log(response.data.data); + setData( response.data.data.map((obj: any) => ({ ...obj, status: obj.status === 'requested' ? ( - + ) : obj.status === 'approved' ? ( - + Approval + + ) : obj.status === 'declined' ? ( + + Decline + + ) : obj.status === 'pending' ? ( + + Pending + + ) : obj.status === 'review' ? ( + + Review + ) : ( ), - submissionDate: - obj.submissionDate ? fDate(obj.submissionDate) : '' + submission_date: + theme.palette.grey[300], + borderRadius: '4px', + width: '70%', + }} + variant="body2" + > + {obj.submission_date ? format(new Date(obj.submission_date), "d MMM yyyy") : ''} + + , + action: + + navigate ('/employee-data/user-profile/'+obj.personId)}> + + Detail + + navigate ('/employee-data/user-profile/'+obj.personId)}> + + History + + + } /> })) ); diff --git a/frontend/client-portal/src/pages/EmployeeData/List.tsx b/frontend/client-portal/src/pages/EmployeeData/List.tsx index 1d8a0476..36dba3d6 100644 --- a/frontend/client-portal/src/pages/EmployeeData/List.tsx +++ b/frontend/client-portal/src/pages/EmployeeData/List.tsx @@ -250,24 +250,24 @@ export default function List() { { id: 'start_date', - align: 'left', + align: 'center', label: 'Start Date', isSort: true, }, { id: 'end_date', - align: 'left', + align: 'center', label: 'End Date', isSort: true, }, { id: 'status', - align: 'left', + align: 'center', label: 'Status', isSort: true, }, { - id: 'view', + id: 'action', align: 'center', label: '', isSort: true, @@ -289,9 +289,7 @@ export default function List() { const response = await axios.get(`${corporateValue}/members?type=employee-data`, { params: { ...parameters }, }); - - console.log(response.data.data); - + setData( response.data.data.map((obj: any) => { return { @@ -303,34 +301,48 @@ export default function List() { // , status: obj.status === 1 ? ( - + ) : ( - + ), start_date: theme.palette.grey[300], borderRadius: '4px', - width: '95%', + width: '70%', }} variant="body2" > - {obj.start_date ? format(new Date(obj.start_date), "dd MMMM yyyy HH:mm:ss") : ''} + {obj.start_date ? format(new Date(obj.start_date), "dd MMM yyyy") : ''} , end_date: @@ -338,11 +350,11 @@ export default function List() { sx={{ backgroundColor: (theme) => theme.palette.grey[300], borderRadius: '4px', - width: '95%', + width: '70%', }} variant="body2" > - {obj.end_date ? format(new Date(obj.end_date), "d MMMM yyyy HH:mm:ss") : ''} + {obj.end_date ? format(new Date(obj.end_date), "d MMM yyyy") : ''} , fullName: @@ -359,7 +371,7 @@ export default function List() { {obj.memberId} , - view: + action: navigate ('/employee-data/user-profile/'+obj.personId)}> diff --git a/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx b/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx index 5349d055..e0814b9d 100644 --- a/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx +++ b/frontend/client-portal/src/sections/claim-report/CardClaimStatus.tsx @@ -39,13 +39,13 @@ const defaultData = [ export default function CardClaimStatus({ data }: PropsCardClaimStatus) { return ( - + {/* Claim Status - + */} {data ? data.map(({ name, value, color }: ClaimStatusType, key) => ( - + )) : defaultData.map(({ name, value, color }: ClaimStatusType, key) => ( - +