2 Commits

1442 changed files with 69645 additions and 168438 deletions

View File

View File

@@ -1,83 +0,0 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:axfmcy3qUMuukm8emaW6G0x/7SS3wWcLITXo+YAyCps=
APP_DEBUG=true
APP_URL=http://localhost:8000
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=aso_two
DB_USERNAME=mysql
DB_PASSWORD=password
OLDLMS_DB_CONNECTION=mysql
OLDLMS_DB_HOST=127.0.0.1
OLDLMS_DB_PORT=3306
OLDLMS_DB_DATABASE=linksehat
OLDLMS_DB_USERNAME=mysql
OLDLMS_DB_PASSWORD=password
BROADCAST_DRIVER=pusher
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
#MAIL_DRIVER=smtp
#MAIL_HOST=smtp.gmail.com
#MAIL_PORT=587
#MAIL_USERNAME=tumbaltumbal11@gmail.com
#MAIL_PASSWORD="pxrrksphndlvkgca"
#MAIL_USERNAME=noreply@primayahospital.com
#MAIL_PASSWORD="eqplciswxchsaart"
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=b488d13fde4349
MAIL_PASSWORD=63b64761d270ba
MAIL_ENCRYPTION=tls
MAIL_ENCRYPTION=TLS
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID="app-id"
PUSHER_APP_KEY="app-key"
PUSHER_APP_SECRET="app-secret"
PUSHER_HOST=localhost
PUSHER_PORT=6001
PUSHER_SCHEME=http
# PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
LMS_API_URL="http://lmsapi.primaya.id"
DUITKU_MERCHANT_KEY=
DUITKU_MERCHANT_CODE=
DUITKU_IS_SANDBOX=TRUE
WKHTML_PDF_BINARY=/var/www/aso/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64
WKHTML_IMG_BINARY=

59
.env.example Normal file
View File

@@ -0,0 +1,59 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
OLDLMS_DB_CONNECTION=mysql
OLDLMS_DB_HOST=127.0.0.1
OLDLMS_DB_PORT=3306
OLDLMS_DB_DATABASE=linksehat
OLDLMS_DB_USERNAME=mysql
OLDLMS_DB_PASSWORD=password
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

15
.gitignore vendored
View File

@@ -15,18 +15,3 @@ yarn-error.log
/public/dashboard
/public/dashboard-staging
/public/dashboard-copy
/public/dashboard-copy2
/public/client-portal
/public/client-portal-staging
/public/hospital-portal
/public/hospital-portal-staging
/public/files
/Modules/Internal/vendor
composer.lock
/frontend/dashboard/.env.*
/frontend/hospital-portal/.env.*

0
Modules/Client/Config/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Config/config.php Executable file → Normal file
View File

0
Modules/Client/Console/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Database/Migrations/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Database/Seeders/.gitkeep Executable file → Normal file
View File

View File

0
Modules/Client/Database/factories/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Entities/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Http/Controllers/.gitkeep Executable file → Normal file
View File

75
Modules/Client/Http/Controllers/Api/AuthController.php Executable file → Normal file
View File

@@ -8,17 +8,14 @@ use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\View;
class AuthController extends Controller
{
public function login(Request $request)
{
$request->validate([
'phoneOrEmail' => 'required',
'password' => 'required'
'phoneOrEmail' => 'required'
]);
$user = User::query()
@@ -35,60 +32,28 @@ class AuthController extends Controller
return Helper::responseJson(statusCode: Response::HTTP_NOT_FOUND, message: $message);
}
// $token = rand(1000, 9999); // Menghasilkan angka acak antara 100000 dan 999999
// if($request->phoneOrEmail == 'manager+one@gmail.com' || $request->phoneOrEmail == 'manager+two@gmail.com')
// {
// $token = 4444;
// }
// if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
// User::query()->find($user->id)->update([
// 'email' => $request->phoneOrEmail,
// 'otp' => $token,
// 'otp_created_at' => now()
// ]);
// } else {
// User::query()->find($user->id)->update([
// 'phone' => $request->phoneOrEmail,
// 'otp' => $token,
// 'otp_created_at' => now()
// ]);
// }
// // TODO Send the OTP
// if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
// // Send Email
// //send to alarm
// if($request->phoneOrEmail != 'manager+one@gmail.com' && $request->phoneOrEmail != 'manager+two@gmail.com')
// {
// $nameTo = 'User';
// $dataEmail = [
// 'email' => $request->phoneOrEmail,
// 'name' => $nameTo,
// 'subject' => 'OTP Login Client Portal Tanggal '. date('Y-m-d H:i:s'),
// 'body' => View::make('email/forgot_password', ['token' => $token])->render(),
// ];
// Helper::sendEmail($dataEmail);
// }
// } else {
// // Send Whatsapp
// }
// return Helper::responseJson(message: 'OTP Terkirim');
if (!Hash::check($request->password, $user->password)) {
return response(['message' => 'Password Salah'], 403);
if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
User::query()->find($user->id)->update([
'email' => $request->phoneOrEmail,
'otp' => 4444, //rand(1000, 9999),
'otp_created_at' => now()
]);
} else {
User::query()->find($user->id)->update([
'phone' => $request->phoneOrEmail,
'otp' => 4444,//rand(1000, 9999),
'otp_created_at' => now()
]);
}
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => $user,
],
message: 'Selamat Datang'
);
// TODO Send the OTP
if (filter_var($request->phoneOrEmail, FILTER_VALIDATE_EMAIL)) {
// Send Email
} else {
// Send Whatsapp
}
return Helper::responseJson(message: 'OTP Terkirim');
}
public function validateOtp(Request $request)

View File

