Merge remote-tracking branch 'origin/staging' into origin/production

This commit is contained in:
Linksehat Staging Server
2023-12-25 09:43:39 +07:00
577 changed files with 64446 additions and 14205 deletions

View File

@@ -2,13 +2,21 @@
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;
class ClaimController extends Controller
{
@@ -20,7 +28,7 @@ class ClaimController extends Controller
{
$claims = $this->claimService->getCountClaimRequestPerStatus($corporate_id);
dd($claims);
// dd($claims);
return Helper::responseJson([
'count_requested' => 0,
@@ -133,4 +141,124 @@ 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
]);
}
}
}

View File

@@ -2,62 +2,275 @@
namespace Modules\Client\Http\Controllers\Api;
use Illuminate\Http\Request;
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;
class ClaimReportController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
public function claimStatus($corporateId)
{
$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)
]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
public function claimDetail($corporate_id, $claimRequestId)
{
//
$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;
$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();
$results['documents'] = $documents;
return Helper::responseJson($results);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
public function requestFiles(Request $request, $corporate_id, $claim_id)
{
//
$claim_id = Crypt::decrypt($claim_id);
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$pathFile = File::storeFile('claim-diagnosis', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = File::storeFile('claim-kondisi', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $claim_id, $file),
'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) {
$pathFile = File::storeFile('claim-result', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $claim_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: 'Invoice Success Uploaded');
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function claimDetailHistory($corporate_id, $claimRequestId)
{
//
$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);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
public function show($corporateId, $claimRequestId)
{
//
$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

@@ -0,0 +1,254 @@
<?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 = 'CP';
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,
'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,
'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,
'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_number = ClaimRequest::max('code');
// $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1);
// return self::makeCode($next_number);
$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);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
}

View File

@@ -0,0 +1,87 @@
<?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(),
'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

@@ -4,14 +4,22 @@ 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\CorporateEmployee;
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 Modules\Client\Transformers\DataMemberResource;
use Illuminate\Support\Facades\DB;
class CorporateMemberController extends Controller
{
@@ -26,12 +34,15 @@ 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->getAllMemberClaimReports($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members)));
$members = $this->corporateMemberService->getAllMemberClaimSubmits($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimSubmitMemberResources::collection($members)));
case 'alarm-center':
$members = $this->corporateMemberService->getAllMemberAlarmCenter($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members)));
@@ -46,16 +57,68 @@ class CorporateMemberController extends Controller
public function show($corporate_id, $person_id)
{
$data = Member::with(['claims', 'person', 'employeds', 'currentPlan.benefits'])
->where('person_id', $person_id)
->whereHas('employeds', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})
->first();
$data = Member::with(['claims', 'person', 'employeds', 'currentPlan.benefits', 'person.currentAddress'])
->where('person_id', $person_id)
->whereHas('employeds', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})
->first();
$totalClaims = $data->claims->sum('total_claim');
$data->total_claims = $totalClaims;
//Get Family
$data_family = DB::table('members')
->join('persons', 'members.person_id', '=', 'persons.id')
->select('members.*', 'persons.phone')
->where('principal_id', $data->member_id)
->get();
if ($data_family->isEmpty()) {
$principal_id = DB::table('members')
->where('member_id', $data->member_id)
->select('principal_id')
->first();
$data_family = DB::table('members')
->join('persons', 'members.person_id', '=', 'persons.id')
->select('members.*', 'persons.phone')
->where('principal_id', $principal_id->principal_id)
->where('members.member_id', '<>', $data->member_id)
->orWhere('members.member_id', $principal_id->principal_id)
->get();
}
$data->family = $data_family;
//Claim History
$data_claim_history = DB::table('claim_requests')
->join('claims', 'claims.claim_request_id', '=', 'claim_requests.id')
->join('claim_items', 'claim_items.claim_id', '=', 'claims.id')
->join('benefits', 'benefits.id', '=', 'claim_items.claim_itemable_id')
->select('claim_requests.status', 'claim_requests.submission_date', 'benefits.description')
->where('claim_requests.member_id', $data->id)
->get();
$data->claim_history = $data_claim_history;
return response()->json(DataMemberResource::make($data));
}
public function showPerMember($corporate_id, $member_id){
$data = ClaimRequest::where(['member_id' => $member_id])
->whereNotNull('claim_id')
->paginate(10);
return response()->json(Helper::paginateResources(DataListClaimMemberResource::collection($data)));
}
public function serviceMonitoring($corporate_id, $claim_id)
{
$data = Claim::where('id', $claim_id)->first();
return Helper::responseJson(DataServiceMonitoring::make($data));
}
}

View File

@@ -3,6 +3,7 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Models\Person;
use App\Models\Member;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
@@ -29,4 +30,39 @@ class DataController extends Controller
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

@@ -0,0 +1,93 @@
<?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());
}
}

View File

@@ -4,14 +4,16 @@ use Modules\Client\Http\Controllers\Api\AuthController;
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 App\Models\Encounter;
use Modules\Client\Http\Controllers\Api\ClaimReportController;
use Modules\Client\Http\Controllers\Api\ClaimRequestController;
use Modules\Client\Http\Controllers\Api\DataController;
use Modules\Internal\Transformers\EncounterResource;
/*
|--------------------------------------------------------------------------
@@ -36,21 +38,38 @@ Route::prefix('client')->group(function () {
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('alarm-center-members/{id}', [CorporateMemberController::class, 'showPerMember']);
Route::get('service-monitoring/{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/{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('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');
});
});

View File

@@ -0,0 +1,37 @@
<?php
namespace Modules\Client\Transformers\AlarmCenter;
use App\Models\Member;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Storage;
class DataListClaimMemberResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$member = Member::findOrFail($this->member_id);
return [
'id' => $this->id,
'admission_date' => $this->submission_date,
'discharge_date' => $this->submission_date,
'code' => $this->code,
'service_type' => $this->service_code == 'IP' ? 'Inpatient' : 'Outpatient',
'status' => $this->service_code == 'approved' ? 'Done' : 'OnGoing',
'claim_id' => $this->claim_id,
// 'memberId' => $this->member_id,
'fullName' => $member->name,
// 'division' => $this->division_name ?? '',
// 'status' => $this->status,
// 'claimRequestId' => $this->claim_request_id,
// 'submissionDate' => $this->submission_date,
];
}
}

View File

@@ -0,0 +1,184 @@
<?php
namespace Modules\Client\Transformers\AlarmCenter;
use App\Models\ClaimRequest;
use App\Models\DiagnosisSecondaryClaimHistoryCare;
use App\Models\ClaimEncounter;
use App\Models\ClaimHistoryCare;
use App\Models\Encounter;
use App\Models\Member;
use App\Models\Icd;
use App\Models\Organization;
use App\Models\MedicalPlan;
use App\Models\CorporateEmployee;
use App\Models\DailyMonitoring;
use App\Models\LaboratoriumResult;
use App\Helpers\Helper;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Storage;
class DataServiceMonitoring extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$claim_request = ClaimRequest::findOrFail($this->claim_request_id);
$member = Member::findOrFail($this->member_id);
// History Care Hospital
$historyCareHospital = ClaimHistoryCare::where('claim_id', $this->id)->first();
if ($historyCareHospital) {
$hospital = Organization::findOrFail($historyCareHospital->organization_id)->name;
$mainDianosis = Icd::findOrFail($historyCareHospital->main_diagnosis_id)->name;
$mainDianosisCode = Icd::findOrFail($historyCareHospital->main_diagnosis_id)->code;
$comporatationDiagnosis = DiagnosisSecondaryClaimHistoryCare::where('claim_history_care_id', $historyCareHospital->id)->first();
$comporatationDiagnosisName = Icd::findOrFail($comporatationDiagnosis->icd_id)->name;
$comporatationDiagnosisCode = Icd::findOrFail($comporatationDiagnosis->icd_id)->code;
$admissionDate = $historyCareHospital->admission_date;
$dischargeDate = $historyCareHospital->discharge_date;
$serviceCode = $historyCareHospital->service_code;
} else {
$hospital = '-';
$mainDianosis = '-';
$mainDianosisCode = '-';
$comporatationDiagnosisName = '-';
$comporatationDiagnosisCode = '-';
$admissionDate = '-';
$dischargeDate = '-';
$serviceCode = '-';
}
$dailyMonitoring = DailyMonitoring::where('claim_id', $claim_request->claim_id)->get()->toArray();
$laboratoriumResult = LaboratoriumResult::where('claim_id', $claim_request->claim_id)->get()->toArray();
// Handle Daily Monitoring
$dataDailyMonitoring = [];
if (count($dailyMonitoring) > 0){
$temp = [];
foreach($dailyMonitoring as $data){
$temp['date'] = Helper::formatDateOnly($data['created_at']);
$temp['time'] = Helper::formatTimeOnly($data['created_at']);
$temp['status'] = 'Done';
$temp['subject_title'] = $data['subject'];
$temp['body_temperature'] = $data['body_temperature']. 'mm[Hg]';
$temp['sistole'] = $data['sistole']. 'mm[Hg]';
$temp['diastole'] = $data['diastole']. 'mm[Hg]';
$temp['respiration_rate'] = $data['respiration_rate']. 'mm[Hg]';
$temp['analisis_title'] = $data['analysis'];
$medicalPlan = MedicalPlan::where('claim_daily_monitoring_id', $data['id'])->get('plan')->toArray();
if (count( $medicalPlan) > 0){
$temp['Perencanaan'] = [];
foreach($medicalPlan as $item){
array_push($temp['Perencanaan'], $item['plan']);
}
} else {
$temp['Perencanaan'] = [];
}
array_push($dataDailyMonitoring, $temp);
}
}
// Handle Laboratorium Result
$dataLaboratoruiumResult = [];
if (count($laboratoriumResult) > 0){
$tempLab = [];
foreach($laboratoriumResult as $data){
$tempLab['datetime'] = $data['date'];
$tempLab['reimbursement_code'] = "RE-0" . $data['id'];
$tempLab['examination'] = $data['examination'];
$tempLab['location'] = $data['location'];
if (count($data['lab_result_file']) > 0){
$tempLab['file'] = $data['lab_result_file'][0]['lab_result_file_obj']->path; // masih dumy untuk download nya belum bisa multiple
}
array_push($dataLaboratoruiumResult, $tempLab);
}
}
$data = [
"id" => $this->id,
"company_name" => $member->currentCorporate->name,
"member_name" => $member->name,
"member_code" => $member->member_id,
"member_id" => $member->id,
"phone" => $member->person->phone,
"email" => $member->email,
"birth_date" => $member->birth_date,
"symptoms" => $historyCareHospital->symptoms ? $historyCareHospital->symptoms : '-' ,
"sign" => $historyCareHospital->sign ? $historyCareHospital->sign : '-',
"main_diagnose" => $mainDianosis,
"main_diagnose_code" => $mainDianosisCode,
"comparative_diagnosis" => $comporatationDiagnosisName,
"comparative_diagnosis_code" => $comporatationDiagnosisCode,
"service_name" => $serviceCode,
"benefit_name" => "Konsultasi Dokter",
"hospital" => $hospital,
"admission_date" => $admissionDate,
"discharge_date" => $dischargeDate,
"dialy_monitoring" => $dataDailyMonitoring,
// "laboratorium_result" => [
// "0" => [
// [
// "datetime" => "2023-10-05 10:00",
// "reimbursement_code" => "RE-011",
// "examination" => "SGOT",
// "location" => "Pramita Jakarta Ragunan",
// "files" => "https:://test.com"
// ],
// [
// "datetime" => "2023-10-05 09:00",
// "reimbursement_code" => "RE-010",
// "examination" => "SGOT",
// "location" => "Pramita Jakarta Ragunan",
// "files" => "https:://test.com"
// ],
// ],
// "1" => [
// [
// "datetime" => "2023-10-04 10:00",
// "reimbursement_code" => "RE-09",
// "examination" => "Hematologi Lengkap",
// "location" => "Pramita Jakarta Ragunan",
// "files" => "https:://test.com"
// ],
// [
// "datetime" => "2023-10-04 09:00",
// "reimbursement_code" => "RE-08",
// "examination" => "Hematologi Lengkap",
// "location" => "Pramita Jakarta Ragunan",
// "files" => "https:://test.com"
// ]
// ]
// ],
"laboratorium_result" => [$dataLaboratoruiumResult], //
];
return $data;
}
}

View File

@@ -0,0 +1,24 @@
<?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,6 +3,7 @@
namespace Modules\Client\Transformers\ClaimReport;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Crypt;
class MemberResources extends JsonResource
{
@@ -16,11 +17,13 @@ class MemberResources extends JsonResource
{
return [
'id' => $this->id,
'memberId' => $this->member_id,
'fullName' => $this->full_name,
'division' => $this->division_name ?? '',
'submission_date' => '',
'status' => $this->active,
'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,
];
}
}

View File

@@ -0,0 +1,31 @@
<?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'))
]
];
}
}

View File

@@ -0,0 +1,27 @@
<?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,6 +14,7 @@ class MemberResources extends JsonResource
*/
public function toArray($request)
{
// dd($this->currentPlans);
return [
'id' => $this->id,
'memberId' => $this->member_id,
@@ -25,6 +26,7 @@ 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

@@ -25,10 +25,21 @@ class DataMemberResource extends JsonResource
'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,
'marital_status' => $this->marital_status,
'record_type' => $this->record_type,
'principal_id' => $this->principal_id,
'relation_with_principal' => $this->relation_with_principal,

View File

@@ -16,6 +16,9 @@ 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
{
@@ -23,6 +26,7 @@ class ClaimRequestController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
private static $code_prefix = 'CRQ-H';
public function index(request $request)
{
$claimRequests = ClaimRequest::query()
@@ -60,70 +64,93 @@ class ClaimRequestController extends Controller
*/
public function store(Request $request)
{
$request->validate([
$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',
'member_id' => 'required',
'service_code' => 'required|in:OP,IP'
'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'])
]);
$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,
]);
}
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
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,
]);
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();
$member = Member::find($request->member_id);
$newClaimRequest = ClaimRequestService::storeClaimRequest(
row: [],
code: $code,
member: $member,
paymentType: 'reimbursement',
serviceCode: $request->service_code,
requestLogID: $request->request_logs_id,
);
// 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) {
$pathFile = File::storeFile('additional-files', $newClaimRequest->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,
]);
}
}
DB::commit();
return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200);
}
catch (\Exception $e) {
DB::rollback();
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
if ($request->hasFile('kondisi_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,
]);
else
{
return ApiResponse::apiResponse("Error", $data, trans('Message.already_exists'), 409);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!');
}
/**
@@ -137,7 +164,8 @@ class ClaimRequestController extends Controller
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
}
},
'files',
]);
return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest));
@@ -178,16 +206,260 @@ 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', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']);
->load([
// 'currentPlan',
'currentPlan' => function ($plan) use ($claim_request_id, $service_code) {
$plan->where('plans.service_code', $service_code);
},
'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()
{
$last_number = ClaimRequest::withTrashed()->max('code');
$last_number_parts = explode('-', $last_number);
$next_number = count($last_number_parts) < 3 ? 1 : ((int) $last_number_parts[2] + 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);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . '-' . 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) {
$pathFile = File::storeFile('claim-diagnosis', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = File::storeFile('claim-kondisi', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $claim_id, $file),
'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) {
$pathFile = File::storeFile('claim-result', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $claim_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: 'Invoice Success Uploaded');
}
}

View File

@@ -9,6 +9,7 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB;
class MemberController extends Controller
{
@@ -26,8 +27,8 @@ class MemberController extends Controller
'no_polis' => 'required',
'birth_date' => 'required'
], [
'no_polis.required' => trans('validation.required',['attribute' => 'Member ID']),
'birth_date.required' => trans('validation.required',['attribute' => 'Birth Date']),
'no_polis.required' => trans('Validation.required',['attribute' => 'Member ID']),
'birth_date.required' => trans('Validation.required',['attribute' => 'Birth Date']),
]);
if ($validator->fails())
{
@@ -35,20 +36,74 @@ class MemberController extends Controller
}
else
{
$res_data = 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();
return ApiResponse::apiResponse("Success", $res_data, trans('message.success'), 200);
$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;
$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)
->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;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse("Data Not Found", $data, trans('Message.not_found'), 404);
}
}
}
}

View File

@@ -0,0 +1,86 @@
<?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, $hospital_id)
{
$data = [
'hospital_id' => $hospital_id,
];
if (!$hospital_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('hospital_id', '=', $hospital_id)
->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 = [
'hospital_id' => $request->hospital_id,
'id' => $request->id,
'isUnRead'=> 0,
];
$validator = Validator::make($request->all(), [
'hospital_id' => 'required',
'id' => 'required'
], [
'hospital_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

@@ -0,0 +1,284 @@
<?php
namespace Modules\HospitalPortal\Http\Controllers\Api;
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 Modules\Internal\Http\Controllers\Api\RequestLogController as primeCenterRequestLog;
use App\Helpers\Helper;
use App\Models\File;
class RequestLogController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function requestLog(Request $request)
{
$data = [
'member_id' => $request->member_id,
'service_code' => $request->service_code
];
$validator = Validator::make($request->all(), [
'member_id' => 'required',
'service_code' => 'required'
], [
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$requestLogControllerInstance = new PrimeCenterRequestLog();
$response = $requestLogControllerInstance->createNew($request);
if($response->original['statusCode'] == 200)
{
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse('Server Error', $data, trans('Message.server_error'), 500);
}
}
}
public function getRequestLog(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
$results = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->when($request->input('search'), function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('request_logs.code', 'like', "%" . $search . "%")
->orWhere('members.name', 'like', "%" . $search . "%")
->orWhere('request_logs.submission_date', '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('request_logs.submission_date', '<', $start_date);
});
})
->when($request->input('status'), function ($query, $status) {
$query->where(function ($query) use ($status) {
if ($status === 'requested') {
$query->where('request_logs.status', '=', 'requested');
}
if ($status === 'reviewed') {
$query->where('request_logs.status', '=', 'approved');
}
if ($status === 'approved') {
$query->where('request_logs.status', '=', 'approved');
}
if ($status === 'declined') {
$query->where('request_logs.status', '=', 'declined');
}
});
})
->select(
'request_logs.id',
'request_logs.final_log',
'request_logs.code',
'members.name as full_name',
'members.member_id as no_polis',
'members.birth_date',
DB::raw('
CASE
WHEN request_logs.status = "requested" THEN "requested"
WHEN request_logs.status = "approved" THEN "approved"
WHEN request_logs.status = "declined" THEN "declined"
WHEN request_logs.status = "reviewed" THEN "reviewed"
ELSE ""
END AS status
'),
'request_logs.submission_date')
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function getFinalLog(Request $request)
{
$limit = $request->has('per_page') ? $request->input('per_page') : 10;
$results = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->when($request->input('search'), function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('request_logs.code', 'like', "%" . $search . "%")
->orWhere('members.name', 'like', "%" . $search . "%")
->orWhere('request_logs.submission_date', 'like', "%" . $search . "%")
->orWhere('request_logs.service_code', 'like', "%" . ($search == 'outpatient' || $search == 'Outpatient' ? 'OP' : 'IP') . "%");
});
})
->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('request_logs.submission_date', '<', $start_date);
});
})
->when($request->input('status'), function ($query, $status) {
$query->where(function ($query) use ($status) {
if ($status === 'requested') {
$query->where('request_logs.status_final_log', '=', 'requested');
}
if ($status === 'reviewed') {
$query->where('request_logs.status_final_log', '=', 'approved');
}
if ($status === 'approved') {
$query->where('request_logs.status_final_log', '=', 'approved');
}
if ($status === 'declined') {
$query->where('request_logs.status_final_log', '=', 'declined');
}
});
})
->where('request_logs.final_log', '=', 1)
->select(
'request_logs.id',
'request_logs.final_log',
'request_logs.code',
'members.name as full_name',
'members.member_id as no_polis',
'members.id AS member_id',
'request_logs.service_code',
'members.birth_date',
DB::raw('
CASE
WHEN request_logs.status_final_log = "requested" THEN "requested"
WHEN request_logs.status_final_log = "approved" THEN "approved"
WHEN request_logs.status_final_log = "declined" THEN "declined"
WHEN request_logs.status_final_log = "reviewed" THEN "reviewed"
ELSE ""
END AS status
'),
'request_logs.submission_date',
DB::raw('
CASE
WHEN service_code = "OP" THEN "Outpatient"
WHEN service_code = "IP" THEN "Inpatient"
ELSE ""
END AS service_type
'),
DB::raw('
(Select request_log_id FROM claim_requests WHERE claim_requests.request_log_id = request_logs.id LIMIT 1) AS check_claim
')
)
->paginate($limit);
return response()->json(Helper::paginateResources($results));
}
public function requestFinalLog(Request $request)
{
$data = [
'request_logs_id' => $request->request_logs_id
];
$validator = Validator::make($request->all(), [
'request_logs_id' => 'required'
], [
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Logs ID'])
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
try {
DB::beginTransaction();
DB::table('request_logs')
->where('request_logs.id', '=', $request->request_logs_id)
->update([
'status_final_log' => 'requested',
'final_log' => 1
]);
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('final-log-result', $request->request_logs_id, $file);
File::updateOrCreate([
'fileable_type' => 'App\Models\RequestLog',
'fileable_id' => $request->request_logs_id,
'type' => 'final-log-result',
'name' => File::getFileName('final-log-result', $request->request_logs_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('final-log-diagnosis', $request->request_logs_id, $file);
File::updateOrCreate([
'fileable_type' => 'App\Models\RequestLog',
'fileable_id' => $request->request_logs_id,
'type' => 'final-log-diagnosis',
'name' => File::getFileName('final-log-diagnosis', $request->request_logs_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('kondisi_files')) {
foreach ($request->kondisi_files as $file) {
$pathFile = File::storeFile('final-log-kondisi', $request->request_logs_id, $file);
File::updateOrCreate([
'fileable_type' => 'App\Models\RequestLog',
'fileable_id' => $request->request_logs_id,
'type' => 'final-log-kondisi',
'name' => File::getFileName('final-log-kondisi', $request->request_logs_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'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);
}
}
}
}

View File

@@ -27,11 +27,11 @@ class Authorization
// Add language
if(!$locale)
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Accept-Language']), 401);
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);
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept-Language']), 400);
}
if ($locale === 'en-US')
{
@@ -46,25 +46,25 @@ class Authorization
// Validate authorization
if (empty($authorization) || strpos($authorization, 'Bearer ') !== 0) {
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Authorization']), 401);
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);
return ApiResponse::apiResponse('Unauthorized', null, trans('Validation.required', ['attribute' => 'Accept']), 401);
}
if (!$contentType)
if (!$contentType && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Unauthorized', null, trans('validation.required', ['attribute' => 'Content-Type']), 401);
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);
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Accept']), 400);
}
if($contentType !== 'application/json')
if($contentType !== 'application/json' && $request->isMethod('post'))
{
return ApiResponse::apiResponse('Bad Request', null, trans('validation.invalid', ['attribute' => 'Content-Type']), 400);
return ApiResponse::apiResponse('Bad Request', null, trans('Validation.invalid', ['attribute' => 'Content-Type']), 400);
}
return $next($request);
}

View File

@@ -5,6 +5,8 @@ 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\HospitalPortal\Http\Middleware\Authentication;
use Modules\HospitalPortal\Http\Middleware\Authorization;
@@ -42,15 +44,40 @@ Route::prefix('v1')->group(function() {
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');
});
//Notification
Route::controller(NotificationController::class)->group(function() {
//get notifications
Route::get('notifications/{hospital_id}', 'getNotifications');
//Set read notification
Route::post('set-read-notification', 'setReadNotification');
});
});
// 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::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']);
});
});
});

View File

@@ -3,6 +3,7 @@
namespace Modules\HospitalPortal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
class ClaimRequestShowResource extends JsonResource
{
@@ -25,6 +26,12 @@ class ClaimRequestShowResource extends JsonResource
'histories' => $histories
];
}
// Map Files by type
$filesGroupByType = $this->files->mapToGroups(function($file) {
return [Str::slug($file->type, '_') => $file];
});
$data['files_by_type'] = $filesGroupByType;
return $data;
}

View File

@@ -4,6 +4,7 @@ namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\AuditTrail;
use App\Models\ExclusionRules;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
@@ -19,7 +20,7 @@ class AuditTrailController extends Controller {
$audittrails = AuditTrail::query()
->where('model', '=', $request->model)
->where('model_id', '=', $id)
// ->latest()
->latest()
->paginate(1000);
return response()->json(Helper::paginateResources(AuditTrailResource::collection($audittrails)));
}

File diff suppressed because it is too large Load Diff

View File

@@ -4,17 +4,29 @@ namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\ClaimRequest;
use App\Models\Organization;
use App\Services\ClaimService;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\ClaimRequestResource;
use Modules\Internal\Transformers\ClaimRequestShowResource;
use Illuminate\Support\Facades\Storage;
use App\Services\ClaimRequestService;
use App\Exceptions\ImportRowException;
use App\Events\ClaimRequested;
use App\Models\File;
use App\Models\FilesMcu;
use Illuminate\Support\Facades\DB;
use App\Models\Member;
class ClaimRequestController extends Controller
{
private static $code_prefix = 'CRQ-C';
/**
* Display a listing of the resource.
* @return Renderable
@@ -24,6 +36,9 @@ class ClaimRequestController extends Controller
$claimRequests = ClaimRequest::query()
->when($request->search, function ($q, $search) {
$q->where('code', 'LIKE', "%".$search."%");
$q->orWhereHas('member', function ($subQuery) use ($search) {
$subQuery->where('name', 'LIKE', "%".$search."");
});
})
->when($request->orderBy, function ($q, $orderBy) use ($request) {
if (in_array($orderBy, ['submission_date', 'code'])) {
@@ -36,7 +51,7 @@ class ClaimRequestController extends Controller
->when($request->status, function($q, $status) {
$q->where('status', $status);
})
->with(['member', 'files', 'service'])
->with(['member', 'files', 'service', 'member.currentPolicy'])
->paginate();
return Helper::paginateResources(ClaimRequestResource::collection($claimRequests));
@@ -52,13 +67,150 @@ class ClaimRequestController extends Controller
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
* Create New Calim Request
*
* Bagaskoro, BSD 03 November 2023
*/
public function store(Request $request)
public function createNew(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['file_penunjang'])) {
foreach ($_FILES['file_penunjang']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-result-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['file_penunjang']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['file_penunjang']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['file_penunjang']['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,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['file_diagnosa'])) {
foreach ($_FILES['file_diagnosa']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-diagnosis-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['file_diagnosa']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['file_diagnosa']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['file_diagnosa']['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,
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
}
}
if (isset($_FILES['file_kondisi'])) {
foreach ($_FILES['file_kondisi']['error']["member_" .$member_id] as $key => $value) {
if ($value == 0) {
$new_file_name = "claim-kondisi-" . time() . "-" . uniqid();
$ekstension = "." . explode("/", $_FILES['file_kondisi']['type']["member_" .$member_id][$key])[1];
$pathFile = $folder . $new_file_name . $ekstension;
$tmp_name = $_FILES['file_kondisi']['tmp_name']["member_" .$member_id][$key];
$full_path = $_FILES['file_kondisi']['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,
'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(status: 'success', statusCode: 201, message: 'Claim Request berhasil ajukan!', data: $request->toArray());
}
/**
@@ -73,7 +225,10 @@ class ClaimRequestController extends Controller
'histories' => function ($history) {
$history->latest();
},
'files'
'files',
'member',
'claim',
'organization',
]);
return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest));
@@ -97,7 +252,83 @@ class ClaimRequestController extends Controller
*/
public function update(Request $request, $id)
{
//
$claimRequest = ClaimRequest::findOrFail($id);
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
},
'files',
'member',
'claim',
'organization',
]);
$organization = Organization::where('code', $request->provider_code)->first();
if (!$organization) {
return response()->json(['error' => true, 'message' => 'Data tidak ditemukan'], 404);
}
$updateClaimRequest = ClaimRequestService::updateClaimRequest(organization_id: $organization->id, claim_request_id: $id);
ClaimRequested::dispatch($updateClaimRequest);
// Log History
$updateClaimRequest->histories()->create([
'title' => 'Update Claim Requested',
'description' => "Update Claim Requested for Member : {$claimRequest->member->member_id} - ({$claimRequest->member->full_name})",
'type' => 'update',
'system_origin' => 'prime-center'
]);
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-result', $id, $file);
$updateClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('claim-diagnosis', $id, $file);
$updateClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('kondisi_files')) {
foreach ($request->kondisi_files as $file) {
$pathFile = File::storeFile('claim-kondisi', $id, $file);
$updateClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $updateClaimRequest],
200);
}
/**
@@ -114,17 +345,17 @@ class ClaimRequestController extends Controller
{
$claimRequest = ClaimRequest::findOrFail($id);
$member = $claimRequest->member;
try {
// Create New Claim
$newClaim = ClaimService::storeClaim(member: $member, status: 'received', claimRequest: $claimRequest);
// Update Claim Request Status & Link with Claim
$claimRequest->status = 'approved';
$claimRequest->claim_id = $newClaim->id;
$claimRequest->save();
// Store Generated Documents LOG
$logContent = view('pdf.guaranted_leter', compact('member', 'claimRequest'));
$claimRequest->generatedDocuments()->create([
@@ -135,8 +366,21 @@ class ClaimRequestController extends Controller
'system_origin' => 'primecenter'
]);
} catch (\Exception $e) {
// Claim Log
DB::table('claim_logs')
->insert([
'claim_request_id' => $id,
'status' => 'reviewed',
'date' => date('Y-m-d H:i:s'),
'description' => "Claim Requested Successfully Reviewed",
'system_origin' => 'prime-center',
'created_by' => auth()->user()->id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at'=> date('Y-m-d H:i:s'),
]);
} catch (\Exception $e) {
return $e->getMessage();
}
return $claimRequest;
@@ -164,7 +408,366 @@ class ClaimRequestController extends Controller
{
return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file member yang ditambahkan');
}
}
public function importClaim(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$fileWrite = Storage::disk('public')->path('temp/result-' . $file_name);
$fileRead = Storage::path('temp/' . $file_name);
$import = new ImportService();
$import->read($fileRead);
$import->write($fileWrite, 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
if ($sheetIndex == 1) { // Rename First Sheet to Writer
$firstWriterSheet = $import->writer->getCurrentSheet();
$firstWriterSheet->setName($sheet->getName());
} else { // Add New Sheet to Writer
$nextWriterSheet = $import->writer->addNewSheetAndMakeItCurrent();
$nextWriterSheet->setName($sheet->getName());
}
$headers_map_to_table_fields = ClaimRequest::$doc_headers_to_field_map;
// Write Header to File
$result_headers = array_keys($headers_map_to_table_fields);
$result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace("/\r|\n/", " ", $title);
$title = preg_replace('/\xc2\xa0/', " ", $title);
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]]))
$row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
}
try { // Process the Row Data
$claimRequestService = new ClaimRequestService();
$claimRequestService->handleClaimRequestRow($row_data);
// Write Success Result to File
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']);
$import->addArrayToRow($result_headers, $sheet->getName());
} catch (ImportRowException $e) {
// Write Data Validation Error to File
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
}
// catch (\Exception $e) {
// // throw new \Exception($e);
// // Write Server Error to File
// // $import->read($fileRead);
// // $import->write($fileWrite, 'xsls');
// dd( $e->getMessage());
// $import->addArrayToRow(array_merge($row_data, [
// 'Ingest Code' => 500,
// 'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
// ]), $sheet->getName());
// }
}
}
}
$import->reader->close();
Storage::delete('temp/' . $file_name);
$import->writer->close();
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
// 'failed_row' => $failed_plan_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-' . $file_name),
'name' => 'result-' . $file_name,
]
];
}
public function claimRequestDetail($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',
'claim_requests.code',
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;
$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();
$results['documents'] = $documents;
$dialog_submits = DB::table('claim_requests')
->leftJoin('members', 'claim_requests.member_id','=', 'members.id')
->where('claim_requests.id', $claimRequestId)
->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status')
->first();
$results['dialog_submits'] = $dialog_submits;
return Helper::responseJson($results);
}
public function invoiceFiles(Request $request, $claim_id)
{
if ($request->hasFile('invoice_files')) {
foreach ($request->invoice_files as $file) {
$pathFile = File::storeFile('claim-invoice', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-invoice',
'name' => File::getFileName('claim-invoice', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if($request->date)
{
DB::table('claim_requests')
->where('id', $claim_id)
->update(['invoice_date' => $request->date]);
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
/**
* Get Claim Member - Infinite Scroll
*
* Bagaskoro, BSD 31 Oktober 2023
*/
public function getClaimMemberInfiniteScroll(Request $request)
{
$offset = 0;
$limit = 10;
$page = $request->get('page');
$keyword = $request->get('keyword');
if ($page > 1) {
$offset = ($page*$limit)-$limit;
}
$memberList = DB::table('members')
->select('id','member_id','name')
->where("name", "like", "%$keyword%")
->orWhere("member_id", "like", "%$keyword%")
->orderBy('created_at', 'asc')
->offset($offset)
->limit($limit)
->get();
$data = [];
if(count($memberList)>0){
$temp = [];
foreach($memberList as $d){
$serviceType = $this->getServiceMember($d->id);
$temp['id'] = $d->id;
$temp['member_id'] = $d->member_id;
$temp['name'] = $d->name;
$temp['service_type'] = $serviceType;
array_push($data, $temp);
}
}
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'member_list'=> $data,
]
],200);
}
public function getServiceMember($id){
$service = DB::table('member_plans')
->select('plans.service_code as code', 'services.name')
->join('plans', 'member_plans.plan_id', '=', 'plans.id')
->join('services', 'plans.service_code', '=', 'services.code')
->where('member_id', $id)
->get()
->toArray();
return $service;
}
public static function getNextCode()
{
// $last_number = ClaimRequest::max('code');
// $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1);
// return self::makeCode($next_number);
$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);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . '-' . str_pad($next_number, 5, '0', STR_PAD_LEFT);
}
public function requestFiles(Request $request, $claim_id)
{
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$pathFile = File::storeFile('claim-diagnosis', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = File::storeFile('claim-kondisi', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $claim_id, $file),
'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) {
$pathFile = File::storeFile('claim-result', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\ClaimRequest',
'fileable_id' => $claim_id,
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $claim_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: 'Invoice Success Uploaded');
}
}

View File

@@ -20,10 +20,12 @@ class CorporateBenefitController extends Controller
$benefits = CorporateBenefit::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->paginate(0)
->with('benefit', 'plan')
->paginate(10)
->appends($request->all());
return $benefits;
}
public function activation(Request $request, $benefit_id)
{
$request->validate([
@@ -31,9 +33,8 @@ class CorporateBenefitController extends Controller
]);
// abort(404);
$benefit = CorporateBenefit::findOrFail($benefit_id);
$benefit->active = $request->active == '1';
$benefit = CorporateBenefit::find($benefit_id);
$benefit->active = $request->active == 1 ? 0 : 1;
$benefit->reason = $request->reason;
if ($benefit->save()) {
@@ -108,18 +109,15 @@ class CorporateBenefitController extends Controller
{
$corporateBenefit = CorporateBenefit::findOrFail($id);
$request->validate([
'code' => [
'budget' => [
'required',
Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporateBenefit->id)
],
'name' => 'required'
]);
$corporateBenefit->fill([
'code' => $request->code,
'name' => $request->name,
'active' => $request->active,
'budget' => $request->budget,
])->save();
return $corporateBenefit;

View File

@@ -25,6 +25,7 @@ use Illuminate\Support\Facades\File as FacadesFile;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\CorporateService;
use App\Models\FilesDoc;
class CorporateController extends Controller
{
@@ -120,9 +121,9 @@ class CorporateController extends Controller
$services = [
[
'id' => 1,
'name' => 'Out Patient',
'name' => 'Outpatient',
'code' => 'OP',
'description' => 'Out Patient',
'description' => 'Outpatient',
],
[
'id' => 2,
@@ -380,13 +381,15 @@ class CorporateController extends Controller
public function activation(Request $request, $corporate_id)
{
$request->validate([
'active' => 'required'
'active' => 'required',
'reason' => 'required'
]);
// abort(404);
$corporate = Corporate::findOrFail($corporate_id);
$corporate->active = $request->active == '1';
$corporate->active = $request->active == 0 ? 1 : 0;
$corporate->reason = $request->reason;
if ($corporate->save()) {
return response()->json([
@@ -504,6 +507,17 @@ class CorporateController extends Controller
];
}
public function deleteAllImportPlanBenefit(Request $request, $corporate_id){
$deleteBenefit = CorporateBenefit::where('corporate_id', $corporate_id)->delete();
$deletePlan = Plan::where('corporate_id', $corporate_id)->delete();
if ( $deleteBenefit && $deletePlan ){
return Helper::responseJson(data: [], message: 'Berhasil delete semua benefit');
} else {
return Helper::responseJson(data: [], message: 'Gagal delete semua benefit', statusCode:404);
}
}
public function importDocumentExample($document_type)
{
switch ($document_type) {
@@ -524,7 +538,37 @@ class CorporateController extends Controller
'file_name' => "Corporate Exclusion Import.xlsx",
"file_url" => url('files/Corporate Exclusion Import.xlsx')
]);
break;
break;
case 'master-icd':
return Helper::responseJson([
'file_name' => "Template - ICD.xlsx",
"file_url" => url('files/Template - ICD.xlsx')
]);
break;
case 'master-formularium':
return Helper::responseJson([
'file_name' => "Template - Formularium.xlsx",
"file_url" => url('files/Template - Formularium.xlsx')
]);
break;
case 'master-formularium-corporate':
return Helper::responseJson([
'file_name' => "Template - Formularium.xlsx",
"file_url" => url('files/Template - Formularium - Corporate.xlsx')
]);
break;
case 'claim-request':
return Helper::responseJson([
'file_name' => "Template Format Claim.xlsx",
"file_url" => url('files/Template Format Claim.xlsx')
]);
break;
case 'request-log':
return Helper::responseJson([
'file_name' => "Template Update Status Request LOG.xlsx",
"file_url" => url('files/Template Update Status Request LOG.xlsx')
]);
break;
default:
return Helper::responseJson([], 'error', 404);
break;
@@ -717,5 +761,69 @@ class CorporateController extends Controller
return $corporates;
}
public function addFilesDoc(Request $request)
{
$request->validate([
'corporate_id' => 'required'
]);
if ($request->hasFile('result_files')) {
$pathFile = File::storeFile('docs', $request->corporate_id, $request->result_files);
$data = [
'corporate_id' => $request->corporate_id,
'original_name' => $request->result_files->getClientOriginalName(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id
];
FilesDoc::create($data);
return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file '.$data['original_name']);
}
else
{
return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file yang ditambahkan');
}
}
public function getFilesDoc(Request $request)
{
$request->validate([
'corporate_id' => 'required'
]);
$datas = FilesDoc::where('corporate_id', $request->corporate_id)
->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'status_download')
->orderBy('id', 'desc')
//->limit(1)
->get();
if ($datas->isEmpty()) {
return Helper::responseJson(data: [], message: 'Tidak ada data');
}
return Helper::responseJson(data: $datas, message: 'Berhasil mendapatkan data');
}
public function updateStatusFilesDoc(Request $request)
{
$request->validate([
'status_download' => 'required',
'corporate_id' => 'required'
]);
$data_requests = [
'status_download' => $request->status_download
];
FilesDoc::where('corporate_id', $request->corporate_id)
->update($data_requests);
$datas = FilesDoc::where('corporate_id', $request->corporate_id)
->select('status_download')
->orderBy('id', 'desc')
->limit(1)
->get();
return Helper::responseJson(data: $datas, message: 'Berhasil update status download menjadi '.($request->status_download == 0 ? 'Inactive' : 'Active'));
}
}

View File

@@ -2,13 +2,25 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Exceptions\ImportRowException;
use App\Helpers\Helper;
use App\Models\CorporateFormularium;
use App\Models\Formularium;
use App\Models\FormulariumTemplate;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Transformers\CorporateFormulariumResource;
use Modules\Internal\Services\FormulariumService;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
class CorporateFormulariumController extends Controller
{
@@ -16,25 +28,24 @@ class CorporateFormulariumController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function __construct(FormulariumService $formulariumService)
{
$this->formulariumService = $formulariumService;
}
public function index(Request $request, $corporate_id)
{
$formulariums = Formularium::query()
->filter($request->all());
if (!empty($request->status) && $request->status == 'inactive') {
$formulariums = $formulariums->whereDoesntHave('corporateFormulariums');
} else if (!empty($request->status) && $request->status == 'all') {
} else { // Active or Default
$formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){
$corporateFormularium->where('corporate_id', $corporate_id);
});
}
$formulariums = $formulariums->with(['corporateFormulariums' => function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
}])
->withCount('items')
->paginate();
$formulariums = CorporateFormularium::query()
->where('corporate_id', $corporate_id)
->paginate(15);
// if (!empty($request->status) && $request->status == 'inactive') {
// $formulariums = $formulariums->whereDoesntHave('corporateFormulariums');
// } else if (!empty($request->status) && $request->status == 'all') {
// } else { // Active or Default
// $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){
// $corporateFormularium->where('corporate_id', $corporate_id);
// });
// }
return Helper::paginateResources(CorporateFormulariumResource::collection($formulariums));
}
@@ -42,9 +53,16 @@ class CorporateFormulariumController extends Controller
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
public function create(Request $request, $corporate_id)
{
return view('internal::create');
$data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel
$formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get();
$respone = [
"status" => 200,
"message" => 'data berhasil diambil',
"data" => $formularium_template
];
return $respone;
}
/**
@@ -52,9 +70,36 @@ class CorporateFormulariumController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
public function store(Request $request, $corporate_id)
{
//
$request->validate([
'id' => 'required'
]);
$checkFormularium = FormulariumTemplate::find($request->id);
if (!$checkFormularium){
$respone = [
"status" => 404,
"message" => "data master formularium tidak ditemukan",
"data" => []
];
return $respone;
}
$newCorporateFormularium = CorporateFormularium::create([
'corporate_id' => $corporate_id,
'formularium_template_id' => $request->id,
'active' => 1
]);
if ($newCorporateFormularium){
$respone = [
"status" => 200,
"message" => "data berhasil disimpan"
];
return $respone;
}
return $newCorporatePlan;
}
/**
@@ -62,9 +107,15 @@ class CorporateFormulariumController extends Controller
* @param int $id
* @return Renderable
*/
public function show($id)
public function show(Request $request, $corporate_id, $id)
{
return view('internal::show');
$data = Formularium::where('formularium_template_id', $id)->get();
$respone = [
"status" => 200,
"message" => 'data berhasil diambil',
"data" => $data
];
return $respone;
}
/**
@@ -72,9 +123,16 @@ class CorporateFormulariumController extends Controller
* @param int $id
* @return Renderable
*/
public function edit($id)
public function edit(Request $request, $corporate_id)
{
return view('internal::edit');
$data = CorporateFormularium::where('corporate_id', $corporate_id)->pluck('formularium_template_id')->toArray(); // agar tidak dobel
$formularium_template = FormulariumTemplate::whereNotIn('id', $data)->get();
$respone = [
"status" => 200,
"message" => 'data berhasil diambil',
"data" => $formularium_template
];
return $respone;
}
/**
@@ -101,7 +159,7 @@ class CorporateFormulariumController extends Controller
public function updateStatus($corporate_id, $formularium_id , $status)
{
if ($status == 'activate') {
$corporateFormularium = CorporateFormularium::firstOrCreate([
$corporateFormularium = CorporateFormularium::updateOrCreate([
'corporate_id' => $corporate_id,
'formularium_id' => $formularium_id
], [
@@ -128,4 +186,213 @@ class CorporateFormulariumController extends Controller
]);
}
}
public function active(Request $request, $corporate_id, $id)
{
$corporateFormularium = CorporateFormularium::find($id);
$corporateFormularium->fill([
'active' => $request->active,
])->save();
$respone = [
"status" => 200,
"message" => 'data berhasil diedit',
"data" => $corporateFormularium
];
return $respone;
}
public function import(Request $request, $id)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
// dd($request->toArray());
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
// $importLog = $corporate->importLogs()->create([
// 'type' => 'diagnosis-exclusions',
// 'file_path' => $file,
// 'status' => 'pending',
// 'progress' => 0,
// ]);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
// $result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
// Tambahkan 'Ingest Code' dan 'Ingest Note' ke akhir array
$doc_headers_indexes[] = 'Ingest Code';
$doc_headers_indexes[] = 'Ingest Note';
$import->addArrayToRow($doc_headers_indexes);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'code',
1 => 'active',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (empty($row_data['code'])){
throw new ImportRowException(__('Internal Code is REQUIRED'), 405, null, $row_data);
}
if (
// empty($row_data['code']) &&
// empty($row_data['description']) &&
empty($row_data['code']) &&
empty($row_data['active'])
) {
continue;
}
// Save the Row
$formulariums = Formularium::where('code', $row_data['code'])->first();
if ($formulariums){
$row_data['formularium_id'] = $formulariums->id;
} else {
throw new ImportRowException(__('Internal Code is Not Found'), 405, null, $row_data);
}
$formulariumService = new FormulariumService();
$formulariumService->handleFormuariumCorporateRow($row_data, $id);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
// 'failed_row' => $failed_plan_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function generateFormulariumList(Request $request, $id){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
// $data = Formularium::get()->toArray();
$formulariums = Formularium::query()
->filter($request->all());
// if (!empty($request->status) && $request->status == 'inactive') {
// $formulariums = $formulariums->whereDoesntHave('corporateFormulariums');
// } else if (!empty($request->status) && $request->status == 'all') {
// } else { // Active or Default
// $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){
// $corporateFormularium->where('corporate_id', $corporate_id);
// });
// }
$data = $formulariums->with(['corporateFormulariums' => function ($query) use ($id) {
$query->where('corporate_id', $id);
}])->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/TemplateFormulariumList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->formulariumService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['code'], // code
$item['name'], // name
$item['description'], // Description
$item['manufacturer'], // manufacturer
$item['category_name'], // category_name
$item['kategori_obat'], // kategori_obat
$item['uom'], // uom
$item['general_indication'], // Description
$item['composition'], // composition
$item['atc_code'], // atc_code
$item['class'], // class
$item['bpom_registration'], // bpom_registration
$item['classifications'], // classifications
$item['cat_for'], // cat_for
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/TemplateFormulariumList.xlsx');
return Helper::responseJson([
'file_name' => "Formularium List " . date('Y-m-d h:i:s'),
"file_url" => url('files/TemplateFormulariumList.xlsx')
]);
}
}

View File

@@ -0,0 +1,82 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\CorporateManager;
use Modules\Internal\Transformers\CorporateManageResource;
class CorporateManageController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
$userCorporateManage = CorporateManager::with(['user', 'corporate'])->get();
return response()->json($userCorporateManage);
}
public function store(Request $request)
{
$request->validate([
'user_id' => [
'required',
],
'corporate_id' => 'required'
]);
$newCorporateManage = CorporateManager::create([
'corporate_id' => $request->corporate_id,
'user_id' => $request->user_id,
]);
return $newCorporateManage;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$updateCorporateManage = CorporateManager::findOrFail($id);
$request->validate([
'user_id' => [
'required',
],
'corporate_id' => 'required'
]);
$updateCorporateManage->fill([
'corporate_id' => $request->corporate_id,
'user_id' => $request->user_id,
])->save();
return $updateCorporateManage;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
// Soft delete model
$corporateManage = CorporateManager::find($id);
$corporateManage->delete();
return $corporateManage;
}
}

View File

@@ -31,7 +31,7 @@ class CorporateMemberController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $corporate_id)
public function index(Request $request, $corporate_id )
{
$members = Member::query()
->joinCorporateEmployees('left')
@@ -44,7 +44,13 @@ class CorporateMemberController extends Controller
// return $claim->whereBetween('requested_at', [now()->startOfYear(), now()->endOfYear()]);
// return $claim->used(now()->startOfYear(), now()->endOfYear());
},
'currentPlans',
'currentPlan',
// 'currentPlan' => function ($currentPlan) use ($service_code){
// return $currentPlan->where([
// 'plans.service_code' => $service_code
// ]);
// },
'currentPlan.benefits' => function ($benefit) use ($corporate_id){
return $benefit->where([
'corporate_benefits.active' => 1,
@@ -69,13 +75,14 @@ class CorporateMemberController extends Controller
public function activation(Request $request, $member_id)
{
$request->validate([
'active' => 'required'
'active' => 'required',
'reason' => 'required',
]);
// abort(404);
$member = Member::findOrFail($member_id);
$member->active = $request->active == '1';
$member->active = $request->active;
$member->reason = $request->reason;
if ($member->save()) {

View File

@@ -25,6 +25,31 @@ class CorporatePlanController extends Controller
return $benefits;
}
public function filter(Request $request, $corporate_id){
$benefits = CorporatePlan::query()
->filter($request->all())
->where('corporate_id', $corporate_id);
// ->where('type', $request->type)
// ->where('code', $request->code);
if ($request->has('service_code') && is_array($request->service_code) && count($request->service_code) > 0) {
$benefits->whereIn('service_code', $request->service_code);
}
if ($request->has('type') && is_array($request->type) && count($request->type) > 0) {
$benefits->whereIn('type', $request->type);
}
if ($request->has('code') && is_array($request->code) && count($request->code) > 0) {
$benefits->whereIn('code', $request->code);
}
$benefits = $benefits->paginate(0)->appends($request->all());
return $benefits;
}
public function activation(Request $request, $plan_id)
{
$request->validate([
@@ -34,7 +59,7 @@ class CorporatePlanController extends Controller
// abort(404);
$plan = CorporatePlan::findOrFail($plan_id);
$plan->active = $request->active == '1';
$plan->active = $request->active == 1 ? 0 : 1;
$plan->reason = $request->reason;
if ($plan->save()) {
@@ -110,21 +135,21 @@ class CorporatePlanController extends Controller
public function update(Request $request, $corporate_id, $id)
{
$corporatePlan = CorporatePlan::findOrFail($id);
$request->validate([
'code' => [
'required',
Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id)
// Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id)
],
'name' => 'required'
]);
$corporatePlan->fill([
'code' => $request->code,
'name' => $request->name,
'active' => $request->active,
'description' => $request->description
'corporate_plan_id' => $request->plan,
'service_code' => $request->service,
'type' => $request->type,
'limit_rules' => $request->limit
])->save();
return $corporatePlan;
}

View File

@@ -144,7 +144,7 @@ class CorporateServiceController extends Controller
// ->with('configs', 'service')
->first();
$corporateService->fill([
'status' => $request->status == 'active' ? 'active' : 'inactive',
'status' => $request->status == 'active' ? 'inactive' : 'active',
'reason' => $request->reason
]);
$corporateService->save();
@@ -154,8 +154,6 @@ class CorporateServiceController extends Controller
public function corporateServiceSpecialityUpdate(Request $request, $corporate_id, $service_code)
{
// return response()->json([$request->checked, $request->value, $request->speciality_id]);
$corporateService = CorporateService::query()
@@ -163,7 +161,6 @@ class CorporateServiceController extends Controller
->where('service_code', $service_code)
->first();
$corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $request->speciality_id,
@@ -193,6 +190,116 @@ class CorporateServiceController extends Controller
return response()->json($selected_specialities);
}
public function corporateServiceSpecialityAllUpdate(Request $request, $corporate_id, $service_code)
{
// return response()->json([$request->checked, $request->value, $request->speciality_id]);
$corporateService = CorporateService::query()
->where('corporate_id', $corporate_id)
->where('service_code', $service_code)
->first();
$specialities = Speciality::get()->toArray();
if ($specialities){
foreach($specialities as $s){
$corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
], [
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
'active' => $request->active
]);
$corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
], [
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
'active' => $request->active
]);
$corporateServiceSpecialityRule = CorporateServiceSpeciality::where('corporate_service_id', $corporateService->id)
->where('speciality_id', $s['id'])
->with('exclusions.rules')
->first();
// Exclusion Rules
if (empty($corporateServiceSpecialityRule)) {
$corporateServiceSpecialityRule = CorporateServiceSpeciality::create([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $s['id'],
'active' => false,
]);
$corporateServiceSpecialityRule->exclusions()->updateOrCreate([
'corporate_id' => $corporate_id,
'service_code' => $service_code,
], [
'corporate_id' => $corporate_id,
'service_code' => $service_code,
'type' => 'speciality',
]);
} else {
$corporateServiceSpecialityRule->exclusions()->updateOrCreate([
'corporate_id' => $corporate_id,
'service_code' => $service_code,
], [
'corporate_id' => $corporate_id,
'service_code' => $service_code,
'type' => 'speciality',
]);
}
$exclusion = $corporateServiceSpecialityRule->exclusions()->where('corporate_id', $corporate_id)->where('service_code', $service_code)->first();
// if($exclusion){
$exclusion_rule = $exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
'name' => 'msc',
], [
'name' => 'msc',
'values' => $request->active ? 'm,s,c' : '',
]);
$exclusion_rule = $exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
'name' => 'gender',
], [
'name' => 'gender',
'values' => $request->active ? 'male,female' : '',
]);
// }
}
}
$exclusion = $corporateServiceSpeciality->exclusions()->updateOrCreate([
'corporate_id' => $corporate_id,
'service_code' => $service_code,
], [
'corporate_id' => $corporate_id,
'service_code' => $service_code,
'type' => 'speciality',
]);
$selected_specialities = CorporateServiceSpeciality::query()
->where('corporate_service_id', $corporateService->id)
->where('active', true)
->with('speciality')
->get()
->pluck('speciality.name', 'speciality.id');
// return response()->json($selected_specialities);
return response()->json([
'selected_specialities' => $selected_specialities,
'service' => CorporateServiceConfigResource::make($corporateService),
]);
}
public function storeExclusion(Request $request, $corporate_id, $service_code)
{
@@ -227,12 +334,10 @@ class CorporateServiceController extends Controller
if ($request->type == 'msc') {
$value_input = $request->value;
$current_msc = $exclusion->rules()->where('name', 'msc')->first()->values ?? null;
if (!empty($current_msc)) {
$values = "";
if ($request->value == 'm' && $request->checked == "1") {
$values = $current_msc . "," . $value_input;
@@ -438,4 +543,6 @@ class CorporateServiceController extends Controller
'service' => CorporateServiceConfigResource::make($corporateService),
]);
}
}

View File

@@ -0,0 +1,216 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\DailyMonitoring;
use App\Models\MedicalPlan;
use DB;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
/**
* Bagaskoro BSD 27-10-2023
*
* Controller untuk daily monitoring
*/
class DailyMonitoringController extends Controller
{
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'
];
}
/**
* Member List
*/
public function GetMemberList()
{
$memberList = DB::table('request_logs')
->leftJoin('members', 'request_logs.member_id', '=', 'members.id')
->leftJoin('member_plans', 'request_logs.member_id', '=', 'member_plans.member_id')
->leftJoin('organizations', 'organizations.id', '=', 'request_logs.organization_id')
->select('members.member_id','members.name','member_plans.start AS startdate','member_plans.end AS enddate', 'request_logs.submission_date as addmision_date', 'organizations.name as provider' )
->where('request_logs.service_code', 'IP')
->where('request_logs.status_final_log', 'approved')
->groupBy('request_logs.member_id')
->orderBy('request_logs.created_at', 'desc')
->get();
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'member_list'=> $memberList,
]
],200);
}
/**
* 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',)
->where('request_logs.service_code', 'IP')
->where('request_logs.status_final_log', 'approved')
->where("request_logs.member_id", "=", $memberDetail->id)
->orderBy("request_logs.created_at", "desc")
->get();
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, $claim_code)
{
// 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', empty($claim_request)==false ? $claim_request->id : '')
->first();
$detail_list = DailyMonitoring::where('claim_id', empty($claim) == false ? $claim->id : '')->orderBy("created_at", "desc")->get()->makeHidden(['updated_at']);
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'detail_list'=> $detail_list,
]
],200);
}
/**
* 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,
'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);
}
}
}

View File

@@ -3,20 +3,40 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Icd;
use App\Services\ImportService;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\IcdService;
class DiagnosisController extends Controller
{
public function __construct(IcdService $icdService)
{
$this->icdService = $icdService;
}
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
public function index(Request $request, $diagnosis_template_id)
{
$diagnosis = Icd::withTrashed()->filter($request->toArray())->paginate();
$diagnosis = Icd::query()
->filter($request->toArray())
->where('icd_template_id', '=', $diagnosis_template_id)
->orderBy('code', 'ASC')
->paginate(15);
return $diagnosis;
}
@@ -87,4 +107,178 @@ class DiagnosisController extends Controller
->orWhere('code', 'LIKE', '%'.$search.'%');
})->limit(10)->get();
}
public function import(Request $request, $id)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
$imported_icd_data = 0;
$failed_icd_data = [];
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
$result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'ICD_Code',
1 => 'Description',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (
empty($row_data['ICD_Code']) &&
empty($row_data['Description'])
) {
continue;
}
// Save the Row
$icdService = new IcdService();
$icdService->handleIcdRow($row_data, $id);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
$imported_icd_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
'total_successed_row' => $imported_icd_data,
'total_failed_row' => count($failed_icd_data),
'failed_row' => $failed_icd_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function activation(Request $request, $diagnosis_id)
{
$request->validate([
'active' => 'required'
]);
$Icd = Icd::findOrFail($diagnosis_id);
$Icd->active = $request->active == '1';
if ($Icd->save()) {
return response()->json([
'icd' => $Icd,
'message' => 'Status Updated Successfully'
]);
}
}
public function generateIcdList(Request $request, $diagnosis_id){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Icd::where('icd_template_id', $diagnosis_id)->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/TemplateICDList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->icdService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
// $item['rev'], // Rev
// $item['version'], // Version
$item['code'], // Code
// $item['parent_code'], // Parent Code
$item['name'], // Name
// $item['description'], // Description
// $item['active'] == 1 ? 'Active' : 'Inactive', // Status
// $item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/TemplateICDList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
"file_url" => url('files/TemplateICDList.xlsx')
]);
}
}

View File

@@ -7,6 +7,7 @@ use App\Helpers\Helper;
use App\Models\Corporate;
use App\Models\CorporateService;
use App\Models\Exclusion;
use App\Models\ExclusionImport;
use App\Models\Icd;
use App\Models\ImportLog;
use App\Services\ImportService;
@@ -17,6 +18,8 @@ use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\ExclusionService;
use Modules\Internal\Transformers\DiagnosisExclusionResource;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class DiagnosisExclusionController extends Controller
{
@@ -37,6 +40,22 @@ class DiagnosisExclusionController extends Controller
return Helper::paginateResources(DiagnosisExclusionResource::collection($exclusions));
}
public function listDiagnosis(Request $request, $corporate_id){
$exclusion = Exclusion::query()
->where('corporate_id', $corporate_id)
->where('type', 'diagnosis')
->where('deleted_at', null)
// ->with(['rules'])
->get('exclusionable_id')->toArray();
$icd = Icd::query()
->whereNotIn('id', $exclusion)
->limit(100)
->get()
->toArray();
return Helper::responseJson($icd);
}
/**
* Show the form for creating a new resource.
* @return Renderable
@@ -216,7 +235,13 @@ class DiagnosisExclusionController extends Controller
$import->reader->close();
Storage::delete('temp/' . $file_name);
$import->writer->close();
ExclusionImport::updateOrCreate([
'corporate_id' => $corporate_id
],[
'file_name' => $file_name,
'file_path' => 'temp/result-' . $file_name,
]);
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
@@ -268,6 +293,7 @@ class DiagnosisExclusionController extends Controller
$gender = implode(",", $gender);
$gender = trim($gender, ",");
$exclusion->rules()->corporate_id = $corporate_id;
$exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
@@ -293,7 +319,6 @@ class DiagnosisExclusionController extends Controller
'values' => $data['min_age'] ?? '',
]);
$exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
'name' => 'max_age',
@@ -320,4 +345,85 @@ class DiagnosisExclusionController extends Controller
// return $exclusions;
return Helper::paginateResources(DiagnosisExclusionResource::collection($exclusions));
}
/**
* Bagaskoro BSD 20-10-2023
*
* Fungsi untuk get detil exclusion
*/
public function detilExclusion(Request $request, $corporate_id, $id_exclusion)
{
$corporate = Corporate::query()
->with(['currentPolicy', 'plans'])
->withCount('corporatePlans')
->withCount('employees')
->findOrFail($corporate_id);
$plans = $corporate['plans']->map(function ($plan) {
return $plan['code'];
});
$exclusions = Exclusion::query()
->where('id', $id_exclusion)
->where('type', 'diagnosis')
->where('deleted_at', null)
->with(['rules'])
->get();
$exclusion = DiagnosisExclusionResource::collection($exclusions);
return response()->json([
'error' => false,
'messages' => "success",
'data' => [
'exclusion' => empty($exclusion) ? [] : $exclusion[0],
'plans' => $plans,
]
],200);
}
/**
* Bagaskoro BSD 19-10-2023
*
* Fungsi untuk update status active
*/
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',
'digits_between'=> ':attribute maximal :max digit minimal :min digit'
];
}
public function updateActivation(Request $request)
{
// validation rule
$validator = Validator::make($request->all(),[
'id' => 'required|exists:exclusions',
'active' => 'required|in:0,1',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'messages' => $validator->getMessageBag()
],400);
}
Exclusion::where('id', $request->id)->update([
'active' => $request->active == 1 ? 0 : 1,
'reason' => $request->reason
]);
return response()->json([
'error' => false,
'messages' => "status berhasil diupdate",
'data' => []
],200);
}
}