@@ -1,286 +0,0 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
class BillingSummaryController extends Controller
{
public function index(Request $request, $corporate_id)
{
$year = $request->year ?? now()->year;
$status = $request->status;
$bn = $request->bn;
$payorId = $request->payorId;
$service = $request->service;
$billing = $request->billing;
$search = $request->search;
$rows = DB::table('invoice_payments')
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
->join('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->whereYear('invoice_payments.created_at', $year)
->where('corporate_employees.corporate_id', '=', $corporate_id)
// FILTERS
->when($status, fn ($q) =>
$q->where('invoice_payments.status', $status)
)
->when($bn, fn ($q) =>
$q->where('members.member_id', $bn)
)
->when($payorId, fn ($q) =>
$q->where('members.payor_id', $payorId)
)
->when($service, fn ($q) =>
$q->where('claim_requests.service_code', $service)
)
->when($billing, fn ($q) =>
$q->where('invoice_payments.invoice_number', $billing)
)
// 🔍 SEARCH PROVIDER (LIKE)
->when($search, fn ($q) =>
$q->where('organizations.name', 'like', '%' . $search . '%')
)
->selectRaw("
MONTH(invoice_payments.created_at) as month_number,
organizations.name as provider,
SUM(request_logs.nominal) as total
")
->groupBy('month_number', 'organizations.name')
->orderBy('month_number')
->get();
return response()->json(
$this->formatMonthly($rows)
);
}
protected function formatMonthly($rows): array
{
$months = [
1 => 'Januari', 2 => 'Februari', 3 => 'Maret',
4 => 'April', 5 => 'Mei', 6 => 'Juni',
7 => 'Juli', 8 => 'Agustus', 9 => 'September',
10 => 'Oktober', 11 => 'November', 12 => 'Desember',
];
return collect($rows)
->groupBy('month_number')
->map(function ($items, $monthNumber) use ($months) {
return [
'month' => $months[$monthNumber],
'total' => $items->sum('total'),
'items' => $items->map(fn ($item) => [
'provider' => $item->provider,
'total' => (float) $item->total,
])->values(),
];
})
->values()
->toArray();
}
public function providerSummary(Request $request, $corporate_id)
{
$year = $request->year ?? now()->year;
$status = $request->status;
$bn = $request->bn;
$payorId = $request->payorId;
$service = $request->service;
$billing = $request->billing;
$search = $request->search;
$query = DB::table('invoice_payments')
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
->join('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->whereYear('invoice_payments.created_at', $year)
->where('corporate_employees.corporate_id', '=', $corporate_id)
// FILTER
->when($status, fn ($q) =>
$q->where('invoice_payments.status', $status)
)
->when($bn, fn ($q) =>
$q->where('members.member_id', $bn)
)
->when($payorId, fn ($q) =>
$q->where('members.payor_id', $payorId)
)
->when($service, fn ($q) =>
$q->where('claim_requests.service_code', $service)
)
->when($billing, fn ($q) =>
$q->where('invoice_payments.invoice_number', $billing)
)
->when($search, fn ($q) =>
$q->where('organizations.name', 'like', '%' . $search . '%')
);
$items = $query
->selectRaw("
organizations.name as provider,
SUM(request_logs.nominal) as total
")
->groupBy('organizations.name')
->orderByDesc('total')
->get()
->map(fn ($row) => [
'provider' => $row->provider,
'total' => (float) $row->total,
]);
return response()->json([
'total' => $items->sum('total'),
'items' => $items,
]);
}
public function topDiagnosis(Request $request, $corporate_id)
{
$year = $request->year ?? now()->year;
$status = $request->status;
$bn = $request->bn;
$payorId = $request->payorId;
$service = $request->service;
$billing = $request->billing;
$search = $request->search;
$rows = DB::table('invoice_payments')
->join('invoice_payment_details', 'invoice_payment_details.invoice_payment_id', '=', 'invoice_payments.id')
->join('claim_requests', 'claim_requests.id', '=', 'invoice_payment_details.claim_request_id')
->join('request_logs', 'request_logs.id', '=', 'claim_requests.request_log_id')
->join('corporate_employees', 'corporate_employees.member_id', '=', 'request_logs.member_id')
// 🔥 ICD JOIN
->leftJoin(
'icd',
DB::raw("icd.code"),
'=',
DB::raw("SUBSTRING_INDEX(request_logs.diagnosis, ',', 1)")
)
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->whereYear('invoice_payments.created_at', $year)
// FILTER
->when($status, fn ($q) =>
$q->where('invoice_payments.status', $status)
)
->when($bn, fn ($q) =>
$q->where('members.member_id', $bn)
)
->when($payorId, fn ($q) =>
$q->where('members.payor_id', $payorId)
)
->when($service, fn ($q) =>
$q->where('claim_requests.service_code', $service)
)
->when($billing, fn ($q) =>
$q->where('invoice_payments.invoice_number', $billing)
)
->selectRaw("
SUBSTRING_INDEX(request_logs.diagnosis, ',', 1) as code_diagnosis,
icd.name as diagnosis,
COUNT(request_logs.id) as total_case,
SUM(request_logs.nominal) as total_billing
")
->groupBy('code_diagnosis', 'icd.name')
->orderByDesc('total_case')
->limit(10)
->get();
return response()->json(
$rows->map(fn ($row) => [
'code' => $row->code_diagnosis,
'diagnosis' => $row->diagnosis ?? '-',
'total_case' => (int) $row->total_case,
'total_billing' => (float) $row->total_billing,
])
);
}
/**
* Display a listing of the resource.
* @return Renderable
*/
// public function index()
// {
// return view('client::index');
// }
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('client::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('client::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('client::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
}

506
Modules/Client/Http/Controllers/Api/ClaimController.php Executable file → Normal file
View File

@@ -2,26 +2,13 @@
namespace Modules\Client\Http\Controllers\Api;
use Illuminate\Support\Facades\DB;
use App\Helpers\Helper;
use App\Models\Claim;
use App\Models\CorporateEmployee;
use App\Models\Icd;
use App\Models\ClaimHistoryCare;
use App\Models\Corporate;
use App\Services\ClaimService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimShowResource;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use Illuminate\Support\Facades\Storage;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Carbon\Carbon;
class ClaimController extends Controller
{
@@ -33,7 +20,7 @@ class ClaimController extends Controller
{
$claims = $this->claimService->getCountClaimRequestPerStatus($corporate_id);
// dd($claims);
dd($claims);
return Helper::responseJson([
'count_requested' => 0,
@@ -146,495 +133,4 @@ class ClaimController extends Controller
{
//
}
public function export($corporate_id){
$corporate = Corporate::where('id', $corporate_id)->with(['currentPolicy'])->first();
$member_id = CorporateEmployee::where('corporate_id', $corporate_id)->get('member_id')->toArray();
// dd($member_id);
$claim = Claim::whereIn('member_id', $member_id)->with(['member', 'member.plans'])->get();
$data = [];
if (count( $claim) > 0){
$temp = [];
foreach($claim as $c) {
$diagnosis = ClaimHistoryCare::where('claim_id', 34)->with('icd')->get();
$diagnosisName = '';
if (count($diagnosis) > 0){
$tempDiagnosis = [];
foreach($diagnosis as $key => $d){
$diagnosis = Icd::where('id', $d['main_diagnosis_id'])->first();
array_push($tempDiagnosis, $diagnosis->name);
}
$diagnosisName = implode(", ", $tempDiagnosis);
}
$temp['id'] = $c['id'];
$temp['plan_id'] = $c['member']['plans'][0]['code'];
$temp['payor_id'] = $c['member']['payor_id'];
$temp['corporate_id'] = $corporate->name;
$temp['policy_number'] = $corporate->currentPolicy->code;
$temp['member_id'] = $c['member']['member_id'];
$temp['benefit_code'] = $c['benefit_code'];
$temp['benefit_desc'] = $c['benefit_desc'];
$temp['amount_incurred'] = $c['amount_incurred'];
$temp['amount_approved'] = $c['amount_approved'];
$temp['amount_not_approved'] = $c['amount_not_approved'];
$temp['excess_paid'] = $c['excess_paid'];
$temp['diganosis'] = $diagnosisName;
array_push($data, $temp);
}
$headers = [
['value' => 'Plan ID', 'cell' => 'A1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Payor ID', 'cell' => 'B1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Corporate ID', 'cell' => 'C1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Policy Number', 'cell' => 'D1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Member ID', 'cell' => 'E1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Benefit Code', 'cell' => 'F1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Benefit Desc', 'cell' => 'G1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Incurred', 'cell' => 'H1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Approved', 'cell' => 'I1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Not Approved', 'cell' => 'J1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Excess Paid', 'cell' => 'K1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Diagnosis', 'cell' => 'L1', 'mergeCell' => false, 'mergeToCell' => 'J2'],
];
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
foreach ($headers as $header) {
$sheet->setCellValue($header['cell'], $header['value']);
if ($header['mergeCell'] === true) {
$sheet->mergeCells($header['cell'] . ':' . $header['mergeToCell']);
}
$sheet->getStyle($header['cell'])->getFont()->setBold(true);
$sheet->getStyle($header['cell'])->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
}
$startFrom = 2;
foreach($data as $i => $d){
$sheet->setCellValue('A' . $startFrom, $d['plan_id'] ?? '-');
$sheet->setCellValue('B' . $startFrom, $d['payor_id'] ?? '-');
$sheet->setCellValue('C' . $startFrom, $d['corporate_id'] ?? '-');
$sheet->setCellValue('D' . $startFrom, $d['policy_number'] ?? '-');
$sheet->setCellValue('E' . $startFrom, $d['member_id'] ?? '-');
$sheet->setCellValue('F' . $startFrom, $d['benefit_code'] ?? '-');
$sheet->setCellValue('G' . $startFrom, $d['benefit_desc'] ?? '-');
$sheet->setCellValue('H' . $startFrom, $d['amount_incurred'] ?? '-');
$sheet->setCellValue('I' . $startFrom, $d['amount_approved'] ?? '-');
$sheet->setCellValue('J' . $startFrom, $d['amount_not_approved'] ?? '-');
$sheet->setCellValue('K' . $startFrom, $d['excess_paid'] ?? '-');
$sheet->setCellValue('L' . $startFrom, $d['diganosis'] ?? '-');
$startFrom++;
}
foreach (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K'] as $header) {
if ($header === 'A') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(35, 'px');
} elseif ($header === 'H' || $header === 'I') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(100, 'px');
} else {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setAutoSize(true);
}
}
$spreadsheet->getActiveSheet()->getStyle('A2:A' . $startFrom)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
$sheet->getDefaultRowDimension()->setRowHeight(-1);
$sheet->setTitle('Alarm Center Report');
$writer = new Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$content = ob_get_contents();
ob_end_clean();
$fileName = 'result-' . now()->getPreciseTimestamp(3) . '-alarm-center-report.xlsx';
Storage::disk('public')->put('temp/' . $fileName, $content);
$fileUrl = url('storage/temp/' . $fileName);
return Helper::responseJson([
"file_url" => $fileUrl
]);
}
}
public function exportAlrmCenter($corporate_id, $start, $end)
{
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile(public_path('files/Report-Data-Alarm-Center-'.$start.'-'.$end.'.xlsx'));
$header = [
'No',
'Code',
'Date Submission',
'Date Admission',
'Date Discharge',
'Provider',
'Member ID (BN)',
'Member Name',
'Member Name Principal',
'Plan Code',
'Service',
'Payor ID',
'Corporate name',
'Policy Number',
'Total Billing',
'Benefit Code',
'Benefit Desc',
'Amt Incurred',
'Amt Approved',
'Amt Not Approved',
'Excess Paid',
'Diagnosis',
'Keterangan',
'Catatan',
'Invoice No',
'Billing No',
'Type Of Member',
'Deskripsi Diagnosis'
];
$style = (new StyleBuilder())
->setFontBold()
// ->setFontSize(15)
// ->setFontColor(Color::BLUE)
// ->setShouldWrapText()
->setCellAlignment(CellAlignment::LEFT)
// ->setBackgroundColor(Color::YELLOW)
->build();
$headerRow = WriterEntityFactory::createRowFromArray($header, $style);
$writer->addRow($headerRow);
$data = DB::table('request_logs')
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->leftJoin('corporate_employees','corporate_employees.member_id','=','members.id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
// ->where('request_logs.status_final_log', '=', 'approved')
->where('request_logs.deleted_at', '=', null)
->when($start != 'all' && $end != 'all', function ($query) use ($start, $end) {
$query->where('request_logs.submission_date', '>=',$start. ' 00:00:00')
->where('request_logs.submission_date', '<=',$end. ' 23:59:59');
})
->select(
DB::raw('1 AS no'),
'request_logs.submission_date',
'request_logs.created_at',
'request_logs.discharge_date',
'request_logs.organization_id',
'request_logs.id',
'request_logs.member_id',
'request_logs.service_code',
'request_logs.code',
'request_logs.diagnosis',
'request_logs.keterangan',
'request_logs.catatan',
DB::raw('
(Select SUM(request_log_benefits.amount_approved) as tot_bill FROM request_log_benefits
WHERE request_log_benefits.request_log_id = request_logs.id AND request_log_benefits.deleted_at IS NULL LIMIT 1) AS tot_bill
'),
'request_logs.invoice_no',
'request_logs.billing_no',
'request_logs.type_of_member',
)
->groupBy(
'request_logs.submission_date',
'request_logs.created_at',
'request_logs.discharge_date',
'request_logs.organization_id',
'request_logs.id',
'request_logs.member_id',
'request_logs.service_code',
'request_logs.code',
'request_logs.diagnosis',
'request_logs.keterangan',
'request_logs.catatan',
'tot_bill'
)
->orderBy('request_logs.submission_date', 'desc')
->get();
if (isset($data) && count($data) > 0)
{
$dataRow = array();
$no = 0;
foreach ($data as $item)
{
//Provider
$dataRumahSakit = DB::table('organizations')
->leftJoin('addresses', 'addresses.addressable_id', '=', 'organizations.id')
->where('organizations.id', '=', $item->organization_id)
->where('addresses.addressable_type', '=', 'App\Models\Organization')
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit', 'organizations.corporate_id_partner')
->first();
//Data Member
$dataMember = DB::table('members')
->where('members.id', '=', $item->member_id)
->select(
'members.nric',
'members.id',
'members.principal_id',
'members.name',
'members.birth_date',
'members.member_id',
'members.gender',
DB::raw('
(Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik
'),
// DB::raw('
// "LinkSehat" AS penjamin
// '),
DB::raw('
(Select corporates.name FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS nama_perusahaan
'),
DB::raw('
(Select corporates.id FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS id_perusahaan
'),
DB::raw('
(Select corporates.code FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS code_perusahaan
'),
DB::raw('
(Select services.name FROM services
WHERE services.code = "'.$item->service_code.'" LIMIT 1) AS jenis_perawatan
'),
DB::raw('
(Select member_policies.policy_id FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS no_polis
'),
DB::raw('
(Select member_policies.status FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS status_polis
'),
DB::raw('
(Select plans.code FROM member_plans
LEFT JOIN plans ON plans.id = member_plans.plan_id
WHERE member_plans.member_id = members.id AND plans.service_code = "'.$item->service_code.'" LIMIT 1) AS code_plan
'),
DB::raw('
(Select plans.limit_rules FROM member_plans
LEFT JOIN plans ON plans.id = member_plans.plan_id
WHERE member_plans.member_id = members.id LIMIT 1) AS limit_rules
'),
DB::raw('
"IDR" AS mata_uang
'),
'members.members_effective_date AS mulai',
'members.members_expire_date AS akhir'
)
->first();
//get penjamin
$penjamin = 'LinkSehat';
if(!empty($dataRumahSakit->corporate_id_partner))
{
$corporate_id_partners = explode(',', $dataRumahSakit->corporate_id_partner);
$valueToCheck = $dataMember->id_perusahaan;
if (in_array($valueToCheck, $corporate_id_partners)) {
$penjamin = $dataMember->nama_perusahaan;
}
}
//Nama Karyawan
$data['namaKaryawan'] = '';
if($dataMember->principal_id)
{
$dataNamaKaryawan = DB::table('members')
->where('members.principal_id', '=', $dataMember->principal_id)
->select('members.name')
->first();
$data['namaKaryawan'] = $dataNamaKaryawan->name;
}
else{
$data['namaKaryawan'] = $dataMember->name;
}
//Data Benefit
$dataClaimLog = DB::table('request_log_benefits')
->where('request_log_benefits.request_log_id', '=', $item->id)
->where('request_log_benefits.deleted_at', null)
->select(
'*',
DB::raw('
(Select benefits.description FROM benefits
WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS benfit
'),
DB::raw('
(Select benefits.code FROM benefits
WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS code
')
)
->get();
// Description Diagnosi
$diagnosis = explode(",", $item->diagnosis);
$descriptionDiagnosis = '-';
if ($diagnosis){
$dataDiagnosises = DB::table('icd')->whereIn('code',$diagnosis)->get();
$descriptionDiagnosis = "";
foreach($dataDiagnosises as $dataDiagnosis){
$descriptionDiagnosis .= $dataDiagnosis->name ." ";
}
}
$check_first_id = 0;
if($check_first_id != $item->id)
{
$no += $item->no;
}
$total_billing = 0;
$lastIndex = count($dataClaimLog) - 1;
$firtIndex = 0;
if (isset($dataClaimLog) && count($dataClaimLog) > 0)
{
foreach ($dataClaimLog as $index => $item_benefit)
{
$total_billing += !empty($item_benefit->amount_approved) ? $item_benefit->amount_approved : 0;
$rowData = [
$check_first_id != $item->id ? $no : $no,
!empty($item->code) ? $item->code : '',
!empty($item->created_at) ? $item->created_at : '',
!empty($item->submission_date) ? $item->submission_date : '',
!empty($item->discharge_date) ? $item->discharge_date : '',
!empty($dataRumahSakit->nama_rumahsakit) ? $dataRumahSakit->nama_rumahsakit : '',
!empty($dataMember->member_id) ? $dataMember->member_id : '',
!empty($dataMember->name) ? $dataMember->name : '',
$data['namaKaryawan'],
($firtIndex == $index ? (!empty($dataMember->code_plan) ? $dataMember->code_plan : '') : ''),
!empty($dataMember->jenis_perawatan) ? $dataMember->jenis_perawatan : '',
$penjamin,
!empty($dataMember->nama_perusahaan) ? $dataMember->nama_perusahaan : '',
!empty($dataMember->no_polis) ? $dataMember->no_polis : '',
($firtIndex == $index ? $item->tot_bill : ''),
!empty($item_benefit->code) ? $item_benefit->code : '',
!empty($item_benefit->benfit) ? $item_benefit->benfit : '',
!empty($item_benefit->amount_incurred) ? $item_benefit->amount_incurred : '',
!empty($item_benefit->amount_approved) ? $item_benefit->amount_approved : '',
!empty($item_benefit->amount_not_approved) ? $item_benefit->amount_not_approved : '',
!empty($item_benefit->excess_paid) ? $item_benefit->excess_paid : '',
!empty($item->diagnosis) ? $item->diagnosis : '',
!empty($item->keterangan) ? $item->keterangan : '',
!empty($item->catatan) ? $item->catatan : '',
!empty($item->invoice_no) ? $item->invoice_no : '',
!empty($item->billing_no) ? $item->billing_no : '',
!empty($item->type_of_member) ? $item->type_of_member : '',
$descriptionDiagnosis,
];
array_push($dataRow,$rowData);
$check_first_id = $item->id;
}
}
else
{
$rowData = [
$check_first_id != $item->id ? $no : '',
!empty($item->code) ? $item->code : '',
!empty($item->created_at) ? $item->created_at : '',
!empty($item->submission_date) ? $item->submission_date : '',
!empty($item->discharge_date) ? $item->discharge_date : '',
!empty($dataRumahSakit->nama_rumahsakit) ? $dataRumahSakit->nama_rumahsakit : '',
!empty($dataMember->member_id) ? $dataMember->member_id : '',
!empty($dataMember->name) ? $dataMember->name : '',
$data['namaKaryawan'],
!empty($dataMember->code_plan) ? $dataMember->code_plan : '',
!empty($dataMember->jenis_perawatan) ? $dataMember->jenis_perawatan : '',
$penjamin,
!empty($dataMember->nama_perusahaan) ? $dataMember->nama_perusahaan : '',
!empty($dataMember->no_polis) ? $dataMember->no_polis : '',
'0',
'',
'',
'',
'',
'',
'',
'',
'',
'',
!empty($item->invoice_no) ? $item->invoice_no : '',
!empty($item->billing_no) ? $item->billing_no : '',
!empty($item->type_of_member) ? $item->type_of_member : '',
$descriptionDiagnosis,
];
array_push($dataRow,$rowData);
}
}
$style = (new StyleBuilder())
//->setFontBold()
// ->setFontSize(15)
// ->setFontColor(Color::BLUE)
// ->setShouldWrapText()
->setCellAlignment(CellAlignment::LEFT)
// ->setBackgroundColor(Color::YELLOW)
->build();
$grand_total_billing = 0;
foreach ($dataRow as $rowData) {
if (is_numeric($rowData[14])) {
// Jumlahkan nilai angka ke total
$grand_total_billing += $rowData[14];
}
$row = WriterEntityFactory::createRowFromArray($rowData, $style);
$writer->addRow($row);
}
//Footer
$footer = [
'Total',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
$grand_total_billing,
'',
'',
'',
'',
'',
'',
'',
'',
''
];
$style = (new StyleBuilder())
->setFontBold()
// ->setFontSize(15)
// ->setFontColor(Color::BLUE)
// ->setShouldWrapText()
->setCellAlignment(CellAlignment::LEFT)
// ->setBackgroundColor(Color::YELLOW)
->build();
$footerRow = WriterEntityFactory::createRowFromArray($footer, $style);
$writer->addRow($footerRow);
}
$writer->close();
return Helper::responseJson([
'file_name' => 'Report-Data-Alarm-Center-'. $start.'-'.$end,
"file_url" => url('files/Report-Data-Alarm-Center-'. $start.'-'.$end.'.xlsx')
]);
}
}

View File

@@ -2,312 +2,62 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\ClaimRequest;
use Modules\Client\Transformers\ClaimReport\ShowResources;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;
use App\Models\File;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ClaimReportController extends Controller
{
public function claimStatus($corporateId)
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$requesteds = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->where('status', 'requested')
->get();
$approveds = 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', 'approved'))
->where('status', 'approved')
->get();
$rejecteds = 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', 'declined'))
->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),
'disbrusments' => count($disbrusments)
]);
}
public function claimDetail($corporate_id, $claimRequestId)
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$claimRequestId = Crypt::decrypt($claimRequestId);
$status = 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', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.submission_date',
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 "reviewed"
ELSE ""
END AS status
')
)
->first();
$results['status'] = $status;
$timeline = DB::table('claim_logs')
->where('claim_logs.claim_request_id', '=', $claimRequestId)
->select(
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "Request"
WHEN claim_logs.status = "reviewed" THEN "Review"
WHEN claim_logs.status = "approved" THEN "Approval"
WHEN claim_logs.status = "declined" THEN "Decline"
ELSE "-"
END AS txt_status
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#159C9C"
WHEN claim_logs.status = "reviewed" THEN "#0C53B7"
WHEN claim_logs.status = "approved" THEN "#229A16"
WHEN claim_logs.status = "declined" THEN "#FF4842"
ELSE "-"
END AS txt_status_color
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#00AB5529"
WHEN claim_logs.status = "reviewed" THEN "#1890FF29"
WHEN claim_logs.status = "approved" THEN "#54D62C29"
WHEN claim_logs.status = "declined" THEN "#FF48427A"
ELSE "-"
END AS txt_status_backgroundColor
'),
'claim_logs.date',
'claim_logs.description',
'claim_logs.status'
)
->orderBy('claim_logs.id', 'desc')
->get();
$results['timeline'] = $timeline;
$request_files = DB::table('claim_request_files')
->where('claim_request_files.claim_request_id', '=', $claimRequestId)
->select(
'claim_request_files.*',
DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'),
)
->get();
$results['request_files'] = $request_files;
// Jika path kosong, kembalikan null
if (!$row->path) {
return null;
}
// $documents = DB::table('files')
// ->where('fileable_type', 'App\Models\ClaimRequest')
// ->where('fileable_id', $claimRequestId)
// ->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type')
// ->orderBy('id', 'desc')
// ->get();
$documents = DB::table('files')
->where('fileable_type', 'App\Models\ClaimRequest')
->where('fileable_id', $claimRequestId)
->select('id', 'original_name', 'path', 'source', 'type')
->orderBy('id', 'desc')
->get()
->map(function ($row) {
// default null kalau tidak ada path
if (!$row->path) {
$row->path = null; // atau bisa $row->url = null
return $row;
}
if ($row->source === 's3') {
try {
$row->path = Storage::disk('s3')->temporaryUrl(
$row->path,
now()->addMinutes(60)
);
} catch (\Exception $e) {
$row->path = Storage::disk('s3')->url($row->path);
}
} else {
$row->path = Storage::disk('public')->url($row->path);
}
return $row;
});
$results['documents'] = $documents;
return Helper::responseJson($results);
//
}
public function requestFiles(Request $request, $corporate_id, $claim_id)
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$claim_id = Crypt::decrypt($claim_id);
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$fileData = File::storeFile('claim-diagnosis', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-diagnosis',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$fileData = File::storeFile('claim-kondisi', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-kondisi',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileResults')) {
foreach ($request->fileResults as $file) {
$pathFile = File::storeFile('claim-result', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-result',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
//
}
public function claimDetailHistory($corporate_id, $claimRequestId)
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$claimRequestId = Crypt::decrypt($claimRequestId);
$member = 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', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.code','members.member_id', 'members.name'
)
->first();
$results['member'] = $member;
$claim_item = DB::table('claim_items')
->leftJoin('claims','claim_items.claim_id', '=', 'claims.id')
->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id')
->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_items.nominal_ditagihkan',
'claim_items.nominal_dicover',
'benefits.description',
'claim_requests.submission_date'
)
->orderBy('claim_items.id', 'desc')
->get();
$results['claim_item'] = $claim_item;
$tot_claim_item = DB::table('claim_items')
->leftJoin('claims','claim_items.claim_id', '=', 'claims.id')
->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id')
->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
DB::raw('SUM(claim_items.nominal_ditagihkan) AS nominal_ditagihkan'),
DB::raw('SUM(claim_items.nominal_dicover) AS nominal_dicover'),
DB::raw('(SUM(claim_items.nominal_ditagihkan) - SUM(claim_items.nominal_dicover)) AS difference'),
)
->groupBy('claim_items.id')
->orderBy('claim_items.id', 'desc')
->first();
$results['tot_claim_item'] = $tot_claim_item;
return Helper::responseJson($results);
//
}
public function show($corporateId, $claimRequestId)
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$data = ClaimRequest::query()
->with([
'histories:historiable_type,historiable_id,title,description,created_at',
'member:id,person_id,name_prefix,name,name_suffix' => [
'person:id,name_prefix,name,name_suffix,gender'
],
'claim:id,status',
'claimResults',
'claimConditions',
'claimDiagnosis'
])
->find($claimRequestId, ['id', 'submission_date', 'member_id', 'claim_id', 'status']);
return Helper::responseJson(new ShowResources($data));
//
}
}

View File

@@ -1,259 +0,0 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Events\ClaimRequested;
use App\Helpers\Helper;
use App\Models\File;
use App\Models\Member;
use App\Models\ClaimRequest;
use App\Services\ClaimRequestService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
class ClaimRequestController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
private static $code_prefix = 'CLAIM';
public function index()
{
return view('client::index');
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('client::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
$request->validate([
'member_id' => 'required|array',
'member_id.*' => 'required',
'service_code.*' => 'required|in:OP,IP'
]);
if ($request->member_id){
foreach($request->member_id as $key => $member_id){
$code = $this->getNextCode();
$member = Member::find($member_id);
DB::beginTransaction();
try {
$newClaimRequest = ClaimRequestService::storeClaimRequest(
row: [],
code: $code,
member: $member,
paymentType: 'reimbursement',
serviceCode: $request->service_code[$key],
);
// ClaimRequested::dispatch($newClaimRequest);
// Log History
$newClaimRequest->histories()->create([
'title' => 'New Claim Requested',
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'type' => 'info',
'system_origin' => 'client-portal'
]);
// Claim Log
DB::table('claim_logs')
->insert([
'claim_request_id' => $newClaimRequest->id,
'status' => 'requested',
'date' => date('Y-m-d H:i:s'),
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'system_origin' => 'hospital-portal',
'created_by' => auth()->user()->id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at'=> date('Y-m-d H:i:s'),
]);
$storage_path = storage_path() . "/app/public";
$folder = "claim/";
if (is_dir($storage_path . "/" . $folder) == false) {
mkdir($storage_path . "/" . $folder, 0770, true);
}
if (isset($_FILES['laboratorium'])) {
foreach ($_FILES['laboratorium']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-result-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['laboratorium']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['laboratorium']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['laboratorium']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'source' => env('FILESYSTEM_DISK'),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['prescription'])) {
foreach ($_FILES['prescription']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-diagnosis-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['prescription']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['prescription']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['prescription']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'source' => env('FILESYSTEM_DISK'),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['invoice'])) {
foreach ($_FILES['invoice']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-kondisi-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['invoice']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['invoice']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['invoice']['full_path']["member_" .$member_id][$key];
if (move_uploaded_file($tmp_name, $storage_path . "/" . $pathFile)) {
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => $new_file_name,
'original_name' => $full_path,
'extension' => $ekstension,
'source' => env('FILESYSTEM_DISK'),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
DB::commit();
}
catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!');
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('client::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('client::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public static function getNextCode()
{
$last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, "-", -1) AS SIGNED)) as max_numeric_code'))
->whereRaw('SUBSTRING_INDEX(code, "-", -1) REGEXP "^[0-9]+$"')
->value('max_numeric_code');
// $next_number = 1;
if ($last_numeric_code) {
// // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir
// $parts = explode('-', $last_code);
// $last_number = (int) end($parts);
$next_number = $last_numeric_code + 1;
}
return self::makeCode($next_number);
}
public static function makeCode($next_number)
{
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
$requestLogData = RequestLog::where('id', $request_log_id)->first();
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
$provideCode = $organization ? $organization->code : '';
$member = Member::with('currentCorporate')->where(['id' => $requestLogData->member_id])->first();
$sparator = '.';
$date = date('ymd');
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . $sparator. 'H' . $sparator. $provideCode . $sparator. $date. $sparator . $member->currentPolicy->code . $sparator. $member->member_id . $sparator. str_pad($next_number, 6, '0', STR_PAD_LEFT);
}
}

View File

@@ -1,88 +0,0 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Member;
use App\Models\Corporate;
use App\Models\File;
use App\Services\CorporateMemberService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMemberResources;
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\DataMemberResource;
use Illuminate\Support\Facades\DB;
class CorporateCurrentController extends Controller
{
public function __construct(public CorporateMemberService $corporateMemberService)
{
}
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $id)
{
$corporates = Corporate::query()
->with('currentPolicy', 'subCorporates')
->withCount([
'employees',
'corporateBenefits',
'corporatePlans',
// 'claims'
])
// ->where('type', 'corporate')
->where('id', $id)
->paginate(1);
return $corporates;
}
public function update(Request $request, $id)
{
$validate = $request->validate([
'reason' => 'required',
]);
try {
DB::beginTransaction();
//karena pake formdata
$linkingRules = $request->linking_rules;
$linkingRules = explode(',', $linkingRules);
$corporate = Corporate::findOrFail($id);
$corporate->fill($request->all());
$corporate->linking_rules = $linkingRules;
$corporate->save();
if ($request->hasFile('logo')) {
$pathFileAvatar = File::storeFile('avatar', $corporate->id, $request->file('logo'));
$corporate->files()->updateOrCreate([
'type' => 'avatar',
'name' => File::getFileName('avatar', $corporate->id, $request->file('logo')),
'extension' => $request->file('logo')->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $pathFileAvatar,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
return $corporate;
}
}

View File

View File

@@ -37,10 +37,7 @@ class CorporateManageController extends Controller
*/
public function show($corporate_id)
{
$userLogin = Auth::user();
$corporate = $userLogin->managedCorporates()->where('corporates.id', $corporate_id)->first();
return response()->json($corporate);
//
}
/**

View File

@@ -3,36 +3,18 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Member;
use App\Models\Claim;
use App\Models\ClaimRequest;
use App\Models\RequestLog;
use App\Services\CorporateMemberService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMemberResources;
use Modules\Client\Transformers\AlarmCenter\DataListClaimMemberResource;
use Modules\Client\Transformers\AlarmCenter\DataServiceMonitoring;
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 Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Modules\Client\Transformers\EmployeeData\UserProfile\DataMemberResource as EmployeeDataProfileMemberResource;
use Modules\Internal\Services\MemberEnrollmentService;
use Illuminate\Support\Facades\DB;
use Dompdf\Dompdf;
use Dompdf\Options;
use PDF;
class CorporateMemberController extends Controller
{
public $memberEnrollmentService;
public function __construct(public CorporateMemberService $corporateMemberService, MemberEnrollmentService $memberEnrollmentService)
public function __construct(public CorporateMemberService $corporateMemberService)
{
$this->memberEnrollmentService = $memberEnrollmentService;
}
/**
@@ -42,408 +24,18 @@ class CorporateMemberController extends Controller
public function index(Request $request, $corporate_id)
{
switch ($request->input('type')) {
case 'employee-data':
$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)));
case 'claim-submit':
$members = $this->corporateMemberService->getAllMemberClaimSubmits($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimSubmitMemberResources::collection($members)));
$members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members)));
case 'alarm-center':
$members = $this->corporateMemberService->getAllMemberAlarmCenter($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members)));
case 'service-monitoring':
$members = $this->corporateMemberService->getAllEncounter($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members)));
default:
$members = $this->corporateMemberService->getAllMemberDashboards($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberResources::collection($members)));
}
}
public function show($corporate_id, $person_id)
{
$data = Member::query()
->with(['person'])
->where('person_id', $person_id)
->whereHas('currentCorporate', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})
->firstOrFail();
// Get Families
$data->families = Member::query()
->with(['person'])
->where('principal_id', $data->member_id)
->get();
return response()->json(EmployeeDataProfileMemberResource::make($data));
}
public function generateMemberList($corporate_id)
{
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Member::with(['currentPlan', 'currentCorporate', 'division', 'employeds', 'currentPolicy'])
// ->filter($request->all())
// ->where('corporate_id', $corporate_id)
->whereHas('employeds', function ($employeds) use ($corporate_id) {
$employeds->where('corporate_id', $corporate_id);
})->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
// Menulis header kolom
$headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['record_mode'], // Recode Mode
$item['record_type'], // Recode Type
$item['payor_id'], // Payor ID
$item['member_id'], // Member ID
$item['principal_id'], // Mapping ID
NULL, // Link Medis Member ID
$item['current_corporate']['code'] ?? null, // Corporate ID
$item['employeds'][0]['nik'] ?? null, // NIK
$item['division']['code'] ?? null, // Devision
$item['employeds'][0]['branch_code'] ?? null, // Branch Code
$item['bank_info'], // Bank Info
$item['language'], // Language
null, // Type of Work
$item['race'], // Race
$item['current_policy']['code'] ?? null, // Policy Number
$item['marital_status'], // Marital Status
$item['relation_with_principal'], // Relationship
str_replace('-', '', $item['members_effective_date']), // Member effective date
str_replace('-', '', $item['members_expire_date']), // Member expiry date
NULL, // Faskes FKTP (First Level Provider) or Individual preferred provider
NULL, // Faskes FKRTL (Next Level Provider) or Individual group preferred provider
$item['bpjs_class'], // The Right Classes Room of BPJS Participants
NULL, // Name of Faskes
NULL, // Rule BPJSK
NULL, // Internal Use
$item['full_name'], // Member Name
$item['address1'], // Address1
$item['address2'], // Address2
$item['address3'], // Address3
$item['address4'], // Address4
$item['city'], // City
NULL, // State
$item['postal_code'], // Post Code
NULL, // Telephone - Mobile
NULL, // Telephone - Res
NULL, // Telephone - Office
$item['nric'], // NRIC
$item['passport_no'], // Passport No
$item['passport_country'], // Passport Country
$item['email'], // Email
$item['identification_code'], // Identification Code
$item['birth_date'], // Date of Birth
$item['gender_code'], // Sex
NULL, // Internal Use
$item['current_plan']['code'] ?? null, // Plan-ID
NULL, // Employment-Status
NULL, // Internal Use
NULL, // Internal Use
NULL, // Internal Use
str_replace('-', '', $item['terminated_date']), // Date Terminated
$item['pre_existing'], // Pre Existing
$item['bpjs_id'], // BPJS ID
$item['endorsement_date'], // Endorsement Date
$item['remarks'], // Remarks
NULL, // Internal Use
NULL, // Member Since
NULL, // Internal Use
$item['policy_in_force'], // Policy Inforce
NULL, // Member Suspended
str_replace('-', '', $item['activation_date']), // Activation Date
NULL, // Internal Use
$item['start_no_claim'], // StartNoClaim
$item['end_no_claim'], // EndNoClaim
NULL, // Option Mode
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// dd('test');
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
// dd($filePath);
// Mengembalikan response untuk mengunduh file
return Helper::responseJson([
'file_name' => "Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
public function showPerMember(Request $request, $corporate_id, $member_id)
{
$per_page = $request->has('per_page') ? $request->input('per_page') : 10;
$member = Member::query()
->whereHas('currentCorporate', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})
->find($member_id);
$data = RequestLog::where([
'member_id' => $member->id,
'deleted_at' => null
])
->when($request->has('orderBy'), function ($query) use ($request) {
$orderBy = match ($request->input('orderBy')) {
'admission_date' => 'request_logs.submission_date',
'discharge_date' => 'request_logs.discharge_date',
'code' => 'request_logs.code',
default => ''
};
$query->getQuery()->orderBy($orderBy, $request->order);
})
->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->status, function ($q, $search) {
if ($search == 'kondisi') {
$q->whereHas('files', function ($subQuery) {
$subQuery->where('type', 'final-log-kondisi');
});
} elseif ($search == 'diagnosa') {
$q->whereHas('files', function ($subQuery) {
$subQuery->where('type', 'final-log-diagnosis');
});
} elseif ($search == 'result') {
$q->whereHas('files', function ($subQuery) {
$subQuery->where('type', 'final-log-result');
});
} elseif ($search == 'none') {
$q->doesntHave('files');
}
})
->with(['member','files'])
->paginate($per_page);
return response()->json(['full_name' => $member->full_name?? null, 'paginations' => Helper::paginateResources(DataListClaimMemberResource::collection($data))]);
}
public function serviceMonitoring(int $corporate_id, int $request_log_id)
{
$data = RequestLog::query()
->with([
'member:id,member_id,person_id,birth_date,email,name_prefix,name,name_suffix' => [
'currentCorporate',
'person:id,email,name_prefix,name,name_suffix,phone'
],
'organization:id,name',
'requestLogBenefits:id,request_log_id,benefit_id,amount_incurred,amount_approved,amount_not_approved,excess_paid,keterangan' => [
'benefit'
],
'requestLogDailyMonitorings:id,request_log_id,submission_date,subject,object,body_temperature,sistole,diastole,respiration_rate,analysis,lab_date,provider,examination' => [
'requestLogMedicalPlans:request_log_daily_monitoring_id,plan,type',
// 'document'
],
'service:code,name',
'files',
])
->find($request_log_id, ['id', 'submission_date', 'discharge_date', 'member_id', 'service_code', 'organization_id', 'diagnosis', 'keterangan', 'catatan']);
$dataBenefit = [];
if (count($data->requestLogBenefits) > 0) {
$totalIncurred = 0;
$totalApprove = 0;
$totalNotApporve = 0;
$totalExcess = 0;
foreach ($data->requestLogBenefits as $itemBenefit) {
$totalIncurred += $itemBenefit->amount_incurred;
$totalApprove += $itemBenefit->amount_approved;
$totalNotApporve += $itemBenefit->amount_not_approved;
$totalExcess += $itemBenefit->excess_paid;
}
$dataBenefit['totalIncurred'] = $totalIncurred;
$dataBenefit['totalApprove'] = $totalApprove;
$dataBenefit['totalNotApprove'] = $totalNotApporve;
$dataBenefit['totalExcess'] = $totalExcess;
}
$data->benefitTotal = $dataBenefit;
return Helper::responseJson(DataServiceMonitoring::make($data));
}
public function getDeposit($corporate_id)
{
$deposit = DB::table('corporate_policies')
->select('total_premi',
'minimal_deposit_percentage',
'minimal_deposit_net',
'minimal_alert_percentage',
'minimal_alert_net',
'minimal_stop_service_net',
'minimal_stop_service_percentage')
->where('corporate_id','=', $corporate_id)
->first();
$usage = DB::table('corporate_employees')
->join('request_logs', 'request_logs.member_id', '=', 'corporate_employees.member_id')
->join('request_log_benefits', 'request_log_benefits.request_log_id', '=', 'request_logs.id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->whereNull('request_log_benefits.deleted_at')
->sum('request_log_benefits.amount_approved');
// Ganti dengan logika Anda untuk mendapatkan data deposit
$deposit = [
'deposit' => $deposit->total_premi,
'limit' => $deposit->total_premi - $usage,
'usage' => $usage,
'minimal_deposit_percentage' => $deposit->minimal_deposit_percentage,
'minimal_deposit_net' => $deposit->minimal_deposit_net,
'minimal_alert_percentage' => $deposit->minimal_alert_percentage,
'minimal_alert_net' => $deposit->minimal_alert_net,
'minimal_stop_service_net' => $deposit->minimal_stop_service_net,
'minimal_stop_service_percentage' => $deposit->minimal_stop_service_percentage
];
return response()->json($deposit);
}
public function getLimits($corporate_id, $member_id)
{
$deposit = DB::table('corporate_policies')
->select('total_premi')
->where('corporate_id','=', $corporate_id)
->first();
$usage = DB::table('corporate_employees')
->join('request_logs', 'request_logs.member_id', '=', 'corporate_employees.member_id')
->join('request_log_benefits', 'request_log_benefits.request_log_id', '=', 'request_logs.id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('request_logs.member_id', '=', $member_id)
->whereNull('request_logs.deleted_at')
->whereNull('request_log_benefits.deleted_at')
->sum('request_log_benefits.amount_approved');
$services = DB::table('member_plans')
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
->leftJoin('services', 'services.code', '=', 'plans.service_code')
->where('member_plans.member_id', '=', $member_id)
->whereNull('member_plans.deleted_at')
->select(
'plans.service_code',
'services.name as title',
'plans.limit_rules as total',
DB::raw("
(
IFNULL(
(
SELECT SUM(request_log_benefits.amount_approved)
FROM request_logs
INNER JOIN request_log_benefits
ON request_log_benefits.request_log_id = request_logs.id
WHERE request_logs.member_id = $member_id
AND request_logs.service_code = plans.service_code
AND request_log_benefits.deleted_at IS NULL
), 0
)
) as current
")
)
->get();
$total_premi = 0;
foreach ($services as $value)
{
if($value->total > 0 && $value->total != 999999999)
{
$total_premi += $value->total;
}
else if($value->total == 999999999)
{
$total_premi = 999999999;
}
}
// Ganti dengan logika Anda untuk mendapatkan data deposit
$deposit = [
'deposit' => $total_premi,
'usage' => $usage,
'services' => $services
];
return response()->json($deposit);
}
public function downloadEcard($corporate_id, $member_id)
{
$member = Member::with([
'currentPlan',
'currentPolicy',
'currentCorporate',
'currentCorporate.files',
// 'currentPlan.corporateBenefits.benefit'
])->find($member_id);
$dataMember['member'] = $member;
$pdf = new Dompdf();
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set(['isRemoteEnabled' => true]);
$pdf->setOptions($options);
$pdf->setPaper('A5', 'portrait');
if ($member->currentCorporate->id == 5){ // Vale
$html1 = view('pdf.ecard', $dataMember);
} else {
$html1 = view('pdf.ecard-lms', $dataMember);
}
// Halaman 2
// $html2 = view('pdf.req_log_page_2', $data);
// Gabung konten HTML dari dua tampilan
// $htmlCombined = $html1 . $html2;
$htmlCombined = $html1;
$pdf->loadHtml($htmlCombined);
$pdf->render();
$headers = [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="file.pdf"',
];
return response($pdf->output(), 200, $headers);
}
public function viewECard($corporate_id, $member_id){
$member = Member::with([
'currentPlan',
'currentPolicy',
'currentCorporate',
'currentCorporate.files',
// 'currentPlan.corporateBenefits.benefit'
])->find($member_id);
if ($member->currentCorporate->id == 5){ // Vale
$pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait');
} else {
$pdf = PDF::loadView('pdf.ecard-lms', compact('member'))->setPaper('A5', 'portrait');
}
return $pdf->download('Ecard - '.$member->full_name.'.pdf');
}
}

View File

@@ -18,7 +18,7 @@ class CorporatePolicyController extends Controller
public function index($corporate_id)
{
$currentCorporate = Auth::user()->managedCorporates()
->with(['currentPolicy'])
->with(['currentPolicy', 'employees'])
->find($corporate_id);
$data = LimitResources::make($currentCorporate);

View File

@@ -1,905 +0,0 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\DailyMonitoring;
use App\Models\RequestDailyMonitoring;
use App\Models\MedicalPlan;
use App\Models\File;
use DB;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\File as Files;
use Modules\Internal\Transformers\DailyMonitoringResource;
use Carbon\Carbon;
/**
* Bagaskoro BSD 27-10-2023
*
* Controller untuk daily monitoring
*/
class DailyMonitoringController extends Controller
{
protected $path_for_store = 'public/lab_result';
protected function messages()
{
return [
'required' => ':attribute harus diisi',
'integer' => ':attribute harus angka',
'unique' => ':attribute (:input) sudah ada',
'max' => ':attribute maximal :max karakter',
'exists' => ':attribute (:input) tidak ditemukan',
'numeric' => ':attribute harus angka',
'digits_between'=> ':attribute maximal :max digit minimal :min digit'
];
}
public function GetMemberList(Request $request)
{
$startDate = $request->start_date ? Carbon::parse($request->start_date) : Carbon::today();
$endDate = $request->end_date ? Carbon::parse($request->end_date)->addDay() : Carbon::today()->addDay();
$memberList = DB::table('request_log_daily_monitorings')
->leftJoin('request_logs', 'request_log_daily_monitorings.request_log_id', '=', 'request_logs.id')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->select(
'members.member_id',
'members.name',
'members.birth_date',
'request_logs.type_of_member as member_type',
'members.members_effective_date AS startdate',
'members.members_expire_date AS enddate',
'request_logs.submission_date as addmision_date',
'organizations.name as provider',
'request_logs.organization_id',
'request_logs.code',
// Using a subquery to fetch medical_plan
DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 1 LIMIT 1) as medical_plan'),
DB::raw('(SELECT plan FROM request_log_medical_plan rdm WHERE rdm.request_log_daily_monitoring_id = request_log_daily_monitorings.id AND type = 2 LIMIT 1) as non_medical_plan'),
'request_log_daily_monitorings.*'
)
->whereNull('request_logs.deleted_at') // Use whereNull() for checking NULL
->when($request->search, function ($q, $search) {
$q->where(function ($subQ) use ($search) {
$subQ->where('members.member_id', 'LIKE', "%{$search}%");
$subQ->orWhere('members.name', 'LIKE', "%{$search}%");
});
})
->when($startDate, function ($q) use ($startDate) {
$q->where('request_log_daily_monitorings.submission_date', '>=', $startDate);
})
->when($endDate, function ($q) use ($endDate) {
$q->where('request_log_daily_monitorings.submission_date', '<=', Carbon::parse($endDate)->addDay());
})
->orderBy('request_logs.created_at', 'desc')
->paginate();
return Helper::paginateResources(DailyMonitoringResource::collection($memberList));
}
/**
* Claim List - by member id
*/
public function GetClaimList(Request $request, $member_id)
{
$memberDetail = DB::table('members')
->select('id','member_id','name')
->where('member_id', $member_id)
->first();
$claimList = DB::table('request_logs')
->leftJoin('services', 'services.code', '=', 'request_logs.service_code')
->leftJoin('members', 'members.id', '=', 'request_logs.member_id')
->select('request_logs.id','request_logs.submission_date AS admission_date','request_logs.discharge_date','request_logs.code','services.name as service_name','request_logs.status','members.name', 'members.member_id')
->where('request_logs.service_code', 'IP')
->where('request_logs.deleted_at', null)
// ->where('request_logs.status_final_log', 'approved')
->where("request_logs.member_id", "=", $memberDetail->id)
->where("request_logs.organization_id", "=", $request->organization_id)
->when($request->search, function ($q, $search) {
$q->where('request_logs.code', 'LIKE', "%".$search."%");
})
->orderBy("request_logs.created_at", "desc")
// ->get()
->paginate();
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'member_detail'=> $memberDetail,
'claim_list' => $claimList,
]
],200);
}
/**
* Detail Monitoring List - by claim_code
*/
public function GetDetailMonitoringList(Request $request, $request_code)
{
// get id request log
$request_logs = DB::table('request_logs')
->select('id','organization_id')
->where('code', $request_code)
->first();
$detail_list = RequestDailyMonitoring::where('request_log_id', empty($request_logs) == false ? $request_logs->id : '')
->orderBy("submission_date", "desc")
->get();
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'detail_list'=> $detail_list,
'organization_id' => $request_logs ? $request_logs->organization_id : 0
]
],200);
}
public function GetDetailMonitoringListbyID(Request $request, $id)
{
$detail = RequestDailyMonitoring::where('id', $id)
->orderBy("created_at", "desc")
->first();
if ($detail) {
// Ubah menjadi array agar bisa dimodifikasi
$detailArray = $detail->toArray();
// Ubah nama key dari request_log_id menjadi log_id
$detailArray['log_code'] = $detailArray['request_log_id'];
unset($detailArray['request_log_id']);
} else {
$detailArray = null;
}
return response()->json([
'error' => false,
'message' => "success",
'data' => $detailArray,
], 200);
}
public function UpdateDetailMonitoringbyID(Request $request)
{
// validation rule
$validator = Validator::make($request->all(),[
'log_code' => 'required',
'reason' => 'required',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'message' => $validator->getMessageBag()
],400);
}
try {
// insert claim daily monitoring
$db_response = RequestDailyMonitoring::where('id', $request->id)
->update([
'request_log_id' => $request->log_code,
'submission_date' => $request->submission_date,
'subject' => $request->subject,
'object' => $request->objective,
'sistole' => $request->sistole,
'diastole' => $request->diastole,
'body_temperature' => $request->body_temperature,
'respiration_rate' => $request->respiration_rate,
'analysis' => $request->analysis,
'lab_date' => $request->lab_date,
'provider' => $request->provider,
'examination' => $request->examination,
'doctor_1' => $request->doctor_1,
'doctor_2' => $request->doctor_2,
'temp_diagnosis' => $request->temp_diagnosis,
'final_diagnosis' => $request->final_diagnosis,
'approval_pendamping' => $request->approval_pendamping,
'description' => $request->keterangan,
'note' => $request->catatan,
'reason' => $request->reason,
'created_by' => auth()->user()->id,
]);
// cek medical plan
$num_medical_plan = 0;
foreach ($request->medical_plan as $row) {
if ($row['medical_plan_str']) {
$num_medical_plan++;
}
}
if ($num_medical_plan == 0) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => [
'medical_plan' => ['medical plan harus diisi']
],
'data' => []
],400);
}
if ($request->medical_plan){
// delete medical plan
DB::table('request_log_medical_plan')
->where([
'request_log_daily_monitoring_id' => $request->id,
'type' => 1
])
->delete();
// insert medical plan
foreach ($request->medical_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $request->id,
'plan' => $row['medical_plan_str'],
'type' => 1,
'created_at' => date('Y-m-d'),
]);
}
}
if ($request->non_medikamentosa_plan){
// delete medical plan
DB::table('request_log_medical_plan')
->where([
'request_log_daily_monitoring_id' => $request->id,
'type' => 2
])
->delete();
// insert non medical plan
foreach ($request->non_medikamentosa_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $request->id,
'plan' => $row['non_medikamentosa_plan_str'],
'type' => 2,
'created_at' => date('Y-m-d'),
]);
}
}
// insert file result
if ($request->confirmation_medical_leter){
// $fileCurrents = File::where([
// 'fileable_id' => $request->id,
// 'type' => 'confirmation-medical-letter',
// ])->get();
// if ($fileCurrents){
// foreach($fileCurrents as $fileCurrent){
// if (Files::exists($fileCurrent->path)) {
// Files::delete();
// }
// File::find($fileCurrent->id)->delete();
// }
// }
foreach ($request->confirmation_medical_leter as $file) {
$fileData = File::storeFile('confirmation-medical-letter', $request->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $request->id,
'type' => 'confirmation-medical-letter',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->medical_action_letter){
// $fileCurrents = File::where([
// 'fileable_id' => $request->id,
// 'type' => 'medical-action-letter',
// ])->get();
// if ($fileCurrents){
// foreach($fileCurrents as $fileCurrent){
// if (Files::exists($fileCurrent->path)) {
// Files::delete();
// }
// File::find($fileCurrent->id)->delete();
// }
// }
foreach ($request->medical_action_letter as $file) {
$fileData = File::storeFile('medical-action-letter', $request->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $request->id,
'type' => 'medical-action-letter',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
if ($request->result){
// $fileCurrents = File::where([
// 'fileable_id' => $request->id,
// 'type' => 'laboratorium-result',
// ])->get();
// if ($fileCurrents){
// foreach($fileCurrents as $fileCurrent){
// if (Files::exists($fileCurrent->path)) {
// Files::delete();
// }
// File::find($fileCurrent->id)->delete();
// }
// }
foreach ($request->result as $file) {
$fileData = File::storeFile('laboratorium-result', $request->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $request->id,
'type' => 'laboratorium-result',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
DB::commit();
return response()->json([
'error' => false,
'message' => "success",
'data' => []
],200);
}
catch (Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
'data' => []
],500);
}
}
/**
* Add Detail Monitoring List
*/
public function AddDetailMonitoringList(Request $request, $claim_code)
{
$request->merge(['claim_code' => $claim_code]);
// validation rule
$validator = Validator::make($request->all(),[
'claim_code' => 'required|exists:claim_requests,code',
'subject' => 'required',
'sistole' => 'required|numeric',
'diastole' => 'required|numeric',
'body_temperature' => 'required|numeric',
'respiration_rate' => 'required|numeric',
'analysis' => 'required',
'complaints' => 'required',
'medical_plan' => 'required',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'message' => $validator->getMessageBag()
],400);
}
// get claim request
$claim_request = DB::table('claim_requests')
->select('id')
->where('code', $claim_code)
->first();
// get claim
$claim = DB::table('claims')
->select('id')
->where('claim_request_id', $claim_request->id)
->first();
DB::beginTransaction();
try {
// insert claim daily monitoring
$db_response = DailyMonitoring::create([
'claim_id' => $claim->id,
'subject' => $request->subject,
'objective' => $request->objective,
'sistole' => $request->sistole,
'diastole' => $request->diastole,
'body_temperature' => $request->body_temperature,
'respiration_rate' => $request->respiration_rate,
'analysis' => $request->analysis,
'complaints' => $request->complaints,
]);
// cek medical plan
$num_medical_plan = 0;
foreach ($request->medical_plan as $row) {
if ($row['medical_plan_str']) {
$num_medical_plan++;
}
}
if ($num_medical_plan == 0) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => [
'medical_plan' => ['medical plan harus diisi']
],
'data' => []
],400);
}
// insert medical plan
foreach ($request->medical_plan as $row) {
MedicalPlan::create([
'claim_daily_monitoring_id' => $db_response->id,
'plan' => $row['medical_plan_str'],
]);
}
DB::commit();
return response()->json([
'error' => false,
'message' => "success",
'data' => []
],200);
}
catch (Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
'data' => []
],500);
}
}
/**
* Add Detail Request LOG LIST
*/
public function AddDetailMonitoringListRequestLog(Request $request, $request_code)
{
$request->merge(['request_code' => $request_code]);
// validation rule
$validator = Validator::make($request->all(),[
'request_code' => 'required|exists:request_logs,code',
'subject' => 'required',
'submission_date' => 'required',
'body_temperature' => 'required',
'sistole' => 'required',
'diastole' => 'required',
'respiration_rate' => 'required',
'analysis' => 'required',
'medical_plan' => 'required',
'non_medikamentosa_plan' => 'required',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'message' => $validator->getMessageBag()
],400);
}
// get claim request
$request_log = DB::table('request_logs')
->select('id')
->where('code', $request_code)
->first();
DB::beginTransaction();
try {
// insert claim daily monitoring
$db_response = RequestDailyMonitoring::create([
'request_log_id' => $request_log->id,
'submission_date' => $request->submission_date,
'subject' => $request->subject,
'object' => $request->objective,
'sistole' => $request->sistole,
'diastole' => $request->diastole,
'body_temperature' => $request->body_temperature,
'respiration_rate' => $request->respiration_rate,
'analysis' => $request->analysis,
'lab_date' => $request->lab_date,
'provider' => $request->provider,
'examination' => $request->examination,
'created_by' => auth()->user()->id,
]);
// cek medical plan
$num_medical_plan = 0;
foreach ($request->medical_plan as $row) {
if ($row['medical_plan_str']) {
$num_medical_plan++;
}
}
if ($num_medical_plan == 0) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => [
'medical_plan' => ['medical plan harus diisi']
],
'data' => []
],400);
}
// insert medical plan
foreach ($request->medical_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['medical_plan_str'],
'type' => 1,
'created_at' => date('Y-m-d'),
]);
}
// insert non medical plan
foreach ($request->non_medikamentosa_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['non_medikamentosa_plan_str'],
'type' => 2,
'created_at' => date('Y-m-d'),
]);
}
// insert file result
if ($request->confirmation_medical_leter){
foreach ($request->confirmation_medical_leter as $file) {
$fileData = File::storeFile('confirmation-medical-letter', $db_response->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'confirmation-medical-letter',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->medical_action_letter){
foreach ($request->medical_action_letter as $file) {
$fileData = File::storeFile('medical-action-letter', $db_response->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'medical-action-letter',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
if ($request->result){
foreach ($request->result as $file) {
$fileData = File::storeFile('laboratorium-result', $db_response->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'laboratorium-result',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
DB::commit();
return response()->json([
'error' => false,
'message' => "success",
'data' => []
],200);
}
catch (Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
'data' => []
],500);
}
}
public function AddListRequestLog(Request $request)
{
// validation rule
$validator = Validator::make($request->all(),[
'log_code' => 'required|exists:request_logs,id',
'subject' => 'required',
'submission_date' => 'required',
'body_temperature' => 'required',
'sistole' => 'required',
'diastole' => 'required',
'respiration_rate' => 'required',
'analysis' => 'required',
'medical_plan' => 'required',
'non_medikamentosa_plan' => 'required',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'message' => $validator->getMessageBag()
],400);
}
// get claim request
$request_log = DB::table('request_logs')
->select('id')
->where('id', $request->log_code)
->first();
DB::beginTransaction();
try {
// insert claim daily monitoring
$db_response = RequestDailyMonitoring::create([
'request_log_id' => $request->log_code,
'submission_date' => $request->submission_date,
'doctor_1' => $request->doctor_1,
'doctor_2' => $request->doctor_2,
'temp_diagnosis' => $request->temp_diagnosis,
'final_diagnosis' => $request->final_diagnosis,
'approval_pendamping' => $request->approval_pendamping,
'description' => $request->keterangan,
'note' => $request->catatan,
'subject' => $request->subject,
'object' => $request->objective,
'sistole' => $request->sistole,
'diastole' => $request->diastole,
'body_temperature' => $request->body_temperature,
'respiration_rate' => $request->respiration_rate,
'analysis' => $request->analysis,
'lab_date' => $request->lab_date,
'provider' => $request->provider,
'examination' => $request->examination,
'created_by' => auth()->user()->id,
]);
// cek medical plan
$num_medical_plan = 0;
foreach ($request->medical_plan as $row) {
if ($row['medical_plan_str']) {
$num_medical_plan++;
}
}
if ($num_medical_plan == 0) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => [
'medical_plan' => ['medical plan harus diisi']
],
'data' => []
],400);
}
// insert medical plan
foreach ($request->medical_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['medical_plan_str'],
'type' => 1,
'created_at' => date('Y-m-d'),
]);
}
// insert non medical plan
foreach ($request->non_medikamentosa_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['non_medikamentosa_plan_str'],
'type' => 2,
'created_at' => date('Y-m-d'),
]);
}
// insert file result
if ($request->confirmation_medical_leter){
foreach ($request->confirmation_medical_leter as $file) {
$fileData = File::storeFile('confirmation-medical-letter', $db_response->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'confirmation-medical-letter',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->medical_action_letter){
foreach ($request->medical_action_letter as $file) {
$fileData = File::storeFile('medical-action-letter', $db_response->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'medical-action-letter',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
if ($request->result){
foreach ($request->result as $file) {
$fileData = File::storeFile('laboratorium-result', $db_response->id, $file);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'laboratorium-result',
'name' => $fileData['name'],
'original_name' => $orignalName,
'extension' => $file->getClientOriginalName(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
DB::commit();
return response()->json([
'error' => false,
'message' => "success",
'data' => []
],200);
}
catch (Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
'data' => []
],500);
}
}
/**
* Delete Listing Daily Monitoring
*/
public function deleteDetailMonitoringListRequestLog(Request $request, $id)
{
$listDailyMonitoring = RequestDailyMonitoring::find($id);
$listDailyMonitoring->reason = $request->reason;
$listDailyMonitoring->save();
if (!$listDailyMonitoring) {
return response()->json([
'error' => true,
'message' => "Data not found.",
], 404);
}
$listDailyMonitoring->delete();
return response()->json([
'error' => false,
'message' => "Delete success",
'data' => $listDailyMonitoring
], 200);
}
/**
* Delete File Daily Monitoring
*/
public function deleteFileDetailMonitoringListRequestLog(Request $request, $id){
$fileCurrent = File::where([
'id' => $id,
])->first();
if ($fileCurrent){
if (Files::exists($fileCurrent->path)) {
Files::delete();
}
$fileCurrent->deleted_at = now();
$fileCurrent->reason = $request->reason;
$fileCurrent->deleted_by = auth()->user()->id;
$fileCurrent->save();
return response()->json([
'error' => false,
'message' => "Delete success",
'data' => $fileCurrent
], 200);
} else {
return response()->json([
'error' => true,
'message' => "Data not found.",
], 404);
}
}
/**
* Update Status Request LOG
*/
public function UpdateListRequestLog(Request $request, $request_code)
{
// get claim request
$request_log = DB::table('request_logs')
->where('code', $request_code)
->update([
'discharge_date' => now(),
'updated_by' => auth()->user()->id,
'updated_at' => now()
]);
if ($request_log) {
return response()->json([
'error' => false,
'message' => "success",
'data' => []
], 200);
} else {
return response()->json([
'error' => true,
'message' => $e->getMessage(),
'data' => []
],500);
}
}
}

View File

@@ -1,68 +0,0 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Models\Person;
use App\Models\Member;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class DataController extends Controller
{
public function show($id)
{
try {
$data = Person::findOrFail($id);
return response()->json($data);
} catch (\Exception $e) {
return response()->json(['error' => 'Member not found'], 404);
}
}
public function update(Request $request, $id)
{
try {
$data = Person::findOrFail($id);
$data->update($request->all());
return response()->json(['message' => 'Data updated successfully']);
} catch (\Exception $e) {
return response()->json(['error' => 'Failed to update data'], 500);
}
}
public function updateFamily(Request $request)
{
try {
// Ambil data keluarga dari payload
$familyData = $request->json()->all();
// Loop melalui data keluarga
foreach ($familyData as $familyMember) {
// Ambil ID anggota keluarga dari payload
$person_id = $familyMember['person_id'];
// Perbarui data anggota keluarga sesuai dengan payload
Member::where('person_id', $person_id)->update([
'name' => $familyMember['name'],
'email' => $familyMember['email'],
'relation_with_principal' => $familyMember['relation_with_principal'],
'birth_date' => $familyMember['birth_date'],
]);
Person::where('id', $person_id)->update([
'name' => $familyMember['name'],
'email' => $familyMember['email'],
'phone' => $familyMember['phone'],
'birth_date' => $familyMember['birth_date']
]);
}
// Respon sukses jika pembaruan berhasil
return response()->json([$person_id => 'Data keluarga berhasil diperbarui'], 200);
} catch (\Exception $e) {
// Tangani kesalahan jika ada yang terjadi
return response()->json(['error' => 'Gagal memperbarui data keluarga: ' . $e->getMessage()], 500);
}
}
}

View File

@@ -1,93 +0,0 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Models\Member;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class MemberController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
return Member::query()
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('member_id', 'LIKE', '%' . $search . '%');
})
->with('currentPlan', 'currentCorporate')
->paginate();
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('internal::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('internal::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function benefits($member_id)
{
$member = Member::findOrFail($member_id);
return response()->json($member->currentPlan->benefits()->select(['description', 'code', 'id'])->get());
}
}

37
Modules/Client/Http/Controllers/Api/TopUpController.php Executable file → Normal file
View File

@@ -3,7 +3,6 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\CorporatePolicy;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
@@ -20,7 +19,7 @@ class TopUpController extends Controller
{
$data = Auth::user()
->managedCorporates()
->with(['currentPolicy'])
->with(['currentPolicy', 'employees'])
->withCount(['employees', 'claims' => function ($query) {
$query->where('claims.status', 'paid');
}])
@@ -34,22 +33,9 @@ class TopUpController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request, $corporate_id)
public function store(Request $request)
{
$data = $request->validate([
'topup' => 'required|numeric',
]);
$corporatePolicy = CorporatePolicy::query()->where('corporate_id', $corporate_id)->firstOrFail();
if (!$corporatePolicy) {
return response()->json(['message' => 'Corporate policy not found'], 404);
}
$corporatePolicy->total_premi += $data['topup'];
$corporatePolicy->save();
return response()->json(['message' => 'Amount added to total_premi successfully'], 200);
//
}
/**
@@ -62,23 +48,6 @@ class TopUpController extends Controller
return view('client::show');
}
public function get($corporate_id)
{
$data = CorporatePolicy::query()
->where('corporate_id', $corporate_id)
->with(['currentPolicy', 'employees'])
->withCount(['employees', 'claims' => function ($query) {
$query->where('claims.status', 'paid');
}])
->first();
if (!$data) {
return response()->json(['message' => 'Corporate policy not found'], 404);
}
return Helper::responseJson(TopUpLimitResources::make($data));
}
/**
* Update the specified resource in storage.
* @param Request $request

0
Modules/Client/Http/Controllers/Api/UserController.php Executable file → Normal file
View File

0
Modules/Client/Http/Controllers/ClientController.php Executable file → Normal file
View File

0
Modules/Client/Http/Middleware/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Http/Requests/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Providers/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Providers/ClientServiceProvider.php Executable file → Normal file
View File

0
Modules/Client/Providers/RouteServiceProvider.php Executable file → Normal file
View File

0
Modules/Client/Resources/assets/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Resources/assets/js/app.js Executable file → Normal file
View File

0
Modules/Client/Resources/assets/sass/app.scss Executable file → Normal file
View File

0
Modules/Client/Resources/lang/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Resources/views/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Resources/views/index.blade.php Executable file → Normal file
View File

View File

0
Modules/Client/Routes/.gitkeep Executable file → Normal file
View File

91
Modules/Client/Routes/api.php Executable file → Normal file
View File

@@ -1,29 +1,13 @@
<?php
use Modules\Client\Http\Controllers\Api\AuthController;
use Modules\Client\Http\Controllers\Api\BillingSummaryController;
use Modules\Client\Http\Controllers\Api\CorporateDivisionController;
use Modules\Client\Http\Controllers\Api\CorporateManageController;
use Modules\Client\Http\Controllers\Api\CorporateMemberController;
use Modules\Client\Http\Controllers\Api\CorporateCurrentController;
use Modules\Client\Http\Controllers\Api\MemberController;
use Modules\Client\Http\Controllers\Api\CorporatePolicyController;
use Modules\Client\Http\Controllers\Api\UserController;
use Modules\Client\Http\Controllers\Api\ClaimController;
use Modules\Client\Http\Controllers\Api\TopUpController;
use Modules\Internal\Http\Controllers\ClaimEncounterController;
use Modules\Client\Http\Controllers\Api\ClaimReportController;
use Modules\Client\Http\Controllers\Api\ClaimRequestController;
use Modules\Client\Http\Controllers\Api\DataController;
use Modules\Internal\Http\Controllers\Api\FormulariumController;
use Modules\Internal\Http\Controllers\Api\FormulariumTemplateController;
use Modules\Internal\Http\Controllers\Api\AuditTrailController;
use Modules\Internal\Http\Controllers\Api\CorporateController;
use Modules\Internal\Http\Controllers\Api\NavigationController;
use Modules\Client\Http\Controllers\Api\DailyMonitoringController;
use Modules\Internal\Http\Controllers\Api\RequestLogController;
use Modules\Internal\Http\Controllers\Api\UserManagementController;
/*
|--------------------------------------------------------------------------
@@ -38,8 +22,6 @@ use Modules\Internal\Http\Controllers\Api\UserManagementController;
Route::prefix('client')->group(function () {
Route::get('codeLog', [RequestLogController::class, 'codeLog']);
Route::controller(AuthController::class)->group(function () {
Route::post('login', 'login');
Route::post('verify-code', 'validateOtp');
@@ -48,90 +30,19 @@ Route::prefix('client')->group(function () {
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('user', [UserController::class, 'index']);
Route::get('data/{id}', [DataController::class, 'show']);
Route::put('data/{id}', [DataController::class, 'update']);
Route::post('update-family', [DataController::class, 'updateFamily']);
Route::get('corporate-manage', [CorporateManageController::class, 'index']);
Route::get('corporate-manage/{corporate_id}', [CorporateManageController::class, 'show']);
Route::prefix('{corporate_id}')->group(function () {
Route::post('search-member', [MemberController::class, 'index']);
Route::get('policy', [CorporatePolicyController::class, 'index']);
Route::get('division', [CorporateDivisionController::class, 'index']);
Route::get('members', [CorporateMemberController::class, 'index']);
Route::get('members/{id}', [CorporateMemberController::class, 'show']);
Route::get('export-members/list', [CorporateMemberController::class, 'generateMemberList']);
Route::get('alarm-center-members/{id}', [CorporateMemberController::class, 'showPerMember']);
Route::get('service-monitoring/{request_log_id}', [CorporateMemberController::class, 'serviceMonitoring']);
Route::get('claims/status', [ClaimController::class, 'status']);
Route::get('claims', [ClaimController::class, 'index']);
Route::get('claims/export', [ClaimController::class, 'export']);
Route::get('claims/exportAlrmCenter/{start}/{end}', [ClaimController::class, 'exportAlrmCenter']);
Route::get('claims/{claim_id}/encounters', [ClaimEncounterController::class, 'getEncounterData']);
Route::get('topup', [TopUpController::class, 'index']);
// Route::get('topup', [TopUpController::class, 'get']);
Route::post('topup', [TopUpController::class, 'store']);
Route::get('claim-report/claim-status', [ClaimReportController::class, 'claimStatus']);
Route::get('claim-report/detail/{id}', [ClaimReportController::class, 'claimDetail']);
Route::get('claim-report/detail-history/{id}', [ClaimReportController::class, 'claimDetailHistory']);
Route::post('claim-report/{id}/request-files', [ClaimReportController::class, 'requestFiles']);
Route::get('corporate', [CorporateCurrentController::class, 'index']);
Route::put('corporate-update', [CorporateCurrentController::class, 'update']);
Route::get('get-deposits', [CorporateMemberController::class, 'getDeposit']);
Route::get('billing/summary', [BillingSummaryController::class, 'index']);
Route::get('/billing/provider-summary', [BillingSummaryController::class, 'providerSummary']);
Route::get('/billing/top-diagnosis', [BillingSummaryController::class, 'topDiagnosis']);
Route::get('get-limits/{member_id}', [CorporateMemberController::class, 'getLimits']);
Route::get('download-ecard/{member_id}', [CorporateMemberController::class, 'downloadEcard']);
Route::get('view_card/{member_id}', [CorporateMemberController::class, 'viewECard']);
});
Route::get('memberlist', [DailyMonitoringController::class, 'GetMemberList']);
// Daily Monitoring
Route::prefix('daily_monitoring')->group(function () {
Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']);
Route::get('detail/{id}/edit', [DailyMonitoringController::class, 'GetDetailMonitoringListbyID']);
});
Route::get('claims/{id}', [ClaimController::class, 'show']);
Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
Route::post('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
Route::get('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'index']);
Route::post('master/formulariums/{formulariums_template_id}', [FormulariumController::class, 'store']);
Route::post('master/formulariums/{formulariums_template_id}/import', [FormulariumController::class, 'import']);
Route::get('master/formulariums/{formulariums_template_id}/list', [FormulariumController::class, 'generateFormulariumList']);
Route::get('master/formularium-template', [FormulariumTemplateController::class, 'index']);
Route::get('master/formularium-template/search', [FormulariumTemplateController::class, 'search']);
Route::post('master/formularium-template/store', [FormulariumTemplateController::class, 'store']);
Route::put('master/formularium-template/{id}/activation', [FormulariumTemplateController::class, 'activation']);
Route::get('master/formularium-template/{id}/edit', [FormulariumTemplateController::class, 'edit']);
Route::put('master/formularium-template/{id}/update', [FormulariumTemplateController::class, 'update']);
Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']);
Route::get('corporates/import-document-example/{document_type}', [CorporateController::class, 'importDocumentExample']);
// Navigation
Route::get('navigations', [NavigationController::class, 'index']);
// User Management Role
Route::get('user/role', [UserManagementController::class, 'index']);
Route::post('user/role', [UserManagementController::class, 'store']);
Route::get('user/role/{id}', [UserManagementController::class, 'edit']);
Route::put('user/role/{id}', [UserManagementController::class, 'update']);
Route::get('permission_list', [UserManagementController::class, 'permission_list']);
// User Role Access
Route::get('user/access', [UserManagementController::class, 'list_access']);
Route::post('user/access', [UserManagementController::class, 'store_access']);
Route::get('user/access/{id}', [UserManagementController::class, 'edit_access']);
Route::put('user/access/{id}', [UserManagementController::class, 'update_access']);
Route::get('role-list', [UserManagementController::class, 'list_role']);
});
});

0
Modules/Client/Routes/web.php Executable file → Normal file
View File

0
Modules/Client/Tests/Feature/.gitkeep Executable file → Normal file
View File

0
Modules/Client/Tests/Unit/.gitkeep Executable file → Normal file
View File

View File

@@ -1,54 +0,0 @@
<?php
namespace Modules\Client\Transformers\AlarmCenter;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Service;
use App\Models\Organization;
use Illuminate\Support\Str;
class DataListClaimMemberResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$filesGroupByType = $this->files->mapToGroups(function($file) {
return [Str::slug($file->type, '_') => $file];
});
$serviceData = Service::where('code', $this->service_code)->first();
$organization = Organization::where('id', $this->organization_id)->first();
$organizationName = '-';
if ($organization){
$organizationName = $organization->name;
}
if ($serviceData) {
$serviceName = $serviceData->name;
} else {
$serviceName = $this->service_code;
}
if ($this->status == 'approved' && $this->status_final_log ){
$status = 'Done';
} else if ($this->status == 'declined' || $this->status_final_log == 'declined') {
$status = 'Declined';
} else {
$status = 'Ongoing';
}
return [
'id' => $this->id,
'admission_date' => $this->submission_date ?? null,
'discharge_date' => $this->discharge_date ?? null,
'code' => $this->code ?? null,
'provider_name' => $organizationName ?? null,
'service_type' => $serviceName,
'status' => $status,
'files_by_type' => $filesGroupByType
];
}
}

View File

@@ -1,264 +0,0 @@
<?php
namespace Modules\Client\Transformers\AlarmCenter;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
use App\Models\Icd;
use DB;
class DataServiceMonitoring extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$files = [];
$filesFinalLogResult = [];
$filesFinalLogDiagnosis = [];
$filesFinalLogKondisi = [];
if (count($this->files)>0){
foreach ($this->files as $key => $value) {
/*
Sementara di buat satu dulu, jangan di hapus..
karena suka labil client nya, tiba2 hide tiba2 munculin fitur :D
*/
// if($value->type == 'final-log-result'){
array_push($filesFinalLogResult, $value);
// };
// if($value->type == 'final-log-diagnosis'){
// array_push($filesFinalLogDiagnosis, $value);
// }
// if($value->type == 'final-log-kondisi'){
// array_push($filesFinalLogKondisi, $value);
// }
}
$files = [
'result' => $filesFinalLogResult,
'diagnosis' => $filesFinalLogDiagnosis,
'kondisi' => $filesFinalLogKondisi,
];
} else {
$files = [
'result' => [],
'diagnosis' => [],
'kondisi' => [],
];
}
$diagnosis = '-';
$main_diagnosis = '-';
if ($this->diagnosis){
$diagnosis = explode(',', $this->diagnosis);
if (count($diagnosis)>0){
foreach($diagnosis as $key => $d){
$icd = Icd::where('code', $d)->first('name');
if($key == 0){
if ($icd){
$main_diagnosis = $icd->name;
} else {
$main_diagnosis = $d;
}
$diagnosis = '-';
}
if ($key > 0){
if ($icd) {
$diagnosis .= $icd->name . ', ';
} else {
$diagnosis .= $d .', ';
}
}
}
}
}
return [
'companyName' => $this->member->currentCorporate->name ?? null,
'serviceCode' => $this->service_code ?? null,
'member_id' => $this->member->id ?? null,
'memberId' => $this->member->member_id ?? null,
'fullName' => $this->member->full_name ?? null,
'dateOfBirth' => $this->member->birth_date ?? null,
'phoneNumber' => $this->person->phone ?? null,
'email' => $this->member->email ?? ($this->member->person->email ?? null),
'serviceName' => $this->service->name ?? ($this->service_code ?? null),
'files' => $files,
'mainDiagnose' => $main_diagnosis,
'comparativeDiagnosis' => $diagnosis,
'benefits' => collect($this->requestLogBenefits)->map(function ($requestLogBenefit) {
return [
'amountIncurred' => $requestLogBenefit->amount_incurred,
'amountApproved' => $requestLogBenefit->amount_approved,
'amountNotAprroved' => $requestLogBenefit->amount_not_approved,
'excessPaid' => $requestLogBenefit->excess_paid,
'description' => $requestLogBenefit->keterangan,
'name' => $requestLogBenefit->benefit->description,
];
})->all() ?? null,
'keterangan' => $this->keterangan ?? null,
'catatan' => $this->catatan ?? null,
'benefitTotal' => $this->benefitTotal ?? null,
'hospital' => $this->organization->name ?? null,
'admissionDate' => $this->submission_date ?? null,
'dischargeDate' => $this->discharge_date ?? null,
'dailyMonitorings' => $this->when($this->service_code === 'IP', collect($this->requestLogDailyMonitorings)
->groupBy(function ($requestLogDailyMonitoring) {
return Carbon::parse($requestLogDailyMonitoring->submission_date)->format('d M Y');
})
->map(function ($groupedItems) {
return collect($groupedItems)
->map(function ($requestLogDailyMonitoring) {
$arr_document = [];
$document = DB::table('files')
->where([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $requestLogDailyMonitoring->id,
'deleted_at' => null
])
->whereIn('type', ['medical-action-letter', 'confirmation-medical-letter'])
->get();
if ($document){
foreach($document as $d){
// Jika path kosong, kembalikan null
if (!$row->path) {
return null;
}
// Cek nilai 'source'. Jika 's3', gunakan disk S3.
// Selain itu (termasuk null atau 'local'), gunakan disk 'public'.
if ($row->source === 's3') {
try {
$path = Storage::disk('s3')->temporaryUrl(
$row->path,
now()->addMinutes(60) // expired 1 jam
);
} catch (\Exception $e) {
$path = Storage::disk('s3')->url($row->path); // fallback kalau public
}
} else {
$path = Storage::disk('public')->url($row->path);
}
$arr_document[]= [
'path' => $path,
'type' => $d->type,
'original_name' => $d->original_name,
'name' => $d->name,
];
}
}
return [
'time' => Carbon::parse($requestLogDailyMonitoring->submission_date)->format('H:i') ?? null,
'status' => 'Done' ?? null,
'subject' => $requestLogDailyMonitoring->subject ?? null,
'object' => $requestLogDailyMonitoring->object ?? null,
'bodyTemperature' => $requestLogDailyMonitoring->body_temperature ?? null,
'sistole' => $requestLogDailyMonitoring->sistole ?? null,
'diastole' => $requestLogDailyMonitoring->diastole ?? null,
'respirationRate' => $requestLogDailyMonitoring->respiration_rate ?? null,
'analysis' => $requestLogDailyMonitoring->analysis ?? null,
'complaints' => $requestLogDailyMonitoring->complaints ?? null,
'plans' => $this->when($requestLogDailyMonitoring->requestLogMedicalPlans, collect($requestLogDailyMonitoring->requestLogMedicalPlans)
->map(function ($requestLogMedicalPlan) {
return [
'type' => $requestLogMedicalPlan->type,
'plan' => $requestLogMedicalPlan->plan
];
})
->sortBy('type')
->all()) ?? null,
'files' => $arr_document
];
})
->sortByDesc(function ($item) {
return $item['time'];
})
->values();
})
->sortByDesc(function ($groupedItems, $date) {
return Carbon::createFromFormat('d M Y', $date)->format('Y-m-d');
})
->all()) ?? null,
'laboratoriumResults' => $this->when($this->service_code === 'IP', collect($this->requestLogDailyMonitorings)
->groupBy(function ($requestLogDailyMonitoring) {
return Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y');
})
->filter(function ($groupedItems) {
return !is_null($groupedItems->first()->lab_date);
})
->map(function ($groupedItems) {
return collect($groupedItems)
->map(function ($test) {
$arr_document = [];
$document = DB::table('files')
->where([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $test->id,
'deleted_at' => null
])
->whereIn('type', ['laboratorium-result'])
->get();
if ($document){
foreach($document as $d){
// Jika path kosong, kembalikan null
if (!$row->path) {
return null;
}
// Cek nilai 'source'. Jika 's3', gunakan disk S3.
// Selain itu (termasuk null atau 'local'), gunakan disk 'public'.
if ($row->source === 's3') {
try {
$path = Storage::disk('s3')->temporaryUrl(
$row->path,
now()->addMinutes(60) // expired 1 jam
);
} catch (\Exception $e) {
$path = Storage::disk('s3')->url($row->path); // fallback kalau public
}
} else {
$path = Storage::disk('public')->url($row->path);
}
$arr_document[]= [
'path' => $path,
'type' => $d->type,
'original_name' => $d->original_name,
'name' => $d->name,
];
}
}
return [
'code' => $test->code,
'date' => Carbon::parse($test->lab_date)->format('d M Y') ?? null,
'examination' => $test->examination ?? null,
'location' => $test->provider ?? null,
'files' => $arr_document
];
})
->sortByDesc(function ($item) {
return $item['code'];
})
->values();
})
->sortByDesc(function ($groupedItems, $date) {
return Carbon::createFromFormat('d M Y', $date)->format('Y-m-d');
})
->all()) ?? null
];
}
}

View File

@@ -1,24 +0,0 @@
<?php
namespace Modules\Client\Transformers\ClaimReport;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Storage;
class ClaimReportFileShowResources extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'fileName' => $this->name,
'fileUrl' => url(Storage::url($this->path))
];
}
}

View File

@@ -3,7 +3,6 @@
namespace Modules\Client\Transformers\ClaimReport;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Crypt;
class MemberResources extends JsonResource
{
@@ -17,13 +16,11 @@ class MemberResources extends JsonResource
{
return [
'id' => $this->id,
'code' => $this->code,
'member_id' => $this->member_id,
'full_name' => $this->full_name,
'division_name' => $this->division_name ?? '',
'status' => $this->status,
'claimRequestId' => Crypt::encrypt($this->claim_request_id),
'submission_date' => $this->submission_date,
'memberId' => $this->member_id,
'fullName' => $this->full_name,
'division' => $this->division_name ?? '',
'submission_date' => '',
'status' => $this->active,
];
}
}

View File

@@ -1,31 +0,0 @@
<?php
namespace Modules\Client\Transformers\ClaimReport;
use Illuminate\Http\Resources\Json\JsonResource;
class ShowResources extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'claimRequestId' => $this->id,
'claimId' => $this->claim_id,
'submissionDate' => $this->submission_date,
'histories' => $this->whenLoaded('histories'),
'fullName' => $this->whenLoaded('member', $this->member->full_name),
'status' => $this->status,
'files' => [
'claimResults' => ClaimReportFileShowResources::collection($this->whenLoaded('claimResults')),
'claimConditions' => ClaimReportFileShowResources::collection($this->whenLoaded('claimConditions')),
'claimDiagnosis' => ClaimReportFileShowResources::collection($this->whenLoaded('claimDiagnosis'))
]
];
}
}