View File

@@ -0,0 +1,314 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Icd;
use App\Models\IcdTemplate;
use App\Services\ImportService;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\IcdService;
class DiagnosisTemplateController extends Controller
{
public function index(Request $request)
{
if ($request->search){
return IcdTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('code', 'LIKE', '%'.$search.'%');
})->paginate(15);
} else {
$diagnosisTemplate = IcdTemplate::query()
// ->filter($request->toArray())
->orderBy('code', 'ASC')
->paginate(15);
return $diagnosisTemplate;
}
}
/**
* 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)
{
$request->validate([
'name' => 'required'
]);
$newDiagnosisTemplate = IcdTemplate::create($request->all());
return $newDiagnosisTemplate;
}
/**
* 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)
{
$IcdTemplate = IcdTemplate::findOrFail($id);
return $IcdTemplate;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$IcdTemplate = IcdTemplate::findOrFail($id);
$request->validate([
'name' => 'required'
]);
$IcdTemplate->fill([
// 'code' => $request->code,
'name' => $request->name,
'description' => $request->description,
'active' => $request->active,
])->save();
return $IcdTemplate;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function search(Request $request)
{
return IcdTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('code', 'LIKE', '%'.$search.'%');
})->limit(10)->get();
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
$imported_icd_data = 0;
$failed_icd_data = [];
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
$result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'code',
1 => 'parent_code',
2 => 'reff_exc',
3 => 'description_en',
4 => 'description_id',
5 => 'keywords',
6 => 'version',
7 => 'active',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (
empty($row_data['code']) &&
empty($row_data['parent_code']) &&
empty($row_data['reff_exc']) &&
empty($row_data['description_en']) &&
empty($row_data['description_id']) &&
empty($row_data['keywords']) &&
empty($row_data['version']) &&
empty($row_data['active'])
) {
continue;
}
// Save the Row
$icdService = new IcdService();
$icdService->handleIcdRow($row_data);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
$imported_icd_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
'total_successed_row' => $imported_icd_data,
'total_failed_row' => count($failed_icd_data),
'failed_row' => $failed_icd_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function activation(Request $request, $id)
{
$request->validate([
'active' => 'required'
]);
$Icd = IcdTemplate::findOrFail($id);
$Icd->active = $request->active == '1';
if ($Icd->save()) {
return response()->json([
'icd' => $Icd,
'message' => 'Status Updated Successfully'
]);
}
}
public function generateIcdList(Request $request){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Icd::get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->icdService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['rev'], // Rev
$item['version'], // Version
$item['code'], // Code
$item['parent_code'], // Parent Code
$item['name'], // Name
$item['description'], // Description
$item['active'] == 1 ? 'Active' : 'Inactive', // Status
$item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
}

View File

@@ -19,6 +19,7 @@ class DivisionController extends Controller
$benefits = CorporateDivision::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
@@ -52,6 +53,7 @@ class DivisionController extends Controller
'corporate_id' => $corporate_id,
'code' => $request->code,
'name' => $request->name,
'description' => $request->description ? $request->description : null,
]);
return $newCorporatePlan;
@@ -91,8 +93,6 @@ class DivisionController extends Controller
$request->validate([
'code' => [
'required',
// Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporatePlan->id)
// Rule::unique('corporate_divisions')->where('corporate_id', $corporate_id)
],
'name' => 'required'
]);
@@ -100,7 +100,7 @@ class DivisionController extends Controller
$corporatePlan->fill([
'code' => $request->code,
'name' => $request->name,
'active' => $request->active,
'description' => $request->description,
])->save();
return $corporatePlan;

View File

@@ -6,6 +6,8 @@ use App\Models\Drug;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Helpers\Helper;
use Maatwebsite\Excel\Facades\Excel;
class DrugController extends Controller
{
@@ -15,8 +17,11 @@ class DrugController extends Controller
*/
public function index(Request $request)
{
$drugs = Drug::withTrashed()->filter($request->toArray())->paginate();
$drugs = Drug::query()
->filter($request->all())
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
return $drugs;
}
@@ -79,4 +84,110 @@ class DrugController extends Controller
{
//
}
public function activation(Request $request, $drug_id)
{
$request->validate([
'active' => 'required',
'reason' => 'required',
]);
$drug = Drug::findOrFail($drug_id);
$drug->active = $request->active;
$drug->reason = $request->reason;
if ($drug->save()) {
return response()->json([
'hostpital' => $drug,
'message' => 'Status Updated Successfully'
]);
}
}
public function downloadTemplate()
{
return Helper::responseJson([
'file_name' => "Template - Drugs.xlsx",
"file_url" => url('files/Template - Drugs.xlsx')
]);
}
public function import(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$data = Excel::toArray([], $file);
$processedData = $this->processCategoryNames($data);
$importedRows = 0;
$failedRows = [];
foreach ($processedData as $row) {
try {
Drug::create(
[
'name' => $row['name'],
'code' => $row['code'],
'generic_name' => $row['generic_name'],
'description' => $row['description'],
'mims_class' => $row['mims_class'],
'indications' => $row['indications'],
'atc_code' => $row['atc_code'],
'segmentation' => $row['segmentation'],
'type' => $row['type'],
'dosage' => $row['dosage'],
'remark' => $row['remark'],
]
);
$importedRows++;
} catch (\Exception $e) {
$failedRows[] = $row;
}
}
$response = [
'message' => 'File uploaded and data saved to database',
'data' => [
'total_success_row' => $importedRows,
'total_failed_row' => count($failedRows),
'failed_rows' => $failedRows,
],
];
return response()->json($response);
}
return response()->json(['error' => 'No file uploaded.']);
}
private function processCategoryNames($data)
{
$header = [];
$row = [];
for ($i = 1; $i < count($data[0]); $i++) {
$row[] = $data[0][$i];
$header[] = $data[0][0];
}
$filed = [];
foreach ($header[0] as $value)
{
$modelColumn = strtolower(preg_replace('/\s+/', '_', trim($value)));
$modelColumn = str_replace(['*', ' '], '', $modelColumn);
if($modelColumn)
{
$filed[] = $modelColumn;
}
}
$result = [];
foreach ($row as $subarray) {
$trimmedSubarray = [];
for ($i = 0; $i < count($filed); $i++) {
$trimmedSubarray[$filed[$i]] = $subarray[$i] ? $subarray[$i] : null;
}
$result[] = $trimmedSubarray;
}
return $result;
}
}