12
Modules/Client/Transformers/ClaimShowResource.php Executable file → Normal file
View File

@@ -1,4 +1,4 @@
<?php
c<?php
namespace Modules\Client\Transformers;
@@ -25,7 +25,7 @@ class ClaimShowResource extends JsonResource
$itemData['nominal_dicover'] = $item['nominal_dicover'] ?? 0;
$itemData['nominal_ditagihkan'] = $item['nominal_ditagihkan'] ?? 0;
$itemData['nominal_total'] = $item['nominal_total'] ?? 0;
// For React Frotnend
$itemData['biaya_diajukan'] = $itemData['nominal_ditagihkan'];
$itemData['biaya_disetujui'] = $itemData['nominal_dicover'];
@@ -33,12 +33,8 @@ class ClaimShowResource extends JsonResource
return $itemData;
});
$data['primary_diagnosis'] = $this->diagnoses->filter(function ($diagnosis) {
return $diagnosis->type == 'primary';
})->values();
$data['secondary_diagnosis'] = $this->diagnoses->filter(function ($diagnosis) {
return $diagnosis->type == 'secondary';
})->values();
$data['primary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'primary';})->values();
$data['secondary_diagnosis'] = $this->diagnoses->filter(function($diagnosis){ return $diagnosis->type == 'secondary';})->values();
return $data;
}