View File

@@ -3,9 +3,21 @@
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Formularium;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Helpers\Helper;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\FormulariumService;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
class FormulariumController extends Controller
{
@@ -13,10 +25,27 @@ class FormulariumController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
public function __construct(FormulariumService $formulariumService)
{
$formulariums = Formularium::withTrashed()->withCount('items')->filter($request->toArray())->paginate();
$this->formulariumService = $formulariumService;
}
public function index(Request $request, $id)
{
if ($request->search) {
return Formularium::when($request->search ?? null, function ($formularium) use ($request, $id) {
$formularium->where('formularium_template_id', $id)
->where('name', 'LIKE', '%' . $request->search . '%')
->orWhere('code', 'LIKE', '%' . $request->search . '%');
})->paginate(15);
}
else {
$formulariums = Formularium::query()
// ->filter($request->toArray())
->where('formularium_template_id', $id)
->orderBy('name', 'ASC')
->paginate(15);
return $formulariums;
}
return $formulariums;
}
@@ -34,7 +63,7 @@ class FormulariumController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
public function store(Request $request, $id)
{
$request->validate([
'name' => 'required|string|max:255',
@@ -87,7 +116,7 @@ class FormulariumController extends Controller
//
}
public function import(Request $request)
public function import(Request $request, $id)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
@@ -95,7 +124,6 @@ class FormulariumController extends Controller
// dd($request->toArray());
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$corporate = Corporate::findOrFail($corporate_id);
// $importLog = $corporate->importLogs()->create([
// 'type' => 'diagnosis-exclusions',
@@ -107,7 +135,6 @@ class FormulariumController extends Controller
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
@@ -130,16 +157,19 @@ class FormulariumController extends Controller
$row_data = [];
$row_map = [
0 => 'code',
1 => 'description',
2 => 'ip_exclusion',
3 => 'op_exclusion',
4 => 'de_exclusion',
5 => 'ma_exclusion',
6 => 'sp_exclusion',
7 => 'pre_exist_exclusion',
8 => 'op_de_exclusion',
9 => 'keterangan',
10 => 'maternity_waiting'
1 => 'name',
2 => 'description',
3 => 'manufacturer',
4 => 'category_name',
5 => 'kategori_obat',
6 => 'uom',
7 => 'general_indication',
8 => 'composition',
9 => 'atc_code',
10 => 'class',
11 => 'bpom_registration',
12 => 'classifications',
13 => 'cat_for',
];
foreach ($row->getCells() as $header_index => $cell) {
@@ -157,20 +187,27 @@ class FormulariumController extends Controller
if (
// empty($row_data['code']) &&
// empty($row_data['description']) &&
empty($row_data['ip_exclusion']) &&
empty($row_data['op_exclusion']) &&
empty($row_data['de_exclusion']) &&
empty($row_data['ma_exclusion']) &&
empty($row_data['sp_exclusion']) &&
empty($row_data['pre_exis_exclusion']) &&
empty($row_data['op_de_exclusion']) &&
empty($row_data['maternity_waiting'])) {
empty($row_data['code']) &&
empty($row_data['name']) &&
empty($row_data['description']) &&
empty($row_data['manufacturer']) &&
empty($row_data['category_name']) &&
empty($row_data['kategori_obat']) &&
empty($row_data['uom']) &&
empty($row_data['general_indication']) &&
empty($row_data['composition']) &&
empty($row_data['atc_code']) &&
empty($row_data['class']) &&
empty($row_data['bpom_registration']) &&
empty($row_data['classifications']) &&
empty($row_data['cat_for'])
) {
continue;
}
// Save the Row
$exclusionService = new ExclusionService();
$exclusionService->handleDiagnosisExclusionRow($corporate, $row_data);
$formulariumService = new FormulariumService();
$formulariumService->handleFormuariumTemplateRow($row_data, $id);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
@@ -211,4 +248,64 @@ class FormulariumController extends Controller
]
];
}
public function generateFormulariumList(Request $request)
{
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Formularium::get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/TemplateFormulariumList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->formulariumService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['code'], // code
$item['name'], // name
$item['description'], // Description
$item['manufacturer'], // manufacturer
$item['category_name'], // category_name
$item['kategori_obat'], // kategori_obat
$item['uom'], // uom
$item['general_indication'], // Description
$item['composition'], // composition
$item['atc_code'], // atc_code
$item['class'], // class
$item['bpom_registration'], // bpom_registration
$item['classifications'], // classifications
$item['cat_for'], // cat_for
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/TemplateFormulariumList.xlsx');
return Helper::responseJson([
'file_name' => "Formularium List " . date('Y-m-d h:i:s'),
"file_url" => url('files/TemplateFormulariumList.xlsx')
]);
}
}

View File

@@ -0,0 +1,316 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Formularium;
use App\Models\FormulariumTemplate;
use App\Services\ImportService;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Services\IcdService;
class FormulariumTemplateController extends Controller
{
public function index(Request $request)
{
if ($request->search){
return FormulariumTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('description', 'LIKE', '%'.$search.'%');
})->paginate(15);
} else {
$diagnosisTemplate = FormulariumTemplate::query()
// ->filter($request->toArray())
->orderBy('name', 'ASC')
->paginate(15);
return $diagnosisTemplate;
}
}
/**
* 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)
{
$request->validate([
'name' => 'required'
]);
$newDiagnosisTemplate = FormulariumTemplate::create($request->all());
return $newDiagnosisTemplate;
}
/**
* 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)
{
$FormulariumTemplate = FormulariumTemplate::findOrFail($id);
return $FormulariumTemplate;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
$FormulariumTemplate = FormulariumTemplate::findOrFail($id);
$request->validate([
'name' => 'required'
]);
$FormulariumTemplate->fill([
// 'code' => $request->code,
'name' => $request->name,
'description' => $request->description,
'active' => $request->active,
])->save();
return $FormulariumTemplate;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function search(Request $request)
{
return FormulariumTemplate::when($request->search ?? null, function($icd, $search) {
$icd->where('name', 'LIKE', '%'.$search.'%')
->orWhere('code', 'LIKE', '%'.$search.'%');
})->limit(10)->get();
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3).'-'.$request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$import = new ImportService();
$import->read(Storage::path('temp/'.$file_name));
$import->write(Storage::disk('public')->path('temp/result-'.$file_name), 'xsls');
$imported_icd_data = 0;
$failed_icd_data = [];
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace( "/\r|\n/", " ", $title );
$title = preg_replace('/\xc2\xa0/', " ", $title );
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// Write Header to File
$result_headers = array_merge($doc_headers_indexes, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
$row_map = [
0 => 'code',
1 => 'parent_code',
2 => 'reff_exc',
3 => 'description_en',
4 => 'description_id',
5 => 'keywords',
6 => 'version',
7 => 'active',
];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($row_map[$header_index])) {
$value = $cell->getValue();
$value = preg_replace( "/\r|\n/", " ", $value );
$value = preg_replace('/\xc2\xa0/', " ", $value );
$value = rtrim($value);
$value = ltrim($value);
$row_data[$row_map[$header_index]] = $cell->getValue();
}
}
try { // Process the Row Data
if (
empty($row_data['code']) &&
empty($row_data['parent_code']) &&
empty($row_data['reff_exc']) &&
empty($row_data['description_en']) &&
empty($row_data['description_id']) &&
empty($row_data['keywords']) &&
empty($row_data['version']) &&
empty($row_data['active'])
) {
continue;
}
// Save the Row
$icdService = new IcdService();
$icdService->handleIcdRow($row_data);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $sheet->getName());
$imported_icd_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
} catch (\Exception $e) {
throw new \Exception($e);
// Write Server Error to File
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
]), $sheet->getName());
$failed_icd_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $row_data];
}
}
}
break; // Only Read First Row
}
$import->reader->close();
Storage::delete('temp/'.$file_name);
$import->writer->close();
return [
'total_successed_row' => $imported_icd_data,
'total_failed_row' => count($failed_icd_data),
'failed_row' => $failed_icd_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-'.$file_name),
'name' => 'result-'.$file_name,
]
];
}
public function activation(Request $request, $id)
{
$request->validate([
'active' => 'required'
]);
$formulariumTemplate = FormulariumTemplate::find($id);
$formulariumTemplate->active = $request->active == 1 ? 0 : 1;
if ($formulariumTemplate->save()) {
return response()->json([
'data' => $formulariumTemplate,
'message' => 'Status Updated Successfully'
]);
}
}
public function generateIcdList(Request $request){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Icd::get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->build();
// Menulis header kolom
$headers_map_to_table_fields = $this->icdService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields, $style);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['rev'], // Rev
$item['version'], // Version
$item['code'], // Code
$item['parent_code'], // Parent Code
$item['name'], // Name
$item['description'], // Description
$item['active'] == 1 ? 'Active' : 'Inactive', // Status
$item['type'], // Type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
return Helper::responseJson([
'file_name' => "Diagnosis ICD List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
}

View File

@@ -0,0 +1,266 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\CorporateHospital;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\DB;
use App\Helpers\Helper;
use Maatwebsite\Excel\Facades\Excel;
class HospitalController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $corporate_id)
{
$datas = CorporateHospital::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
return $datas;
}
public function activation(Request $request, $hospital_id)
{
$request->validate([
'active' => 'required',
'reason' => 'required',
]);
// abort(404);
$hostpital = CorporateHospital::findOrFail($hospital_id);
$hostpital->active = $request->active;
$hostpital->reason = $request->reason;
if ($hostpital->save()) {
return response()->json([
'hostpital' => $hostpital,
'message' => 'Status Updated Successfully'
]);
}
}
public function dataHospital(Request $request, $corporate_id)
{
$data = DB::table('organizations')
->where('type', 'hospital')
->where('status', 'active')
->orderBy('id', 'desc')
->get();
return $data;
}
/**
* 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, $corporate_id)
{
$request->validate([
'corporate_id' => 'required',
'code' => 'required',
'name' => 'required',
'organization_id' => 'required',
]);
$newCorporateHospital = CorporateHospital::create([
'corporate_id' => $corporate_id,
'code' => $request->code,
'name' => $request->name,
'organization_id' => $request->organization_id,
'description' => $request->description ? $request->description : null,
]);
return $newCorporateHospital;
}
/**
* 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($corporate_id, $id)
{
$corporatePlan = CorporateDivision::findOrFail($id);
return $corporatePlan;
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $corporate_id, $id)
{
$corporatePlan = CorporateHospital::findOrFail($id);
$request->validate([
'corporate_id' => 'required',
'code' => 'required',
'name' => 'required',
'organization_id' => 'required',
]);
$corporatePlan->fill([
'corporate_id' => $corporate_id,
'code' => $request->code,
'name' => $request->name,
'organization_id' => $request->organization_id,
'description' => $request->description ? $request->description : null,
])->save();
return $corporatePlan;
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
public function downloadTemplate()
{
return Helper::responseJson([
'file_name' => "Template - Hospitals.xlsx",
"file_url" => url('files/Template - Hospitals.xlsx')
]);
}
public function import(Request $request, $corporate_id)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$data = Excel::toArray([], $file);
$processedData = $this->processCategoryNames($data);
$importedRows = 0;
$failedRows = [];
foreach ($processedData as $row) {
$q_check = DB::table('corporate_hospitals')
->where('code', '=', $row['code'])
->select('code')
->first();
$q = DB::table('organizations')
->where('code', '=', $row['code'])
->where('type', '=', 'hospital')
->where('status', '=', 'active')
->select('id', 'code', 'name')
->first();
try {
if($q_check)
{
DB::table('corporate_hospitals')
->where('code','=', $q_check->code)
->update(
[
'corporate_id' => $corporate_id,
'code' => $q->code,
'name' => $q->name,
'organization_id' => $q->id,
'description' => $request->description ? $request->description : null,
'updated_by' =>auth()->user()->id,
'updated_at' => date('Y-m-d H:i:s'),
]
);
}
else
{
CorporateHospital::create(
[
'corporate_id' => $corporate_id,
'code' => $q->code,
'name' => $q->name,
'organization_id' => $q->id,
'description' => $request->description ? $request->description : null,
]
);
}
$importedRows++;
} catch (\Exception $e) {
$failedRows[] = $row;
}
}
$response = [
'message' => 'File uploaded and data saved to database',
'data' => [
'total_success_row' => $importedRows,
'total_failed_row' => count($failedRows),
'failed_rows' => $failedRows,
],
];
return response()->json($response);
}
return response()->json(['error' => 'No file uploaded.']);
}
private function processCategoryNames($data)
{
$header = [];
$row = [];
for ($i = 1; $i < count($data[0]); $i++) {
$row[] = $data[0][$i];
$header[] = $data[0][0];
}
$filed = [];
foreach ($header[0] as $value)
{
$modelColumn = strtolower(preg_replace('/\s+/', '_', trim($value)));
$modelColumn = str_replace(['*', ' '], '', $modelColumn);
if($modelColumn)
{
$filed[] = $modelColumn;
}
}
$result = [];
foreach ($row as $subarray) {
$trimmedSubarray = [];
for ($i = 0; $i < count($filed); $i++) {
$trimmedSubarray[$filed[$i]] = $subarray[$i] ? $subarray[$i] : null;
}
$result[] = $trimmedSubarray;
}
return $result;
}
}

View File

@@ -0,0 +1,148 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\File;
use App\Models\LaboratoriumResult;
use App\Models\MedicalPlan;
use DB;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
/**
* Bagaskoro BSD 28-10-2023
*
* Controller untuk laboratorium result
*/
class LaboratoriumResultController 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'
];
}
/**
* Detail Lab Result List - by claim_code
*/
public function GetDetailLabResultList(Request $request, $claim_code)
{
// 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', empty($claim_request)==false ? $claim_request->id : '')
->first();
$detail_list = LaboratoriumResult::where('claim_id', empty($claim) == false ? $claim->id : '')->orderBy("created_at", "desc")->get()->makeHidden(['updated_at']);
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'lab_result_list'=> $detail_list,
]
],200);
}
/**
* Add Detail Lab Result List
*/
public function AddDetailLabResultList(Request $request, $claim_code)
{
$request->merge(['claim_code' => $claim_code]);
// validation rule
$validator = Validator::make($request->all(),[
'claim_code' => 'required|exists:claim_requests,code',
'date' => 'required',
'location' => 'required',
'examination' => 'required',
'lab_result_file' => '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 lab result
$db_response = LaboratoriumResult::create([
'claim_id' => $claim->id,
'date' => $request->date,
'location' => $request->location,
'examination' => $request->examination,
]);
// insert file result
foreach ($request->lab_result_file as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'laboratorium-result',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => '',
]);
$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);
}
}
}