View File

View File

@@ -15,13 +15,11 @@ class MemberAlarmCenterResources extends JsonResource
{
return [
'id' => $this->id,
'personId' => $this->person_id,
'memberId' => $this->member_id,
'link_document' => $this->link_document,
'fullName' => $this->full_name,
'service' => $this->service_code,
'start_date' => $this->members_effective_date,
'end_date' => $this->members_expire_date,
'start_date' => $this->start_date,
'end_date' => $this->end_date,
'status' => $this->active,
];
}

View File

@@ -1,28 +0,0 @@
<?php
namespace Modules\Client\Transformers\Dashboard;
use Illuminate\Http\Resources\Json\JsonResource;
class MemberEmployeeDataResources extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $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,
];
}
}

View File

@@ -14,7 +14,6 @@ class MemberResources extends JsonResource
*/
public function toArray($request)
{
// dd($this->currentPlans);
return [
'id' => $this->id,
'memberId' => $this->member_id,
@@ -26,7 +25,6 @@ class MemberResources extends JsonResource
'percentage' => (!empty($this->currentPlan->limit_rules ?? 0)) ? (($this->claims_sum_total_claim / $this->currentPlan->limit_rules) * 100) : 0
],
'status' => $this->active,
// 'service_type' => $this->currentPlans,
];
}
}

View File

View File

@@ -1,92 +0,0 @@
<?php
namespace Modules\Client\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
class DataMemberResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
// return parent::toArray($request);
$data = [
'id' => $this->id,
'person_id' => $this->person_id,
'user_id' => $this->user_id,
'member_id' => $this->member_id,
'payor_id' => $this->payor_id,
'name_prefix' => $this->name_prefix,
'name' => $this->name,
'name_suffix' => $this->name_suffix,
'birth_date' => $this->birth_date,
'birth_place' => $this->person->birth_place,
'last_weight_kg' => $this->person->last_weight_kg,
'last_height_cm'=> $this->person->last_height_cm,
'phone' => $this->person->phone,
'nik' => $this->person->nik,
'religion' => $this->person->religion,
'marital_status' => $this->person->marital_status,
'last_education' => $this->person->last_education,
'current_employment' => $this->person->current_employment,
'main_address_id' => $this->person->currentAddress->text,
'family' => $this->family,
'claim_history' => $this->claim_history,
'gender' => $this->gender,
'language' => $this->language,
'race' => $this->race,
'record_type' => $this->record_type,
'principal_id' => $this->principal_id,
'relation_with_principal' => $this->relation_with_principal,
'bpjs_class' => $this->bpjs_class,
'nric' => $this->nric,
'email' => $this->email,
'bank_info' => $this->bank_info,
'agent_code' => $this->agent_code,
'address1' => $this->address1,
'address2' => $this->address2,
'address3' => $this->address3,
'address4' => $this->address4,
'city' => $this->city,
'state' => $this->state,
'postal_code' => $this->postal_code,
'record_mode' => $this->record_mode,
'telephone_mobile' => $this->telephone_mobile,
'telephone_res' => $this->telephone_res,
'telephone_office' => $this->telephone_office,
'passport_no' => $this->passport_no,
'passport_country' => $this->passport_country,
'identification_code' => $this->identification_code,
'pre_existing' => $this->pre_existing,
'bpjs_id' => $this->bpjs_id,
'endorsement_date' => $this->endorsement_date,
'members_effective_date' => $this->members_effective_date,
'members_expire_date' => $this->members_expire_date,
'activation_date' => $this->activation_date,
'terminated_date' => $this->terminated_date,
'remarks' => $this->remarks,
'policy_in_force' => $this->policy_in_force,
'start_no_claim' => $this->start_no_claim,
'end_no_claim' => $this->end_no_claim,
'active' => $this->active,
'reason' => $this->reason,
'total_claims' => $this->total_claims,
'full_name' => $this->full_name,
'age' => $this->age,
'gender_code' => $this->gender_code,
'limit' => [
'current' => $this->total_claims ?? 0,
'total' => (int)$this->currentPlan->limit_rules ?? 0,
'percentage' => (!empty($this->currentPlan->limit_rules ?? 0)) ? (($this->total_claims / $this->currentPlan->limit_rules) * 100) : 0
],
'benefits' => $this->currentPlan->benefits,
];
return $data;
}
}

View File

@@ -1,46 +0,0 @@
<?php
namespace Modules\Client\Transformers\EmployeeData\UserProfile;
use Illuminate\Http\Resources\Json\JsonResource;
class DataMemberResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'person' => [
'name' => $this->full_name ?? null,
'weight' => $this->person->last_weight_kg ?? null,
'height' => $this->person->last_height_kg ?? null,
'placeOfBirth' => ucwords($this->person->birth_place) ?? null,
'dateOfBirth' => $this->birth_date ?? $this->person->birth_date,
'gender' => ucwords(strtolower($this->gender ?? $this->person->gender)),
'phoneNumber' => $this->person->phone ?? null,
'email' => $this->email ?? ($this->person->email ?? null),
'address' => $this->person->last_height_kg ?? null,
'idNumber' => $this->person->nik ?? null,
'religion' => ucwords(strtolower($this->person->religion)) ?? null,
'maritalStatus' => $this->marital_status,
'education' => ucwords(strtolower($this->person->last_education)) ?? null,
'occupation' => null,
],
'families' => collect($this->families)->map(function ($family) {
return [
'name' => $family->full_name ?? null,
'relationship' => $family->relationship ?? null,
'dateOfBirth' => $family->birth_date ?? $family->person->birth_date,
'email' => $this->email ?? ($this->person->email ?? null),
'phoneNumber' => $this->person->phone ?? null,
'status' => $this->status ?? null
];
})->all()
];
}
}

0
Modules/Client/composer.json Executable file → Normal file
View File

0
Modules/Client/module.json Executable file → Normal file
View File

0
Modules/Client/package.json Executable file → Normal file
View File

0
Modules/Client/webpack.mix.js Executable file → Normal file
View File

0
Modules/HospitalPortal/Config/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Config/config.php Executable file → Normal file
View File

0
Modules/HospitalPortal/Console/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Database/Migrations/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Database/Seeders/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Database/factories/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Entities/.gitkeep Executable file → Normal file
View File

View File

@@ -1,21 +0,0 @@
<?php
namespace Modules\HospitalPortal\Helpers;
class ApiResponse
{
public static function apiResponse(string $status, array|object $data = null, string|array|object $message = null, int $statusCode)
{
if ($message instanceof \Illuminate\Support\MessageBag) {
$message = $message->first();
}
return response()->json([
'meta' => [
'status' => $status,
'code' => $statusCode,
'message' => $message
],
'data' => $data,
], $statusCode);
}
}

View File

@@ -1,93 +0,0 @@
<?php
namespace Modules\HospitalPortal\Helpers;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use DateTime;
use DateTimeZone;
class GrabHelper
{
protected $client;
public function __construct()
{
$this->client = new Client();
}
public function getToken()
{
$url = env('TOKEN_URL_GRAB');
$headers = [
'Content-Type' => 'application/json',
];
$body = json_encode([
'client_id' => env('CLIENT_ID_GRAB'),
'client_secret' => env('CLIENT_SECRET_GRAB'),
'grant_type' => 'client_credentials',
'scope' => 'grab_express.partner_deliveries',
]);
$request = new Request('POST', $url, $headers, $body);
$response = $this->client->send($request);
$data = json_decode($response->getBody()->getContents(), true);
return $data['access_token'] ?? null;
}
public function createDelivery($token,$body)
{
$url = env('BASE_URL_GRAB').'/v1/deliveries';
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $token,
];
$request = new Request('POST', $url, $headers, $body);
$response = $this->client->send($request);
return $response->getBody()->getContents();
}
public function normalizePhoneNumber($phoneNumber) {
// Remove any non-digit characters (e.g., '+', '-', spaces)
$phoneNumber = preg_replace('/\D/', '', $phoneNumber);
// Check if the cleaned phone number is numeric
if (!is_numeric($phoneNumber)) {
return null; // Return false or handle the error as needed
}
// Handle phone numbers starting with '62' or '+62'
if (substr($phoneNumber, 0, 2) === '62') {
$phoneNumber = '0' . substr($phoneNumber, 2);
}
// Handle phone numbers that already start with '8'
if (substr($phoneNumber, 0, 1) === '8') {
$phoneNumber = '0' . $phoneNumber;
}
return $phoneNumber;
}
public function getScheduleTimes()
{
// Create a DateTime object for the current time in Jakarta timezone
$pickupTimeFrom = new DateTime('now', new DateTimeZone('Asia/Jakarta'));
// Add 30 minutes to the current time for pickupTimeFrom
$pickupTimeFrom->modify('+30 minutes');
// Clone the pickupTimeFrom to calculate pickupTimeTo
$pickupTimeTo = clone $pickupTimeFrom;
// Add 1 hour to pickupTimeFrom for pickupTimeTo
$pickupTimeTo->modify('+1 hour');
// Format the times to ISO 8601 format (e.g., 2024-10-02T12:37:28+07:00)
return [
"pickupTimeFrom" => $pickupTimeFrom->format(DateTime::ATOM),
"pickupTimeTo" => $pickupTimeTo->format(DateTime::ATOM),
];
}
}