View File

@@ -0,0 +1,141 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\RequestLogBenefit;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
class RequestLogBenefitController extends Controller
{
public function index(Request $request)
{
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
$customMessages = [
'required' => 'Kolom :attribute wajib diisi.',
'numeric' => 'Kolom :attribute harus berupa angka.',
];
$validator = Validator::make($request->all(), [
'benefit_data' => 'required|array',
'benefit_data.*' => 'required',
], $customMessages);
if ($validator->fails()) {
return Helper::responseJson([],'error', 400, $validator->errors());
} else {
$benefitData = $request->benefit_data;
if (count($benefitData)>0){
// BeginTransaction
DB::beginTransaction();
foreach($benefitData as $key => $value){
$data = [
'request_log_id' => $value['request_log_id'],
'benefit_id' => $value['benefit_id'],
'amount_incurred' => $value['amount_incurred'],
'amount_approved' => $value['amount_approved'],
'amount_not_approved' => $value['amount_not_approved'],
'excess_paid' => $value['excess_paid'],
'keterangan' => $value['keterangan'],
];
// Insert Data
try {
RequestLogBenefit::create($data);
} catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
DB::commit();
return Helper::responseJson(status: 'success', statusCode: 201, message: 'success', data: $request->toArray());
};
}
$requestLogBenefit = RequestLogBenefit::insert($data);
return $requestLogBenefit;
}
/**
* 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)
{
$requestLogBenefit = requestLogBenefit::findOrFail($id);
$requestLogBenefit->amount_approved = $request->amount_approved;
$requestLogBenefit->amount_incurred = $request->amount_incurred;
$requestLogBenefit->amount_not_approved = $request->amount_not_approved;
$requestLogBenefit->excess_paid = $request->excess_paid;
$requestLogBenefit->keterangan = $request->keterangan;
$requestLogBenefit->save();
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLogBenefit],
200);
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
$requestLogBenefit = RequestLogBenefit::findOrFail($id);
$requestLogBenefit->delete();
}
}

View File

@@ -0,0 +1,791 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\RequestLog;
use App\Models\Organization;
use App\Services\ClaimService;
use App\Services\ImportService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Internal\Transformers\RequestLogResource;
use Modules\Internal\Transformers\RequestLogShowResource;
use Illuminate\Support\Facades\Storage;
use App\Services\RequestLogService;
use App\Exceptions\ImportRowException;
use App\Events\RequestLoged;
use Maatwebsite\Excel\Facades\Excel;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Exception;
use PDF;
use App\Models\File;
use App\Models\FilesMcu;
use Illuminate\Support\Facades\DB;
use App\Models\Member;
class RequestLogController extends Controller
{
private static $code_prefix = 'LOG';
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
$requestLog = RequestLog::query()
->when($request->search, function ($q, $search) {
$q->where('code', 'LIKE', "%".$search."%");
$q->orWhereHas('member', function ($subQuery) use ($search) {
$subQuery->where('name', 'LIKE', "%".$search."");
});
})
->when($request->orderBy, function ($q, $orderBy) use ($request) {
if (in_array($orderBy, ['submission_date', 'code'])) {
$q->orderBy($orderBy, $request->order);
}
})
->when(empty($request->orderBy), function ($q) {
$q->orderBy('created_at', 'desc');
})
->when($request->final_log, function($q, $final_log) {
$q->where('final_log', $final_log);
})
->when($request->service_code, function($q, $service_code) {
$q->where('service_code', $service_code);
})
// ->where('status', $request->status)
->with(['member', 'files', 'service', 'member.currentPolicy'])
->paginate();
return Helper::paginateResources(RequestLogResource::collection($requestLog));
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Create New Request Request
*
* Tb, BSD 28 November 2023
*/
public function createNew(Request $request)
{
$request->validate([
'member_id' => 'required',
'service_code' => 'required',
]);
if ($request->member_id){
$code = $this->getNextCode($request);
$member = Member::find($request->member_id);
$memberValid = false;
if ($member){
if (($member->members_effective_date <= date('Y-m-d')) &&
($member->members_expire_date >= date('Y-m-d')) &&
($member->active == 1) &&
($member->suspended == 'N')
){
DB::beginTransaction();
try {
$newRequestLog = RequestLogService::storeRequestLog(
row: [],
code: $code,
member: $member,
paymentType: 'cashless',
serviceCode: $request->service_code,
submissionDate: null,
status: 'approved',
organization_id: $request->organization_id,
source: $request->source
);
DB::commit();
}
catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
} else {
DB::beginTransaction();
try {
$newRequestLog = RequestLogService::storeRequestLog(
row: [],
code: $code,
member: $member,
paymentType: 'cashless',
serviceCode: $request->service_code,
submissionDate: null,
status: 'requested',
organization_id: $request->organization_id,
source: $request->source
);
DB::commit();
}
catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
// return Helper::responseJson(status: 'failed', statusCode: 500, message: 'Member Not Valid');
}
}
}
return Helper::responseJson(status: 'success', statusCode: 200, message: 'Request LOG berhasil ajukan!', data: $request->toArray());
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
$claimRequest = RequestLog::findOrFail($id);
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
},
'files',
'member',
'member.currentPlan' => function($memberPlan) {
$memberPlan->join('request_logs', 'request_logs.service_code', '=', 'plans.service_code');
},
'claim',
'organization',
]);
return Helper::responseJson(data: RequestLogShowResource::make($claimRequest));
}
/**
* 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)
{
$requestLog = RequestLog::findOrFail($id);
$requestLog->status = $request->status;
$requestLog->save();
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLog],
200);
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
/**
* Generate Request LOG PDF
*/
public function generateRequestLog($id)
{
$requestLog = RequestLog::find($id);
$service_code = $requestLog->service_code;
if ($requestLog->status != 'approved') {
return response()->json([
'error' => true,
'message' => 'LOG Belum Terverifikasi',
'data' => $requestLog],
200);
}
$member = Member::findOrFail($requestLog->member_id)
->load([
// 'currentPlan',
'currentPlan' => function ($plan) use ($id, $service_code) {
$plan->where('plans.service_code', $service_code);
},
'currentPolicy',
'currentPlan.corporateBenefits',
'currentPlan.corporateBenefits.benefit'
]);
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'requestLog'));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
return $requestLog;
}
/**
* Generate Export Excel Request LOG
*/
public function generateDataRequestLogExcel(){
$file_name = 'Data Request LOG';
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/Data Request LOG.xlsx'));
// Sheet 1
$writer->getCurrentSheet()->setName('Data');
$headers_map_to_table_fields = RequestLog::$listing_data_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataRequestLog = RequestLog::query()
// ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
// $corporatePlan->where('corporate_id', $corporate_id);
// })
->with('member')
->orderBy('id', 'desc')
->get()->toArray();
// dd($dataRequestLog);
foreach ($dataRequestLog as $index => $row){
$serviceType = $this->getServiceName($row['service_code']);
$rowData = [
$row['id'], // id
$row['code'], // code
$row['member']['name'], // name
$row['submission_date'], // submission date
$serviceType, // service type
$row['payment_type_name'], // service type
$row['status'], // service type
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
$writer->close();
return Helper::responseJson([
'file_name' => "Data Request Log " . date('Y-m-d h:i:s'),
"file_url" => url('files/Data Request LOG.xlsx')
]);
}
/**
* Submit Request LOG to Final LOG
*/
public function updateFinalLog(Request $request)
{
$id = $request->id;
$requestLog = RequestLog::findOrFail($id);
$status = $request->status ?? 'requested';
// Update Request LOG untuk lanjut ke Final LOG
$requestLog->final_log = 1;
$requestLog->status_final_log = $status;
$requestLog->save();
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('final-log-result', $id, $file);
$requestLog->files()->updateOrCreate([
'type' => 'final-log-result',
'name' => File::getFileName('final-log-result', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('final-log-diagnosis', $id, $file);
$requestLog->files()->updateOrCreate([
'type' => 'final-log-diagnosis',
'name' => File::getFileName('final-log-diagnosis', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('kondisi_files')) {
foreach ($request->kondisi_files as $file) {
$pathFile = File::storeFile('final-log-kondisi', $id, $file);
$requestLog->files()->updateOrCreate([
'type' => 'final-log-kondisi',
'name' => File::getFileName('final-log-kondisi', $id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLog],
200);
}
public function updateStatus($id)
{
$requestLog = RequestLog::findOrFail($id);
$member = $requestLog->member;
try {
// Update Request LOG Status & Link with Claim
$requestLog->status = 'approved';
$requestLog->save();
// Store Generated Documents LOG
$logContent = view('pdf.guaranted_leter', compact('member', 'requestLog'));
$requestLog->generatedDocuments()->create([
'type' => 'guarantee_letter',
'title' => 'Guarantee Letter for '. $member->full_name,
'document_type' => 'type',
'html_content' => $logContent,
'system_origin' => 'primecenter'
]);
} catch (\Exception $e) {
return $e->getMessage();
}
return $claimRequest;
}
public function filesMcu(Request $request)
{
$request->validate([
'id' => 'required',
'memberid' => 'required'
]);
if ($request->hasFile('result_files')) {
$pathFile = File::storeFile('claim-result', $request->id, $request->result_files);
$data = [
'memberid' => $request->id,
'original_name' => $request->result_files->getClientOriginalName(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id
];
FilesMcu::create($data);
return Helper::responseJson(data: $request->toArray(), message: 'Berhasil tambah file MemberID '.$request->memberid.', silahkan lihat dilaporan');
}
else
{
return Helper::responseJson(data: $request->toArray(), message: 'Tidak ada file member yang ditambahkan');
}
}
public function importRequestLog(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$fileWrite = Storage::disk('public')->path('temp/result-' . $file_name);
$fileRead = Storage::path('temp/' . $file_name);
$import = new ImportService();
$import->read($fileRead);
$import->write($fileWrite, 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
if ($sheetIndex == 1) { // Rename First Sheet to Writer
$firstWriterSheet = $import->writer->getCurrentSheet();
$firstWriterSheet->setName($sheet->getName());
} else { // Add New Sheet to Writer
$nextWriterSheet = $import->writer->addNewSheetAndMakeItCurrent();
$nextWriterSheet->setName($sheet->getName());
}
$headers_map_to_table_fields = RequestLog::$doc_headers_to_field_map;
// Write Header to File
$result_headers = array_keys($headers_map_to_table_fields);
$result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
$title = $cell->getValue();
$title = preg_replace("/\r|\n/", " ", $title);
$title = preg_replace('/\xc2\xa0/', " ", $title);
$title = rtrim($title);
$title = ltrim($title);
$doc_headers_indexes[$index] = $title;
}
// TODO Validate if First Row not Header
} else { // Next Row Should be Data
$row_data = [];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]]))
$row_data[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
}
try { // Process the Row Data
$requestLog = new RequestLogService();
$requestLog->handleRequestLogRow($row_data);
$result_headers = array_merge($row_data, ['Ingest Code' =>200, 'Ingest Note' => 'Success']);
$import->addArrayToRow($result_headers, $sheet->getName());
} catch (ImportRowException $e) {
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => $e->getCode(),
'Ingest Note' => $e->getMessage(),
]), $sheet->getName());
}
}
}
}
$import->reader->close();
Storage::delete('temp/' . $file_name);
$import->writer->close();
return [
// 'total_successed_row' => $imported_plan_data,
// 'total_failed_row' => count($failed_plan_data),
// 'failed_row' => $failed_plan_data,
'result_file' => [
'url' => Storage::disk('public')->url('temp/result-' . $file_name),
'name' => 'result-' . $file_name,
]
];
}
public function claimRequestDetail($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',
'claim_requests.code',
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;
$documents = DB::table('files')
->where('fileable_type', 'App\Models\RequestLog')
->where('fileable_id', $claimRequestId)
->select('original_name', \DB::raw("CONCAT('" . env('APP_URL') . "/storage/', path) as path"), 'type')
->orderBy('id', 'desc')
->get();
$results['documents'] = $documents;
$dialog_submits = DB::table('claim_requests')
->leftJoin('members', 'claim_requests.member_id','=', 'members.id')
->where('claim_requests.id', $claimRequestId)
->select('claim_requests.code', 'members.name', 'claim_requests.submission_date', 'claim_requests.service_code','claim_requests.status')
->first();
$results['dialog_submits'] = $dialog_submits;
return Helper::responseJson($results);
}
public function invoiceFiles(Request $request, $claim_id)
{
if ($request->hasFile('invoice_files')) {
foreach ($request->invoice_files as $file) {
$pathFile = File::storeFile('claim-invoice', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-invoice',
'name' => File::getFileName('claim-invoice', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if($request->date)
{
DB::table('claim_requests')
->where('id', $claim_id)
->update(['invoice_date' => $request->date]);
}
return Helper::responseJson(data: $request->toArray(), message: 'Invoice Success Uploaded');
}
/**
* Get Claim Member - Infinite Scroll
*
* Bagaskoro, BSD 31 Oktober 2023
*/
public function getClaimMemberInfiniteScroll(Request $request)
{
$offset = 0;
$limit = 10;
$page = $request->get('page');
$keyword = $request->get('keyword');
if ($page > 1) {
$offset = ($page*$limit)-$limit;
}
$memberList = DB::table('members')
->select('id','member_id','name')
->where("name", "like", "%$keyword%")
->orWhere("member_id", "like", "%$keyword%")
->orderBy('created_at', 'asc')
->offset($offset)
->limit($limit)
->get();
$data = [];
if(count($memberList)>0){
$temp = [];
foreach($memberList as $d){
$serviceType = $this->getServiceMember($d->id);
$temp['id'] = $d->id;
$temp['member_id'] = $d->member_id;
$temp['name'] = $d->name;
$temp['service_type'] = $serviceType;
array_push($data, $temp);
}
}
return response()->json([
'error' => false,
'message' => "success",
'data' => [
'member_list'=> $data,
]
],200);
}
public function getServiceMember($id){
$service = DB::table('member_plans')
->select('plans.service_code as code', 'services.name')
->join('plans', 'member_plans.plan_id', '=', 'plans.id')
->join('services', 'plans.service_code', '=', 'services.code')
->where('member_id', $id)
->get()
->toArray();
return $service;
}
public function getServiceName($code){
$service = DB::table('services')
->select('name')
->where('code', $code)
->get()
->first();
return $service->name;
}
public static function getNextCode(Request $request)
{
// $last_number = RequestLog::max('code');
// $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[2] + 1);
// return self::makeCode($next_number);
$source = $request->source == 'client-portal' ? 'C' : 'H';
$organization = Organization::where(['id' => $request->organization_id, 'type' => 'hospital'])->first('code');
$provideCode = $organization ? $organization->code : '';
$member = Member::with('currentCorporate')->where(['id' => $request->member_id])->first();
$data = [
'source' => $source,
'provideCode' => $provideCode,
'date' => date('ymd'),
'policy' => $member->currentPolicy->code,
'member_code' => $member->member_id,
];
$last_numeric_code = RequestLog::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, $data);
}
public static function makeCode($next_number, $data)
{
$sparator = '.';
// Pastikan $next_number adalah integer positif
$next_number = max(1, (int) $next_number);
// Menghasilkan kode dengan format yang diinginkan
return self::$code_prefix . $sparator. $data['source'] . $sparator. $data['provideCode'] . $sparator. $data['date'] . $sparator . $data['policy'] . $sparator. $data['member_code'] . $sparator. str_pad($next_number, 3, '0', STR_PAD_LEFT);
}
public function requestFiles(Request $request, $claim_id)
{
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$pathFile = File::storeFile('claim-diagnosis', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $claim_id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('fileKondisis')) {
foreach ($request->fileKondisis as $file) {
$pathFile = File::storeFile('claim-kondisi', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $claim_id, $file),
'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) {
$pathFile = File::storeFile('claim-result', $claim_id, $file);
File::updateOrCreate([
'fileable_type'=>'App\Models\RequestLog',
'fileable_id' => $claim_id,
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $claim_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: 'Invoice Success Uploaded');
}
}

View File

@@ -0,0 +1,136 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\RequestLogMedicine;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
class RequestLogMedicineController extends Controller
{
public function index(Request $request)
{
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
return view('internal::create');
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show($id)
{
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function store(Request $request)
{
$customMessages = [
'required' => 'Kolom :attribute wajib diisi.',
'numeric' => 'Kolom :attribute harus berupa angka.',
];
$validator = Validator::make($request->all(), [
'medicine' => 'required|array',
'medicine.*' => 'required',
], $customMessages);
if ($validator->fails()) {
return Helper::responseJson([],'error', 400, $validator->errors());
} else {
$medicine = $request->medicine;
if (count($medicine)>0){
// BeginTransaction
DB::beginTransaction();
foreach($medicine as $key => $value){
$data = [
'request_log_id' => $value['request_log_id'],
'medicine' => $value['medicine_name'],
'price' => $value['medicine_price'],
];
// Insert Data
try {
RequestLogMedicine::create($data);
} catch (\Throwable $th) {
DB::rollBack();
return Helper::responseJson(status: 'failed', statusCode: 500, message: $th->getMessage());
}
}
DB::commit();
return Helper::responseJson(status: 'success', statusCode: 201, message: 'success', data: $request->toArray());
};
}
$requestLogMedicine = RequestLogMedicine::insert($data);
return $requestLogMedicine;
}
/**
* 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)
{
$requestLogBenefit = requestLogBenefit::findOrFail($id);
$requestLogBenefit->amount_approved = $request->amount_approved;
$requestLogBenefit->amount_incurred = $request->amount_incurred;
$requestLogBenefit->amount_not_approved = $request->amount_not_approved;
$requestLogBenefit->excess_paid = $request->excess_paid;
$requestLogBenefit->keterangan = $request->keterangan;
$requestLogBenefit->save();
return response()->json([
'error' => false,
'message' => 'Update succses',
'data' => $requestLogBenefit],
200);
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
$RequestLogMedicine = RequestLogMedicine::findOrFail($id);
$RequestLogMedicine->delete();
}
}

View File

@@ -0,0 +1,86 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\Service;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class ServiceController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
$service = Service::orderBy('name', 'ASC')->get();
if (empty($service)) {
return response(['message' => 'Tidak ada data'], 404);
} else {
return response(['message' => 'Data ditemukan', "status" => 200, 'data' => $service]);
}
}
/**
* 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)
{
//
}
}

View File

@@ -8,6 +8,9 @@ use Modules\Internal\Http\Controllers\Api\BenefitController;
use Modules\Internal\Http\Controllers\Api\CityController;
use Modules\Internal\Http\Controllers\Api\ClaimController;
use Modules\Internal\Http\Controllers\Api\ClaimRequestController;
use Modules\Internal\Http\Controllers\Api\RequestLogController;
use Modules\Internal\Http\Controllers\Api\RequestLogBenefitController;
use Modules\Internal\Http\Controllers\Api\RequestLogMedicineController;
use Modules\Internal\Http\Controllers\Api\CorporateBenefitController;
use Modules\Internal\Http\Controllers\Api\CorporateController;
use Modules\Internal\Http\Controllers\Api\CorporateFormulariumController;
@@ -15,13 +18,16 @@ use Modules\Internal\Http\Controllers\Api\CorporateMemberController;
use Modules\Internal\Http\Controllers\Api\CorporatePlanController;
use Modules\Internal\Http\Controllers\Api\CorporateServiceController;
use Modules\Internal\Http\Controllers\Api\DiagnosisController;
use Modules\Internal\Http\Controllers\Api\DiagnosisTemplateController;
use Modules\Internal\Http\Controllers\Api\DiagnosisExclusionController;
use Modules\Internal\Http\Controllers\Api\DistrictController;
use Modules\Internal\Http\Controllers\Api\DivisionController;
use Modules\Internal\Http\Controllers\Api\HospitalController;
use Modules\Internal\Http\Controllers\Api\DoctorController;
use Modules\Internal\Http\Controllers\Api\DoctorRatingController;
use Modules\Internal\Http\Controllers\Api\DrugController;
use Modules\Internal\Http\Controllers\Api\FormulariumController;
use Modules\Internal\Http\Controllers\Api\FormulariumTemplateController;
use Modules\Internal\Http\Controllers\Api\Linksehat\PaymentController;
use Modules\Internal\Http\Controllers\Api\LivechatController;
use Modules\Internal\Http\Controllers\Api\MemberController;
@@ -29,10 +35,14 @@ use Modules\Internal\Http\Controllers\Api\OptionController;
use Modules\Internal\Http\Controllers\Api\OrganizationController;
use Modules\Internal\Http\Controllers\Api\PlanController;
use Modules\Internal\Http\Controllers\Api\ProvinceController;
use Modules\Internal\Http\Controllers\Api\ServiceController;
use Modules\Internal\Http\Controllers\Api\PrescriptionController;
use Modules\Internal\Http\Controllers\Api\SpecialityController;
use Modules\Internal\Http\Controllers\Api\VillageController;
use Modules\Internal\Http\Controllers\Api\AuditTrailController;
use Modules\Internal\Http\Controllers\Api\DailyMonitoringController;
use Modules\Internal\Http\Controllers\Api\LaboratoriumResultController;
use Modules\Internal\Http\Controllers\Api\CorporateManageController;
use Modules\Internal\Http\Controllers\ClaimEncounterController;
/*
@@ -69,6 +79,7 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/import-document-example/{document_type}', [CorporateController::class, 'importDocumentExample']);
Route::put('corporates/{corporate_id}/activation', [CorporateController::class, 'activation']);
Route::post('corporates/{corporate_id}/import-plan-benefit', [CorporateController::class, 'importPlanBenefit']);
Route::post('corporates/{corporate_id}/delete-import-plan-benefit', [CorporateController::class, 'deleteAllImportPlanBenefit']);
Route::get('corporates/{corporate_id}/data-plan-benefit', [CorporateController::class, 'dataPlanBenefit']);
Route::get('corporates/{corporate_id}/code', [CorporateController::class, 'corporateCode']);
Route::get('corporates/{corporate_id}/payor_id', [CorporateController::class, 'corporatePayorId']);
@@ -77,6 +88,7 @@ Route::prefix('internal')->group(function () {
Route::post('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'store']);
Route::get('corporates/{corporate_id}/corporate-plans/{id}/edit', [CorporatePlanController::class, 'edit']);
Route::put('corporates/{corporate_id}/corporate-plans/{id}', [CorporatePlanController::class, 'update']);
Route::post('corporates/{corporate_id}/corporate-plans/filter', [CorporatePlanController::class, 'filter']);
Route::put('plans/{plan_id}/activation', [CorporatePlanController::class, 'activation']);
Route::get('corporates/{corporate_id}/plans', [PlanController::class, 'index']);
@@ -96,14 +108,27 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/{corporate_id}/divisions/{id}/edit', [DivisionController::class, 'edit']);
Route::put('corporates/{corporate_id}/divisions/{id}', [DivisionController::class, 'update']);
Route::get('corporates/{corporate_id}/hospitals', [HospitalController::class, 'index']);
Route::put('hospitals/{hospital_id}/activation', [HospitalController::class, 'activation']);
Route::get('corporates/{corporate_id}/hospitals/data', [HospitalController::class, 'dataHospital']);
Route::post('corporates/{corporate_id}/hospitals/save', [HospitalController::class, 'store']);
Route::put('corporates/{corporate_id}/hospitals/{id}/edit', [HospitalController::class, 'update']);
Route::get('corporates/hospitals/download-template', [HospitalController::class, 'downloadTemplate']);
Route::post('corporates/{corporate_id}/hospitals/import', [HospitalController::class, 'import']);
Route::get('corporates/{corporate_id}/members', [CorporateMemberController::class, 'index']);
Route::get('corporates/{corporate_id}/members/list', [CorporateMemberController::class, 'generateMemberList']);
Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']);
Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']);
Route::get('corporates/{corporate_id}/diagnosis', [DiagnosisExclusionController::class, 'listDiagnosis']);
Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']);
Route::get('corporates/{corporate_id}/diagnosis-exclusions/{id_exclusion}', [DiagnosisExclusionController::class, 'detilExclusion']); // By Bagaskoro, get detil exclusion
Route::post('corporates/{corporate_id}/diagnosis-exclusions/store', [DiagnosisExclusionController::class, 'storeExclusion']);
Route::put('corporates/diagnosis-exclusions/update_activation', [DiagnosisExclusionController::class, 'updateActivation']); // By Bagaskoro, edit status aktif
Route::delete('diagnosis-exclusions/{id}', [DiagnosisExclusionController::class, 'destroy']);
Route::post('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);
@@ -112,23 +137,86 @@ Route::prefix('internal')->group(function () {
Route::get('corporates/{corporate_id}/services/{service_code}', [CorporateServiceController::class, 'corporateServiceIndex']);
Route::put('corporates/{corporate_id}/services/{service_code}', [CorporateServiceController::class, 'corporateServiceUpdate']);
Route::post('corporates/{corporate_id}/services/{service_code}/specialities', [CorporateServiceController::class, 'corporateServiceSpecialityUpdate']);
Route::post('corporates/{corporate_id}/services/{service_code}/specialities-all', [CorporateServiceController::class, 'corporateServiceSpecialityAllUpdate']);
Route::post('corporates/{corporate_id}/services/{service_code}/specialities/exclusion', [CorporateServiceController::class, 'storeExclusion']);
Route::get('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'index']);
Route::get('corporates/{corporate_id}/formulariums/{formularium_id}', [CorporateFormulariumController::class, 'show']);
Route::get('corporates/{corporate_id}/formulariums-create', [CorporateFormulariumController::class, 'create']);
Route::post('corporates/{corporate_id}/formulariums', [CorporateFormulariumController::class, 'store']);
Route::get('corporates/{corporate_id}/formulariums/list', [CorporateFormulariumController::class, 'generateFormulariumList']);
Route::post('corporates/{corporate_id}/formulariums/import', [CorporateFormulariumController::class, 'import']);
Route::put('corporates/{corporate_id}/formulariums-update-status/{id}', [CorporateFormulariumController::class, 'active']);
Route::put('corporates/{corporate_id}/formulariums/{formularium_id}/{action}', [CorporateFormulariumController::class, 'updateStatus']);
Route::controller(CorporateController::class)->group(function () {
Route::post('add-files-doc', 'addFilesDoc');
Route::post('get-files-doc', 'getFilesDoc');
Route::post('update-status-files-doc', 'updateStatusFilesDoc');
});
// Route::get('corporates/{corporate_id}/diagnosis-exclusions', [DiagnosisExclusionController::class, 'index']);
// Route::get('corporates/{corporate_id}/diagnosis-exclusions/import', [DiagnosisExclusionController::class, 'import']);
// Audittrail
Route::get('audittrail/{corporate_id}', [AuditTrailController::class, 'index']);
Route::get('master/diagnosis', [DiagnosisController::class, 'index']);
Route::get('master/diagnosis/search', [DiagnosisController::class, 'search']);
Route::prefix('case_management')->group(function () {
Route::get('memberlist', [DailyMonitoringController::class, 'GetMemberList']);
Route::get('claimlist/{member_id}', [DailyMonitoringController::class, 'GetClaimList']);
// Daily Monitoring
Route::prefix('daily_monitoring')->group(function () {
Route::get('detail/{claim_code}/list', [DailyMonitoringController::class, 'GetDetailMonitoringList']);
Route::post('detail/{claim_code}/add', [DailyMonitoringController::class, 'AddDetailMonitoringList']);
});
// Laboratorium Result
Route::prefix('laboratorium_result')->group(function () {
Route::get('detail/{claim_code}/list', [LaboratoriumResultController::class, 'GetDetailLabResultList']);
Route::post('detail/{claim_code}/add', [LaboratoriumResultController::class, 'AddDetailLabResultList']);
});
});
Route::prefix('user_management')->group(function () {
Route::get('/', [CorporateManageController::class, 'index']);
Route::post('/', [CorporateManageController::class, 'store']);
Route::post('/{id}', [CorporateManageController::class, 'update']);
Route::post('/delete/{id}', [CorporateManageController::class, 'destroy']);
});
Route::get('master/diagnosis-template', [DiagnosisTemplateController::class, 'index']);
Route::get('master/diagnosis-template/search', [DiagnosisTemplateController::class, 'search']);
Route::post('master/diagnosis-template/store', [DiagnosisTemplateController::class, 'store']);
Route::put('master/diagnosis-template/{id}/activation', [DiagnosisTemplateController::class, 'activation']);
Route::get('master/diagnosis-template/{id}/edit', [DiagnosisTemplateController::class, 'edit']);
Route::put('master/diagnosis-template/{id}/update', [DiagnosisTemplateController::class, 'update']);
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('master/diagnosis/{diagnosis_template_id}', [DiagnosisController::class, 'index']);
Route::get('master/diagnosis/{diagnosis_template_id}/search', [DiagnosisController::class, 'search']);
Route::post('master/diagnosis/{diagnosis_template_id}/import', [DiagnosisController::class, 'import']);
Route::get('master/diagnosis/{diagnosis_template_id}/list', [DiagnosisController::class, 'generateIcdList']);
Route::put('master/diagnosis/{diagnosis_template_id}/activation', [DiagnosisController::class, 'activation']);
Route::get('master/drugs', [DrugController::class, 'index']);
Route::get('master/formulariums', [FormulariumController::class, 'index']);
Route::post('master/formulariums', [FormulariumController::class, 'store']);
Route::post('master/formulariums/import', [FormulariumController::class, 'import']);
Route::put('master/drugs/{drug_id}/activation', [DrugController::class, 'activation']);
Route::get('master/drugs/download-template', [DrugController::class, 'downloadTemplate']);
Route::post('master/drugs/import', [DrugController::class, 'import']);
Route::get('members', [MemberController::class, 'index']);
Route::get('members/{member_id}/benefits', [MemberController::class, 'benefits']);
@@ -143,11 +231,45 @@ Route::prefix('internal')->group(function () {
Route::post('claims/{id}/decline', [ClaimController::class, 'decline'])->name('claim.decline');
Route::post('claims/{id}/approve', [ClaimController::class, 'approve'])->name('claim.approve');
Route::post('claims/{id}/re-open', [ClaimController::class, 'reOpen'])->name('claim.re-open');
Route::post('claims/{id}/carehistory', [ClaimController::class, 'storeHistoryCare']);
Route::post('claims/carehistory/{id}/update', [ClaimController::class, 'updateHistoryCare']);
Route::get('claims/carehistory/{id}', [ClaimController::class, 'showHistoryCare']);
Route::post('claims/carehistory/approval', [ClaimController::class, 'approvalHistoryCare']);
Route::post('claims', [ClaimController::class, 'store']);
Route::get('claims/{id}', [ClaimController::class, 'show']);
Route::put('claims/{id}', [ClaimController::class, 'update']);
Route::get('claims/{id}/edit', [ClaimController::class, 'edit']);
Route::post('check-limit', [ClaimController::class, 'checkLimit']);
Route::get('claims/1/data-claim', [ClaimController::class, 'dataClaimReport']);
Route::get('claims/detail/{id}', [ClaimController::class, 'getDetailClaims']);
Route::post('claims/request-documents', [ClaimController::class, 'requestDocuments']);
Route::get('claims/get-services/{id}', [ClaimController::class, 'getServices']);
Route::post('claims/save-services', [ClaimController::class, 'saveServices']);
Route::get('claims/{id}/benefit-configuration', [ClaimController::class, 'getBenefitConfiguration']); // Bagaskoro, BSD 03 November 2023
Route::put('claims/benefit-configuration/edit/{id}', [ClaimController::class, 'editBenefitConfiguration']); // Bagaskoro, BSD 03 November 2023
Route::get('customer-service/request', [RequestLogController::class, 'index']);
Route::post('customer-service/request', [RequestLogController::class, 'createNew']);
Route::put('customer-service/request/{id}', [RequestLogController::class, 'update']);
Route::get('customer-service/request/{id}', [RequestLogController::class, 'show']);
Route::get('customer-service/request/{id}/download', [RequestLogController::class, 'generateRequestLog']);
Route::post('customer-service/request/import', [RequestLogController::class, 'importRequestLog']);
Route::get('customer-service/request/data', [RequestLogController::class, 'generateDataRequestLogExcel']);
Route::post('customer-service/request/final-log', [RequestLogController::class, 'updateFinalLog']);
// insert benefit
Route::post('customer-service/request/insert-benefit', [RequestLogBenefitController::class, 'store']);
Route::delete('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']);
Route::get('search-organizations', [OrganizationController::class, 'searchOrganization']);
Route::get('search-specialities', [SpecialityController::class, 'searchSpeciality']);
Route::resource('organizations', OrganizationController::class);
@@ -165,12 +287,26 @@ Route::prefix('internal')->group(function () {
Route::controller(ClaimRequestController::class)->group(function () {
Route::post('files-mcu', 'filesMcu');
});
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
Route::get('claim-requests/list-member', [ClaimRequestController::class, 'getClaimMemberInfiniteScroll']); // Bagaskoro, BSD 31 Oktober 2023
Route::post('claim-requests/{id}/approve', [ClaimRequestController::class, 'approve'])->name('claim-requests.approve');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
Route::post('claim-requests', [ClaimRequestController::class, 'createNew']); // Bagaskoro, BSD 2 November 2023
Route::put('claim-requests/{id}', [ClaimRequestController::class, 'update'])->name('claim-requests.update');
Route::post('claim-requests/import', [ClaimRequestController::class, 'importClaim'])->name('claim-requests.importClaim');
Route::get('claim-requests/detail/{id}', [ClaimRequestController::class, 'claimRequestDetail']);
Route::post('claim-requests/{id}/invoice-files', [ClaimRequestController::class, 'invoiceFiles']);
Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']);
Route::get('claim-requests/service/{id}', [ClaimRequestController::class, 'getServiceMember']);
});
Route::get('province', [ProvinceController::class, 'index']);
Route::get('service', [ServiceController::class, 'index']);
Route::get('city', [CityController::class, 'index']);
Route::get('district', [DistrictController::class, 'index']);
Route::get('village', [VillageController::class, 'index']);

View File

@@ -237,7 +237,6 @@ class CorporateService
->where('corporate_plan_id', $benefit_data['plan_code'])
->first();
$benefit_data['plan_code'] = $plan->id;
$benefit = Benefit::updateOrCreate([
'code' => $benefit_data['code'],
'service_code' => $plan->service_code,

View File

@@ -6,6 +6,7 @@ use App\Exceptions\ImportRowException;
use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\Icd;
use App\Models\Exclusion;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
@@ -21,15 +22,13 @@ class ExclusionService
public function handleDiagnosisExclusionRow(Corporate $corporate, $row)
{
try {
$this->validateDiagnosisExclusionRow($row);
if (!empty($row['ip_exclusion'])) {
$excl_array = explode('|', $row['ip_exclusion']);
if ($excl_array[0] == '3') {
$icd = Icd::where('code', $row['code'])->first();
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'OP',
'service_code' => 'IP',
'type' => 'diagnosis'
]);
@@ -89,7 +88,8 @@ class ExclusionService
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'OP',
'type' => 'diagnosis'
'type' => 'diagnosis',
'active' => 1
]);
if (!empty($excl_array[1])) { //msc
@@ -130,11 +130,35 @@ class ExclusionService
]);
}
if (!empty($excl_array[5])) { //plans
$exclusion->rules()->create([
'name' => 'plan',
'values' => $excl_array[5]
]);
$codePlan = explode(',', $excl_array[5]);
collect($codePlan)->each(function ($codePlan) use ($corporate, $exclusion) {
$isCodeplan = Plan::where(['code' => $codePlan, 'corporate_id' => $corporate->id])->first();
if (!$isCodeplan) {
throw new ImportRowException(__('codePlan.NOT_FOUND'), 0, NULL, $codePlan);
}
$exclusion->rules()->create([
'name' => 'plan',
'values' => $codePlan
]);
});
}
} else if (!$excl_array[0]){
$icd = Icd::where(['code' => $row['code']])->first();
if (!$icd) {
throw new ImportRowException(__('icd.NOT_FOUND'), 0, NULL, $row);
}
// Cari entitas Exclusion yang sesuai dengan kriteria tertentu
$exclusion = Exclusion::where([
'corporate_id' => $corporate->id,
'exclusionable_id' => $icd->id,
])->first();
// Jika entitas ditemukan, perbarui nilai 'active' menjadi 0
if ($exclusion) {
$exclusion->update(['active' => 0]);
}
}
}
@@ -144,7 +168,7 @@ class ExclusionService
$icd = Icd::where('code', $row['code'])->first();
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'OP',
'service_code' => 'DE',
'type' => 'diagnosis'
]);
@@ -196,7 +220,6 @@ class ExclusionService
if (!empty($row['ma_exclusion'])) {
$excl_array = explode('|', $row['ma_exclusion']);
dd($excl_array);
if ($excl_array[0]) {
}
}

View File

@@ -7,10 +7,11 @@ use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\Drug;
use App\Models\Formularium;
use App\Models\CorporateFormularium;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class CorporateService
class FormulariumService
{
protected function validateFormulariumRow($row)
{
@@ -45,4 +46,75 @@ class CorporateService
throw $e;
}
}
public function handleFormuariumTemplateRow($row, $id)
{
try {
$formularium = Formularium::updateOrCreate(
[
'code' => $row['code'],
'formularium_template_id' => $id
],
[
'code' => $row['code'],
'name' => $row['name'],
'description' => $row['description'],
'manufacturer' => $row['manufacturer'],
'category_name' => $row['category_name'],
'kategori_obat' => $row['kategori_obat'],
'uom' => $row['uom'],
'composition' => $row['composition'],
'general_indication' => $row['general_indication'],
'atc_code' => $row['atc_code'],
'class' => $row['class'],
'bpom_registration' => $row['bpom_registration'],
'classifications' => $row['classifications'],
'cat_for' => $row['cat_for'],
'formularium_template_id' => $id,
]);
return $formularium;
} catch (\Exception $e) {
throw $e;
}
}
public function handleFormuariumCorporateRow($row, $id)
{
try {
$formularium = CorporateFormularium::updateOrCreate(
[
'formularium_id' => $row['formularium_id'],
'corporate_id' => $id
],
[
'formularium_id' => $row['formularium_id'],
'corporate_id' => $id,
'active' => $row['active']
]);
return $formularium;
} catch (\Exception $e) {
throw $e;
}
}
public $listing_doc_headers = [
"Internal Code",
"Name",
"Description",
"Manufacturer",
"Category Name",
"Kategori Obat",
"UOM",
"Composition",
"General Indication",
"ATC Code",
"Class",
"BPOM Registration",
"Classifications",
"Cat For (O = obat, VS = Vitamin Suplemen, H=herbal, M=makanan, etc) ",
];
}

View File

@@ -0,0 +1,53 @@
<?php
namespace Modules\Internal\Services;
use App\Exceptions\ImportRowException;
use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\Icd;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class IcdService
{
protected function validateDiagnosisExclusionRow($row)
{
if (empty($row['ICD_Code'])) {
throw new ImportRowException(__('ICD_Code is REQUIRED'), 0, null, $row);
}
}
public function handleIcdRow($row, $id)
{
try {
$this->validateDiagnosisExclusionRow($row);
$icd = Icd::updateOrCreate([
'code' => $row['ICD_Code']
], [
"code" => $row['ICD_Code'],
"parent_code" => null,
"rev" => '',
"name" => $row['Description'] ?? null,
"version" => null,
"active" => 1,
"icd_template_id" => $id,
]);
return true;
} catch (\Exception $e) {
throw $e;
}
}
public $listing_doc_headers = [
// "Rev",
// "Version",
"Code",
// "Parent Code",
// "Name",
"Description",
// "Status",
// "Type"
];
}

View File

@@ -326,6 +326,7 @@ class MemberEnrollmentService
public function __construct(Member $member)
{
app()->setLocale('en');
$this->member = $member;
}
@@ -580,6 +581,7 @@ class MemberEnrollmentService
"telephone_mobile" => $row['telephone_mobile'] ?? null,
"telephone_res" => $row['telephone_res'] ?? null,
"telephone_office" => $row['telephone_office'] ?? null,
"suspended" => $row['member_suspended'] ?? null,
];
// $this->validateRow($row);
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->code != $row['policy_number']) {
@@ -731,12 +733,25 @@ class MemberEnrollmentService
// Validate If Plan Exist
// TODO validate corporate plan
$plan = Plan::query()
->where('code', $row['plan_id'])
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
$plans = explode(",",$row['plan_id']);
if (count($plans) > 0) {
foreach($plans as $d){
$plan = Plan::query()
->where('code', $d)
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
}
} else {
$plan = Plan::query()
->where('code', $row['plan_id'])
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
}
try {
@@ -787,12 +802,40 @@ class MemberEnrollmentService
'status' => $row['employment_status']
]);
// Bisa disini penyebab data dobel
$member->memberPlans()->create([
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
$plans = explode(",",$row['plan_id']);
if (count($plans) > 0) {
foreach($plans as $d){
$plan = Plan::query()
->where('code', $d)
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
$member->memberPlans()->create([
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
}
} else {
$plan = Plan::query()
->where('code', $row['plan_id'])
->where('corporate_id', $corporate->id)
->first();
if (!$plan) {
throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
}
$member->memberPlans()->create([
'plan_id' => $plan->id,
'status' => 'active',
'start' => $this->dateParser($row['member_effective_date']),
'end' => $this->dateParser($row['member_expiry_date']),
]);
}
}
DB::commit();
} catch (\Exception $e) {
@@ -834,7 +877,6 @@ class MemberEnrollmentService
$member->person_id = $person->id;
$member->save();
try {
$memberPolicy = MemberPolicy::query()
->where('policy_id', $row['policy_number'])
->where('member_id', $row['member_id'])
@@ -852,17 +894,63 @@ class MemberEnrollmentService
$memberPlan->save();
}
// Pengecekan jika ada perubahan di plan
$plan = Plan::query()
->where('code', $row['plan_id'])
->first();
if ($plan){
$memberPlan = MemberPlan::query()
->where('member_id', $member->id)
->first();
$memberPlan->plan_id = $plan->id;
$memberPlan->save();
}
// // Pengecekan jika ada perubahan di plan
// $plan = Plan::query()
// ->where('code', $row['plan_id'])
// ->first();
// if ($plan){
// $memberPlan = MemberPlan::query()
// ->where('member_id', $member->id)
// ->first();
// $memberPlan->plan_id = $plan->id;
// $memberPlan->save();
// }
// Update plan
// $plans = explode(",",$row['plan_id']);
// if (count($plans) > 0) {
// foreach($plans as $d){
// $plan = Plan::query()
// ->where('code', $d)
// ->where('corporate_id', $corporate->id)
// ->first();
// if (!$plan) {
// throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
// }
// $member->memberPlans()->updateOrCreate([
// 'member_id' => $member->id,
// 'plan_id' => $plan->id,
// ],
// [
// 'plan_id' => $plan->id,
// 'status' => 'active',
// 'start' => $this->dateParser($row['member_effective_date']),
// 'end' => $this->dateParser($row['member_expiry_date']),
// ]);
// }
// } else {
// $plan = Plan::query()
// ->where('code', $row['plan_id'])
// ->where('corporate_id', $corporate->id)
// ->first();
// if (!$plan) {
// throw new ImportRowException(__('enrollment.PLAN_NOT_FOUND'), 0, null, $row);
// }
// $member->memberPlans()->updateOrCreate([
// 'member_id' => $member->id,
// 'plan_id' => $plan->id,
// ],
// [
// 'plan_id' => $plan->id,
// 'status' => 'active',
// 'start' => $this->dateParser($row['member_effective_date']),
// 'end' => $this->dateParser($row['member_expiry_date']),
// ]);
// }
// end update plan
// Update jika ada perubahaan di ASO maka akan teriflek ke LMS juga\
$userInsuranceLms = UserInsurance::query()
->where('sNoPolis', $row['member_id'])

View File

@@ -0,0 +1,36 @@
<?php
namespace Modules\Internal\Transformers;
use App\Models\Benefit;
use Illuminate\Http\Resources\Json\JsonResource;
class ClaimEditResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$value = parent::toArray($request);
$data['id'] = $value['id'];
$data['plan_id'] = $value['plan'] ? $value['plan']['code'] : '-';
$data['payor_id'] = $value['member'] ? $value['member']['current_corporate']['payor_id'] : '-';
$data['corporate_id'] = $value['member'] ? $value['member']['current_corporate']['code'] : '-';
$data['policy_number'] = $value['member'] ? $value['member']['current_policy']['code'] : '-';
$data['member_id'] = $value['member'] ? $value['member']['member_id'] : '-';
// $data['benefit_code'] = $value['benefit'] ? $value['benefit']['code'] : '-';
// $data['benefit_desc'] = $value['benefit'] ? $value['benefit']['description'] : '-';
$data['benefit_code'] = $value['benefit_code'];
$data['benefit_desc'] = $value['benefit_desc'];
$data['amount_incurred'] = $value['amount_incurred'];
$data['amount_approved'] = $value['amount_approved'];
$data['amount_not_approved'] = $value['amount_not_approved'];
$data['excess_paid'] = $value['excess_paid'];
return $data;
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace Modules\Internal\Transformers;
use App\Models\DiagnosisSecondaryClaimHistoryCare;
use App\Models\Icd;
use Illuminate\Http\Resources\Json\JsonResource;
class ClaimHistoryCareResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$claim = parent::toArray($request);
$secondaryDiagnosis = DiagnosisSecondaryClaimHistoryCare::where('claim_history_care_id', $claim['id'])->with(['icd'])->get()->toArray();
$data = [
'id' => $claim['id'],
'service_code' => $claim['service_code'],
'admission_date' => $claim['admission_date'],
'discharge_date' => $claim['discharge_date'],
'claim_id' => $claim['claim_id'],
'organization_id' => $claim['organization_id'],
'organization_name' => $claim['organization'] ? $claim['organization']['name'] : '-',
'practitioner_id' => $claim['practitioner_id'],
'practitioner_name' => $claim['practitioner'] ? $claim['practitioner']['person']['name'] : '-',
'medical_record_number' => $claim['medical_record_number'],
'symptoms' => $claim['symptoms'],
'sign' => $claim['sign'],
'main_diagnosis_id' => $claim['main_diagnosis_id'],
'main_diagnosis_name' => $claim['icd'] ? $claim['icd']['name'] : '-',
'status' => $claim['status'],
'secondary_diagnosis' => $secondaryDiagnosis,
];
return $data;
}
}

View File

@@ -3,6 +3,7 @@
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
class ClaimRequestResource extends JsonResource
{
@@ -15,7 +16,7 @@ class ClaimRequestResource extends JsonResource
public function toArray($request)
{
$filesGroupByType = $this->files->mapToGroups(function($file) {
return [$file->type => $file];
return [Str::slug($file->type, '_') => $file];
});
$data = [

View File

@@ -3,6 +3,9 @@
namespace Modules\Internal\Transformers;
use App\Models\Benefit;
use App\Models\CorporateEmployee;
use App\Models\ClaimRequest;
use App\Models\Icd;
use Illuminate\Http\Resources\Json\JsonResource;
class ClaimShowResource extends JsonResource
@@ -15,34 +18,55 @@ class ClaimShowResource extends JsonResource
*/
public function toArray($request)
{
$data = parent::toArray($request);
// $data['']
$data['benefit_items'] = $this->items
->filter(function ($item) {
return $item->claim_itemable_type == Benefit::class;
})
->map(function ($item) {
$itemData = $item->claim_itemable->toArray();
$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'];
$claim = parent::toArray($request);
return $itemData;
});
$member_data = CorporateEmployee::where('member_id', $claim['member_id'])->first();
$claim_request = ClaimRequest::where('id', $claim['claim_request_id'])->first();
$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['encounters'] = $this->encounters->map(function($encounter) {
$encounterData = EncounterResource::make($encounter);
return $encounterData;
});
// $memberDiagnosisHistories = $this->member->
$data = [
'id' => $claim['id'],
'uuid' => $claim['uuid'],
'code' => $claim['code'],
'claim_request_id' => $claim['claim_request_id'],
'member_id' => $claim['member_id'],
'currency' => $claim['currency'],
'total_claim' => $claim['total_claim'],
'plan_id' => $claim['plan_id'],
'benefit_id' => $claim['benefit_id'],
'organization_id' => $claim['organization_id'],
'benefit_code' => $claim['benefit_code'],
'benefit_desc' => $claim['benefit_desc'],
'amount_incurred' => $claim['amount_incurred'],
'amount_approved' => $claim['amount_approved'],
'amount_not_approved' => $claim['amount_not_approved'],
'excess_paid' => $claim['excess_paid'],
'final_encounter_id' => $claim['final_encounter_id'],
'status' => $claim['status'],
'created_at' => $claim['created_at'],
'corporate_id' => $member_data->corporate_id,
'service_code' => $claim_request->service_code
// "uuid" => "9a59bff7-857f-4e48-8c6b-242ad1286395"
// "" => "CLM-00035"
// "" => 66
// "member_id" => 3
// "" => "IDR"
// "" => null
// "" => 1
// "" => null
// "" => 0
// "benefit_code" => ""
// "benefit_desc" => "erwraf"
// "" => 10000
// "" => 123000
// "amount_not_approved" => 122000
// "excess_paid" => 230000
// "final_encounter_id" => null
// "status" => "received"
// "created_at" => "2023-10-12T09:23:54.000000Z"
];
// $data['benefit_items'] = $this->items
$data['history_hospital_care'] = $claim['history_hospital_care'];
// $data['main_diagnosis']
return $data;
}

View File

@@ -16,11 +16,10 @@ class CorporateFormulariumResource extends JsonResource
{
return [
'id' => $this->id,
'code' => $this->code,
'name' => $this->name,
'items_count' => $this->items_count,
'status' => $this->corporateFormulariums->count() ? 'active' : 'inactive',
'corporate_formulariums' => $this->coporateFormulariums,
'formulaurium_category_id' => $this->formularium_template->id,
'category' => $this->formularium_template->name,
'description' => $this->formularium_template->description,
'active' => $this->active == 1 ? 'Active' : 'Inactive',
];
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
class CorporateManageResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$data = [];
// dd($this);
// if(count($this) > 0){
$temp = [];
foreach($this as $d){
dd($d);
// $temp['user'] = []
}
// }
return $data;
}
}

View File

@@ -41,38 +41,97 @@ class CorporateServiceConfigResource extends JsonResource
];
$list_msc = $this->corporateServiceSpecialities->map(function ($speciality) {
return explode(',', $speciality->exclusions->first()->rules->where('name', 'msc')->first()->values ?? '');
})->map(function ($item) {
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'msc')->first();
if ($rules) {
$values = $rules->values ?? '';
$item = explode(',', $values);
} else {
// Handle case where 'rules' with name 'msc' is not found
$item = [];
}
} else {
// Handle case where 'exclusions' is not found
$item = [];
}
return [
'm' => in_array('m', $item),
's' => in_array('s', $item),
'c' => in_array('c', $item),
];
});
$list_gender = $this->corporateServiceSpecialities->map(function ($speciality) {
// dd($speciality->exclusions->first()->rules);
return explode(',', $speciality->exclusions->first()->rules->where('name', 'gender')->first()->values ?? '');
})->map(function ($item) {
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'gender')->first();
if ($rules) {
$values = $rules->values ?? '';
$item = explode(',', $values);
} else {
// Handle case where 'rules' with name 'gender' is not found
$item = [];
}
} else {
// Handle case where 'exclusions' is not found
$item = [];
}
return [
'male' => in_array('male', $item),
'female' => in_array('female', $item),
];
});
$min_age = $this->corporateServiceSpecialities->map(function ($speciality) {
return $speciality->exclusions->first()->rules->where('name', 'min_age')->first()->values ?? '';
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'min_age')->first();
if ($rules) {
return $rules->values ?? '';
}
}
return '';
});
$max_age = $this->corporateServiceSpecialities->map(function ($speciality) {
return $speciality->exclusions->first()->rules->where('name', 'max_age')->first()->values ?? '';
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'max_age')->first();
if ($rules) {
return $rules->values ?? '';
}
}
return '';
});
$plan = $this->corporateServiceSpecialities->map(function ($speciality) {
return $speciality->exclusions->first()->rules->where('name', 'plan')->first()->values ?? null;
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'plan')->first();
if ($rules) {
return $rules->values ?? null;
}
}
return null;
});
$data['exclusions'] = $data['exclusions']->map(function ($item, $key) use (
$list_msc,
$list_gender,

View File

@@ -21,6 +21,7 @@ class DiagnosisExclusionResource extends JsonResource
'diagnosis_type' => $this->exclusionable->type,
'service_code' => $this->service_code,
'type' => $this->type,
'active' => $this->active,
'rules' => $this->rules->mapToGroups(function ($item, $key) {
return [$item['name'] => $item['values']];
})

View File

@@ -0,0 +1,37 @@
<?php
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
class RequestLogResource 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];
});
$data = [
'id' => $this->id,
'code' => $this->code,
'submission_date' => $this->submission_date,
'member_name' => $this->member->name,
'status' => $this->status ?? 'unknown',
'status_final_log' => $this->status_final_log ?? 'unknown',
'service_name' => $this->service ? $this->service->name : '',
'payment_type' => $this->payment_type,
'payment_type_name' => $this->payment_type_name,
'files_by_type' => $filesGroupByType
];
return $data;
}
}