0
Modules/HospitalPortal/Http/Controllers/.gitkeep Executable file → Normal file
View File

View File

@@ -12,58 +12,41 @@ use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB;
use App\Helpers\Helper;
use Illuminate\Support\Facades\View;
class AuthController extends Controller
{
public function login(Request $request)
{
$data = [
'email' => $request->email,
'password' => $request->password
];
$validator = Validator::make($request->all(), [
$request->validate([
'email' => 'required|email',
'password' => 'required'
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
'password.required' => trans('Validation.required',['attribute' => 'Password']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
$user = User::query()
->where('email', $request->email)
->first();
if (!$user) {
return response(['message' => 'User Tidak Ditemukan'], 404);
}
else
{
$user = User::where('email', $request->email)->first();
if (!$user) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
if (!Hash::check($request->password, $user->password)) {
return ApiResponse::apiResponse('Bad Request', $data, trans('Message.password'), 400);
}
$res_data = [
'user' => $user,
'token' => $user->createToken('app')->plainTextToken
];
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
if (!Hash::check($request->password, $user->password)) {
return response(['message' => 'Password Salah'], 403);
}
return response([
'message' => 'Selamat Datang',
'user' => $user,
'token' => $user->createToken('app')->plainTextToken
]);
}
public function logout(Request $request)
{
$request->user()->tokens()->delete();
$token = $request->bearerToken();
Auth::user()->tokens()->where('id', $token)->delete();
return ApiResponse::apiResponse('Success', [], trans('Message.logout'), 200);
return response(['message' => 'Berhasil Logout.']);
}
public function resetPassword(Request $request)
@@ -77,12 +60,12 @@ class AuthController extends Controller
]);
if (!Hash::check($request['old_password'], $user->password)) {
return response(['Message' => 'Password Salah'], 403);
return response(['message' => 'Password Salah'], 403);
}
if ($request["new_password"] != $request["confirm_new_password"]) {
return response([
'Message' => "Password Tidak Sama"
'message' => "Password Tidak Sama"
]);
}
@@ -94,202 +77,52 @@ class AuthController extends Controller
public function verifyEmail(Request $request)
{
$data = [
'email' => $request->email,
];
$validator = Validator::make($request->all(), [
$request->validate([
'email' => 'required|email',
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$user = User::where('email', $request->email)->first();
if (!$user) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
//send email
// Insert data notifications
$emailTo = $request->email;
$dataNotif = [
'user_id' => $user->id,
'email' => $emailTo,
'title' => 'Forgot Password',
'description' => 'Request forgot password from Hospital Portal',
'type' => 1,
'isUnRead' => true,
'created_by' => auth()->check() ? auth()->user()->id : null,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$sendNotif = Helper::insertNotification($dataNotif);
//Insert data password reset
$token = mt_rand(100000, 999999); // Menghasilkan angka acak antara 100000 dan 999999
$p_resets = DB::table('password_resets')
->insert([
'email' => $request->email,
'token' => $token,
'created_at' => date('Y-m-d H:i:s'),
]);
// Send Email after insert notifications
if($sendNotif && $p_resets)
{
//send to alarm
$nameTo = 'User';
$dataEmail = [
'email' => $emailTo,
'name' => $nameTo,
'subject' => 'Request Forgot Password from Hospital Portal Date '. date('Y-m-d H:i:s'),
'body' => View::make('email/forgot_password', ['token' => $token])->render(),
];
Helper::sendEmail($dataEmail);
$res = DB::table('password_resets')
->where('email', '=', $request->email)
->where('token', '=', $token)
->first();
return ApiResponse::apiResponse("Success", $res, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse("Internal Server Error", $data, trans('Message.server_error'), 500);
}
}
}
public function verifCode(Request $request)
{
$data = [
'email' => $request->email,
'token' => $request->token,
];
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'token' => 'required|numeric',
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
'token.required' => trans('Validation.required',['attribute' => 'Token']),
'token.numeric' => trans('Validation.required',['attribute' => 'Code Numeric']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
//Check Time
$check = DB::table('password_resets')
->where('email', '=', $request->email)
->where('token', '=', $request->token)
->select('created_at')
$user = User::query()
->where('email', $request->email)
->first();
if($check)
{
$created_at = strtotime($check->created_at); // Konversi string waktu ke UNIX timestamp
$now = time(); // Waktu sekarang dalam UNIX timestamp
// Hitung selisih waktu dalam menit
$diffInMinutes = ($now - $created_at) / 60;
if ($diffInMinutes > 60) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
} else {
// Lanjutkan dengan proses pemulihan kata sandi
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
}
else
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
if (!$user) {
return response(['message' => 'User Tidak Ditemukan'], 404);
}
Event(new ForgetPassword($user));
// Mail::to($user->email)->send(new SendVerifyEmail($user));
return response()->json($user);
}
public function forgetPassword(Request $request)
{
$data = [
'email' => $request->email,
'token' => $request->token,
'new_password' => $request->new_password
];
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'token' => 'required|numeric',
'new_password' => [
'required',
'min:8',
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/'
]
], [
'email.required' => trans('Validation.required',['attribute' => 'Email']),
'email.email' => trans('Validation.email'),
'token.required' => trans('Validation.required',['attribute' => 'Token']),
'new_password.required' => trans('Validation.required',['attribute' => 'New Password']),
'new_password.min' => trans('Validation.min',['attribute' => 'New Password']),
'new_password.regex' => trans('Validation.regex',['attribute' => 'New Password']),
$request->validate([
'new_password' => 'required',
'confirm_new_password' => 'required'
]);
if($request->new_password != $request->confirm_new_password)
{
return ApiResponse::apiResponse('Bad Request', $data, 'Confirm password is not the same', 400);
}
else if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
//Check Time
$check = DB::table('password_resets')
->where('email', '=', $request->email)
->where('token', '=', $request->token)
->select('created_at')
$token = Crypt::decryptString($request->token);
$email = explode('|', $token)[0];
$user = User::query()
->where('email', $email)
->first();
if($check)
{
$created_at = strtotime($check->created_at); // Konversi string waktu ke UNIX timestamp
$now = time(); // Waktu sekarang dalam UNIX timestamp
// Hitung selisih waktu dalam menit
$diffInMinutes = ($now - $created_at) / 60;
if ($diffInMinutes > 60) {
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
} else {
// Lanjutkan dengan proses pemulihan kata sandi
$user = User::where('email', $request->email)->first();
if ($user)
{
$newPassword = Hash::make($request->new_password);
$user->password = $newPassword;
$user->save();
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.token_expired'), 404);
}
}
}
else
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
if (!$user) {
return response(['message' => 'User Tidak Ditemukan'], 404);
}
if ($request["new_password"] != $request["confirm_new_password"]) {
return response([
'message' => "Password Tidak Sama"
], 404);
}
$user->update([
'password' => Hash::make($request->confirm_new_password),
]);
return response()->json($user);
}
}

View File

@@ -7,9 +7,6 @@ use App\Helpers\Helper;
use App\Models\ClaimRequest;
use App\Models\File;
use App\Models\Member;
use App\Models\RequestLog;
use App\Models\Organization;
use App\Services\ClaimRequestService;
use App\Services\ClaimService;
use Exception;
@@ -19,9 +16,6 @@ use Illuminate\Routing\Controller;
use Modules\HospitalPortal\Transformers\ClaimRequestResource;
use Modules\HospitalPortal\Transformers\ClaimRequestShowResource;
use PDF;
use Illuminate\Support\Facades\DB;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\Validator;
class ClaimRequestController extends Controller
{
@@ -29,7 +23,6 @@ class ClaimRequestController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
private static $code_prefix = 'CLAIM';
public function index(request $request)
{
$claimRequests = ClaimRequest::query()
@@ -67,110 +60,70 @@ class ClaimRequestController extends Controller
*/
public function store(Request $request)
{
$data = [
'request_logs_id' => $request->request_logs_id,
'member_id' => $request->member_id,
'service_code' => $request->service_code
];
$validator = Validator::make($request->all(), [
'request_logs_id' => 'required',
$request->validate([
'member_id' => 'required',
'service_code' => 'required'
], [
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Log ID']),
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code'])
'service_code' => 'required|in:OP,IP'
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$check_claim_requests = DB::table('claim_requests')
->where('claim_requests.request_log_id', '=', $request->request_logs_id)
->first();
if(!$check_claim_requests)
{
try {
DB::beginTransaction();
$code = $this->getNextCode($request->request_logs_id);
$member = Member::find($request->member_id);
$requestLogData = RequestLog::where('id',$request->request_logs_id)->first();
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
$provideCode = $organization ? $organization->code : '';
$newClaimRequest = ClaimRequestService::storeClaimRequest(
row: [],
code: $code,
member: $member,
paymentType: 'cashless',
serviceCode: $request->service_code,
requestLogID: $request->request_logs_id,
organization_code: $provideCode,
);
// Log History
$newClaimRequest->histories()->create([
'title' => 'New Claim Requested',
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'type' => 'info',
'system_origin' => 'hospital-portal'
]);
// Claim Log
DB::table('claim_logs')
->insert([
'claim_request_id' => $newClaimRequest->id,
'status' => 'requested',
'date' => date('Y-m-d H:i:s'),
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'system_origin' => 'hospital-portal',
'created_by' => auth()->user()->id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at'=> date('Y-m-d H:i:s'),
]);
if ($request->hasFile('additional_files')) {
foreach ($request->additional_files as $file) {
$fileData = File::storeFile('additional-files', $request->request_logs_id, $file);
// $newClaimRequest->files()->updateOrCreate([
// 'type' => 'additional-files',
// 'name' => File::getFileName('additional-files', $newClaimRequest->id, $file),
// 'original_name' => $file->getClientOriginalName(),
// 'extension' => $file->getClientOriginalExtension(),
// 'path' => $pathFile,
// 'created_by' => auth()->user()->id,
// 'updated_by' => auth()->user()->id,
// ]);
File::updateOrCreate([
'fileable_type' => 'App\Models\RequestLog',
'fileable_id' => $request->request_logs_id,
'type' => 'additional-files',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
DB::commit();
return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200);
}
catch (\Exception $e) {
DB::rollback();
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
$member = Member::find($request->member_id);
$newClaimRequest = ClaimRequestService::storeClaimRequest(member: $member, paymentType: 'reimbursement', serviceCode: $request->service_code);
ClaimRequested::dispatch($newClaimRequest);
// Log History
$newClaimRequest->histories()->create([
'title' => 'New Claim Requested',
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'type' => 'info',
'system_origin' => 'hospital-portal'
]);
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-result', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
else
{
return ApiResponse::apiResponse("Error", $data, trans('Message.already_exists'), 409);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('claim-diagnosis', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-kondisi', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!');
}
/**
@@ -184,8 +137,7 @@ class ClaimRequestController extends Controller
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
},
'files',
}
]);
return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest));
@@ -226,276 +178,16 @@ class ClaimRequestController extends Controller
{
$claimRequest = ClaimRequest::findOrFail($claim_request_id);
$service_code = $claimRequest->service_code;
if ($claimRequest->status != 'approved') {
throw new Exception("Belum Teverifikasi", 1);
}
$member = Member::findOrFail($claimRequest->member_id)
->load([
// 'currentPlan',
'currentPlan' => function ($plan) use ($claim_request_id, $service_code) {
$plan->where('plans.service_code', $service_code);
},
'currentPolicy',
'currentPlan.corporateBenefits',
'currentPlan.corporateBenefits.benefit'
]);
->load(['currentPlan', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']);
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'claimRequest'));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
return $claimRequest;
}
public static function getNextCode($request_log_id = 0)
{
$last_numeric_code = ClaimRequest::select(DB::raw('MAX(CAST(SUBSTRING_INDEX(code, ".", -1) AS SIGNED)) as max_numeric_code'))
->whereRaw('SUBSTRING_INDEX(code, ".", -1) REGEXP "^[0-9]+$"')
->value('max_numeric_code');
// $next_number = 1;
if ($last_numeric_code) {
// // Jika ada kode sebelumnya, pecah kode dan tambahkan 1 ke angka terakhir
// $parts = explode('-', $last_code);
// $last_number = (int) end($parts);
$next_number = $last_numeric_code + 1;
} else {
$next_number = 1;
}
return self::makeCode($next_number, $request_log_id);
}
public static function makeCode($next_number, $request_log_id)
{
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
$requestLogData = RequestLog::where('id', $request_log_id)->first();
$organization = Organization::where(['id' => $requestLogData->organization_id, 'type' => 'hospital'])->first('code');
$provideCode = $organization ? $organization->code : '';
$member = Member::with('currentCorporate')->where(['id' => $requestLogData->member_id])->first();
$sparator = '.';
$date = date('ymd');
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . $sparator. 'H' . $sparator. $provideCode . $sparator. $date. $sparator . $member->currentPolicy->code . $sparator. $member->member_id . $sparator. str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
public function get_claim_requests(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
$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')
->when($request->input('search'), function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('claim_requests.code', 'like', "%" . ($search == 'outpatient' || $search == 'Outpatient' ? 'OP' : 'IP') . "%")
->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 . "%")
->orWhere('claims.status', 'like', "%" . $search . "%");
});
})
->when($request->has('orderBy'), function ($query) use ($request) {
$orderBy = $request->orderBy;
$direction = $request->order ?? 'asc';
$query->orderBy($orderBy, $direction);
})
->when($request->input('start_date') && !$request->input('end_date'), function ($query, $start_date) {
$query->where(function ($query) use ($start_date) {
$query->where('claim_requests.submission_date', '<', $start_date);
});
})
->when($request->input('status'), function ($query, $status) {
$query->where(function ($query) use ($status) {
if ($status === 'requested') {
$query->where('claim_requests.status', '=', 'requested');
}
if ($status === 'reviewed') {
$query->where('claim_requests.status', '=', 'approved');
$query->where('claims.status', '=', 'received');
}
if ($status === 'approved') {
$query->where('claim_requests.status', '=', 'approved');
$query->where('claims.status', '=', 'approved');
}
if ($status === 'declined') {
$query->where('claim_requests.status', '=', 'approved');
$query->where('claims.status', '=', 'declined');
}
});
})
->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 "reviewed"
ELSE ""
END AS status
'),
'claim_requests.id AS claim_request_id',
'claim_requests.submission_date',
DB::raw('
CASE
WHEN service_code = "OP" THEN "Outpatient"
WHEN service_code = "IP" THEN "Inpatient"
ELSE ""
END AS service_type
')
)
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function detail_claim_requests($claimRequestId)
{
$status = 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('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.submission_date',
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 "reviewed"
ELSE ""
END AS status
')
)
->first();
$results['status'] = $status;
$timeline = DB::table('claim_logs')
->where('claim_logs.claim_request_id', '=', $claimRequestId)
->select(
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "Request"
WHEN claim_logs.status = "reviewed" THEN "Review"
WHEN claim_logs.status = "approved" THEN "Approval"
WHEN claim_logs.status = "declined" THEN "Decline"
ELSE "-"
END AS txt_status
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#159C9C"
WHEN claim_logs.status = "reviewed" THEN "#0C53B7"
WHEN claim_logs.status = "approved" THEN "#229A16"
WHEN claim_logs.status = "declined" THEN "#FF4842"
ELSE "-"
END AS txt_status_color
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#00AB5529"
WHEN claim_logs.status = "reviewed" THEN "#1890FF29"
WHEN claim_logs.status = "approved" THEN "#54D62C29"
WHEN claim_logs.status = "declined" THEN "#FF48427A"
ELSE "-"
END AS txt_status_backgroundColor
'),
'claim_logs.date',
'claim_logs.description',
'claim_logs.status'
)
->orderBy('claim_logs.id', 'desc')
->get();
$results['timeline'] = $timeline;
$request_files = DB::table('claim_request_files')
->where('claim_request_files.claim_request_id', '=', $claimRequestId)
->select(
'claim_request_files.*',
DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'),
)
->get();
$results['request_files'] = $request_files;
return Helper::responseJson($results);
}
public function requestFiles(Request $request, $claim_id)
{
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$fileData = File::storeFile('claim-diagnosis', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-diagnosis',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$fileData = File::storeFile('claim-kondisi', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-kondisi',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileResults')) {
foreach ($request->fileResults as $file) {
$fileData = File::storeFile('claim-result', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-result',
'name' => $fileData['name'],
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'source' => env('FILESYSTEM_DISK'),
'path' => $fileData['path'],
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
}

View File

@@ -7,12 +7,6 @@ use App\Models\Member;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB;
use App\Models\CorporateBenefit;
use App\Models\MemberPlan;
use App\Models\Plan;
class MemberController extends Controller
{
@@ -22,208 +16,26 @@ class MemberController extends Controller
*/
public function search(Request $request)
{
$data = [
'no_polis' => $request->no_polis,
'birth_date' => $request->birth_date
];
$validator = Validator::make($request->all(), [
$request->validate([
'no_polis' => 'required',
'birth_date' => 'required'
], [
'no_polis.required' => trans('Validation.required',['attribute' => 'Member ID']),
'birth_date.required' => trans('Validation.required',['attribute' => 'Birth Date']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$members = DB::table('members')
->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id')
->leftJoin('persons', 'persons.id', '=', 'members.person_id')
->where('members.member_id', '=', $request->no_polis)
->where('members.birth_date', '=', $request->birth_date)
->select(
'members.id',
'members.name',
'members.member_id',
'member_policies.policy_id',
'persons.nik',
'members.email',
'members.birth_date',
'members.gender',
'members.marital_status',
'members.language',
'members.race',
'members.relation_with_principal')
->first();
if($members)
{
$res_data['members'] = $members;
$benefits = DB::table('member_plans')
->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id')
->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id')
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
->leftJoin('services', 'services.code', '=', 'plans.service_code')
->where('member_plans.member_id', '=', $members->id)
->select(
'benefits.description',
'benefits.code',
'corporate_benefits.corporate_id',
'plans.service_code'
)
->get();
$res_data['benefits'] = $benefits;
$member = Member::query()
->where('member_id', $request->no_polis)
->where('birth_date', $request->birth_date)
->with(['person', 'currentCorporate',
// 'currentCorporate.corporateServices' => function ($corporateService) {
// $corporateService->where('status', 'active');
// },
// 'currentCorporate.corporateServices.service'
// 'currentPlan.benefits',
// 'currentPlan.corporateBenefit.plan',
'currentPlan.corporateBenefits.benefit'
])
->firstOrFail();
$services = DB::table('member_plans')
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
->leftJoin('services', 'services.code', '=', 'plans.service_code')
->where('member_plans.member_id', $members->id)
->whereNull('member_plans.deleted_at')
->select('plans.service_code', 'services.name')
->get();
$res_data['services'] = $services;
// Group Services
$groupServices = [];
foreach ($res_data['benefits'] as $benefit) {
$serviceCode = $benefit->service_code;
$groupServices[$serviceCode][] = [
'description' => $benefit->description,
'code' => $benefit->code,
];
}
$res_data['groupServices'] = $groupServices;
$res_data['type'] = $request->type;
// Provider
$providers = DB::table('organizations')
->where('organizations.type', '=', 'hospital')
->where('organizations.corporate_id_partner', '!=', 8)
->orWhere('organizations.corporate_id_partner', NULL)
->where('status', '=', 'active')
->orderBy('organizations.name','asc')
->select(
'organizations.id',
'organizations.name'
)
->get();
$res_data['providers'] = $providers;
//company
$companies = DB::table('corporates')
->where('corporates.active', '=', 1)
->select(
'corporates.id',
'corporates.name'
)
->get();
$res_data['companies'] = $companies;
//company
$companies = DB::table('corporates')
->where('corporates.active', '=', 1)
->select(
'corporates.id',
'corporates.name'
)
->get();
$res_data['companies'] = $companies;
$corporateEmployee = DB::table('corporate_employees')
->leftJoin('corporates', 'corporates.id', '=', 'corporate_employees.corporate_id')
->leftJoin('corporate_policies', 'corporate_policies.corporate_id', '=', 'corporates.id')
// ->where('corporate_employees.status', 'ACTIVE')
->where('corporates.active', 1)
->where('corporate_policies.active', 1)
->where('corporate_employees.member_id', $members->id)
->select(
'corporate_policies.total_premi',
'corporate_employees.corporate_id'
)
->first();
$res_data['total_premi'] = $corporateEmployee ?? 0;
$limitRules = DB::table('member_plans')
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
->where('member_plans.member_id', $members->id)
->where('member_plans.status', 'active')
->where('plans.active', 1)
->value('plans.limit_rules');
$res_data['limit_rules'] = $limitRules ?? 0;
$planMember = MemberPlan::where('member_id', $members->id)->get('plan_id');
$planId = Plan::whereIn('id', $planMember)->where('service_code', 'OP')->first();
$benefit = CorporateBenefit::with(['benefit', 'plan'])->where('plan_id', $planId->id)->get()->toArray();
$benefitData = [];
if (count($benefit)){
foreach($benefit as $data){
$data['benefit']['plan_id'] = $data['plan_id'];
$data['benefit']['limit_amount'] = $data['limit_amount'];
$data['benefit']['family_plan'] = $planId->family_plan;
$data['benefit']['max_frequency_period'] = $data['max_frequency_period'];
$data['benefit']['limit_amount_plan'] = $data['plan']['limit_rules'];
$data['benefit']['family_plan_plans'] = $data['plan']['family_plan'];
array_push($benefitData, $data['benefit']);
}
}
$memberUsage = Helper::getUsageMember($corporateEmployee->corporate_id, $members->id, $benefitData);;
$res_data['used_limit'] = json_decode($memberUsage);
$usedLimit = json_decode($memberUsage, true); // jadi array
$totalUsed = 0;
if (is_array($usedLimit)) {
foreach ($usedLimit as $value) {
$totalUsed += (int) $value;
}
}
$limitRules = (int) $limitRules;
// hitung sisa
$remainingLimit = $limitRules - $totalUsed;
// biar gak minus
if ($remainingLimit < 0) {
$remainingLimit = 0;
}
// set ke response
$res_data['remaining_limit'] = $remainingLimit;
$res_data['total_used_limit'] = $totalUsed;
// specialities
$specialities = DB::table('specialities')
->select(
'specialities.id',
'specialities.name'
)
->orderBy('specialities.name','asc')
->get();
$res_data['specialities'] = $specialities;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse("Data Not Found", $data, trans('Message.not_found'), 404);
}
}
return Helper::responseJson($member);
}
}

View File

@@ -1,87 +0,0 @@
<?php
namespace Modules\HospitalPortal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Claim;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
class NotificationController extends Controller
{
public function getNotifications(Request $request, $user_id)
{
$data = [
'user_id' => $user_id,
];
if (!$user_id)
{
return ApiResponse::apiResponse('Not Found', $data, trans('Message.not_found'), 404);
}
else
{
try {
$notifications = DB::table('notifications')
->join('notification_types', 'notification_types.id', '=', 'notifications.type')
->select(
'notifications.id',
'notifications.title',
'notifications.description',
'notifications.avatar',
'notification_types.type',
DB::raw('DATE_FORMAT(notifications.created_at, "%Y-%m-%dT%H:%i:%s.000+07:00") as createdAt'),
'notifications.isUnRead',
)
->where('user_id', '=', $user_id)
->orderBy('id', 'DESC')
->get();
$res_data['notifications'] = $notifications;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
catch (\Exception $e) {
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
public function setReadNotification(Request $request)
{
$data = [
'user_id' => $request->user_id,
'id' => $request->id,
'isUnRead'=> 0,
];
$validator = Validator::make($request->all(), [
'user_id' => 'required',
'id' => 'required'
], [
'user_id.required' => trans('Validation.required',['attribute' => 'Hospital ID']),
'id.required' => trans('Validation.required',['attribute' => 'ID']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
try {
DB::beginTransaction();
DB::table('notifications')
->where('notifications.id', '=', $request->id)
->update($data);
DB::commit();
return ApiResponse::apiResponse("Success", $data, trans('Message.read_notification'), 200);
}
catch (\Exception $e) {
DB::rollback();
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
}

View File

@@ -1,721 +0,0 @@
<?php
namespace Modules\HospitalPortal\Http\Controllers;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Helpers\Helper;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Modules\HospitalPortal\Helpers\GrabHelper;
use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\Exception\UnsatisfiedDependencyException;
class ApotekController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
$results = DB::connection('oldlms')->table('tx_prescriptions')
->join('tx_prescription_orders', 'tx_prescription_orders.nIDPrescription', '=', 'tx_prescriptions.nID')
->join('tm_users', 'tm_users.nID', '=', 'tx_prescriptions.nIDUser')
->when(auth()->user()->organization_id, function ($query, $organizationId) {
$query->where('tx_prescription_orders.nIDApotek', '=', $organizationId);
})
->when($request->input('search'), function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('tx_prescriptions.sKodeResep', 'like', "%" . $search . "%")
->orWhere('tm_users.sFirstName', 'like', "%" . $search . "%");
});
})
->when($request->has('orderBy'), function ($query) use ($request) {
$orderBy = $request->orderBy;
$direction = $request->order ?? 'asc';
if($orderBy == 'apotek')
{
$orderBy = 'nIDApotek';
}
$query->orderBy($orderBy, $direction);
})
->when($request->input('start_date') && !$request->input('end_date'), function ($query, $start_date) {
$query->where(function ($query) use ($start_date) {
$query->where('tx_prescriptions.dTanggalresep', '<', $start_date);
});
})
->when($request->input('status'), function ($query, $status) {
// Apply the filter if 'status' has a value
if ($status !== 'all') {
$query->where(function ($query) use ($status) {
$query->where('tx_prescription_orders.sStatus', '=', $status);
});
}
})
->select(
'tx_prescriptions.nID as id',
'tx_prescription_orders.nID as nID_orders',
'tx_prescriptions.nIDUser',
'tx_prescriptions.sKodeResep as no_resep',
'tx_prescriptions.dTanggalResep as tanggal',
'tx_prescription_orders.nIDApotek',
'tx_prescription_orders.sStatus as status',
'tx_prescription_orders.sStatus',
DB::raw('
CASE
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 72 THEN ""
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 1 AND tx_prescription_orders.sStatus = "waiting_pharmacy" THEN "1"
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 2 AND tx_prescription_orders.sStatus = "order_prepared" THEN "2"
WHEN TIMESTAMPDIFF(HOUR, tx_prescriptions.dTanggalResep, NOW()) > 3 AND tx_prescription_orders.sStatus = "ready" THEN "3"
ELSE ""
END AS alert
'),
DB::raw('
CASE
WHEN tx_prescription_orders.sStatus = "waiting_pharmacy" THEN "Diterima"
WHEN tx_prescription_orders.sStatus = "order_prepared" THEN "Siap Diambil"
WHEN tx_prescription_orders.sStatus = "ready" THEN "Cari Kurir"
WHEN tx_prescription_orders.sStatus = "failed" THEN "Cari Kurir"
WHEN tx_prescription_orders.sStatus = "waiting_for_courir" THEN "Pesanan Diambil"
WHEN tx_prescription_orders.sStatus = "package_picked_up" THEN "Sedang Diantar"
WHEN tx_prescription_orders.sStatus = "package_on_delivery" THEN "Selesai"
ELSE ""
END AS button_accept'),
DB::raw('CONCAT(
COALESCE(tm_users.sFirstName, ""),
" ",
COALESCE(tm_users.sMiddleName, ""),
" ",
COALESCE(tm_users.sLastName, "")
) as pasien'),
DB::raw('
(SELECT CONCAT(
COALESCE(u.sFirstName, ""),
" ",
COALESCE(u.sMiddleName, ""),
" ",
COALESCE(u.sLastName, "")
)
FROM tm_dokter d
LEFT JOIN tm_users u ON u.nID = d.nIDUser
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS nama_dokter
'),
DB::raw('
(SELECT s.sSpesialis
FROM tm_dokter d
LEFT JOIN tm_spesialis s ON s.nID = d.nIDSpesialis
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS spesialis
'),
DB::raw('
(SELECT t.sSIP
FROM tm_dokter d
LEFT JOIN tx_jadwal_dokter t ON t.nIDDokter = d.nID
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS sip
'),
DB::raw('
(SELECT u.sPhone
FROM tm_dokter d
LEFT JOIN tm_users u ON u.nID = d.nIDUser
WHERE d.nID = tx_prescriptions.nIDDokter LIMIT 1) AS no_ponsel_dokter
'),
DB::raw('
(SELECT tm_users_detail.dTanggalLahir
FROM tm_users_detail
WHERE tm_users_detail.nIDUser = tm_users.nID LIMIT 1) AS tgl_lahir_pasien
'),
DB::raw('
(SELECT CASE
WHEN tm_users_detail.nIDJenisKelamin = 1 THEN "Male"
ELSE "Female"
END
FROM tm_users_detail
WHERE tm_users_detail.nIDUser = tm_users.nID LIMIT 1) AS jenis_kelamin_pasien
'),
DB::raw('
(SELECT CONCAT(tm_users_detail.sHeight, "/", tm_users_detail.sWeight)
FROM tm_users_detail
WHERE tm_users_detail.nIDUser = tm_users.nID LIMIT 1) AS tinggi_berat
'),
DB::raw('
(SELECT tm_users_insurance.sNoPolis
FROM tm_users_insurance
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS no_polis
'),
DB::raw('
(SELECT tm_insurance.sInsurance
FROM tm_users_insurance
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS perusahaan_asuransi
'),
DB::raw('
(SELECT tm_users_insurance.sCorporateName
FROM tm_users_insurance
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS nama_perusahaan
'),
DB::raw('
(SELECT tm_users_insurance.sProductCode
FROM tm_users_insurance
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser LIMIT 1) AS kode_produk
'),
DB::raw('
(
SELECT
CASE
WHEN tm_users_insurance.sPlanCode = "A" THEN "Alba"
WHEN tm_users_insurance.sPlanCode = "B" THEN "Blue"
WHEN tm_users_insurance.sPlanCode = "S" THEN "Silver"
WHEN tm_users_insurance.sPlanCode = "G" THEN "Gold"
WHEN tm_users_insurance.sPlanCode = "P" THEN "Platinum"
WHEN tm_users_insurance.sPlanCode = "D" THEN "Diamond"
ELSE ""
END AS kelas_asuransi
FROM tm_users_insurance
LEFT JOIN tm_insurance ON tm_users_insurance.nIDInsurance = tm_insurance.nID
WHERE tm_users_insurance.nIDUser = tx_prescriptions.nIDUser
LIMIT 1
) AS kelas_asuransi
'),
DB::raw('
(
SELECT
CASE
WHEN tm_hubungan_keluarga.sHubunganKeluarga = "Husband" THEN "S"
WHEN tm_hubungan_keluarga.sHubunganKeluarga = "Wife" THEN "I"
WHEN tm_hubungan_keluarga.sHubunganKeluarga = "Child" THEN "A"
ELSE "P"
END AS tipe_member
FROM tm_hubungan_keluarga
WHERE tm_hubungan_keluarga.nID = tm_users.nIDHubunganKeluarga
LIMIT 1
) AS tipe_member
'),
'tx_prescription_orders.sAddress AS alamat_penerima',
'tx_prescription_orders.sDeliveryMethod AS pengiriman',
'tx_prescription_orders.nTotalPrice AS total_kirim',
'tx_prescriptions.sNoRefProvider AS noref_dokter',
DB::raw('DATE_ADD(tx_prescriptions.dTanggalResep, INTERVAL 1 DAY) as valid_tanggal'),
'tx_prescriptions.sNomorPenjamin AS nomor_penjamin',
DB::raw('
(SELECT tx_livechat.dCreateOn
FROM tx_livechat
WHERE tx_livechat.nID = tx_prescriptions.nIDLivechat LIMIT 1) AS tgl_livechat
'),
'tx_prescriptions.sDiagnose as diagnosa',
'tx_prescription_orders.nDeliveryID',
'tx_prescription_orders.sDeliveryStatus'
)
->paginate($limit);
// Secret key for generating the token
$secret_key = env('SECRET_KEY_LMS');
// Transform the results to include the download link
$results->getCollection()->transform(function ($item) use ($secret_key) {
// Generate the token with the timestamp
$expiry_time = time() + 86400; // Token expiry time (1 day)
$token = hash_hmac('sha256', $item->id . $expiry_time, $secret_key);
// Construct the download link
$path = 'prescription/barcode-print-pdf/' . $item->id . '?token=' . urlencode($token) . '&expiry=' . $expiry_time;
$host = $_SERVER['HTTP_HOST']; // This will give you the host like 'linksehat.dev' or 'linksehat.com'
$base_url = "https://m.linksehat.dev/";
// Check if the host contains '.dev'
if (strpos($host, '.com') !== false) {
$base_url = "https://m.linksehat.com/";
}
$item->link_download = $base_url.$path;
return $item;
});
$apotekIds = $results->pluck(value: 'nIDApotek')->unique()->filter();
$organizations = DB::connection('mysql')->table('organizations')
->whereIn('id', $apotekIds)
->pluck('name', 'id');
$results->getCollection()->transform(function ($item) use ($organizations) {
$item->apotek = $organizations->get($item->nIDApotek, '-'); // Default to 'Unknown' if not found
return $item;
});
$apotek_phone = DB::connection('mysql')->table('organizations')
// ->leftJoin('addresses', 'addresses.id','=', 'organizations.main_address_id')
->whereIn('organizations.id', $apotekIds)
->pluck('organizations.phone', 'organizations.id');
$results->getCollection()->transform(function ($item) use ($apotek_phone) {
$item->phone_apotek = $apotek_phone->get($item->nIDApotek, '-'); // Default to 'Unknown' if not found
return $item;
});
// Transform results to include allergies
$results->getCollection()->transform(function ($item) use ($organizations) {
// Get the allergies for each user
$allergies = $this->getAllergies($item->nIDUser);
// Concatenate the allergy description
$alergi_desc = '';
foreach ($allergies as $row) {
$alergi_desc .= $row->sAlergi . ' - ' . $row->sKeterangan . ', ';
}
// Set apotek and allergies data
$item->apotek = $organizations->get($item->nIDApotek, '-'); // Default to 'Unknown' if not found
$item->alergi_desc = rtrim($alergi_desc, ', '); // Remove the trailing comma
return $item;
});
// Extract unique Prescription IDs from the results
$prescriptionIDs = $results->pluck('id')->unique()->filter();
// Fetch prescription items based on Prescription IDs
$items = DB::connection('oldlms')->table('tx_prescription_items')
->whereIn('nIDPrescription', $prescriptionIDs)
->select('nIDPrescription', 'sItemName', 'sSigna', 'sTiming', 'sDuration', 'nQty', 'sNote')
->get()
->groupBy('nIDPrescription'); // Group items by their Prescription ID
// Final transformation: Attach prescription items to each prescription
$results->getCollection()->transform(function ($item) use ($items) {
$item->prescription_items = $items->get($item->id, collect())->map(function ($prescriptionItem) {
return [
'sItemName' => $prescriptionItem->sItemName,
'sSigna' => $prescriptionItem->sSigna,
'sTiming' => $prescriptionItem->sTiming,
'sDuration' => $prescriptionItem->sDuration,
'nQty' => $prescriptionItem->nQty,
'sNote' => $prescriptionItem->sNote,
];
});
return $item;
});
return response()->json(Helper::paginateResources($results));
}
public function getAllergies($nIDUser) {
return DB::connection('oldlms')
->table('tx_alergi_users as txa')
->join('tm_alergi as ta', 'ta.nID', '=', 'txa.nIDAlergi')
->select('ta.sAlergi', 'ta.sKeterangan')
->where('txa.nIDUser', $nIDUser)
->get();
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('hospitalportal::create');
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
return view('hospitalportal::show');
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
return view('hospitalportal::edit');
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$data = ['sStatus' => $request->sStatus];
$validator = Validator::make($request->all(), [
'sStatus' => 'required|string|max:255',
], [
'sStatus.required' => trans('Validation.required',['attribute' => 'Status']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
try {
// Define the valid transitions
$valid_transitions = [
'waiting_for_payment' => 'waiting_pharmacy',
'waiting_pharmacy' => 'order_prepared',
'order_prepared' => 'ready',
'ready' => 'waiting_for_courir',
'waiting_for_courir' => 'package_picked_up',
'package_picked_up' => 'package_on_delivery',
'package_on_delivery' => 'package_delivered'
];
// Get the current status from the request
$inputStatus = $request->sStatus;
// Check if the input status has a valid next status in the map
if (isset($valid_transitions[$inputStatus])) {
// Get the next status
$status = $valid_transitions[$inputStatus];
// Start the transaction
DB::connection('oldlms')->beginTransaction();
// Update the status in the database
DB::connection('oldlms')->table('tx_prescription_orders')
->where('tx_prescription_orders.nID', '=', $id)
->update([
'sStatus' => $status,
'sUpdateBy' => auth()->user()->id,
'dUpdateOn' => date('Y-m-d H:i:s'),
]);
// Insert the log
$prescriptionOrder = DB::connection('oldlms')
->table('tx_prescription_orders')
->where('tx_prescription_orders.nID', '=', $id)
->join('tx_delivery_orders', 'tx_delivery_orders.nIDPrescriptionOrder', '=', 'tx_prescription_orders.nID')
->select('tx_prescription_orders.*', 'tx_delivery_orders.*', 'tx_delivery_orders.nID as nIDDelivery') // Add specific columns you want to select
->first();
if ($prescriptionOrder) {
$createdBy = $prescriptionOrder->sCreateBy;
$nIDPrescription = $prescriptionOrder->nIDPrescription;
$nIDDeliveryOrder = $prescriptionOrder->nIDDelivery;
// Insert data into the tx_delivery_log table
DB::connection('oldlms')->table('tx_delivery_log')->insert([
'sStatus' => $prescriptionOrder->sDeliveryStatus,
'sStatusPrescription' => $status,
'nIDDeliveryOrder' => $nIDDeliveryOrder,
'nIDPrescription' => $nIDPrescription,
'dCreatedOn' => now(),
]);
}
// Commit the transaction
DB::connection('oldlms')->commit();
// Return success response
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
} else {
// If the input status is not valid, return an error
return ApiResponse::apiResponse('Invalid Status', $data, 'The input status is not valid.', 400);
}
} catch (\Exception $e) {
// Rollback the transaction if an error occurs
DB::connection('oldlms')->rollBack();
// Handle error, could log or return as response
return ApiResponse::apiResponse('Server Error', $data, $e->getMessage(), 500);
}
}
}
public function getDriver(Request $request, $id)
{
$data = ['sStatus' => $request->sStatus];
// Validation
$validator = Validator::make($request->all(), [
'sStatus' => 'required|string|max:255',
], [
'sStatus.required' => trans('Validation.required', ['attribute' => 'Status']),
]);
if ($validator->fails()) {
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
try {
// Fetch prescription data
$prescriptions = DB::connection('oldlms')->table('tx_prescription_orders')
->leftJoin('tx_prescriptions', 'tx_prescriptions.nID', '=', 'tx_prescription_orders.nIDPrescription')
->where('tx_prescription_orders.nID', '=', $id)
->select(
'tx_prescriptions.nIDUser',
'tx_prescriptions.nID as id_prescription',
'tx_prescriptions.sKodeResep as merchantOrderID',
'tx_prescription_orders.nIDApotek'
)
->first();
if (!$prescriptions) {
return ApiResponse::apiResponse('Not Found', [], 'Prescription not found', 404);
}
// Fetch prescription items (medicine data)
$items = DB::connection('oldlms')->table('tx_prescription_items')
->where('nIDPrescription', $prescriptions->id_prescription)
->select('nIDPrescription', 'sItemName', 'nQty', 'nHarga')
->get();
$packages = [];
foreach ($items as $item) {
$packages[] = [
'name' => $item->sItemName,
'description' => $item->sItemName,
'quantity' => (float)$item->nQty,
'price' => (float)$item->nHarga,
'dimensions' => [
'height' => 0,
'width' => 0,
'depth' => 0,
'weight' => 0,
]
];
}
// Fetch pharmacy (apotek) data
$apotek = DB::connection('mysql')->table('organizations')
->leftJoin('addresses', 'addresses.id', '=', 'organizations.main_address_id')
->where('organizations.id', '=', $prescriptions->nIDApotek)
->select('organizations.name as nama_apotek',
'addresses.text as alamat_apotek',
'addresses.lat',
'addresses.lng',
'organizations.phone',
'organizations.email')
->first();
// Fetch patient (pasien) data
$pasien = DB::connection('oldlms')->table('tm_users')
->leftJoin('tm_users_detail', 'tm_users_detail.nIDuser', '=', 'tm_users.nID')
->where('tm_users.nID', '=', $prescriptions->nIDUser)
->select(
DB::raw('CONCAT(
COALESCE(tm_users.sFirstName, ""),
" ",
COALESCE(tm_users.sMiddleName, ""),
" ",
COALESCE(tm_users.sLastName, "")
) as nama_pasien'),
'tm_users.sFirstName as firstname',
'tm_users.sLastName as lastname',
'tm_users.sEmail as email',
'tm_users.sPhone as phone',
'tm_users_detail.sLatitude as latitude',
'tm_users_detail.sLongitude as longitude',
'tm_users_detail.sAlamatMap',
DB::raw('(SELECT tm_provinsi.sProvinsi FROM tm_provinsi WHERE tm_provinsi.nID = tm_users_detail.nIDProvinsi LIMIT 1) AS provinsi'),
DB::raw('(SELECT tm_kota.sKota FROM tm_kota WHERE tm_kota.nID = tm_users_detail.nIDKota LIMIT 1) AS kota'),
DB::raw('(SELECT tm_kecamatan.sKecamatan FROM tm_kecamatan WHERE tm_kecamatan.nID = tm_users_detail.nIDKecamatan LIMIT 1) AS kecamatan'),
DB::raw('(SELECT tm_kelurahan.sKelurahan FROM tm_kelurahan WHERE tm_kelurahan.nID = tm_users_detail.nIDKelurahan LIMIT 1) AS kelurahan'),
DB::raw('(SELECT tm_kelurahan.nKodePos FROM tm_kelurahan WHERE tm_kelurahan.nID = tm_users_detail.nIDKelurahan LIMIT 1) AS kode_pos')
)
->first();
if (!$pasien) {
return ApiResponse::apiResponse('Not Found', [], 'Patient not found', 404);
}
if(!$pasien->email)
{
return ApiResponse::apiResponse('Not Found', [], 'Email Patient not found', 404);
}
if(!$pasien->phone)
{
return ApiResponse::apiResponse('Not Found', [], 'Phone Patient not found', 404);
}
// Use GrabHelper to handle the API calls
$grabHelper = new GrabHelper();
$token = $grabHelper->getToken();
$serviceType = 'INSTANT';
$body = json_encode([
"merchantOrderID" => $prescriptions->merchantOrderID,
"serviceType" => $serviceType,
"vehicleType" => "BIKE",
"codType" => "REGULAR",
"paymentMethod" => "CASHLESS",
"highValue" => false,
"packages" => $packages,
"origin" => [
"address" => $apotek->alamat_apotek,
"coordinates" => [
"latitude" => (float)$apotek->lat,
"longitude" => (float)$apotek->lng
]
],
"destination" => [
"address" => $pasien->sAlamatMap,
"coordinates" => [
"latitude" => (float)$pasien->latitude,
"longitude" => (float)$pasien->longitude
]
],
"recipient" => [
"firstName" => $pasien->firstname,
"lastName" => $pasien->lastname,
"email" => $pasien->email,
"phone" => $grabHelper->normalizePhoneNumber($pasien->phone),
"smsEnabled" => true
],
"sender" => [
"firstName" => $apotek->nama_apotek,
"companyName" => $apotek->nama_apotek,
"email" => $apotek->email,
"phone" => $apotek->phone,
"smsEnabled" => true
],
"schedule" => $grabHelper->getScheduleTimes()
]);
// Create the delivery request
$response = $grabHelper->createDelivery($token, $body);
$data_grab = json_decode($response, true);
// Transaction to update status
DB::connection('oldlms')->beginTransaction();
//insert to api logs
$data_logs = [
'sType' => 'out',
'sContext' => 'grab',
'sTarget' => 'deliveries/create-grab',
'sRequest' => $body,
'sResponse' => $response,
'sCreateBy' => auth()->user()->id,
'dCreateOn' => now(),
];
DB::connection('oldlms')->table('api_logs')
->insert($data_logs);
DB::connection('oldlms')->table('tx_prescription_orders')
->where('tx_prescription_orders.nID', '=', $id)
->update([
'nDeliveryID' => $data_grab['deliveryID'],
'sDeliveryStatus' => $data_grab['status'],
'sStatus' => 'waiting_for_courir',
'sUpdateBy' => auth()->user()->id,
'dUpdateOn' => now(),
]);
//insert to delivery order
$tm_delivery_statuses = DB::connection('oldlms')->table('tm_delivery_statuses')
->where('tm_delivery_statuses.sStatus', 'LIKE', '%' . $data_grab['status'] . '%')
->where('tm_delivery_statuses.nIDDelivery', '=', 3)
->select('tm_delivery_statuses.sStatusDescription')
->first();
$data_delivery_orders = [
'nIDPrescriptionOrder' => $id,
'sUUID' => $this->generateUuid($id),
'nIDDelivery' => 3, //grab
'sType' => $serviceType,
'nOrderID' => $data_grab['deliveryID'],
'nVehicleTypeID' => null,
'sCreatedDateTime' => $data_grab['schedule']['pickupTimeFrom'],
'sFinishDateTime' => $data_grab['schedule']['pickupTimeTo'],
'sStatus' => $data_grab['status'],
'sStatusDescription' => $tm_delivery_statuses->sStatusDescription,
'sMatter' => 'medicine',
'nTotalWeightKg' => 0,
'nPaymentAmount' => $data_grab['quote']['amount'],
'nDeliveryFeeAmount' => $data_grab['quote']['amount'],
'sPaymentMethod' => 'cash',
'sCreateBy' => auth()->user()->id,
'dCreateOn' => now(),
];
// Use insertGetId to insert the data and get the last inserted ID
$lastInsertId = DB::connection('oldlms')->table('tx_delivery_orders')->insertGetId($data_delivery_orders);
$data_points = [
'origin' => [
'nIDDeliveryOrder' => $lastInsertId,
'sUUID' => $this->generateUuid($lastInsertId),
'nDeliveryID' => $data_grab['deliveryID'],
'nPointID' => 1,
'nType' => 1,
'sAddress' => $data_grab['quote']['origin']['address'],
'nLatitude' => $data_grab['quote']['origin']['coordinates']['latitude'] ?? null,
'nLongitude' => $data_grab['quote']['origin']['coordinates']['longitude'] ?? null,
'sName' => $data_grab['sender']['companyName'],
'sPhone' => $data_grab['sender']['phone'],
'sTrackingUrl' => null,
'sCreateBy' => auth()->user()->id,
'dCreateOn' => now(),
],
'destination' => [
'nIDDeliveryOrder' => $lastInsertId,
'sUUID' => $this->generateUuid($lastInsertId),
'nDeliveryID' => $data_grab['deliveryID'],
'nPointID' => 2,
'nType' => 2,
'sAddress' => $data_grab['quote']['destination']['address'],
'nLatitude' => $data_grab['quote']['destination']['coordinates']['latitude'] ?? null,
'nLongitude' => $data_grab['quote']['destination']['coordinates']['longitude'] ?? null,
'sName' => $data_grab['recipient']['firstName'] . " " . $data_grab['recipient']['lastName'],
'sPhone' => $data_grab['recipient']['phone'],
'sTrackingUrl' => null,
'sCreateBy' => auth()->user()->id,
'dCreateOn' => now(),
]
];
foreach ($data_points as $value_point) {
DB::connection('oldlms')->table('tx_delivery_order_points')->insert($value_point);
}
DB::connection('oldlms')->commit();
// Return success response
return ApiResponse::apiResponse("Success", $data_grab, trans('Message.success'), 200);
} catch (\Exception $e) {
// Rollback transaction on error
DB::connection('oldlms')->rollBack();
return ApiResponse::apiResponse('Server Error', [], $e->getMessage(), 500);
}
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function generateUuid($id_prescription_order)
{
// Define the namespace (using DNS in this example)
$namespace = Uuid::NAMESPACE_DNS;
$uuidV5 = Uuid::uuid5($namespace, $id_prescription_order);
return $uuidV5->toString();
}
}

View File

View File

0
Modules/HospitalPortal/Http/Middleware/.gitkeep Executable file → Normal file
View File

View File

@@ -1,65 +0,0 @@
<?php
namespace Modules\HospitalPortal\Http\Middleware;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\App;
class Authentication
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$acceptHeader = $request->header('Accept');
$contentType = $request->header('Content-Type');
$locale = $request->header('Accept-Language');
// Add language
if(!$locale)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Accept-Language']), 401);
}
if($locale !== 'en-US' && $locale !== 'id-ID')
{
return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Accept-Language']), 400);
}
if ($locale === 'en-US')
{
App::setLocale('en');
} elseif ($locale === 'id-ID')
{
App::setLocale('id');
} else
{
App::setLocale('en');
}
// Validate type accept & content type
if (!$acceptHeader)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Accept']), 401);
}
if (!$contentType)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Content-Type']), 401);
}
if ($acceptHeader !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Accept']), 400);
}
if($contentType !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Content-Type']), 400);
}
return $next($request);
}
}

View File

@@ -1,71 +0,0 @@
<?php
namespace Modules\HospitalPortal\Http\Middleware;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\App;
class Authorization
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$acceptHeader = $request->header('Accept');
$contentType = $request->header('Content-Type');
$locale = $request->header('Accept-Language');
$authorization = $request->header('Authorization');
// Add language
if(!$locale)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept-Language']), 401);
}
if($locale !== 'en-US' && $locale !== 'id-ID')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept-Language']), 400);
}
if ($locale === 'en-US')
{
App::setLocale('en');
} elseif ($locale === 'id-ID')
{
App::setLocale('id');
} else
{
App::setLocale('en');
}
// Validate authorization
if (empty($authorization) || strpos($authorization, 'Bearer ') !== 0) {
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Authorization']), 401);
}
// Validate type accept & content type
if (!$acceptHeader)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept']), 401);
}
if (!$contentType && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Content-Type']), 401);
}
if ($acceptHeader !== 'application/json')
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept']), 400);
}
if($contentType !== 'application/json' && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Content-Type']), 400);
}
return $next($request);
}
}

0
Modules/HospitalPortal/Http/Requests/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Providers/.gitkeep Executable file → Normal file
View File

View File

View File

0
Modules/HospitalPortal/Resources/assets/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Resources/assets/js/app.js Executable file → Normal file
View File

0
Modules/HospitalPortal/Resources/assets/sass/app.scss Executable file → Normal file
View File

0
Modules/HospitalPortal/Resources/lang/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Resources/views/.gitkeep Executable file → Normal file
View File

0
Modules/HospitalPortal/Resources/views/index.blade.php Executable file → Normal file
View File

View File

0
Modules/HospitalPortal/Routes/.gitkeep Executable file → Normal file
View File

154
Modules/HospitalPortal/Routes/api.php Executable file → Normal file
View File

@@ -4,20 +4,8 @@ use Illuminate\Http\Request;
use Modules\HospitalPortal\Http\Controllers\Api\AuthController;
use Modules\HospitalPortal\Http\Controllers\Api\ClaimRequestController;
use Modules\HospitalPortal\Http\Controllers\Api\MemberController;
use Modules\HospitalPortal\Http\Controllers\ClaimController;
use Modules\HospitalPortal\Http\Controllers\Api\NotificationController;
use Modules\HospitalPortal\Http\Controllers\Api\RequestLogController;
use Modules\Internal\Http\Controllers\Api\RequestLogController as RequestLogControllerInternal;
use Modules\Internal\Http\Controllers\Api\RequestLogBenefitController;
use Modules\Internal\Http\Controllers\Api\RequestLogMedicineController;
use Modules\HospitalPortal\Http\Controllers\ApotekController;
use Modules\HospitalPortal\Http\Middleware\Authentication;
use Modules\HospitalPortal\Http\Middleware\Authorization;
use Modules\Internal\Http\Controllers\Api\NavigationController;
use Modules\Linksehat\Http\Controllers\Api\AutocompleteController;
use Modules\Primaya\Http\Controllers\Api\MasterController;
use Modules\HospitalPortal\Http\Controllers\Api\ProviderOnlineController;
use Modules\HospitalPortal\Http\Controllers\ClaimController;
/*
|--------------------------------------------------------------------------
@@ -29,121 +17,39 @@ use Modules\HospitalPortal\Http\Controllers\Api\ProviderOnlineController;
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::prefix('v1')->group(function() {
Route::prefix('hospitalportal')->group(function () {
Route::middleware(Authentication::class)->group(function () {
Route::controller(AuthController::class)->group(function () {
Route::post('login', 'login');
});
Route::prefix('hospitalportal')->group(function () {
Route::post('login', [AuthController::class, 'login'])->name('login');
Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::put('reset-password', [AuthController::class, 'resetPassword'])->name('resetPassword');
Route::post('forget-password', [AuthController::class, 'forgetPassword']);
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
Route::post('verify-code', [AuthController::class, 'verifCode']);
Route::get('claims', [ClaimController::class, 'index']);
Route::get('service-member/{id}', [AutocompleteController::class, 'serviceCode']);
Route::get('specialis', [AutocompleteController::class, 'specialisList']);
Route::get('diagnosis', [RequestLogControllerInternal::class, 'diagnosis']);
Route::post('search-member', [MemberController::class, 'search']);
Route::middleware('auth:sanctum')->group(function () {
//dari Internal Prime center
Route::get('customer-service/request', [RequestLogControllerInternal::class, 'index']);
Route::post('customer-service/request', [RequestLogControllerInternal::class, 'createNew']);
Route::put('customer-service/request/{id}', [RequestLogControllerInternal::class, 'update']);
Route::get('customer-service/request/{id}', [RequestLogControllerInternal::class, 'show']);
Route::put('customer-service/request/delete/{id}', [RequestLogControllerInternal::class, 'destroy']);
Route::put('customer-service/request/final_log/{id}', [RequestLogControllerInternal::class, 'deleteFinalLog']);
Route::get('customer-service/request/{id}/download', [RequestLogControllerInternal::class, 'generateRequestLog']);
Route::post('customer-service/request/import', [RequestLogControllerInternal::class, 'importRequestLog']);
Route::post('customer-service/request/import-invoice', [RequestLogControllerInternal::class, 'importInvoice']);
Route::post('customer-service/request/exportFiledInvoice', [RequestLogControllerInternal::class, 'exportFiledInvoice']);
Route::get('customer-service/request/data', [RequestLogControllerInternal::class, 'generateDataRequestLogExcel']);
Route::post('customer-service/request/{id}/add_file', [RequestLogControllerInternal::class, 'requestFiles']);
Route::post('customer-service/request/{id}/approval_files', [RequestLogControllerInternal::class, 'approvalFiles']);
Route::post('customer-service/request/{id}/delete_file', [RequestLogControllerInternal::class, 'deleteFiles']);
Route::post('customer-service/request/final-log', [RequestLogControllerInternal::class, 'updateFinalLog']);
// insert benefit
Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']);
Route::post('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'destroy']);
Route::put('customer-service/request/benefit_data/{id}', [RequestLogBenefitController::class, 'update']);
// insert medicine
Route::post('customer-service/request/medicine-data', [RequestLogMedicineController::class, 'store']);
Route::delete('customer-service/request/medicine-data/{id}', [RequestLogMedicineController::class, 'destroy']);
Route::put('customer-service/request/medicine-data/{id}', [RequestLogMedicineController::class, 'update']);
// end prime center
// Navigation
Route::get('navigations', [NavigationController::class, 'index']);
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::put('reset-password', [AuthController::class, 'resetPassword'])->name('resetPassword');
Route::get('claims', [ClaimController::class, 'index']);
Route::middleware(Authorization::class)->group(function () {
//Search Member
Route::controller(MemberController::class)->group(function () {
Route::post('search-member', 'search');
});
// Request LOG
Route::controller(RequestLogController::class)->group(function () {
Route::post('request-log', 'requestLog');
Route::get('get-request-log', 'getRequestLog');
Route::get('get-final-log', 'getFinalLog');
Route::post('request-final-log', 'requestFinalLog');
Route::get('download-log/{request_log_id}', 'downlodLog');
Route::get('download-final-log/{request_log_id}', 'downlodFinalLog');
Route::post('submit-claims', 'submitClaims');
});
//Notification
Route::controller(NotificationController::class)->group(function() {
//get notifications
Route::get('notifications/{user_id}', 'getNotifications');
//Set read notification
Route::post('set-read-notification', 'setReadNotification');
});
Route::get('get-prescription-orders',[ApotekController::class, 'index']);
Route::put('put-prescription-orders/{id}',[ApotekController::class, 'update']);
Route::put('put-driver-prescription-orders/{id}',[ApotekController::class, 'getDriver']);
});
// Request Final LOG
Route::controller(RequestLogController::class)->group(function () {
Route::post('request-final-log', 'requestFinalLog');
});
// Claim Submit
Route::controller(ClaimRequestController::class)->group(function () {
Route::post('claim-requests', 'store');
});
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
// Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
Route::get('claim-requests/{claim_request_id}/log', [ClaimRequestController::class, 'generateLog'])->name('claim-requests.generate-log');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
Route::get('get-claim-requests', [ClaimRequestController::class, 'get_claim_requests'])->name('claim-requests.get_claim_requests');
Route::get('detail-claim-requests/{id}', [ClaimRequestController::class, 'detail_claim_requests'])->name('claim-requests.detail_claim_requests');
Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']);
Route::get('organizations', [MasterController::class, 'organizations']);
});
});
Route::prefix('bridging-service/ProviderOnline')->controller(ProviderOnlineController::class)->group(function () {
Route::post('AddHeaderKey', 'addHeaderKey');
Route::post('HeaderKey', 'getHeaderKey');
Route::post('EligibilitasPeserta', 'checkEligibilitasPeserta');
Route::post('Pendaftaran', 'createPendaftaran');
Route::post('Pengesahan', 'createPengesahan');
Route::post('RincianBiayaKlaim', 'getRincianBiayaKlaim');
Route::post('StrukPendaftaran', 'downloadStrukPendaftaran');
Route::post('StrukPengesahan', 'downloadStrukPengesahan');
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
Route::get('claim-requests/{claim_request_id}/log', [ClaimRequestController::class, 'generateLog'])->name('claim-requests.generate-log');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
});
});
Route::prefix('v1/bridging-service/ProviderOnline')->group(function () {
Route::post('HeaderKey', [ProviderOnlineController::class, 'getHeaderKey']);
Route::post('EligibilitasPeserta', [ProviderOnlineController::class, 'checkEligibilitasPeserta']);
Route::post('Pendaftaran', [ProviderOnlineController::class, 'createPendaftaran']);
Route::post('Pengesahan', [ProviderOnlineController::class, 'createPengesahan']);
Route::post('RincianBiayaKlaim', [ProviderOnlineController::class, 'getRincianBiayaKlaim']);
Route::post('StrukPendaftaran', [ProviderOnlineController::class, 'downloadStrukPendaftaran']);
Route::post('StrukPengesahan', [ProviderOnlineController::class, 'downloadStrukPengesahan']);
});

0
Modules/HospitalPortal/Routes/web.php Executable file → Normal file
View File

Some files were not shown because too many files have changed in this diff Show More