View File

@@ -0,0 +1,93 @@
<?php
namespace Modules\Internal\Transformers;
use App\Models\Benefit;
use App\Models\CorporateBenefit;
use App\Models\ClaimRequest;
use App\Models\CorporateService;
use App\Models\RequestLogBenefit;
use App\Models\RequestLogMedicine;
use App\Models\Exclusion;
use App\Models\Icd;
use App\Helpers\Helper;
use Illuminate\Http\Resources\Json\JsonResource;
class RequestLogShowResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$requestLog = parent::toArray($request);
$corporateId = $requestLog['member']['current_plan']['corporate_id'] ?? 0;
$benefit = CorporateBenefit::with('benefit')->where('plan_id', $corporateId)->get()->toArray();
$benefitDetailLog = RequestLogBenefit::with('benefit')->where('request_log_id', $requestLog['id'])->get()->toArray();
$medicineDetailLog = RequestLogMedicine::where('request_log_id', $requestLog['id'])->get()->toArray();
$benefitData = [];
if (count($benefit)){
foreach($benefit as $data){
array_push($benefitData, $data['benefit']);
}
}
// Medicine
$medicineData = [];
if (count($medicineDetailLog)){
foreach($medicineDetailLog as $data){
array_push($medicineData, $data);
}
}
// Service Rule
$corporateService = CorporateService::query()
->where('corporate_id', $corporateId)
->where('service_code', $requestLog['service_code'])
->with(['configs'])
->first();
$config = [];
if ($corporateService) {
$config = $corporateService->configs->pluck('value', 'name')->toArray();
}
// Exclusion Service or diagnosis
$exclusions = Exclusion::query()
->where('corporate_id', $corporateId)
->where('type', 'diagnosis')
->with(['exclusionable', 'rules'])
->get()->toArray();
$data = [
'id' => $requestLog['id'],
'code' => $requestLog['code'],
'member_id' => $requestLog['member']['member_id'],
'policy_number' => $requestLog['member']['current_policy']['code'],
'name' => $requestLog['member']['name'],
'date_of_birth' => $requestLog['member']['birth_date'],
'gender' => $requestLog['member']['gender'],
'marital_status' => Helper::maritalNormalization($requestLog['member']['marital_status']),
'member_type' => Helper::memberType($requestLog['member']['record_type']),
'principal_id' => $requestLog['member']['principal_id'] ? $requestLog['member']['principal_id'] : '-',
'principal_name' => $requestLog['member']['principal_id'] ? Helper::principalName($requestLog['member']['principal_id']) : '-',
'relation_with_principal' => Helper::relationWithPrincipal($requestLog['member']['relation_with_principal']),
'submission_date' => $requestLog['submission_date'],
'service_type' => Helper::serviceName($requestLog['service_code']),
'claim_method' => $requestLog['payment_type'],
'status' => $requestLog['status'],
'status_final_log' => $requestLog['status_final_log'],
'benefit' => $benefitData,
'benefit_data' => $benefitDetailLog,
'config_service' => $config,
'exclusion' => $exclusions,
'medicine' => $medicineData,
'files' => $requestLog['files'],
];
return $data;
}
}

View File

@@ -5,126 +5,172 @@ namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Person;
use App\Models\User;
use App\Models\OLDLMS\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Laravel\Socialite\Facades\Socialite;
use Modules\Linksehat\Transformers\UserProfileResource;
use Modules\Linksehat\Transformers\User\UserProfileResource;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Http;
use Validator;
class AuthController extends Controller
{
public function otpRequest(Request $request)
{
$request->validate([
// 'phone' => 'required'
'phone_or_email' => 'required'
]);
private $url;
if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) {
$user = User::updateOrCreate([
'email' => $request->phone_or_email
], [
'email' => $request->phone_or_email,
'otp' => rand(1000, 9999),
'otp_created_at' => now()
]);
$person = Person::query()->create([
'owner_user_id' => $user->id,
'email' => $request->phone_or_email,
'created_by' => $user->id,
]);
User::query()->find($user->id)->update([
'person_id' => $person->id
]);
} else {
$user = User::updateOrCreate([
'phone' => $request->phone_or_email
], [
'phone' => $request->phone_or_email,
'otp' => rand(1000, 9999),
'otp_created_at' => now()
]);
$person = Person::query()->create([
'owner_user_id' => $user->id,
'phone' => $request->phone_or_email,
'created_by' => $user->id,
]);
User::query()->find($user->id)->update([
'person_id' => $person->id
]);
}
if (!$user) {
$message = filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? "User dengan alamat email " . $request->phone_or_email . " tidak ditemukan" : "User dengan nomor telepon " . $request->phone_or_email . " tidak ditemukan";
return Helper::responseJson(statusCode: Response::HTTP_NOT_FOUND, message: $message);
}
// TODO Send the OTP
if (filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL)) {
// Send Email
} else {
// Send Whatsapp
}
return Helper::responseJson(message: 'OTP Terkirim');
public function __construct() {
$this->url = $_ENV['LMS_APP_URL'];
}
public function login(Request $request)
{
{
$request->validate([
// 'email' => 'email',
// 'password' => 'required_with:email',
'phone_or_email' => 'required',
// 'phone' => '',
// 'otp' => 'required_with:phone',
'phone_or_email' => 'required',
'otp' => 'required'
'password' => 'required',
// 'otp' => 'required'
]);
$loginType = filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? 'email' : 'phone';
// Login hit ke API linksehat, karena encrypt nya pake CI
$response = Http::post($this->url.'login', [
'sEmail' => $request->phone_or_email,
'sPassword' => $request->password,
'sRemember' => $request->remember
]);
if ($loginType == 'email') {
$user = User::query()
->where('email', $request->phone_or_email)
->first();
}
if ($loginType == 'phone') {
$user = User::query()
->where('phone', $request->phone_or_email)
->first();
}
if (!isset($user) || empty($user)) {
return response(['message' => 'User Tidak Ditemukan'], 404);
}
if ($loginType == 'email') {
if ($request->otp != $user->otp) {
return response(['message' => 'OTP Salah, Silahkan Cek Kembali Email Anda'], 403);
}
} else if ($loginType == 'phone') {
if ($request->otp != $user->otp) {
return response(['message' => 'OTP Salah'], 403);
}
$response = $response->json();
if ($response['success']){
$user = User::with('detail')
->where('sEmail', $request->phone_or_email)
->first();
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
} else {
return response(['message' => 'Mode Login Tidak Dikenal'], 403);
return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403);
};
}
public function forgetPassword(Request $request){
$request->validate([
'email' => 'required|email',
]);
// Login hit ke API linksehat, karena encrypt nya pake CI
$response = Http::post($this->url.'forgot_password', [
'sEmail' => $request->email,
]);
$response = $response->json();
if ($response['success']){
return Helper::responseJson(
data: [],
message: 'Message has been sent.'
);
} else {
return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403);
};
}
public function resetPassword(Request $request){
$request->validate([
'email' => 'required|email',
'code' => 'required',
'password' => 'required',
]);
// Login hit ke API linksehat, karena encrypt nya pake CI
$response = Http::post($this->url.'reset_password', [
'sCode' => $request->code,
'sEmail' => $request->email,
'sPassword' => $request->password,
]);
$response = $response->json();
if ($response['success']){
return Helper::responseJson(
data: [],
message: 'Password telah di reset'
);
} else {
return response(['message' => $response['message']], 403);
};
}
public function loginPhone(Request $request)
{
$request->validate([
'phone_or_email' => 'required',
'otp' => 'required',
]);
$user = User::with('detail')
->where([
'sPhone' => $request->phone_or_email,
'sVerificationCode' => $request->otp
])
->first();
if ($user){
$updateVericationCode = User::with('detail')
->where([
'sPhone' => $request->phone_or_email,
'sVerificationCode' => $request->otp
])->update([
'sVerificationCode' => null,
]);
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
} else {
return response(['message' => 'Email atau Password salah, Silahkan Cek Kembali'], 403);
};
}
public function otpRequest(Request $request)
{
$user = User::with('detail')
->where('sPhone', $request->phone_or_email)
->first();
if ($user){
// Request OTP ke API linksehat
$response = Http::post($this->url.'generate_code', [
'sPhone' => $request->phone_or_email
]);
$response = $response->json();
return Helper::responseJson(
data: [
'otp' => $response['message'],
],
message: 'Kode OTP'
);
} else {
return Helper::responseJson(
data: [
'otp' => null,
],
message: 'Nomor tidak ditemukan'
);
}
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
}
public function register(Request $request)
@@ -163,6 +209,7 @@ class AuthController extends Controller
return Helper::responseJson(message: 'Behasil Logout.');
}
public function mockOtp(Request $request)
{
$request->validate([

View File

@@ -0,0 +1,97 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\OLDLMS\User;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Modules\Linksehat\Transformers\User\ShowProfileResource;
use Illuminate\Support\Facades\DB;
class AutocompleteController extends Controller {
public function maritalStatus(){
$maritalStatus = DB::connection('oldlms')->table('tm_status_pernikahan')->get()->toArray();
$data = [];
if ($maritalStatus){
$temp = [];
foreach($maritalStatus as $d){
$temp['id'] = $d->nID;
$temp['value'] = $d->sStatusPernikahan;
array_push($data, $temp);
}
}
return Helper::responseJson($data);
}
public function bloodType() {
$bloodType = DB::connection('oldlms')->table('tm_golongan_darah')->get()->toArray();
$data = [];
if ($bloodType){
$temp = [];
foreach($bloodType as $d){
$temp['id'] = $d->nID;
$temp['value'] = $d->sGolonganDarah;
array_push($data, $temp);
}
}
return Helper::responseJson($data);
}
public function relationship() {
$relation = DB::connection('oldlms')->table('tm_hubungan_keluarga')->get()->toArray();
$data = [];
if ($relation){
$temp = [];
foreach($relation as $d){
$temp['id'] = $d->nID;
$temp['value'] = $d->sHubunganKeluarga;
array_push($data, $temp);
}
}
return Helper::responseJson($data);
}
public function corporate(Request $request) {
$search = $request->search;
$corporate = DB::table('corporates')
->where('active', 1)
->where(function ($query) use ($search) {
$query->where('name', 'like', "%$search%")
->orWhere('code', 'like', "%$search%");
})
->get()
->toArray();
$data['company'] = [];
if ($corporate){
$temp = [];
foreach($corporate as $d){
$temp['id'] = $d->id;
$temp['name'] = $d->name;
$temp['linking_rule'] = json_decode($d->linking_rules);
array_push($data['company'], $temp);
}
}
return Helper::responseJson($data);
}
}

View File

@@ -0,0 +1,138 @@
<?php
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Person;
use App\Models\Corporate;
use App\Models\Member;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserInsurance;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Laravel\Socialite\Facades\Socialite;
use Modules\Linksehat\Transformers\User\UserProfileResource;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\OLDLMS\MemberResource;
use App\Rules\NikRule;
class LinkingController extends Controller
{
private $url;
public function __construct() {
$this->url = $_ENV['LMS_APP_URL'];
}
public function linkingValidate(Request $request)
{
$validator = Validator::make($request->all(), [
'corporate_id' => 'required',
'user_id' => 'required',
]);
// $request->validate($validationRules);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
$corporate = Corporate::findOrFail($request->corporate_id);
// Make Validation from Linking Rules
$linkingRulesArr = $corporate->linking_rules->toArray();
$validationRules = [];
foreach ($linkingRulesArr as $field) {
$rules = ['required']; // Default is required if in the linking_rules
if ($field == 'email') {
$rules[] = 'email';
}
if ($field == 'nric') {
$rules[] = new NikRule;
}
$validationRules[$field] = $rules;
}
$validator = Validator::make($request->all(),$validationRules);
// $request->validate($validationRules);
if ($validator->fails()) {
return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 422, status: 'error');
}
$member = Member::query()
->when(in_array('nric', $linkingRulesArr), function($q) use ($request) {
$q->where('nric', $request->nric);
})
->when(in_array('member_id', $linkingRulesArr), function($q) use ($request) {
$q->where('member_id', $request->member_id);
})
->when(in_array('name', $linkingRulesArr), function($q) use ($request) {
$q->where('name', $request->name);
})
->when(in_array('dob', $linkingRulesArr), function($q) use ($request) {
$q->where('birth_date', $request->dob);
})
->when(in_array('phone', $linkingRulesArr), function($q) use ($request) {
$q->whereHas('person', function ($person) use ($request) {
$person->where('phone', $request->phone);
});
})
->when(in_array('email', $linkingRulesArr), function($q) use ($request) {
$q->where('email', $request->email);
})
->when(in_array('nik', $linkingRulesArr), function($q) use ($request) {
$q->whereHas('employeds', function ($employed) use ($request) {
$employed->where('corporate_id', $request->corporate_id)
->where('nik', $request->nik);
});
})
->with([
'memberPlans' => function ($memberPlan) {
$memberPlan->latest();
},
])
->first();
if ($member) {
// Insert into database linksehat
$insurance = UserInsurance::updateOrCreate(
[
'nIDUser' => $request->user_id,
],
[
'nIDUser' => $request->user_id,
'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'],
'sNoPolis' => $member->member_id,
'sNamaPeserta' => $member->fullName,
'sKartuPeserta' => '',
'sLayanan' => 'RJ,TC',
'dStartDate' => $member->members_effective_date,
'dExpireDate' => $member->members_expire_date,
'dTanggalLahir' => $member->birth_date,
'nNoKTP' => $member->nric != '' ? $member->nric : 0 ,
'sIsConfrimed' => 1,
'sStatus' => 1,
]);
$message = $member->currentPolicy->corporate->welcome_message;
return Helper::responseJson(data: MemberResource::make($member), message: $message);
}
return Helper::responseJson(data: [], message: 'Member Tidak ditemukan', statusCode: 404, status: 'error');
}
public function card($member_id){
$member = Member::where('member_id', $member_id)->get()->first();
$message = $member->currentPolicy->corporate->welcome_message;
return Helper::responseJson(data: MemberResource::make($member), message: $message);
}
}

View File

@@ -3,12 +3,16 @@
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\User;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Auth;
use Modules\Linksehat\Transformers\UserProfileResource;
use Modules\Linksehat\Transformers\User\ShowProfileResource;
use Modules\Linksehat\Transformers\User\UserProfileResource;
class ProfileController extends Controller
{
@@ -16,11 +20,11 @@ class ProfileController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index()
public function index(Request $request, $id)
{
$user = Auth::user()->load('person');
$user = User::with(['detail'])->where('nID', $id)->get()->first();
return Helper::responseJson(new UserProfileResource($user));
return Helper::responseJson(new ShowProfileResource($user));
}
/**
@@ -70,58 +74,90 @@ class ProfileController extends Controller
*/
public function update(Request $request)
{
$request->validate([
'nik' => 'numeric',
'name_prefix' => '',
'name' => '',
'name_suffix' => '',
'gender' => 'in:P,L',
'birth_date' => 'sometimes:date',
// 'is_deceased' => '',
'deceased_at' => 'sometimes:date',
'marital_status' => 'in:S,M,C',
'preferred_lang' => 'in:id,en'
$validator = Validator::make($request->all(), [
'id' => 'required',
'first_name' => 'required',
'last_name' => 'required',
'date_of_birth' => 'required',
// 'email' => 'required',
]);
$user = Auth::user();
if ($user->person) { // Update Profile
$user->person->fill($request->only([
'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status'
]))->save();
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
if ($request->has('preferred_lang')) {
$user->metas()->updateOrCreate([
'type' => 'preferred_lang'
], [
'system' => 'default',
'type' => 'preferred_lang',
'value' => $request->preferred_lang,
]);
}
} else { // Create If Not Exist
$newPerson = array_merge(
$request->only([
'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status'
]),
['user_owner_id' => $user->id]
);
$newPerson = $user->person()->create($newPerson);
$user->person_id = $newPerson->id;
$user->save();
$user = User::find($request->id);
$userDetail = UserDetail::where('nIDUser', $request->id)->first();
// Array asosiatif yang menghubungkan field dengan nama kolom di tabel
$userFields = [
'first_name' => 'sFirstName',
'last_name' => 'sLastName',
'phone' => 'sPhone',
'email' => 'sEmail',
'relationship' => 'nIDHubunganKeluarga',
];
if ($request->has('preferred_lang')) {
$user->metas()->updateOrCreate([
'type' => 'preferred_lang'
], [
'system' => 'default',
'type' => 'preferred_lang',
'value' => $request->preferred_lang,
]);
$userDetailFields = [
'date_of_birth' => 'dTanggalLahir',
'gender' => 'nIDJenisKelamin',
'blood_type' => 'nIDGolonganDarah',
'marital_status' => 'sMartialStatus',
'weight' => 'sWeight',
'height' => 'sHeight',
];
// Update user data
foreach ($userFields as $requestField => $column) {
if ($request->filled($requestField)) {
$user->update([$column => $request->$requestField]);
}
}
$user = User::find($user->id); // ReLoad User Data
return Helper::responseJson(['users' => new UserProfileResource($user)]);
// Update user detail
if($userDetail){
foreach ($userDetailFields as $requestField => $column) {
if ($request->filled($requestField)) {
$userDetail->update([$column => $request->$requestField]);
}
}
} else {
UserDetail::create([
'nIDUser' => $request->id,
'dTanggalLahir' => $request->date_of_birth,
'nIDJenisKelamin' => $request->gender,
'nIDGolonganDarah' => $request->blood_type,
'sMartialStatus' => $request->marital_status,
'sWeight' => $request->weight,
'sHeight' => $request->height,
]);
}
// poto profile
// if ($request->hasFile('avatar')) {
// $pathFileAvatar = File::storeFile('photo_profile_lms', $newCorporate->id, $request->file('avatar'));
// $newCorporate->files()->updateOrCreate([
// 'type' => 'photo_profile_lms',
// 'name' => File::getFileName('photo_profile_lms', $newCorporate->id, $request->file('avatar')),
// 'extension' => $request->file('avatar')->getClientOriginalExtension(),
// 'path' => $pathFileAvatar,
// 'created_by' => auth()->user()->id,
// 'updated_by' => auth()->user()->id,
// ]);
// }
$data['data'] = [
'status' => 200,
'message' => 'data berhasil di edit',
'error' => 'false'
];
return response()->json($data);
}
/**
@@ -133,4 +169,17 @@ class ProfileController extends Controller
{
//
}
public function changeProfile($id){
$user = User::with('detail')
->where('nID', $id)
->first();
return Helper::responseJson(
data: [
// 'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
}
}

View File

@@ -3,6 +3,7 @@
use Modules\Linksehat\Http\Controllers\Api\AppointmentController;
use Modules\Linksehat\Http\Controllers\Api\AuthController;
use Modules\Linksehat\Http\Controllers\Api\DashboardController;
use Modules\Linksehat\Http\Controllers\Api\AutocompleteController;
use Modules\Linksehat\Http\Controllers\Api\DoctorController;
use Modules\Linksehat\Http\Controllers\Api\HospitalController;
use Modules\Linksehat\Http\Controllers\Api\NotificationTokenController;
@@ -10,6 +11,7 @@ use Modules\Linksehat\Http\Controllers\Api\PersonController;
use Modules\Linksehat\Http\Controllers\Api\ProfileController;
use Modules\Linksehat\Http\Controllers\Api\SearchController;
use Modules\Linksehat\Http\Controllers\Api\SpecialityController;
use Modules\Linksehat\Http\Controllers\Api\LinkingController;
/*
|--------------------------------------------------------------------------
@@ -35,7 +37,11 @@ Route::prefix('linksehat')->group(function () {
Route::post('otp-request', 'otpRequest');
Route::post('mock-otp', 'mockOtp');
Route::post('login', 'login');
Route::post('logout', 'logout');
Route::post('login-phone', 'loginPhone');
Route::post('register', 'register');
Route::post('forget-password', 'forgetPassword');
Route::post('reset-password', 'resetPassword');
Route::get('social-login/{provider}', 'redirectSocialLogin');
Route::get('social-login/{provider}/callback', 'handleSocialLoginCallback');
});
@@ -59,11 +65,22 @@ Route::prefix('linksehat')->group(function () {
Route::middleware('auth:sanctum')->group(function () {
Route::get('profile', [ProfileController::class, 'index'])->name('profile');
Route::get('profile/{id}', [ProfileController::class, 'index'])->name('profile');
Route::get('change-profile/{id}', [ProfileController::class, 'changeProfile'])->name('change-profile');
Route::post('profile', [ProfileController::class, 'update'])->name('profile.update');
Route::post('notification-tokens/delete/{id}', [NotificationTokenController::class, 'destroy'])->name('profile.delete.token');
Route::post('notification-tokens', [NotificationTokenController::class, 'store'])->name('profile.store.token');
Route::apiResource('appointment', AppointmentController::class);
Route::apiResource('families', PersonController::class)->except(['destroy']);
Route::get('autocomplete/marital_status', [AutocompleteController::class, 'maritalStatus']);
Route::get('autocomplete/blood_type', [AutocompleteController::class, 'bloodType']);
Route::get('autocomplete/relationship', [AutocompleteController::class, 'relationship']);
Route::get('autocomplete/corporate', [AutocompleteController::class, 'corporate']);
Route::post('manual-linking', [LinkingController::class, 'linkingValidate']);
Route::get('card/{member_id}', [LinkingController::class, 'card']);
});
});

View File

@@ -0,0 +1,90 @@
<?php
namespace Modules\Linksehat\Transformers\User;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\UserInsurance;
use DB;
class ShowProfileResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
protected $connection = 'oldlms';
public function toArray($request)
{
// Principal
if ($this->detail){
switch ($this->detail->nIDGolonganDarah) {
case 1:
$goldar = 'A';
break;
case 2:
$goldar = 'B';
break;
case 3:
$goldar = 'AB';
break;
case 4:
$goldar = 'O';
break;
default:
$goldar = '-';
break;
}
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
// Marital Status
$maritalStatus = DB::connection('oldlms')->table('tm_status_pernikahan')->where('nID', $this->detail->sMartialStatus)->first('sStatusPernikahan');
// Hubungan Keluarga
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
// dd( $this->detail->nIDGolonganDarah);
$sWeight = $this->detail->sWeight ? $this->detail->sWeight : 0;
$sHeight = $this->detail->sHeight ? $this->detail->sHeight : 0;
$nIDJenisKelamin = $this->detail->nIDJenisKelamin == 1 ? 'Male' : 'Female';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
$goldar = '-';
$relationship = false;
$maritalStatus = false;
$sWeight = 0;
$sHeight = 0;
$nIDJenisKelamin = false;
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
$userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first();
$memberId = Null;
if($userInsurance){
$memberId = $userInsurance->sNoPolis;
}
return [
'id' => $this->nID,
'first_name' => $this->sFirstName,
'last_name' => $this->sLastName,
'date_of_birth' => $this->detail ? $this->detail->dTanggalLahir : null,
'avatar' => $avatar,
'gender' => $nIDJenisKelamin ? $nIDJenisKelamin : '-',
'phone' => $this->sPhone,
'email' => $this->sEmail,
'blood_type' => $goldar,
'marital_status' => $maritalStatus ? $maritalStatus->sStatusPernikahan : '-',
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'weight' => $sWeight,
'height' => $sHeight,
'member_id' => $memberId,
];
}
}

View File

@@ -0,0 +1,174 @@
<?php
namespace Modules\Linksehat\Transformers\User;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\UserInsurance;
use App\Models\Member;
use App\Models\Person;
use App\Models\CorporateEmployee;
use App\Models\Corporate;
use Illuminate\Support\Facades\Auth;
use DB;
class UserProfileResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
protected $connection = 'oldlms';
public function toArray($request)
{
$memberProfile = User::with('detail')->where('nIDUser', $this->nID)->get()->toArray();
$dataMemberProfile = [];
$userInsurance = UserInsurance::where('nIDUser', $this->nID)->get()->first();
$memberId = null;
$linking = false;
if($userInsurance){
$memberId = $userInsurance->sNoPolis;
$linking = true;
} else {
$member = Member::where('email', $this->sEmail)->get()->first();
$person = Person::where('phone', $this->sPhone)->get()->first();
if ($member || $person){ // Autolinking
$corporateEmployee = CorporateEmployee::where('member_id', $member->id)->get()->first(); // cek corporate id empolyee/member
if ($corporateEmployee){
$corporate = Corporate::findOrFail($corporateEmployee->corporate_id)->automatic_linking; // cek autocomplete
if ($corporate){
if($member) {
// Insert into database linksehat
$insurance = UserInsurance::updateOrCreate(
[
'nIDUser' => $this->nID,
],
[
'nIDUser' => $this->nID,
'nIDInsurance' => $_ENV['LINKSEHAT_ASO_INSURANCE_ID'],
'sNoPolis' => $member->member_id,
'sNamaPeserta' => $member->fullName,
'sKartuPeserta' => '',
'sLayanan' => 'RJ,TC',
'dStartDate' => $member->members_effective_date,
'dExpireDate' => $member->members_expire_date,
'dTanggalLahir' => $member->birth_date,
'nNoKTP' => $member->nric != '' ? $member->nric : 0 ,
'sIsConfrimed' => 1,
'sStatus' => 1,
]);
$message = $member->currentPolicy->corporate->welcome_message;
$linking = true;
$memberId = $member->member_id;
}
}
}
}
};
if (count($memberProfile) > 0){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $this->detail->sImage ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $this->nID,
'name' => $this->sFirstName . ' ' . $this->sLastName,
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship ? $relationship->sHubunganKeluarga : '-',
'avatar' => $avatarMember,
];
array_push( $dataMemberProfile, $data);
}
} else {
$nID = $this->nIDUser ? $this->nIDUser : $this->nID;
if ($nID){
$memberProfile = User::with('detail')->where('nIDUser', $nID)->get()->toArray();
$dataMember = User::with('detail')->where('nID', $nID)->get()->first();
if ($this->detail){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
$avatarMember = $dataMember->detail->sImage ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $this->nIDHubunganKeluarga)->first('sHubunganKeluarga');
$dataUser = [
'id' => $dataMember->nID,
'name' => $dataMember->sFirstName . ' ' . $dataMember->sLastName,
'relationship' => 'Me',
'avatar' => $avatarMember
];
array_push($dataMemberProfile, $dataUser);
if (count($memberProfile) > 0){
foreach($memberProfile as $m){
$urlAvatarDefault = $m['detail']['nIDJenisKelamin'] == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
$avatarMember = $m['detail']['sImage'] ?? $urlAvatarDefault;
$relationship = DB::connection('oldlms')->table('tm_hubungan_keluarga')->where('nID', $m['nIDHubunganKeluarga'])->first('sHubunganKeluarga');
$data = [
'id' => $m['nID'],
'name' => $m['full_name'],
'relationship' => $relationship->sHubunganKeluarga,
'avatar' => $avatarMember,
];
array_push( $dataMemberProfile, $data);
}
}
} else {
}
}
// Principal
if ($this->detail){
$urlAvatarDefault = $this->detail->nIDJenisKelamin == 1 ? 'https://linksehat.dev/assets/img/users/male-avatar.png' : 'https://linksehat.dev/assets/img/users/female-avatar.png';
} else {
$urlAvatarDefault = 'https://linksehat.dev/assets/img/users/male-avatar.png';
}
$avatar = $this->detail->sImage ?? $urlAvatarDefault;
return [
'id' => $this->nID,
'full_name' => $this->sFirstName . ' '. $this->sLastName,
'avatar' => $avatar,
'member_type' => $this->nIDUser ? 'Dependent' : 'Principal',
'member_profile' => $dataMemberProfile,
'member_id' => $memberId,
'linking' => $linking,
];
}
}

View File

@@ -1,36 +0,0 @@
<?php
namespace Modules\Linksehat\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
class UserProfileResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'email' => $this->email,
'phone' => $this->phone,
'email_verified_at' => $this->email_verified_at,
'nik' => $this->person->nik ?? null,
'name_prefix' => $this->person->name_prefix ?? null,
'name' => $this->person->name ?? null,
'name_suffix' => $this->person->name_suffix ?? null,
'full_name' => $this->person->full_name ?? null,
'gender' => $this->person->gender ?? null,
'birth_date' => $this->person->birth_date ?? null,
'age' => $this->person->age ?? null,
'is_deceased' => $this->person->is_deceased ?? null,
'deceased_at' => $this->person->deceased_at ?? null,
'marital_status' => $this->person->marital_status ?? null,
'preferred_lang' => $this->meta->preferred_lang ?? 'id',
];
}
}