2 Commits

910 changed files with 52970 additions and 91680 deletions

View File

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

59
.env.example Normal file
View File

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

View File

@@ -2,21 +2,13 @@
namespace Modules\Client\Http\Controllers\Api;
use Illuminate\Support\Facades\DB;
use App\Helpers\Helper;
use App\Models\Claim;
use App\Models\CorporateEmployee;
use App\Models\Icd;
use App\Models\ClaimHistoryCare;
use App\Models\Corporate;
use App\Services\ClaimService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimShowResource;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use Illuminate\Support\Facades\Storage;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class ClaimController extends Controller
{
@@ -28,7 +20,7 @@ class ClaimController extends Controller
{
$claims = $this->claimService->getCountClaimRequestPerStatus($corporate_id);
// dd($claims);
dd($claims);
return Helper::responseJson([
'count_requested' => 0,
@@ -141,124 +133,4 @@ class ClaimController extends Controller
{
//
}
public function export($corporate_id){
$corporate = Corporate::where('id', $corporate_id)->with(['currentPolicy'])->first();
$member_id = CorporateEmployee::where('corporate_id', $corporate_id)->get('member_id')->toArray();
// dd($member_id);
$claim = Claim::whereIn('member_id', $member_id)->with(['member', 'member.plans'])->get();
$data = [];
if (count( $claim) > 0){
$temp = [];
foreach($claim as $c) {
$diagnosis = ClaimHistoryCare::where('claim_id', 34)->with('icd')->get();
$diagnosisName = '';
if (count($diagnosis) > 0){
$tempDiagnosis = [];
foreach($diagnosis as $key => $d){
$diagnosis = Icd::where('id', $d['main_diagnosis_id'])->first();
array_push($tempDiagnosis, $diagnosis->name);
}
$diagnosisName = implode(", ", $tempDiagnosis);
}
$temp['id'] = $c['id'];
$temp['plan_id'] = $c['member']['plans'][0]['code'];
$temp['payor_id'] = $c['member']['payor_id'];
$temp['corporate_id'] = $corporate->name;
$temp['policy_number'] = $corporate->currentPolicy->code;
$temp['member_id'] = $c['member']['member_id'];
$temp['benefit_code'] = $c['benefit_code'];
$temp['benefit_desc'] = $c['benefit_desc'];
$temp['amount_incurred'] = $c['amount_incurred'];
$temp['amount_approved'] = $c['amount_approved'];
$temp['amount_not_approved'] = $c['amount_not_approved'];
$temp['excess_paid'] = $c['excess_paid'];
$temp['diganosis'] = $diagnosisName;
array_push($data, $temp);
}
$headers = [
['value' => 'Plan ID', 'cell' => 'A1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Payor ID', 'cell' => 'B1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Corporate ID', 'cell' => 'C1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Policy Number', 'cell' => 'D1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Member ID', 'cell' => 'E1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Benefit Code', 'cell' => 'F1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Benefit Desc', 'cell' => 'G1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Incurred', 'cell' => 'H1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Approved', 'cell' => 'I1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Amt Not Approved', 'cell' => 'J1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Excess Paid', 'cell' => 'K1', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Diagnosis', 'cell' => 'L1', 'mergeCell' => false, 'mergeToCell' => 'J2'],
];
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
foreach ($headers as $header) {
$sheet->setCellValue($header['cell'], $header['value']);
if ($header['mergeCell'] === true) {
$sheet->mergeCells($header['cell'] . ':' . $header['mergeToCell']);
}
$sheet->getStyle($header['cell'])->getFont()->setBold(true);
$sheet->getStyle($header['cell'])->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
}
$startFrom = 2;
foreach($data as $i => $d){
$sheet->setCellValue('A' . $startFrom, $d['plan_id'] ?? '-');
$sheet->setCellValue('B' . $startFrom, $d['payor_id'] ?? '-');
$sheet->setCellValue('C' . $startFrom, $d['corporate_id'] ?? '-');
$sheet->setCellValue('D' . $startFrom, $d['policy_number'] ?? '-');
$sheet->setCellValue('E' . $startFrom, $d['member_id'] ?? '-');
$sheet->setCellValue('F' . $startFrom, $d['benefit_code'] ?? '-');
$sheet->setCellValue('G' . $startFrom, $d['benefit_desc'] ?? '-');
$sheet->setCellValue('H' . $startFrom, $d['amount_incurred'] ?? '-');
$sheet->setCellValue('I' . $startFrom, $d['amount_approved'] ?? '-');
$sheet->setCellValue('J' . $startFrom, $d['amount_not_approved'] ?? '-');
$sheet->setCellValue('K' . $startFrom, $d['excess_paid'] ?? '-');
$sheet->setCellValue('L' . $startFrom, $d['diganosis'] ?? '-');
$startFrom++;
}
foreach (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K'] as $header) {
if ($header === 'A') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(35, 'px');
} elseif ($header === 'H' || $header === 'I') {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setWidth(100, 'px');
} else {
$spreadsheet->getActiveSheet()->getColumnDimension($header)->setAutoSize(true);
}
}
$spreadsheet->getActiveSheet()->getStyle('A2:A' . $startFrom)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
$sheet->getDefaultRowDimension()->setRowHeight(-1);
$sheet->setTitle('Alarm Center Report');
$writer = new Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$content = ob_get_contents();
ob_end_clean();
$fileName = 'result-' . now()->getPreciseTimestamp(3) . '-alarm-center-report.xlsx';
Storage::disk('public')->put('temp/' . $fileName, $content);
$fileUrl = url('storage/temp/' . $fileName);
return Helper::responseJson([
"file_url" => $fileUrl
]);
}
}
}

View File

@@ -2,275 +2,62 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\ClaimRequest;
use Modules\Client\Transformers\ClaimReport\ShowResources;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;
use App\Models\File;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ClaimReportController extends Controller
{
public function claimStatus($corporateId)
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$requesteds = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->where('status', 'requested')
->get();
$approveds = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->whereHas('claim', fn ($query) => $query->where('status', 'approved'))
->where('status', 'approved')
->get();
$rejecteds = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->whereHas('claim', fn ($query) => $query->where('status', 'declined'))
->where('status', 'approved')
->get();
$disbrusments = ClaimRequest::query()
->whereHas('member', function ($query) use ($corporateId) {
$query->whereHas('employeds', function ($corporateEmployee) use ($corporateId) {
$corporateEmployee->where('corporate_id', $corporateId);
});
})
->whereHas('claim', fn ($query) => $query->where('status', 'disbrusmented'))
->where('status', 'approved')
->get();
return Helper::responseJson([
'requesteds' => count($requesteds),
'approveds' => count($approveds),
'rejecteds' => count($rejecteds),
'disbrusments' => count($disbrusments)
]);
}
public function claimDetail($corporate_id, $claimRequestId)
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$claimRequestId = Crypt::decrypt($claimRequestId);
$status = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.submission_date',
DB::raw('
CASE
WHEN claim_requests.status = "requested" THEN "requested"
WHEN claim_requests.status = "approved" AND claims.status = "approved" THEN "approved"
WHEN claim_requests.status = "approved" AND claims.status = "declined" THEN "declined"
WHEN claim_requests.status = "approved" AND claims.status = "disbrusmented" THEN "disbrusmented"
/*WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "pending"*/
WHEN claim_requests.status = "approved" AND claims.status = "received" THEN "reviewed"
ELSE ""
END AS status
')
)
->first();
$results['status'] = $status;
$timeline = DB::table('claim_logs')
->where('claim_logs.claim_request_id', '=', $claimRequestId)
->select(
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "Request"
WHEN claim_logs.status = "reviewed" THEN "Review"
WHEN claim_logs.status = "approved" THEN "Approval"
WHEN claim_logs.status = "declined" THEN "Decline"
ELSE "-"
END AS txt_status
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#159C9C"
WHEN claim_logs.status = "reviewed" THEN "#0C53B7"
WHEN claim_logs.status = "approved" THEN "#229A16"
WHEN claim_logs.status = "declined" THEN "#FF4842"
ELSE "-"
END AS txt_status_color
'),
DB::raw('
CASE
WHEN claim_logs.status = "requested" THEN "#00AB5529"
WHEN claim_logs.status = "reviewed" THEN "#1890FF29"
WHEN claim_logs.status = "approved" THEN "#54D62C29"
WHEN claim_logs.status = "declined" THEN "#FF48427A"
ELSE "-"
END AS txt_status_backgroundColor
'),
'claim_logs.date',
'claim_logs.description',
'claim_logs.status'
)
->orderBy('claim_logs.id', 'desc')
->get();
$results['timeline'] = $timeline;
$request_files = DB::table('claim_request_files')
->where('claim_request_files.claim_request_id', '=', $claimRequestId)
->select(
'claim_request_files.*',
DB::raw('(SELECT files.fileable_id FROM files WHERE files.fileable_id = claim_request_files.claim_request_id AND files.type = claim_request_files.type LIMIT 1) AS check_files'),
)
->get();
$results['request_files'] = $request_files;
$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);
//
}
public function requestFiles(Request $request, $corporate_id, $claim_id)
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$claim_id = Crypt::decrypt($claim_id);
if ($request->hasFile('fileDiagnosis')) {
foreach ($request->fileDiagnosis as $file) {
$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');
//
}
public function claimDetailHistory($corporate_id, $claimRequestId)
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$claimRequestId = Crypt::decrypt($claimRequestId);
$member = DB::table('claim_requests')
->leftJoin('claims', 'claim_requests.id', '=', 'claims.claim_request_id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->leftJoin('corporate_divisions', 'corporate_employees.division_id', '=', 'corporate_divisions.id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_requests.code','members.member_id', 'members.name'
)
->first();
$results['member'] = $member;
$claim_item = DB::table('claim_items')
->leftJoin('claims','claim_items.claim_id', '=', 'claims.id')
->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id')
->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
'claim_items.nominal_ditagihkan',
'claim_items.nominal_dicover',
'benefits.description',
'claim_requests.submission_date'
)
->orderBy('claim_items.id', 'desc')
->get();
$results['claim_item'] = $claim_item;
$tot_claim_item = DB::table('claim_items')
->leftJoin('claims','claim_items.claim_id', '=', 'claims.id')
->leftJoin('benefits', 'claim_items.claim_itemable_id', '=', 'benefits.id')
->leftJoin('claim_requests', 'claims.claim_request_id', '=', 'claim_requests.id')
->leftJoin('members', 'claim_requests.member_id', '=', 'members.id')
->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
->where('corporate_employees.corporate_id', '=', $corporate_id)
->where('claim_requests.id', '=', $claimRequestId)
->select(
DB::raw('SUM(claim_items.nominal_ditagihkan) AS nominal_ditagihkan'),
DB::raw('SUM(claim_items.nominal_dicover) AS nominal_dicover'),
DB::raw('(SUM(claim_items.nominal_ditagihkan) - SUM(claim_items.nominal_dicover)) AS difference'),
)
->groupBy('claim_items.id')
->orderBy('claim_items.id', 'desc')
->first();
$results['tot_claim_item'] = $tot_claim_item;
return Helper::responseJson($results);
//
}
public function show($corporateId, $claimRequestId)
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$data = ClaimRequest::query()
->with([
'histories:historiable_type,historiable_id,title,description,created_at',
'member:id,person_id,name_prefix,name,name_suffix' => [
'person:id,name_prefix,name,name_suffix,gender'
],
'claim:id,status',
'claimResults',
'claimConditions',
'claimDiagnosis'
])
->find($claimRequestId, ['id', 'submission_date', 'member_id', 'claim_id', 'status']);
return Helper::responseJson(new ShowResources($data));
//
}
}

View File

@@ -1,254 +0,0 @@
<?php
namespace Modules\Client\Http\Controllers\Api;
use App\Events\ClaimRequested;
use App\Helpers\Helper;
use App\Models\File;
use App\Models\Member;
use App\Models\ClaimRequest;
use App\Services\ClaimRequestService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
class ClaimRequestController extends Controller
{
/**
* Display a listing of the resource.
* @return Renderable
*/
private static $code_prefix = '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

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

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

View File

@@ -3,32 +3,18 @@
namespace Modules\Client\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\Member;
use App\Models\Claim;
use App\Models\ClaimRequest;
use App\Models\RequestLog;
use App\Services\CorporateMemberService;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Client\Transformers\ClaimReport\MemberResources as ClaimReportMemberResources;
use Modules\Client\Transformers\AlarmCenter\DataListClaimMemberResource;
use Modules\Client\Transformers\AlarmCenter\DataServiceMonitoring;
use Modules\Client\Transformers\Dashboard\MemberResources as ClaimSubmitMemberResources;
use Modules\Client\Transformers\Dashboard\MemberResources as DashboardMemberResources;
use Modules\Client\Transformers\Dashboard\MemberAlarmCenterResources as DashboardMemberAlarmResources;
use Modules\Client\Transformers\Dashboard\MemberEmployeeDataResources as DashboardMemberEmployeeDataResources;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Modules\Client\Transformers\EmployeeData\UserProfile\DataMemberResource as EmployeeDataProfileMemberResource;
use Modules\Internal\Services\MemberEnrollmentService;
class CorporateMemberController extends Controller
{
public $memberEnrollmentService;
public function __construct(public CorporateMemberService $corporateMemberService, MemberEnrollmentService $memberEnrollmentService)
public function __construct(public CorporateMemberService $corporateMemberService)
{
$this->memberEnrollmentService = $memberEnrollmentService;
}
/**
@@ -38,208 +24,18 @@ class CorporateMemberController extends Controller
public function index(Request $request, $corporate_id)
{
switch ($request->input('type')) {
case 'employee-data':
$members = $this->corporateMemberService->getAllMemberEmployeeData($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberEmployeeDataResources::collection($members)));
case 'claim-report':
$members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members)));
case 'claim-submit':
$members = $this->corporateMemberService->getAllMemberClaimSubmits($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimSubmitMemberResources::collection($members)));
$members = $this->corporateMemberService->getAllMemberClaimReports($corporate_id, $request);
return response()->json(Helper::paginateResources(ClaimReportMemberResources::collection($members)));
case 'alarm-center':
$members = $this->corporateMemberService->getAllMemberAlarmCenter($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members)));
case 'service-monitoring':
$members = $this->corporateMemberService->getAllEncounter($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberAlarmResources::collection($members)));
default:
$members = $this->corporateMemberService->getAllMemberDashboards($corporate_id, $request);
return response()->json(Helper::paginateResources(DashboardMemberResources::collection($members)));
}
}
public function show($corporate_id, $person_id)
{
$data = Member::query()
->with(['person'])
->where('person_id', $person_id)
->whereHas('currentCorporate', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})
->firstOrFail();
// Get Families
$data->families = Member::query()
->with(['person'])
->where('principal_id', $data->member_id)
->get();
return response()->json(EmployeeDataProfileMemberResource::make($data));
}
public function generateMemberList($corporate_id)
{
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Member::with(['currentPlan', 'currentCorporate', 'division', 'employeds', 'currentPolicy'])
// ->filter($request->all())
// ->where('corporate_id', $corporate_id)
->whereHas('employeds', function ($employeds) use ($corporate_id) {
$employeds->where('corporate_id', $corporate_id);
})->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
// Menulis header kolom
$headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [
$item['record_mode'], // Recode Mode
$item['record_type'], // Recode Type
$item['payor_id'], // Payor ID
$item['member_id'], // Member ID
$item['principal_id'], // Mapping ID
NULL, // Link Medis Member ID
$item['current_corporate']['code'] ?? null, // Corporate ID
$item['employeds'][0]['nik'] ?? null, // NIK
$item['division']['code'] ?? null, // Devision
$item['employeds'][0]['branch_code'] ?? null, // Branch Code
$item['bank_info'], // Bank Info
$item['language'], // Language
null, // Type of Work
$item['race'], // Race
$item['current_policy']['code'] ?? null, // Policy Number
$item['marital_status'], // Marital Status
$item['relation_with_principal'], // Relationship
str_replace('-', '', $item['members_effective_date']), // Member effective date
str_replace('-', '', $item['members_expire_date']), // Member expiry date
NULL, // Faskes FKTP (First Level Provider) or Individual preferred provider
NULL, // Faskes FKRTL (Next Level Provider) or Individual group preferred provider
$item['bpjs_class'], // The Right Classes Room of BPJS Participants
NULL, // Name of Faskes
NULL, // Rule BPJSK
NULL, // Internal Use
$item['full_name'], // Member Name
$item['address1'], // Address1
$item['address2'], // Address2
$item['address3'], // Address3
$item['address4'], // Address4
$item['city'], // City
NULL, // State
$item['postal_code'], // Post Code
NULL, // Telephone - Mobile
NULL, // Telephone - Res
NULL, // Telephone - Office
$item['nric'], // NRIC
$item['passport_no'], // Passport No
$item['passport_country'], // Passport Country
$item['email'], // Email
$item['identification_code'], // Identification Code
$item['birth_date'], // Date of Birth
$item['gender_code'], // Sex
NULL, // Internal Use
$item['current_plan']['code'] ?? null, // Plan-ID
NULL, // Employment-Status
NULL, // Internal Use
NULL, // Internal Use
NULL, // Internal Use
str_replace('-', '', $item['terminated_date']), // Date Terminated
$item['pre_existing'], // Pre Existing
$item['bpjs_id'], // BPJS ID
$item['endorsement_date'], // Endorsement Date
$item['remarks'], // Remarks
NULL, // Internal Use
NULL, // Member Since
NULL, // Internal Use
$item['policy_in_force'], // Policy Inforce
NULL, // Member Suspended
str_replace('-', '', $item['activation_date']), // Activation Date
NULL, // Internal Use
$item['start_no_claim'], // StartNoClaim
$item['end_no_claim'], // EndNoClaim
NULL, // Option Mode
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// dd('test');
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
// dd($filePath);
// Mengembalikan response untuk mengunduh file
return Helper::responseJson([
'file_name' => "Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
public function showPerMember(Request $request, $corporate_id, $member_id)
{
$per_page = $request->has('per_page') ? $request->input('per_page') : 10;
$data = Member::query()
->with(['requestLogs'])
->whereHas('currentCorporate', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})
->find($member_id);
return response()->json(['full_name' => $data->full_name ?? null, 'paginations' => Helper::paginateResources(DataListClaimMemberResource::collection($data->requestLogs()->paginate($per_page)))]);
}
public function serviceMonitoring(int $corporate_id, int $request_log_id)
{
$data = RequestLog::query()
->with([
'member:id,member_id,person_id,birth_date,email,name_prefix,name,name_suffix' => [
'currentCorporate',
'person:id,email,name_prefix,name,name_suffix,phone'
],
'organization:id,name',
'requestLogBenefits:id,request_log_id,benefit_id,amount_incurred,amount_approved,amount_not_approved,excess_paid,keterangan' => [
'benefit'
],
'requestLogDailyMonitorings:id,request_log_id,created_at,subject,body_temperature,sistole,diastole,respiration_rate,analysis,lab_date,provider,examination' => [
'requestLogMedicalPlans:request_log_daily_monitoring_id,plan,type'
],
'service:code,name',
])
->find($request_log_id, ['id', 'submission_date', 'discharge_date', 'member_id', 'service_code', 'organization_id']);
$dataBenefit = [];
if (count($data->requestLogBenefits) > 0) {
$totalIncurred = 0;
$totalApprove = 0;
$totalNotApporve = 0;
$totalExcess = 0;
foreach ($data->requestLogBenefits as $itemBenefit) {
$totalIncurred += $itemBenefit->amount_incurred;
$totalApprove += $itemBenefit->amount_approved;
$totalNotApporve += $itemBenefit->amount_not_approved;
$totalExcess += $itemBenefit->excess_paid;
}
$dataBenefit['totalIncurred'] = $totalIncurred;
$dataBenefit['totalApprove'] = $totalApprove;
$dataBenefit['totalNotApprove'] = $totalNotApporve;
$dataBenefit['totalExcess'] = $totalExcess;
}
$data->benefitTotal = $dataBenefit;
return Helper::responseJson(DataServiceMonitoring::make($data));
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,16 +4,10 @@ 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 Modules\Client\Http\Controllers\Api\ClaimReportController;
use Modules\Client\Http\Controllers\Api\ClaimRequestController;
use Modules\Client\Http\Controllers\Api\DataController;
/*
|--------------------------------------------------------------------------
@@ -36,39 +30,19 @@ Route::prefix('client')->group(function () {
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('user', [UserController::class, 'index']);
Route::get('data/{id}', [DataController::class, 'show']);
Route::put('data/{id}', [DataController::class, 'update']);
Route::post('update-family', [DataController::class, 'updateFamily']);
Route::get('corporate-manage', [CorporateManageController::class, 'index']);
Route::get('corporate-manage/{corporate_id}', [CorporateManageController::class, 'show']);
Route::prefix('{corporate_id}')->group(function () {
Route::post('search-member', [MemberController::class, 'index']);
Route::get('policy', [CorporatePolicyController::class, 'index']);
Route::get('division', [CorporateDivisionController::class, 'index']);
Route::get('members', [CorporateMemberController::class, 'index']);
Route::get('members/{id}', [CorporateMemberController::class, 'show']);
Route::get('export-members/list', [CorporateMemberController::class, 'generateMemberList']);
Route::get('alarm-center-members/{id}', [CorporateMemberController::class, 'showPerMember']);
Route::get('service-monitoring/{request_log_id}', [CorporateMemberController::class, 'serviceMonitoring']);
Route::get('claims/status', [ClaimController::class, 'status']);
Route::get('claims', [ClaimController::class, 'index']);
Route::get('claims/export', [ClaimController::class, 'export']);
Route::get('claims/{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');
Route::get('claims/{id}', [ClaimController::class, 'show']);
});
});

View File

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

View File

@@ -1,103 +0,0 @@
<?php
namespace Modules\Client\Transformers\AlarmCenter;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
class DataServiceMonitoring extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
return [
'companyName' => $this->member->currentCorporate->name ?? null,
'serviceCode' => $this->service_code ?? null,
'memberId' => $this->member->member_id ?? null,
'fullName' => $this->member->full_name ?? null,
'dateOfBirth' => $this->member->birth_date ?? null,
'phoneNumber' => $this->person->phone ?? null,
'email' => $this->member->email ?? ($this->member->person->email ?? null),
'serviceName' => $this->service->name ?? ($this->service_code ?? null),
'benefits' => collect($this->requestLogBenefits)->map(function ($requestLogBenefit) {
return [
'amountIncurred' => $requestLogBenefit->amount_incurred,
'amountApproved' => $requestLogBenefit->amount_approved,
'amountNotAprroved' => $requestLogBenefit->amount_not_approved,
'excessPaid' => $requestLogBenefit->excess_paid,
'description' => $requestLogBenefit->keterangan,
'name' => $requestLogBenefit->benefit->description,
];
})->all() ?? null,
'benefitTotal' => $this->benefitTotal ?? null,
'hospital' => $this->organization->name ?? null,
'admissionDate' => $this->submission_date ?? null,
'dischargeDate' => $this->discharge_date ?? null,
'dailyMonitorings' => $this->when($this->service_code === 'IP', collect($this->requestLogDailyMonitorings)
->groupBy(function ($requestLogDailyMonitoring) {
return $requestLogDailyMonitoring->created_at->format('d M Y');
})
->map(function ($groupedItems) {
return collect($groupedItems)
->map(function ($requestLogDailyMonitoring) {
return [
'time' => $requestLogDailyMonitoring->created_at->format('H:i') ?? null,
'status' => 'Done' ?? null,
'subject' => $requestLogDailyMonitoring->subject ?? null,
'bodyTemperature' => $requestLogDailyMonitoring->body_temperature ?? null,
'sistole' => $requestLogDailyMonitoring->sistole . 'mm[Hg]' ?? null,
'diastole' => $requestLogDailyMonitoring->diastole . 'mm[Hg]' ?? null,
'respirationRate' => $requestLogDailyMonitoring->respiration_rate . '/min' ?? null,
'analysis' => $requestLogDailyMonitoring->analysis ?? null,
'complaints' => $requestLogDailyMonitoring->complaints ?? null,
'plans' => $this->when($requestLogDailyMonitoring->requestLogMedicalPlans, collect($requestLogDailyMonitoring->requestLogMedicalPlans)
->map(function ($requestLogMedicalPlan) {
return [
'type' => $requestLogMedicalPlan->type,
'plan' => $requestLogMedicalPlan->plan
];
})
->sortBy('type')
->all()) ?? null,
];
})
->sortByDesc(function ($item) {
return $item['time'];
})
->values();
})
->sortByDesc(function ($groupedItems, $date) {
return Carbon::createFromFormat('d M Y', $date)->format('Y-m-d');
})
->all()) ?? null,
'laboratoriumResults' => $this->whenLoaded('requestLogDailyMonitorings', collect($this->requestLogDailyMonitorings)
->groupBy(function ($requestLogDailyMonitoring) {
return Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y');
})
->map(function ($groupedItems) {
return collect($groupedItems)
->map(function ($requestLogDailyMonitoring) {
return [
'code' => $requestLogDailyMonitoring->code,
'date' => Carbon::parse($requestLogDailyMonitoring->lab_date)->format('d M Y') ?? null,
'examination' => $requestLogDailyMonitoring->examination ?? null,
'location' => $requestLogDailyMonitoring->provider ?? null,
];
})
->sortByDesc(function ($item) {
return $item['code'];
})
->values();
})
->sortByDesc(function ($groupedItems, $date) {
return Carbon::createFromFormat('d M Y', $date)->format('Y-m-d');
})
->all()) ?? null
];
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,28 +0,0 @@
<?php
namespace Modules\Client\Transformers\Dashboard;
use Illuminate\Http\Resources\Json\JsonResource;
class MemberEmployeeDataResources extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'id' => $this->id,
'personId' => $this->person_id,
'memberId' => $this->member_id,
'fullName' => $this->full_name,
// 'service' => $this->service_code,
'start_date' => $this->start_date,
'end_date' => $this->end_date,
'status' => $this->active,
];
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -12,48 +12,33 @@ use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
class AuthController extends Controller
{
public function login(Request $request)
{
$data = [
'email' => $request->email,
'password' => $request->password
];
$validator = Validator::make($request->all(), [
$request->validate([
'email' => 'required|email',
'password' => 'required'
], [
'email.required' => trans('validation.required',['attribute' => 'Email']),
'email.email' => trans('validation.email'),
'password.required' => trans('validation.required',['attribute' => 'Password']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
$user = User::query()
->where('email', $request->email)
->first();
if (!$user) {
return response(['message' => 'User Tidak Ditemukan'], 404);
}
else
{
$user = User::where('email', $request->email)->first();
if (!$user) {
return ApiResponse::apiResponse('Not Found', $data, trans('message.not_found'), 404);
}
if (!Hash::check($request->password, $user->password)) {
return ApiResponse::apiResponse('Bad Request', $data, trans('message.password'), 400);
}
$res_data = [
'user' => $user,
'token' => $user->createToken('app')->plainTextToken
];
return ApiResponse::apiResponse("Success", $res_data, trans('message.success'), 200);
if (!Hash::check($request->password, $user->password)) {
return response(['message' => 'Password Salah'], 403);
}
return response([
'message' => 'Selamat Datang',
'user' => $user,
'token' => $user->createToken('app')->plainTextToken
]);
}
public function logout(Request $request)

View File

@@ -16,9 +16,6 @@ use Illuminate\Routing\Controller;
use Modules\HospitalPortal\Transformers\ClaimRequestResource;
use Modules\HospitalPortal\Transformers\ClaimRequestShowResource;
use PDF;
use Illuminate\Support\Facades\DB;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\Validator;
class ClaimRequestController extends Controller
{
@@ -26,7 +23,6 @@ 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()
@@ -64,93 +60,70 @@ class ClaimRequestController extends Controller
*/
public function store(Request $request)
{
$data = [
'request_logs_id' => $request->request_logs_id,
'member_id' => $request->member_id,
'service_code' => $request->service_code
];
$validator = Validator::make($request->all(), [
'request_logs_id' => 'required',
$request->validate([
'member_id' => 'required',
'service_code' => 'required'
], [
'request_logs_id.required' => trans('Validation.required',['attribute' => 'Request Log ID']),
'member_id.required' => trans('Validation.required',['attribute' => 'Member ID']),
'service_code.required' => trans('Validation.required',['attribute' => 'Service Code'])
'service_code' => 'required|in:OP,IP'
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$check_claim_requests = DB::table('claim_requests')
->where('claim_requests.request_log_id', '=', $request->request_logs_id)
->first();
if(!$check_claim_requests)
{
try {
DB::beginTransaction();
$code = $this->getNextCode();
$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);
}
$member = Member::find($request->member_id);
$newClaimRequest = ClaimRequestService::storeClaimRequest(member: $member, paymentType: 'reimbursement', serviceCode: $request->service_code);
ClaimRequested::dispatch($newClaimRequest);
// Log History
$newClaimRequest->histories()->create([
'title' => 'New Claim Requested',
'description' => "Claim Requested for Member : {$member->member_id} - ({$member->full_name})",
'type' => 'info',
'system_origin' => 'hospital-portal'
]);
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-result', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-result',
'name' => File::getFileName('claim-result', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
else
{
return ApiResponse::apiResponse("Error", $data, trans('Message.already_exists'), 409);
}
}
if ($request->hasFile('diagnosa_files')) {
foreach ($request->diagnosa_files as $file) {
$pathFile = File::storeFile('claim-diagnosis', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-diagnosis',
'name' => File::getFileName('claim-diagnosis', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
if ($request->hasFile('result_files')) {
foreach ($request->result_files as $file) {
$pathFile = File::storeFile('claim-kondisi', $newClaimRequest->id, $file);
$newClaimRequest->files()->updateOrCreate([
'type' => 'claim-kondisi',
'name' => File::getFileName('claim-kondisi', $newClaimRequest->id, $file),
'original_name' => $file->getClientOriginalName(),
'extension' => $file->getClientOriginalExtension(),
'path' => $pathFile,
'created_by' => auth()->user()->id,
'updated_by' => auth()->user()->id,
]);
}
}
return Helper::responseJson(data: $request->toArray(), message: 'Claim Request berhasil ajukan!');
}
/**
@@ -164,8 +137,7 @@ class ClaimRequestController extends Controller
$claimRequest->load([
'histories' => function ($history) {
$history->latest();
},
'files',
}
]);
return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest));
@@ -206,260 +178,16 @@ class ClaimRequestController extends Controller
{
$claimRequest = ClaimRequest::findOrFail($claim_request_id);
$service_code = $claimRequest->service_code;
if ($claimRequest->status != 'approved') {
throw new Exception("Belum Teverifikasi", 1);
}
$member = Member::findOrFail($claimRequest->member_id)
->load([
// 'currentPlan',
'currentPlan' => function ($plan) use ($claim_request_id, $service_code) {
$plan->where('plans.service_code', $service_code);
},
'currentPolicy',
'currentPlan.corporateBenefits',
'currentPlan.corporateBenefits.benefit'
]);
->load(['currentPlan', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']);
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'claimRequest'));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
return $claimRequest;
}
public static function getNextCode()
{
$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

@@ -7,9 +7,6 @@ use App\Models\Member;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use Modules\HospitalPortal\Helpers\ApiResponse;
use Illuminate\Support\Facades\DB;
class MemberController extends Controller
{
@@ -19,103 +16,26 @@ class MemberController extends Controller
*/
public function search(Request $request)
{
$data = [
'no_polis' => $request->no_polis,
'birth_date' => $request->birth_date
];
$validator = Validator::make($request->all(), [
$request->validate([
'no_polis' => 'required',
'birth_date' => 'required'
], [
'no_polis.required' => trans('Validation.required',['attribute' => 'Member ID']),
'birth_date.required' => trans('Validation.required',['attribute' => 'Birth Date']),
]);
if ($validator->fails())
{
return ApiResponse::apiResponse('Bad Request', $data, $validator->errors(), 400);
}
else
{
$members = DB::table('members')
->leftJoin('member_policies', 'member_policies.member_id','=', 'members.member_id')
->leftJoin('persons', 'persons.id', '=', 'members.person_id')
->where('members.member_id', '=', $request->no_polis)
->where('members.birth_date', '=', $request->birth_date)
->select(
'members.id',
'members.name',
'members.member_id',
'member_policies.policy_id',
'persons.nik',
'members.email',
'members.birth_date',
'members.gender',
'members.marital_status',
'members.language',
'members.race',
'members.relation_with_principal')
->first();
if($members)
{
$res_data['members'] = $members;
$benefits = DB::table('member_plans')
->leftJoin('corporate_benefits','corporate_benefits.plan_id', '=', 'member_plans.plan_id')
->leftJoin('benefits', 'benefits.id', '=', 'corporate_benefits.benefit_id')
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
->leftJoin('services', 'services.code', '=', 'plans.service_code')
->where('member_plans.member_id', '=', $members->id)
->select(
'benefits.description',
'benefits.code',
'corporate_benefits.corporate_id',
'plans.service_code'
)
->get();
$res_data['benefits'] = $benefits;
$member = Member::query()
->where('member_id', $request->no_polis)
->where('birth_date', $request->birth_date)
->with(['person', 'currentCorporate',
// 'currentCorporate.corporateServices' => function ($corporateService) {
// $corporateService->where('status', 'active');
// },
// 'currentCorporate.corporateServices.service'
// 'currentPlan.benefits',
// 'currentPlan.corporateBenefit.plan',
'currentPlan.corporateBenefits.benefit'
])
->firstOrFail();
$services = DB::table('member_plans')
->leftJoin('plans', 'plans.id', '=', 'member_plans.plan_id')
->leftJoin('services', 'services.code', '=', 'plans.service_code')
->where('member_plans.member_id', $members->id)
->whereNull('member_plans.deleted_at')
->select('plans.service_code', 'services.name')
->get();
$res_data['services'] = $services;
// Group Services
$groupServices = [];
foreach ($res_data['benefits'] as $benefit) {
$serviceCode = $benefit->service_code;
$groupServices[$serviceCode][] = [
'description' => $benefit->description,
'code' => $benefit->code,
];
}
$res_data['groupServices'] = $groupServices;
$res_data['type'] = $request->type;
// Provider
$providers = DB::table('organizations')
->where('organizations.type', '=', 'hospital')
->select(
'organizations.id',
'organizations.name'
)
->get();
$res_data['providers'] = $providers;
return ApiResponse::apiResponse("Success", $res_data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse("Data Not Found", $data, trans('Message.not_found'), 404);
}
}
return Helper::responseJson($member);
}
}

View File

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

View File

@@ -0,0 +1,565 @@
<?php
namespace Modules\HospitalPortal\Http\Controllers\Api;
use App\Models\Benefit;
use App\Models\CorporateBenefit;
use App\Models\Member;
use App\Models\MemberPlan;
use App\Models\Organization;
use App\Models\Provider;
use App\Models\RequestLog;
use App\Models\RequestLogBenefit;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use PDF;
use Throwable;
class ProviderOnlineController extends Controller
{
public function getHeaderKey(Request $request)
{
$request->validate([
'username' => 'required|string',
'password' => 'required|string',
'kodeprovider' => 'required|string',
]);
$organization = Organization::query()->where('code', $request->kodeprovider)->first();
if (!$organization) {
return $this->headerError('Kode provider tidak ditemukan');
}
$provider = Provider::query()->firstOrNew([
'organization_id' => $organization->id,
'username' => $request->username,
]);
if ($provider->exists) {
$isPasswordValid = Hash::check($request->password, $provider->password) || $provider->password === $request->password;
if (!$isPasswordValid) {
return $this->headerError('Username atau password tidak valid');
}
} else {
$provider->password = Hash::make($request->password);
}
$provider->code = $request->kodeprovider;
$provider->status = 'active';
$provider->header_token = Str::random(64);
$provider->token = Str::random(64);
$provider->save();
return response()->json([
'header-token' => $provider->header_token,
'userid' => $provider->id,
'usertoken' => $provider->token,
'kodeprovider' => $organization->code,
'namaprovider' => $organization->name,
'errornumber' => 0,
'messagestring' => 'Success',
]);
}
public function checkEligibilitasPeserta(Request $request)
{
$request->validate([
'nokartu' => 'required|string',
'kodeprovider' => 'required|string',
'p_user_no' => 'required',
'p_token' => 'required|string',
]);
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
if ($authError) {
return $authError;
}
$member = Member::query()
->with(['person', 'currentCorporate', 'currentPolicy', 'memberPlans.plan'])
->where('member_id', $request->nokartu)
->first();
if (!$member) {
return $this->statusError('Peserta tidak ditemukan');
}
$benefits = $member->memberPlans
->map(function (MemberPlan $memberPlan) {
$plan = $memberPlan->plan;
if (!$plan) {
return null;
}
return [
'kodebenefit' => $plan->code,
'namabenefit' => $plan->corporate_plan_id,
'planid' => $plan->code,
];
})
->filter()
->values();
return response()->json([
'Status' => $this->okStatus(),
'Data' => [
'nokartu' => $member->member_id,
'memberid' => (string) $member->id,
'namapeserta' => $member->full_name,
'nomorbpjs' => $member->bpjs_id,
'jeniskelamin' => $member->gender_code,
'tanggallahir' => $this->isoDate($member->birth_date),
'hubungankeluarga' => $member->relation_with_principal,
'namaperusahaan' => optional($member->currentCorporate)->name,
'pesertavip' => 'N',
'namapenjamin' => optional($organization)->name,
'nomorpolis' => optional($member->currentPolicy)->code,
'tglmulaipolis' => $this->isoDate(optional($member->currentPolicy)->start),
'tglberakhirpolis' => $this->isoDate(optional($member->currentPolicy)->end),
'phone' => optional($member->person)->phone,
'email' => $member->email,
],
'Benefit' => $benefits,
]);
}
public function createPendaftaran(Request $request)
{
$request->validate([
'kodeprovider' => 'required|string',
'kodebenefit' => 'required|string',
'statusrujukan' => 'nullable|string',
'nomorrujukan' => 'nullable|string',
'keterangan' => 'nullable|string',
'nomorsep' => 'nullable|string',
'nokartu' => 'required|string',
'kelaskamar' => 'nullable|string',
'cobbpjs' => 'nullable|numeric',
'notransaksiprovider' => 'nullable|string',
'inacbgscode' => 'nullable|string',
'inacbgsamount' => 'nullable|numeric',
'p_user_no' => 'required',
'p_token' => 'required|string',
]);
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
if ($authError) {
return $authError;
}
$member = Member::query()
->with(['person', 'currentCorporate', 'currentPolicy'])
->where('member_id', $request->nokartu)
->first();
if (!$member) {
return $this->statusError('Peserta tidak ditemukan');
}
$plan = $this->resolvePlan($member, $request->kodebenefit);
$requestLog = RequestLog::query()->create([
'organization_id' => $organization->id,
'member_id' => $member->id,
'plan_id' => optional($plan)->id,
'policy_id' => optional($member->currentPolicy)->id ?? 0,
'payment_type' => 'cashless',
'service_code' => $request->kodebenefit,
'type_of_member' => 'member',
'status' => 'approved',
'source' => 'api',
'keterangan' => $request->keterangan,
'hak_kamar_pasien' => $request->kelaskamar ?? '',
'penempatan_kamar' => $request->kelaskamar,
'total_cob' => $request->cobbpjs,
'nominal' => 0,
'import_system' => 0,
'nomor_sep' => $request->nomorsep,
'inacbgs_code' => $request->inacbgscode,
'inacbgs_amount' => $request->inacbgsamount,
'no_transaksi_provider' => $request->notransaksiprovider,
'diagnosis' => '',
'reason' => '',
'reason_final' => '',
'catatan' => '',
'nomor_rujukan' => $request->nomorrujukan,
'status_rujukan' => $request->statusrujukan,
'submission_date' => now(),
'admission_date' => now(),
]);
$limitSubBenefit = collect();
if ($plan) {
$limitSubBenefit = CorporateBenefit::query()
->with('benefit')
->where('plan_id', $plan->id)
->get()
->map(function (CorporateBenefit $corporateBenefit) {
return [
'kodesubbenefit' => optional($corporateBenefit->benefit)->code,
'namasubbenefit' => optional($corporateBenefit->benefit)->description,
'batasan' => (string) ($corporateBenefit->limit_amount ?? 0),
];
});
}
return response()->json([
'Status' => $this->okStatus(),
'Data' => [[
'noklaim' => $requestLog->code,
'namapeserta' => $member->full_name,
'tanggallahir' => $this->isoDate($member->birth_date),
'nokartu' => $member->member_id,
'nopolis' => optional($member->currentPolicy)->code,
'nobpjs' => $member->bpjs_id,
'nosep' => $requestLog->nomor_sep,
'nomorrujukan' => $requestLog->nomor_rujukan,
'planid' => optional($plan)->code,
'masapolis' => optional($member->currentPolicy)->end ? Carbon::parse($member->currentPolicy->end)->format('d/m/Y') : null,
'namaperusahaan' => optional($member->currentCorporate)->name,
'namapenjamin' => $organization->name,
'tanggalmasuk' => $this->isoDate($requestLog->admission_date),
'tanggalkeluar' => $this->isoDate($requestLog->discharge_date),
'hakkamar' => $requestLog->penempatan_kamar,
'hakicu' => null,
'nosuratjaminan' => $requestLog->code,
'namapegawai' => null,
'namabenefit' => optional($plan)->corporate_plan_id,
'kodediagnosa' => $requestLog->diagnosis,
'keterangan' => $requestLog->keterangan,
'catatanTC1' => null,
'catatanTC2' => null,
'catatanTC3' => null,
'catatanTC4' => null,
'catatanTC5' => null,
'catatanTC6' => null,
'catatanTC7' => null,
'catatanTC8' => null,
'catatanTC9' => null,
'catatanTC10' => null,
'statusrujukan' => $requestLog->status_rujukan,
'statusklaim' => 0,
'notransaksiprovider' => $requestLog->no_transaksi_provider,
'inacbgscode' => $requestLog->inacbgs_code,
'inacbgsamount' => (float) ($requestLog->inacbgs_amount ?? 0),
]],
'LimitSubBenefit' => $limitSubBenefit->values(),
]);
}
public function createPengesahan(Request $request)
{
$request->validate([
'noklaim' => 'required|string',
'kodeprovider' => 'required|string',
'tanggalkeluar' => 'nullable|date',
'kodediagnosa' => 'nullable|string',
'inacbgscode' => 'nullable|string',
'inacbgsamount' => 'nullable|numeric',
'daftarbiaya' => 'nullable|array',
'daftarbiaya.*.kodesubbenefit' => 'required_with:daftarbiaya|string',
'daftarbiaya.*.biayaaju' => 'required_with:daftarbiaya|numeric',
'p_user_no' => 'required',
'p_token' => 'required|string',
]);
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
if ($authError) {
return $authError;
}
$requestLog = RequestLog::query()
->with(['member.person', 'member.currentCorporate', 'member.currentPolicy', 'plan'])
->where('code', $request->noklaim)
->where('organization_id', $organization->id)
->first();
if (!$requestLog) {
return $this->statusError('Nomor klaim tidak ditemukan');
}
$requestLog->update([
'status_final_log' => 'approve',
'final_log' => true,
'discharge_date' => $request->tanggalkeluar,
'diagnosis' => $request->kodediagnosa,
'inacbgs_code' => $request->inacbgscode ?? $requestLog->inacbgs_code,
'inacbgs_amount' => $request->inacbgsamount ?? $requestLog->inacbgs_amount,
]);
foreach (($request->daftarbiaya ?? []) as $biaya) {
$benefit = Benefit::query()->where('code', $biaya['kodesubbenefit'])->first();
if (!$benefit) {
continue;
}
RequestLogBenefit::query()->updateOrCreate(
[
'request_log_id' => $requestLog->id,
'benefit_id' => $benefit->id,
],
[
'amount_incurred' => $biaya['biayaaju'],
'amount_approved' => 0,
'amount_not_approved' => 0,
'excess_paid' => 0,
'keterangan' => null,
]
);
}
$requestLog->load(['requestLogBenefits.benefit']);
$biayaResponse = $requestLog->requestLogBenefits->map(function (RequestLogBenefit $requestLogBenefit) use ($requestLog) {
return [
'noklaim' => $requestLog->code,
'kodesubbenefit' => optional($requestLogBenefit->benefit)->code,
'namasubbenefit' => optional($requestLogBenefit->benefit)->description,
'kodebenefit' => optional($requestLog->plan)->code,
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
'biayaaju' => (float) ($requestLogBenefit->amount_incurred ?? 0),
'jaminanasuransi' => (float) ($requestLogBenefit->amount_approved ?? 0),
'jaminanpeserta' => (float) ($requestLogBenefit->excess_paid ?? 0),
'keterangan' => $requestLogBenefit->keterangan,
];
})->values();
return response()->json([
'Status' => $this->okStatus(),
'Data' => [[
'noklaim' => $requestLog->code,
'namapeserta' => optional($requestLog->member)->full_name,
'tanggallahir' => $this->isoDate(optional($requestLog->member)->birth_date),
'nokartu' => optional($requestLog->member)->member_id,
'nopolis' => optional(optional($requestLog->member)->currentPolicy)->code,
'nobpjs' => optional($requestLog->member)->bpjs_id,
'nosep' => $requestLog->nomor_sep,
'nomorrujukan' => $requestLog->nomor_rujukan,
'planid' => optional($requestLog->plan)->code,
'masapolis' => optional(optional($requestLog->member)->currentPolicy)->end ? Carbon::parse($requestLog->member->currentPolicy->end)->format('d/m/Y') : null,
'namaperusahaan' => optional(optional($requestLog->member)->currentCorporate)->name,
'namapenjamin' => $organization->name,
'tanggalmasuk' => $this->isoDate($requestLog->admission_date),
'tanggalkeluar' => $this->isoDate($requestLog->discharge_date),
'hakkamar' => $requestLog->penempatan_kamar,
'hakicu' => null,
'nosuratjaminan' => $requestLog->code,
'namapegawai' => null,
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
'kodediagnosa' => $requestLog->diagnosis,
'keterangan' => $requestLog->keterangan,
'catatanTC1' => null,
'catatanTC2' => null,
'catatanTC3' => null,
'catatanTC4' => null,
'catatanTC5' => null,
'catatanTC6' => null,
'catatanTC7' => null,
'catatanTC8' => null,
'catatanTC9' => null,
'catatanTC10' => null,
'statusrujukan' => $requestLog->status_rujukan,
'statusklaim' => 0,
'notransaksiprovider' => $requestLog->no_transaksi_provider,
'inacbgscode' => $requestLog->inacbgs_code,
'inacbgsamount' => (float) ($requestLog->inacbgs_amount ?? 0),
]],
'Biaya' => $biayaResponse,
]);
}
public function getRincianBiayaKlaim(Request $request)
{
$request->validate([
'noklaim' => 'required|string',
'kodeprovider' => 'required|string',
'p_user_no' => 'required',
'p_token' => 'required|string',
]);
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
if ($authError) {
return $authError;
}
$requestLog = RequestLog::query()
->with(['plan', 'requestLogBenefits.benefit'])
->where('code', $request->noklaim)
->where('organization_id', $organization->id)
->first();
if (!$requestLog) {
return $this->statusError('Nomor klaim tidak ditemukan');
}
$biaya = $requestLog->requestLogBenefits->map(function (RequestLogBenefit $requestLogBenefit) use ($requestLog) {
return [
'noklaim' => $requestLog->code,
'kodesubbenefit' => optional($requestLogBenefit->benefit)->code,
'namasubbenefit' => optional($requestLogBenefit->benefit)->description,
'kodebenefit' => optional($requestLog->plan)->code,
'namabenefit' => optional($requestLog->plan)->corporate_plan_id,
'biayaaju' => (float) ($requestLogBenefit->amount_incurred ?? 0),
'jaminanasuransi' => (float) ($requestLogBenefit->amount_approved ?? 0),
'jaminanpeserta' => (float) ($requestLogBenefit->excess_paid ?? 0),
'keterangan' => $requestLogBenefit->keterangan,
];
})->values();
return response()->json([
'Status' => $this->okStatus(),
'Data' => [
'noklaim' => $requestLog->code,
'kodeprovider' => $organization->code,
'nosep' => $requestLog->nomor_sep,
'keterangan' => $requestLog->keterangan,
'statusklaim' => $requestLog->status,
],
'Biaya' => $biaya,
]);
}
public function downloadStrukPendaftaran(Request $request)
{
$request->validate([
'noklaim' => 'required|string',
'kodeprovider' => 'required|string',
'p_user_no' => 'required',
'p_token' => 'required|string',
]);
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
if ($authError) {
return $authError;
}
$requestLog = RequestLog::query()->where('code', $request->noklaim)->where('organization_id', $organization->id)->first();
if (!$requestLog) {
return $this->statusError('Nomor klaim tidak ditemukan');
}
$member = Member::findOrFail($requestLog->member_id)
->load(['currentPlan', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']);
$dateOfAdmission = $requestLog->admission_date ? Carbon::parse($requestLog->admission_date) : now();
try {
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'dateOfAdmission'));
return $pdf->download('Struk-Pendaftaran-' . $requestLog->code . '.pdf');
} catch (Throwable $e) {
return $this->statusError('Gagal generate PDF struk pendaftaran: ' . $e->getMessage(), 500);
}
}
public function downloadStrukPengesahan(Request $request)
{
$request->validate([
'noklaim' => 'required|string',
'kodeprovider' => 'required|string',
'p_user_no' => 'required',
'p_token' => 'required|string',
]);
[$provider, $organization, $authError] = $this->resolveProvider($request->kodeprovider, $request->p_user_no, $request->p_token);
if ($authError) {
return $authError;
}
$requestLog = RequestLog::query()->where('code', $request->noklaim)->where('organization_id', $organization->id)->first();
if (!$requestLog) {
return $this->statusError('Nomor klaim tidak ditemukan');
}
$member = Member::findOrFail($requestLog->member_id)
->load(['currentPlan', 'currentPolicy', 'currentPlan.corporateBenefits', 'currentPlan.corporateBenefits.benefit']);
$dateOfAdmission = $requestLog->discharge_date ? Carbon::parse($requestLog->discharge_date) : now();
try {
$pdf = PDF::loadView('pdf.guaranted_leter', compact('member', 'dateOfAdmission'));
return $pdf->download('Struk-Pengesahan-' . $requestLog->code . '.pdf');
} catch (Throwable $e) {
return $this->statusError('Gagal generate PDF struk pengesahan: ' . $e->getMessage(), 500);
}
}
private function resolveProvider(string $kodeProvider, $userId, string $token): array
{
$organization = Organization::query()->where('code', $kodeProvider)->first();
if (!$organization) {
return [null, null, $this->statusError('Kode provider tidak ditemukan')];
}
$provider = Provider::query()
->where('id', $userId)
->where('organization_id', $organization->id)
->where('code', $kodeProvider)
->where('status', 'active')
->first();
if (!$provider) {
return [null, null, $this->statusError('User provider tidak ditemukan')];
}
if ((string) $provider->token !== (string) $token) {
return [null, null, $this->statusError('Token tidak valid')];
}
return [$provider, $organization, null];
}
private function resolvePlan(Member $member, string $serviceCode)
{
$memberPlan = $member->memberPlans()->with('plan')
->where('status', 'active')
->orderByDesc('id')
->get()
->first(function (MemberPlan $item) use ($serviceCode) {
return optional($item->plan)->service_code === $serviceCode;
});
if ($memberPlan && $memberPlan->plan) {
return $memberPlan->plan;
}
return optional($member->memberPlans()->with('plan')->orderByDesc('id')->first())->plan;
}
private function okStatus(): array
{
return [
'errornumber' => 0,
'messagestring' => 'Success',
];
}
private function statusError(string $message, int $statusCode = 400)
{
return response()->json([
'Status' => [
'errornumber' => 1,
'messagestring' => $message,
],
'Data' => null,
], $statusCode);
}
private function headerError(string $message, int $statusCode = 400)
{
return response()->json([
'header-token' => null,
'userid' => 0,
'usertoken' => null,
'kodeprovider' => null,
'namaprovider' => null,
'errornumber' => 1,
'messagestring' => $message,
], $statusCode);
}
private function isoDate($date): ?string
{
if (empty($date)) {
return null;
}
return Carbon::parse($date)->toISOString();
}
}

View File

@@ -1,754 +0,0 @@
<?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;
use Dompdf\Dompdf;
use Dompdf\Options;
use Illuminate\Support\Facades\View;
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,
'organization_id' => $request->organization_id,
'organization_name' => $request->organization_name,
'address_provider' => $request->address_provider
];
$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($request->organization_id)
{
$validator = Validator::make($request->all(), [
'organization_id' => 'required',
'member_id' => 'required',
'service_code' => 'required'
], [
'organization_id.required' => trans('Validation.required',['attribute' => 'Provider ID']),
'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
{
//insert data to organization
try {
if(!$request->organization_id)
{
// Memulai transaksi
DB::beginTransaction();
// Membuat singkatan dari nama rumah sakit
$singkatan = "";
$words = explode(' ', $request->organization_name);
foreach ($words as $word) {
$singkatan .= strtoupper(substr($word, 0, 1));
}
// Membuat kode organisasi
$kodeOrganisasi = "ORG000" . $singkatan;
// Insert data ke tabel organizations
$organization_id = DB::table('organizations')
->insertGetId([
'name' => $request->organization_name,
'code' => $kodeOrganisasi,
'type' => 'hospital',
'created_at' => now(),
'created_by' => auth()->user()->id
]);
// Insert data ke tabel addresses
$address_id = DB::table('addresses')
->insertGetId([
'text'=> $request->address_provider,
'addressable_type' => 'App\Models\Organization',
'addressable_id' => $organization_id,
'type' => 'hospital',
'created_at' => now(),
'created_by' => auth()->user()->id
]);
// Update main_address_id di tabel organizations
DB::table('organizations')
->where('organizations.id', '=', $organization_id)
->update(['main_address_id' => $address_id]);
// Commit transaksi
DB::commit();
$request->merge(['organization_id' => $organization_id]);
}
$requestLogControllerInstance = new PrimeCenterRequestLog();
$response = $requestLogControllerInstance->createNew($request);
if($response->original['statusCode'] == 200)
{
//send email
// Insert data notifications
$emailTo = 'alarm.center@linksehat.com';
$dataNotif = [
'email' => $emailTo,
'title' => 'Request LOG',
'description' => 'Request LOG from Hospital Portal',
'type' => 1,
'isUnRead' => true,
'created_by' => auth()->user()->id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$sendNotif = Helper::insertNotification($dataNotif);
// Send Email after insert notifications
if($sendNotif)
{
//send to alarm
$nameTo = 'Admin LinkSehat';
$dataEmail = [
'email' => $emailTo,
'name' => $nameTo,
'subject' => 'Request LOG from Hospital Portal'. ' '.date('Y-m-d H:i:s'),
'body' => View::make('email/notif_email', ['name' => $nameTo, 'link' => 'https://primecenter.linksehat.com/'])->render(),
];
Helper::sendEmail($dataEmail);
}
return ApiResponse::apiResponse("Success", $data, trans('Message.success'), 200);
}
else
{
return ApiResponse::apiResponse('Server Error', $data, trans('Message.server_error'), 500);
}
} catch (\Exception $e) {
// Rollback transaksi jika terjadi kesalahan
DB::rollBack();
// Handle error, bisa di-log atau dikembalikan sebagai response
return ApiResponse::apiResponse('Server Error', $data, $e->getMessage(), 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.member_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
'),
DB::raw('
(SELECT organizations.name FROM organizations WHERE organizations.id = request_logs.organization_id LIMIT 1) AS provider
'),
'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 organizations.name FROM organizations WHERE organizations.id = request_logs.organization_id LIMIT 1) AS provider
'),
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();
//send email
// Insert data notifications
$emailTo = 'alarm.center@linksehat.com';
$dataNotif = [
'email' => $emailTo,
'title' => 'Request Final LOG',
'description' => 'Request Final LOG from Hospital Portal',
'type' => 1,
'isUnRead' => true,
'created_by' => auth()->user()->id,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
];
$sendNotif = Helper::insertNotification($dataNotif);
// Send Email after insert notifications
if($sendNotif)
{
//send to alarm
$nameTo = 'Admin LinkSehat';
$dataEmail = [
'email' => $emailTo,
'name' => $nameTo,
'subject' => 'Request Final LOG from Hospital Portal'. ' '.date('Y-m-d H:i:s'),
'body' => View::make('email/notif_email', ['name' => $nameTo, 'link' => 'https://primecenter.linksehat.com/'])->render(),
];
Helper::sendEmail($dataEmail);
}
return ApiResponse::apiResponse('Success', $data, trans('Message.success'), 200);
}
catch (\Exception $e) {
DB::rollback();
return ApiResponse::apiResponse("Error", $data, $e->getMessage(), 500);
}
}
}
public function downlodLog($request_log_id)
{
$dataRequestLog = DB::table('request_logs')
->where('request_logs.id', '=', $request_log_id)
->first();
$data['dataRequestLog'] = $dataRequestLog;
$dataMember = DB::table('members')
->where('members.id', '=', $dataRequestLog->member_id)
->select(
'members.nric',
'members.id',
'members.principal_id',
'members.name',
'members.birth_date',
'members.member_id',
'members.gender',
DB::raw('
(Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik
'),
DB::raw('
"LinkSehat" AS penjamin
'),
DB::raw('
(Select corporates.name FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS nama_perusahaan
'),
DB::raw('
(Select corporates.id FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS id_perusahaan
'),
DB::raw('
(Select corporates.code FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS code_perusahaan
'),
DB::raw('
(Select services.name FROM services
WHERE services.code = "'.$dataRequestLog->service_code.'" LIMIT 1) AS jenis_perwatan
'),
DB::raw('
(Select member_policies.policy_id FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS no_polis
'),
DB::raw('
(Select member_policies.status FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS status_polis
'),
DB::raw('
(Select plans.code FROM member_plans
LEFT JOIN plans ON plans.id = member_plans.plan_id
WHERE member_plans.member_id = members.id AND plans.service_code = "'.$dataRequestLog->service_code.'" LIMIT 1) AS code_plan
'),
DB::raw('
(Select plans.limit_rules FROM member_plans
LEFT JOIN plans ON plans.id = member_plans.plan_id
WHERE member_plans.member_id = members.id LIMIT 1) AS limit_rules
'),
DB::raw('
"IDR" AS mata_uang
'),
'members.members_effective_date AS mulai',
'members.members_expire_date AS akhir'
)
->first();
$data['namaKaryawan'] = '';
if($dataMember->principal_id)
{
$dataNamaKaryawan = DB::table('members')
->where('members.member_id', '=', $dataMember->principal_id)
->select('members.name')
->first();
$data['namaKaryawan'] = $dataNamaKaryawan->name;
}
else{
$data['namaKaryawan'] = $dataMember->name;
}
$data['dataMember'] = $dataMember;
$data['request_logs'] = $dataRequestLog;
$dataRumahSakit = DB::table('organizations')
->leftJoin('addresses', 'addresses.addressable_id', '=', 'organizations.id')
->where('organizations.id', '=', $dataRequestLog->organization_id)
->where('addresses.addressable_type', '=', 'App\Models\Organization')
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit')
->first();
$data['rumahSakit'] = $dataRumahSakit;
$logoPerusahaan = DB::table('files')
->leftJoin('corporate_employees', 'corporate_employees.corporate_id', '=', 'files.fileable_id')
->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id')
->where('corporate_employees.member_id', '=', $dataMember->id)
->where('files.fileable_type', '=', 'App\Models\Corporate')
->select('files.path', 'corporates.code', 'corporates.name')
->orderBy('files.id', 'desc')
->first();
$data['logoPerusahaan'] = $logoPerusahaan;
$signatureDr = DB::table('signatures')
->leftJoin('corporate_manager', 'corporate_manager.user_id', '=', 'signatures.user_id')
->leftJoin('files', 'files.fileable_id', '=', 'signatures.id')
->where('files.fileable_type', '=', 'App\Models\Signature')
->where('signatures.type', '=', 1)
->where('corporate_manager.corporate_id', '=', $dataMember->id_perusahaan)
->select('files.path')
->first();
$data['signatureDr'] = $signatureDr;
$signatureAd = DB::table('signatures')
->leftJoin('files', 'files.fileable_id', '=', 'signatures.id')
->where('files.fileable_type', '=', 'App\Models\Signature')
->where('signatures.type', '=', 2)
->where('signatures.user_id', '=', $dataRequestLog->approved_by)
->select(
'files.path',
DB::raw('
(Select persons.name FROM users
LEFT JOIN persons ON users.person_id = persons.id
WHERE users.id = "'.$dataRequestLog->approved_by.'" LIMIT 1) AS name_approve
')
)
->first();
$data['signatureAd'] = $signatureAd;
$pdf = new Dompdf();
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set(['isRemoteEnabled' => true]);
$pdf->setOptions($options);
$pdf->setPaper('A4', 'portrait');
// Halaman 1
$html1 = view('pdf.req_log_page_1', $data);
// Halaman 2
// $html2 = view('pdf.req_log_page_2', $data);
// Gabung konten HTML dari dua tampilan
// $htmlCombined = $html1 . $html2;
$htmlCombined = $html1;
$pdf->loadHtml($htmlCombined);
$pdf->render();
$headers = [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="file.pdf"',
];
return response($pdf->output(), 200, $headers);
}
public function downlodFinalLog($request_log_id)
{
$dataRequestLog = DB::table('request_logs')
->where('request_logs.id', '=', $request_log_id)
->first();
$data['dataRequestLog'] = $dataRequestLog;
$dataMember = DB::table('members')
->where('members.id', '=', $dataRequestLog->member_id)
->select(
'members.nric',
'members.id',
'members.principal_id',
'members.name',
'members.birth_date',
'members.member_id',
'members.gender',
DB::raw('
(Select persons.nik FROM persons WHERE persons.id = members.person_id LIMIT 1) AS nik
'),
DB::raw('
"LinkSehat" AS penjamin
'),
DB::raw('
(Select corporates.name FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS nama_perusahaan
'),
DB::raw('
(Select corporates.id FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS id_perusahaan
'),
DB::raw('
(Select corporates.code FROM corporates
LEFT JOIN corporate_employees ON corporate_employees.corporate_id = corporates.id
WHERE corporate_employees.member_id = members.id LIMIT 1) AS code_perusahaan
'),
DB::raw('
(Select services.name FROM services
WHERE services.code = "'.$dataRequestLog->service_code.'" LIMIT 1) AS jenis_perwatan
'),
DB::raw('
(Select member_policies.policy_id FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS no_polis
'),
DB::raw('
(Select member_policies.status FROM member_policies WHERE member_policies.member_id = members.member_id LIMIT 1) AS status_polis
'),
DB::raw('
(Select plans.code FROM member_plans
LEFT JOIN plans ON plans.id = member_plans.plan_id
WHERE member_plans.member_id = members.id AND plans.service_code = "'.$dataRequestLog->service_code.'" LIMIT 1) AS code_plan
'),
DB::raw('
(Select plans.limit_rules FROM member_plans
LEFT JOIN plans ON plans.id = member_plans.plan_id
WHERE member_plans.member_id = members.id LIMIT 1) AS limit_rules
'),
DB::raw('
"IDR" AS mata_uang
'),
'members.members_effective_date AS mulai',
'members.members_expire_date AS akhir'
)
->first();
$data['namaKaryawan'] = '';
if($dataMember->principal_id)
{
$dataNamaKaryawan = DB::table('members')
->where('members.member_id', '=', $dataMember->principal_id)
->select('members.name')
->limit(1)
->first();
$data['namaKaryawan'] = $dataNamaKaryawan->name;
}
else{
$data['namaKaryawan'] = $dataMember->name;
}
$data['dataMember'] = $dataMember;
$data['request_logs'] = $dataRequestLog;
$dataClaimLog = DB::table('request_log_benefits')
->where('request_log_benefits.request_log_id', '=', $request_log_id)
->select(
'*',
DB::raw('
(Select benefits.description FROM benefits
WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS benfit
'),
DB::raw('
(Select benefits.code FROM benefits
WHERE benefits.id = request_log_benefits.benefit_id LIMIT 1) AS code
')
)
->get();
$data['dataClaimLog'] = $dataClaimLog;
$dataRumahSakit = DB::table('organizations')
->leftJoin('addresses', 'addresses.addressable_id', '=', 'organizations.id')
->where('organizations.id', '=', $dataRequestLog->organization_id)
->where('addresses.addressable_type', '=', 'App\Models\Organization')
->select('organizations.name AS nama_rumahsakit', 'addresses.text AS alamat_rumahsakit')
->first();
$data['rumahSakit'] = $dataRumahSakit;
$logoPerusahaan = DB::table('files')
->leftJoin('corporate_employees', 'corporate_employees.corporate_id', '=', 'files.fileable_id')
->leftJoin('corporates', 'corporate_employees.corporate_id', '=', 'corporates.id')
->where('corporate_employees.member_id', '=', $dataMember->id)
->where('files.fileable_type', '=', 'App\Models\Corporate')
->select('files.path', 'corporates.code', 'corporates.name')
->orderBy('files.id', 'desc')
->first();
$data['logoPerusahaan'] = $logoPerusahaan;
$signatureDr = DB::table('signatures')
->leftJoin('corporate_manager', 'corporate_manager.user_id', '=', 'signatures.user_id')
->leftJoin('files', 'files.fileable_id', '=', 'signatures.id')
->where('files.fileable_type', '=', 'App\Models\Signature')
->where('signatures.type', '=', 1)
->where('corporate_manager.corporate_id', '=', $dataMember->id_perusahaan)
->select('files.path')
->first();
$data['signatureDr'] = $signatureDr;
$signatureAd = DB::table('signatures')
->leftJoin('files', 'files.fileable_id', '=', 'signatures.id')
->where('files.fileable_type', '=', 'App\Models\Signature')
->where('signatures.type', '=', 2)
->where('signatures.user_id', '=', $dataRequestLog->approved_by)
->select(
'files.path',
DB::raw('
(Select persons.name FROM users
LEFT JOIN persons ON users.person_id = persons.id
WHERE users.id = "'.$dataRequestLog->approved_by.'" LIMIT 1) AS name_approve
')
)
->first();
$data['signatureAd'] = $signatureAd;
$pdf = new Dompdf();
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$options->set('isPhpEnabled', true);
$options->set(['isRemoteEnabled' => true]);
$pdf->setOptions($options);
// Halaman 1
$html1 = view('pdf.final_log_page_1', $data);
// Halaman 2
$html2 = view('pdf.final_log_page_2', $data);
// Gabung konten HTML dari dua tampilan
$htmlCombined = $html1 . $html2;
$pdf->loadHtml($htmlCombined);
$pdf->render();
$headers = [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="file.pdf"',
];
return response($pdf->output(), 200, $headers);
}
}

View File

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

View File

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

View File

@@ -4,11 +4,8 @@ use Illuminate\Http\Request;
use Modules\HospitalPortal\Http\Controllers\Api\AuthController;
use Modules\HospitalPortal\Http\Controllers\Api\ClaimRequestController;
use Modules\HospitalPortal\Http\Controllers\Api\MemberController;
use Modules\HospitalPortal\Http\Controllers\Api\ProviderOnlineController;
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;
/*
|--------------------------------------------------------------------------
@@ -20,66 +17,39 @@ use Modules\HospitalPortal\Http\Middleware\Authorization;
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::prefix('v1')->group(function() {
Route::prefix('hospitalportal')->group(function () {
Route::middleware(Authentication::class)->group(function () {
Route::controller(AuthController::class)->group(function () {
Route::post('login', 'login');
});
Route::prefix('hospitalportal')->group(function () {
Route::post('login', [AuthController::class, 'login'])->name('login');
Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
Route::middleware('auth:sanctum')->group(function () {
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('/user', function (Request $request) {
return $request->user();
});
//Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
//Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
Route::put('reset-password', [AuthController::class, 'resetPassword'])->name('resetPassword');
Route::get('claims', [ClaimController::class, 'index']);
Route::middleware('auth:sanctum')->group(function () {
Route::post('search-member', [MemberController::class, 'search']);
Route::post('logout', [AuthController::class, 'logout'])->name('logout');
Route::get('/user', function (Request $request) {
return $request->user();
});
Route::put('reset-password', [AuthController::class, 'resetPassword'])->name('resetPassword');
Route::get('claims', [ClaimController::class, 'index']);
Route::middleware(Authorization::class)->group(function () {
//Search Member
Route::controller(MemberController::class)->group(function () {
Route::post('search-member', 'search');
});
// Request LOG
Route::controller(RequestLogController::class)->group(function () {
Route::post('request-log', 'requestLog');
Route::get('get-request-log', 'getRequestLog');
Route::get('get-final-log', 'getFinalLog');
Route::post('request-final-log', 'requestFinalLog');
Route::get('download-log/{request_log_id}', 'downlodLog');
Route::get('download-final-log/{request_log_id}', 'downlodFinalLog');
});
//Notification
Route::controller(NotificationController::class)->group(function() {
//get notifications
Route::get('notifications/{user_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::get('claim-requests/{claim_request_id}/log', [ClaimRequestController::class, 'generateLog'])->name('claim-requests.generate-log');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
Route::get('get-claim-requests', [ClaimRequestController::class, 'get_claim_requests'])->name('claim-requests.get_claim_requests');
Route::get('detail-claim-requests/{id}', [ClaimRequestController::class, 'detail_claim_requests'])->name('claim-requests.detail_claim_requests');
Route::post('claim-requests/{id}/request-files', [ClaimRequestController::class, 'requestFiles']);
});
Route::get('claim-requests', [ClaimRequestController::class, 'index'])->name('claim-requests.index');
Route::post('claim-requests', [ClaimRequestController::class, 'store'])->name('claim-requests.store');
Route::get('claim-requests/{claim_request_id}/log', [ClaimRequestController::class, 'generateLog'])->name('claim-requests.generate-log');
Route::get('claim-requests/{id}', [ClaimRequestController::class, 'show'])->name('claim-requests.show');
});
});
Route::prefix('v1/bridging-service/ProviderOnline')->group(function () {
Route::post('HeaderKey', [ProviderOnlineController::class, 'getHeaderKey']);
Route::post('EligibilitasPeserta', [ProviderOnlineController::class, 'checkEligibilitasPeserta']);
Route::post('Pendaftaran', [ProviderOnlineController::class, 'createPendaftaran']);
Route::post('Pengesahan', [ProviderOnlineController::class, 'createPengesahan']);
Route::post('RincianBiayaKlaim', [ProviderOnlineController::class, 'getRincianBiayaKlaim']);
Route::post('StrukPendaftaran', [ProviderOnlineController::class, 'downloadStrukPendaftaran']);
Route::post('StrukPengesahan', [ProviderOnlineController::class, 'downloadStrukPengesahan']);
});

View File

@@ -3,7 +3,6 @@
namespace Modules\HospitalPortal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
class ClaimRequestShowResource extends JsonResource
{
@@ -26,12 +25,6 @@ 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

@@ -1,91 +0,0 @@
<?php
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;
use Modules\Internal\Transformers\AuditTrailResource;
class AuditTrailController extends Controller {
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $id)
{
$audittrails = AuditTrail::query()
->where('model', '=', $request->model)
->where('model_id', '=', $id)
->latest()
->paginate(1000);
return response()->json(Helper::paginateResources(AuditTrailResource::collection($audittrails)));
}
/**
* 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)
{
$appointments = Appointment::query()
->with('doctor.user', 'doctor.speciality', 'appointmentDetail', 'healthCare')
->where('nID', $id)
->first();
return response()->json(new AppointmentResource($appointments));
}
/**
* 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

@@ -4,33 +4,27 @@ namespace Modules\Internal\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Person;
use Crypt;
use Error;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Modules\Internal\Emails\SendVerifyEmail;
use Modules\Internal\Events\ForgetPassword;
use App\Helpers\Helper;
use Validator;
class AuthController extends Controller
{
public function login(Request $request)
{
$request->validate([
'email' => 'required',
'email' => 'required|email',
'password' => 'required'
]);
$user = User::query()
->where(function ($query) use ($request) {
$query->where('email', $request->email)
->orWhere('username', $request->email);
})
->first();
->where('email', $request->email)
->first();
if (!$user) {
return response(['message' => 'User Tidak Ditemukan'], 404);
@@ -97,7 +91,7 @@ class AuthController extends Controller
Event(new ForgetPassword($user));
Mail::to($user->email)->send(new SendVerifyEmail($user));
// Mail::to($user->email)->send(new SendVerifyEmail($user));
return response()->json($user);
}
@@ -131,47 +125,4 @@ class AuthController extends Controller
]);
return response()->json($user);
}
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email|unique:users,email',
'username' => 'required|unique:users,username',
'name' => 'required',
'password' => [
'required',
'min:5',
// 'regex:/.*[0-9].*/',
// 'regex:/.*[a-z].*/',
// 'regex:/.*[A-Z].*/',
]
], [
// 'password.regex' => "Password harus minimal 8 karakter, kombinasi huruf besar kecil dan angka"
])->validate();
try {
$user = User::create([
'email' => $request->email,
'username' => $request->username,
'password' => Hash::make($request->password),
]);
$person = Person::updateOrCreate(
[
'id' => $user->person_id
],
[
'name' => $request->name ?? null
]
);
$user->person_id = $person->id;
$user->save();
return response()->json($user);
} catch (\Exception $e) {
return response()->json([
'message' => 'Terjadi masalah ketika mendaftar'
]);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -4,29 +4,15 @@ 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
@@ -36,9 +22,6 @@ 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'])) {
@@ -51,7 +34,7 @@ class ClaimRequestController extends Controller
->when($request->status, function($q, $status) {
$q->where('status', $status);
})
->with(['member', 'files', 'service', 'member.currentPolicy'])
->with(['member', 'files', 'service'])
->paginate();
return Helper::paginateResources(ClaimRequestResource::collection($claimRequests));
@@ -67,150 +50,13 @@ class ClaimRequestController extends Controller
}
/**
* Create New Calim Request
*
* Bagaskoro, BSD 03 November 2023
* Store a newly created resource in storage.
* @param Request $request
* @return Renderable
*/
public function createNew(Request $request)
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['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());
//
}
/**
@@ -225,10 +71,7 @@ class ClaimRequestController extends Controller
'histories' => function ($history) {
$history->latest();
},
'files',
'member',
'claim',
'organization',
'files'
]);
return Helper::responseJson(data: ClaimRequestShowResource::make($claimRequest));
@@ -252,83 +95,7 @@ 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);
//
}
/**
@@ -345,17 +112,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([
@@ -366,408 +133,11 @@ class ClaimRequestController extends Controller
'system_origin' => 'primecenter'
]);
// 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;
}
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 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,12 +20,10 @@ class CorporateBenefitController extends Controller
$benefits = CorporateBenefit::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->with('benefit', 'plan')
->paginate(10)
->paginate(0)
->appends($request->all());
return $benefits;
}
public function activation(Request $request, $benefit_id)
{
$request->validate([
@@ -33,9 +31,9 @@ class CorporateBenefitController extends Controller
]);
// abort(404);
$benefit = CorporateBenefit::find($benefit_id);
$benefit->active = $request->active == 1 ? 0 : 1;
$benefit->reason = $request->reason;
$benefit = CorporateBenefit::findOrFail($benefit_id);
$benefit->active = $request->active == '1';
if ($benefit->save()) {
return response()->json([
@@ -109,15 +107,18 @@ class CorporateBenefitController extends Controller
{
$corporateBenefit = CorporateBenefit::findOrFail($id);
$request->validate([
'budget' => [
'code' => [
'required',
Rule::unique('corporate_plans')->where('corporate_id', $corporate_id)->ignore($corporateBenefit->id)
],
'name' => 'required'
]);
$corporateBenefit->fill([
'budget' => $request->budget,
'code' => $request->code,
'name' => $request->name,
'active' => $request->active,
])->save();
return $corporateBenefit;

View File

@@ -19,13 +19,11 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Maatwebsite\Excel\Facades\Excel;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use App\Models\File;
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
{
@@ -79,11 +77,10 @@ class CorporateController extends Controller
*/
public function store(Request $request)
{
$request->validate([
'code' => 'required|regex:/^[a-zA-Z0-9_]+$/',
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
'name' => 'required',
'payor_id' => 'required',
// 'logo' => 'required',
'policy_code' => 'required_with:policy_id',
'policy_total_premi' => 'required_with:policy_code',
@@ -103,7 +100,6 @@ class CorporateController extends Controller
if ($request->has('policy_code') && !empty($request->policy_code)) {
$newCorporate->policies()->create([
'code' => $request->policy_code ?? NULL,
'payor_id' => $request->payor_id ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
@@ -121,9 +117,9 @@ class CorporateController extends Controller
$services = [
[
'id' => 1,
'name' => 'Outpatient',
'name' => 'Out Patient',
'code' => 'OP',
'description' => 'Outpatient',
'description' => 'Out Patient',
],
[
'id' => 2,
@@ -304,8 +300,7 @@ class CorporateController extends Controller
public function update(Request $request, $id)
{
$request->validate([
'code' => 'required|regex:/^[a-zA-Z0-9_]+$/',
'payor_id' => 'required',
'code' => 'required|regex:/^[a-zA-Z0-9]+$/',
'name' => 'required',
'policy_code' => 'required_with:policy_id',
'policy_total_premi' => 'required_with:policy_code',
@@ -332,7 +327,6 @@ class CorporateController extends Controller
['id' => $request->policy_id],
[
'code' => $request->policy_code ?? NULL,
'payor_id' => $request->payor_id ?? NULL,
'total_premi' => $request->policy_total_premi ?? NULL,
'minimal_deposit_percentage' => $request->policy_minimal_deposit_percentage ?? NULL,
'minimal_deposit_net' => $request->policy_minimal_deposit_net ?? NULL,
@@ -381,15 +375,13 @@ class CorporateController extends Controller
public function activation(Request $request, $corporate_id)
{
$request->validate([
'active' => 'required',
'reason' => 'required'
'active' => 'required'
]);
// abort(404);
$corporate = Corporate::findOrFail($corporate_id);
$corporate->active = $request->active == 0 ? 1 : 0;
$corporate->reason = $request->reason;
$corporate->active = $request->active == '1';
if ($corporate->save()) {
return response()->json([
@@ -407,11 +399,10 @@ class CorporateController extends Controller
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$corporate = Corporate::with(['plans'])->findOrFail($corporate_id);
$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');
$import->read(Storage::path('temp/' . $file_name));
$import->write(Storage::disk('public')->path('temp/result-' . $file_name), 'xsls');
foreach ($import->sheetsIterator() as $sheetIndex => $sheet) {
if (!in_array($sheet->getName(), ['Plan', 'Benefit'])) {
@@ -434,11 +425,9 @@ class CorporateController extends Controller
// Write Header to File
$result_headers = array_keys($headers_map_to_table_fields);
$result_headers = array_merge($result_headers, ['Ingest Code', 'Ingest Note']);
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$import->addArrayToRow($result_headers);
}
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
@@ -453,10 +442,12 @@ class CorporateController extends Controller
// 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
$corporateService = new CorporateService();
if ($sheet->getName() == 'Plan') {
@@ -464,17 +455,14 @@ class CorporateController extends Controller
} else if ($sheet->getName() == 'Benefit') {
$corporateService->handleBenefitRow($corporate, $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());
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 200,
'Ingest Note' => 'Success',
]), $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(),
@@ -482,8 +470,6 @@ class CorporateController extends Controller
} catch (\Exception $e) {
// throw new \Exception($e);
// Write Server Error to File
// $import->read($fileRead);
// $import->write($fileWrite, 'xsls');
$import->addArrayToRow(array_merge($row_data, [
'Ingest Code' => 500,
'Ingest Note' => env('APP_DEBUG') ? $e->getMessage() : 'Server Error',
@@ -507,18 +493,7 @@ 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)
public function importDocumentExample($document_type)
{
switch ($document_type) {
case 'plan-benefit':
@@ -532,304 +507,17 @@ class CorporateController extends Controller
'file_name' => "Corporate Membership Import.xlsx",
"file_url" => url('files/Corporate Membership Import.xlsx')
]);
break;
break;
case 'diagnosis-exclusion':
return Helper::responseJson([
'file_name' => "Corporate Exclusion Import.xlsx",
"file_url" => url('files/Corporate Exclusion Import.xlsx')
]);
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;
case 'template-request-log':
return Helper::responseJson([
'file_name' => "Template Import Request LOG.xlsx.xlsx",
"file_url" => url('files/Template Import Request LOG.xlsx.xlsx')
]);
break;
break;
default:
return Helper::responseJson([], 'error', 404);
break;
}
}
public function dataPlanBenefit(Request $request, $corporate_id){
$file_name = 'Corporate Plan and Benefit';
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporatePlan&BenefitImportData.xlsx'));
// Sheet 1
$writer->getCurrentSheet()->setName('Plans');
$headers_map_to_table_fields = Plan::$listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataPlans = Plan::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
// ->whereHas('corporatePlan', function ($corporatePlan) use ($corporate_id) {
// $corporatePlan->where('corporate_id', $corporate_id);
// })
// ->with('corporatePlan')
->orderBy('corporate_plan_id', 'asc')
->get()->toArray();
foreach ($dataPlans as $index => $row){
$rowData = [
$row['service_code'], // Service
$row['corporate_plan_id'], // Plan
$row['code'], // Customer plans
$row['type'], // Plan Type
$row['start'], // Start Date of Plan
$row['end'], // End Date of Plan
$row['require_referral'], // Referral
$row['referral_source'], // Referral Source
$row['referral_duration'], // Referral Duration
$row['family_plan'], // Family Plan
$row['family_plan_share_rules'], // Family Sharing Overflow
$row['limit_rules'], // Plan Limit
$row['layer'], // Layer ID
$row['layer_conditions'], // Layer Condition
$row['budget_type'], // Budget Type
$row['budget_code'], // Budget Code
$row['budget_conditions'], // Budget Condition
$row['surgery_limit'], // Surgery
$row['non_surgery_limit'], // Non Surgery
$row['max_claim_limit'], // Max/Claim
$row['max_claim_count'], // Max Count of Claim
$row['area_limit'], // Area
$row['limit_shared_plans'], // Shared Plan
$row['limit_shared_plan_type'], // Shared Plan Type
$row['cashless_percentage'], // Cashless(%)
$row['reimbursement_percentage'], // Reimbursement(%)
$row['digital_percentage'], // Digital(%)
$row['co_share_m_percentage'], // CoShareM(%)
$row['co_share_s_percentage'], // CoShareS(%)
$row['co_share_c_percentage'], // CoShareC(%)
$row['cashless_deductible'], // Cashless Deductible
$row['cashless_deductible'], // Reimbursement Deductible
$row['digital_deductible'], // Digital Deductible
$row['co_share_m_deductible'], // DeductibleM
$row['co_share_s_deductible'], // DeductibleS
$row['co_share_c_deductible'], // DeductibleC
$row['co_share_deductible_condition'], // Co-share & Deductible Condition
$row['msc'], // MSC
$row['genders'], // Gender
$row['min_age'], // Min Age
$row['max_age'], // Max Age
$row['rule_of_excess'], // Rule of Excess
$row['max_excess_covered'], // Max Excess Covered
$row['prorate_type'], // Prorate Type
$row['prorate_lookup'], // Prorate Lookup
$row['currency'], // Currency
$row['max_surgery_reinstatement_days'], // Reinstatement days for Surgery NonSurgery
$row['max_surgery_periode_days'], // Max Periode of Surgery Non Surgery
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
// Menutup penulis
// Sheet 2
$writer->addNewSheetAndMakeItCurrent();
$writer->getCurrentSheet()->setName('Benefit');
$headers_map_to_table_fields = CorporateBenefit::$listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
$dataBenfit = CorporateBenefit::query()
->where('corporate_id', $corporate_id)
->with('benefit', 'plan')
->orderBy('plan_id', 'asc')
->get()->toArray();
// dd($dataBenfit);
foreach($dataBenfit as $index => $row){
$rowData = [
$row['benefit']['service_code'] ?? NULL, // "Service",
$row['plan']['type'] ?? NULL, // "Plan",
$row['benefit']['code'] ?? NULL, // "Benefit Code",
$row['benefit']['code'] ?? NULL, // "Customer Benefit Code",
$row['benefit']['description'] ?? NULL, // "Detail Benefit",
$row['budget'], // "ASO/Budget",
$row['budget_conditions'], // "Budget Condition",
$row['budget_code'], // "Budget Code",
$row['primary_benefit_code'], // "Primary benefit",
$row['benefit_mode'], // "Benefit Mode",
$row['room_class_coverage'], // "Room Class",
$row['max_bed_coverage'], // "Max Bed",
$row['tolerance_parameter'], // "Tolerance Paramater",
$row['max_room_class'], // "Max. Room Class",
$row['limit_amount'], // "Limit Value",
$row['area_limit'], // "Area",
$row['shared_benefit'], // "Shared Benefit With",
$row['shared_benefit_type'], // "Shared Benefit Type",
$row['msc'], // "MSC",
$row['genders'], // "Gender",
$row['min_age'], // "Min Age",
$row['max_age'], // "Max Age",
$row['max_frequency_period'], // "Freq. Period",
$row['daily_frequency'], // "Daily Frequency",
$row['weekly_frequency'], // "Weekly Frequency",
$row['monthly_frequency'], // "Monthly Frequency",
$row['yearly_frequency'], // "Yearly Frequency",
$row['custom_frequency_days'], // "Custom Duration",
$row['custom_duration_value'], // "Custom Duration Value",
NULL, // "Cashless, Reimbursement",
$row['high_plan_factor'], // "High Plan Factor",
$row['pre_post_treatment'], // "Pre Post Treatment",
$row['pre_treatment_days'], // "Pre Treatment",
$row['post_treatment_days'], // "Post Treatment",
$row['layer_type_1'], // "Layer Type 1",
$row['layer_value_1'], // "Layer Value 1",
$row['layer_type_2'], // "Layer Type 2",
$row['layer_value_2'], // "Layer Value 2",
$row['cashless_percentage'], // "Cashless (%)",
$row['reimbursement_percentage'], // "Reimburse (%)",
$row['digital_percentage'], // "Digital (%)",
$row['co_share_m_percentage'], // "CoShareM (%)",
$row['co_share_s_percentage'], // "CoShareS (%)",
$row['co_share_c_deductible'], // "CoShareC (%)",
$row['cashless_deductible'], // "Cashless Deductible",
$row['reimbursement_deductible'], // "Reimbursement Deductible",
$row['digital_deductible'], // "Digital Deductible",
$row['co_share_m_deductible'], // "DeductibleM",
$row['co_share_s_deductible'], // "DeductibleS",
$row['co_share_c_deductible'], // "DeductibleC",
$row['prorate_type'], // "Prorate Type",
$row['prorate_lookup'], // "Prorate Lookup",
$row['max_days_for_disability'], // "Max Days for Disability",
$row['max_period_for_disability'], // "Max Periode of Disability",
$row['limit_free_tc'], // "Currency",
$row['currency'], // "Currency",
$row['show_benefit_item'], // "Show Benefit Item",
$row['show_benefit_value'], // "Show Benefit Value",
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
$writer->close();
return Helper::responseJson([
'file_name' => "Data Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporatePlan&BenefitImportData.xlsx')
]);
}
public function corporateCode(Request $request){
$corporates = Corporate::query()
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('code', 'LIKE', '%' . $search . '%');
})
->with('currentPolicy', 'subCorporates')
->withCount([
'employees',
'corporateBenefits',
'corporatePlans',
// 'claims'
])
->where('active', 1)
->get()
->pluck('code');
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,25 +2,13 @@
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
{
@@ -28,24 +16,25 @@ 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 = 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') {
$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();
// } else { // Active or Default
// $formulariums->whereHas('corporateFormulariums', function ($corporateFormularium) use ($corporate_id){
// $corporateFormularium->where('corporate_id', $corporate_id);
// });
// }
return Helper::paginateResources(CorporateFormulariumResource::collection($formulariums));
}
@@ -53,16 +42,9 @@ class CorporateFormulariumController extends Controller
* Show the form for creating a new resource.
* @return Renderable
*/
public function create(Request $request, $corporate_id)
public function 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;
return view('internal::create');
}
/**
@@ -70,36 +52,9 @@ class CorporateFormulariumController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request, $corporate_id)
public function store(Request $request)
{
$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;
//
}
/**
@@ -107,15 +62,9 @@ class CorporateFormulariumController extends Controller
* @param int $id
* @return Renderable
*/
public function show(Request $request, $corporate_id, $id)
public function show($id)
{
$data = Formularium::where('formularium_template_id', $id)->get();
$respone = [
"status" => 200,
"message" => 'data berhasil diambil',
"data" => $data
];
return $respone;
return view('internal::show');
}
/**
@@ -123,16 +72,9 @@ class CorporateFormulariumController extends Controller
* @param int $id
* @return Renderable
*/
public function edit(Request $request, $corporate_id)
public function edit($id)
{
$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;
return view('internal::edit');
}
/**
@@ -159,7 +101,7 @@ class CorporateFormulariumController extends Controller
public function updateStatus($corporate_id, $formularium_id , $status)
{
if ($status == 'activate') {
$corporateFormularium = CorporateFormularium::updateOrCreate([
$corporateFormularium = CorporateFormularium::firstOrCreate([
'corporate_id' => $corporate_id,
'formularium_id' => $formularium_id
], [
@@ -186,213 +128,4 @@ 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

@@ -1,82 +0,0 @@
<?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

@@ -6,7 +6,6 @@ use App\Exceptions\ImportRowException;
use App\Helpers\Helper;
use App\Http\Resources\MemberDataTableResource;
use App\Models\Corporate;
use App\Models\CorporateEmployee;
use App\Models\Member;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
@@ -16,13 +15,8 @@ use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Storage;
use Illuminate\Console\Command;
use Modules\Internal\Services\MemberEnrollmentService;
use PDF;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\File;
use Spatie\Browsershot\Browsershot;
class CorporateMemberController extends Controller
{
@@ -34,11 +28,14 @@ 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')
->where('corporate_employees.corporate_id', $corporate_id)
->filter($request->all())
// ->where('corporate_id', $corporate_id)
->whereHas('employeds', function ($employeds) use ($corporate_id) {
$employeds->where('corporate_id', $corporate_id);
})
->with([
'employeds',
'currentPolicy',
@@ -47,46 +44,25 @@ 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,
'corporate_benefits.corporate_id' => $corporate_id,
// 'corporate_benefits.plan_id' => $corporate_id,
]);
}
'currentPlan.benefits'
])
->when($request->input('search'), function (Builder $query, $search) {
$query->where(function (Builder $query) use ($search) {
$query->orWhere('members.member_id', 'like', "%" . $search . "%")
->orWhere('members.name', 'like', "%" . $search . "%");
});
})
->select('members.*')
->selectRaw('(SELECT GROUP_CONCAT(files_mcu.original_name SEPARATOR ", ") AS file_mcu_names from files_mcu WHERE files_mcu.memberid = members.id) AS file_mcu_names')
->paginate()
->appends($request->all());
return Helper::paginateResources(MemberDataTableResource::collection($members));
}
public function activation(Request $request, $member_id)
{
$request->validate([
'active' => 'required',
'reason' => 'required',
'active' => 'required'
]);
// abort(404);
$member = Member::findOrFail($member_id);
$member->active = $request->active;
$member->reason = $request->reason;
$member->active = $request->active == '1';
if ($member->save()) {
return response()->json([
@@ -159,9 +135,6 @@ class CorporateMemberController extends Controller
public function import(Request $request, $corporate_id)
{
// setting tambahan php
Helper::setCustomPHPIniSettings();
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
]);
@@ -170,7 +143,7 @@ class CorporateMemberController extends Controller
$file_name = now()->getPreciseTimestamp(3) . '-' . $request->file('file')->getClientOriginalName();
$file = $request->file('file')->storeAs('temp', $file_name);
$reader = ReaderEntityFactory::createXLSXReader(Storage::path('temp/' . $file_name));
$reader = ReaderEntityFactory::createReaderFromFile(Storage::path('temp/' . $file_name));
$reader->open(Storage::path('temp/' . $file_name));
$writer = WriterEntityFactory::createXLSXWriter();
@@ -182,10 +155,9 @@ class CorporateMemberController extends Controller
$result_headers = $this->memberEnrollmentService->result_doc_headers;
$singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRow($result_headers));
$writer->addRow($singleRow);
$imported_member_data = 0;
$failed_member_data = [];
foreach ($reader->getSheetIterator() as $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
@@ -209,7 +181,9 @@ class CorporateMemberController extends Controller
}
try {
$rowResponse = $this->memberEnrollmentService->handleImportRow($corporate, $new_member_data);
// Write Success Result to File
$singleRow = WriterEntityFactory::createRow($this->memberEnrollmentService->makeResultRowWithResultFormat($rowResponse));
$writer->addRow($singleRow);
@@ -241,11 +215,11 @@ class CorporateMemberController extends Controller
break; //only read first sheet
}
$reader->close();
$writer->close();
Storage::delete('temp/' . $file_name);
// throw(404);
return [
'total_success_row' => $imported_member_data,
'total_failed_row' => count($failed_member_data),
@@ -260,35 +234,16 @@ class CorporateMemberController extends Controller
public function generateLog(Request $request, $member_id)
{
$corporate_id = CorporateEmployee::where('member_id', $member_id)->value('corporate_id');
// $member = Member::findOrFail($member_id)
// ->load([
// 'currentPlan',
// 'currentPolicy',
// 'currentPlan.corporateBenefits' => function ($benefit) use ($request) {
// return $benefit->when($request->benefit_ids, function ($q, $ids) {
// $q->whereIn('benefit_id', $ids)
// ->where([
// 'corporate_benefits.active' => 1,
// 'corporate_benefits.corporate_id' => $corporate_id,
// ]);
// });
// },
// // 'currentPlan.corporateBenefits.benefit'
// ]);
$member = Member::with([
'currentPlan',
'currentPolicy',
'currentPlan.corporateBenefits' => function ($query) use ($request, $corporate_id) {
$query->when($request->benefit_ids, function ($q, $ids) use ($corporate_id) {
$q->whereIn('benefit_id', $ids)
->where('active', 1)
->where('corporate_id', $corporate_id);
});
},
// 'currentPlan.corporateBenefits.benefit'
])->findOrFail($member_id);
$member = Member::findOrFail($member_id)
->load([
'currentPlan',
'currentPolicy',
'currentPlan.corporateBenefits' => function ($benefit) use ($request) {
return $benefit->when($request->benefit_ids, function ($q, $ids) {
return $q->whereIn('benefit_id', $ids);
});
},
'currentPlan.corporateBenefits.benefit']);
$dateOfAdmission = $request->date_of_admission ? Carbon::parse($request->date_of_admission) : now();
@@ -296,180 +251,4 @@ class CorporateMemberController extends Controller
$pdf = PDF::loadView('pdf.guaranted_leter', compact(['member', 'dateOfAdmission']));
return $pdf->download('Guaranted Letter - '.$member->full_name.'.pdf');
}
public function generateMemberList(Request $request, $corporate_id){
// Mendapatkan data yang akan diekspor (misalnya, dari database)
$data = Member::with(['currentPlan', 'currentCorporate', 'division', 'employeds', 'currentPolicy'])
// ->filter($request->all())
// ->where('corporate_id', $corporate_id)
->whereHas('employeds', function ($employeds) use ($corporate_id) {
$employeds->where('corporate_id', $corporate_id);
})->get()->toArray();
// Membuat penulis entitas Spout
$writer = WriterEntityFactory::createXLSXWriter();
// Membuka penulis untuk menulis ke file
$writer->openToFile(public_path('files/CorporateMembershipList.xlsx'));
// Menulis header kolom
$headers_map_to_table_fields = $this->memberEnrollmentService->listing_doc_headers;
$headerRow = WriterEntityFactory::createRowFromArray($headers_map_to_table_fields);
$writer->addRow($headerRow);
// dd('test');
// Menulis data
if (!empty($data)) {
foreach ($data as $item) {
$rowData = [ $item['record_mode'], // Recode Mode
$item['record_type'], // Recode Type
$item['payor_id'], // Payor ID
$item['member_id'], // Member ID
$item['principal_id'], // Mapping ID
NULL, // Link Medis Member ID
$item['current_corporate']['code'] ?? null, // Corporate ID
$item['employeds'][0]['nik'] ?? null, // NIK
$item['division']['code'] ?? null, // Devision
$item['employeds'][0]['branch_code'] ?? null, // Branch Code
$item['bank_info'], // Bank Info
$item['language'], // Language
null, // Type of Work
$item['race'], // Race
$item['current_policy']['code'] ?? null, // Policy Number
$item['marital_status'], // Marital Status
$item['relation_with_principal'], // Relationship
str_replace('-', '',$item['members_effective_date']), // Member effective date
str_replace('-', '',$item['members_expire_date']), // Member expiry date
NULL, // Faskes FKTP (First Level Provider) or Individual preferred provider
NULL, // Faskes FKRTL (Next Level Provider) or Individual group preferred provider
$item['bpjs_class'], // The Right Classes Room of BPJS Participants
NULL, // Name of Faskes
NULL, // Rule BPJSK
NULL, // Internal Use
$item['full_name'], // Member Name
$item['address1'], // Address1
$item['address2'], // Address2
$item['address3'], // Address3
$item['address4'], // Address4
$item['city'], // City
NULL, // State
$item['postal_code'], // Post Code
NULL, // Telephone - Mobile
NULL, // Telephone - Res
NULL, // Telephone - Office
$item['nric'], // NRIC
$item['passport_no'], // Passport No
$item['passport_country'], // Passport Country
$item['email'], // Email
$item['identification_code'], // Identification Code
$item['birth_date'], // Date of Birth
$item['gender_code'], // Sex
NULL, // Internal Use
$item['current_plan']['code'] ?? null, // Plan-ID
NULL, // Employment-Status
NULL, // Internal Use
NULL, // Internal Use
NULL,// Internal Use
str_replace('-', '',$item['terminated_date']), // Date Terminated
$item['pre_existing'], // Pre Existing
$item['bpjs_id'], // BPJS ID
$item['endorsement_date'], // Endorsement Date
$item['remarks'], // Remarks
NULL, // Internal Use
NULL,// Member Since
NULL,// Internal Use
$item['policy_in_force'], // Policy Inforce
NULL, // Member Suspended
str_replace('-', '',$item['activation_date']), // Activation Date
NULL, // Internal Use
$item['start_no_claim'], // StartNoClaim
$item['end_no_claim'], // EndNoClaim
NULL, // Option Mode
];
$row = WriterEntityFactory::createRowFromArray($rowData);
$writer->addRow($row);
}
}
// Menutup penulis
$writer->close();
// dd('test');
// Mengembalikan response untuk mengunduh file
$filePath = public_path('files/CorporateMembershipList.xlsx');
// dd($filePath);
// Mengembalikan response untuk mengunduh file
return Helper::responseJson([
'file_name' => "Corporate Plan & Benefit List " . date('Y-m-d h:i:s'),
"file_url" => url('files/CorporateMembershipList.xlsx')
]);
}
public function sendAllECard(Request $request, $corporate_id){
$members = Member::with([
'currentPlan',
'currentPolicy',
'currentCorporate',
// 'currentPlan.corporateBenefits.benefit'
])->whereHas('currentCorporate', function ($query) use ($corporate_id) {
$query->where('corporate_id', $corporate_id);
})->get();
$data = [];
$countSuccesSend = 0;
foreach($members as $member){
// Simpan file PDF ke direktori yang diinginkan
$pdfPath = storage_path('app/pdf/ecards/E-card-' . $member->name. '.pdf');
// Cek apakah file sudah ada
if (!File::exists($pdfPath)) {
$pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait');
$pdf->save($pdfPath);
}
$dataEmail = [
// 'email' => $member->email,
'email' => 'tbfajri',
'name' => $member->name,
'subject' => 'Digital E Card '. $member->name,
'body' => '<h1>Hi ' . $member->name . '</h1> <br> ini adalah uji coba kirim e-card' ,
'attach' => $pdfPath,
];
$sendEmail = Helper::sendEmailattachData($dataEmail);
if ($sendEmail === true){
$countSuccesSend ++;
File::delete($pdfPath);
} else {
$dataFaild = [
'email' => $member->email,
'name' => $member->name,
'message' => $sendEmail
];
array_push($data, $dataFaild);
}
}
$response = [
'data_fail_send' => count($data),
'message' => $data,
'data_succes_send' => $countSuccesSend,
];
return response()->json($response);
}
public function viewECard(Request $request, $member_id){
$member = Member::with([
'currentPlan',
'currentPolicy',
'currentCorporate',
'currentCorporate.files',
// 'currentPlan.corporateBenefits.benefit'
])->find($member_id);
if ($member->currentCorporate->id == 5){ // Vale
$pdf = PDF::loadView('pdf.ecard', compact('member'))->setPaper('A5', 'portrait');
} else {
$pdf = PDF::loadView('pdf.ecard-lms', compact('member'))->setPaper('A5', 'portrait');
}
return $pdf->download('Ecard - '.$member->full_name.'.pdf');
}
}

View File

@@ -25,31 +25,6 @@ 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([
@@ -59,8 +34,7 @@ class CorporatePlanController extends Controller
// abort(404);
$plan = CorporatePlan::findOrFail($plan_id);
$plan->active = $request->active == 1 ? 0 : 1;
$plan->reason = $request->reason;
$plan->active = $request->active == '1';
if ($plan->save()) {
return response()->json([
@@ -135,21 +109,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,
'corporate_plan_id' => $request->plan,
'service_code' => $request->service,
'type' => $request->type,
'limit_rules' => $request->limit
'name' => $request->name,
'active' => $request->active,
'description' => $request->description
])->save();
return $corporatePlan;
}

View File

@@ -136,7 +136,6 @@ class CorporateServiceController extends Controller
public function corporateServiceUpdate(Request $request, $corporate_id, $service_code)
{
// dd($request->all);
// $corporate = Corporate::findOrFail($corporate_id);
$corporateService = CorporateService::query()
->where('corporate_id', $corporate_id)
@@ -144,8 +143,7 @@ class CorporateServiceController extends Controller
// ->with('configs', 'service')
->first();
$corporateService->fill([
'status' => $request->status == 'active' ? 'inactive' : 'active',
'reason' => $request->reason
'status' => $request->status == 'active' ? 'active' : 'inactive'
]);
$corporateService->save();
@@ -154,6 +152,8 @@ 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()
@@ -161,6 +161,7 @@ class CorporateServiceController extends Controller
->where('service_code', $service_code)
->first();
$corporateServiceSpeciality = CorporateServiceSpeciality::updateOrCreate([
'corporate_service_id' => $corporateService->id,
'speciality_id' => $request->speciality_id,
@@ -190,116 +191,6 @@ 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)
{
@@ -334,10 +225,12 @@ 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;
@@ -543,6 +436,4 @@ class CorporateServiceController extends Controller
'service' => CorporateServiceConfigResource::make($corporateService),
]);
}
}

View File

@@ -1,410 +0,0 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\DailyMonitoring;
use App\Models\RequestDailyMonitoring;
use App\Models\MedicalPlan;
use DB;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Validator;
use App\Models\File;
/**
* Bagaskoro BSD 27-10-2023
*
* Controller untuk daily monitoring
*/
class DailyMonitoringController extends Controller
{
protected $path_for_store = 'public/lab_result';
protected function messages()
{
return [
'required' => ':attribute harus diisi',
'integer' => ':attribute harus angka',
'unique' => ':attribute (:input) sudah ada',
'max' => ':attribute maximal :max karakter',
'exists' => ':attribute (:input) tidak ditemukan',
'numeric' => ':attribute harus angka',
'digits_between'=> ':attribute maximal :max digit minimal :min digit'
];
}
/**
* 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','members.members_effective_date AS startdate','members.members_expire_date 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', 'members.member_id')
->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, $request_code)
{
// get id request log
$request_logs = DB::table('request_logs')
->select('id')
->where('code', $request_code)
->first();
$detail_list = RequestDailyMonitoring::where('request_log_id', empty($request_logs) == false ? $request_logs->id : '')
->orderBy("created_at", "desc")
->get();
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);
}
}
/**
* Add Detail Request LOG LIST
*/
public function AddDetailMonitoringListRequestLog(Request $request, $request_code)
{
$request->merge(['request_code' => $request_code]);
// validation rule
$validator = Validator::make($request->all(),[
'request_code' => 'required|exists:request_logs,code',
'subject' => 'required',
'body_temperature' => 'required|numeric',
'sistole' => 'required|numeric',
'diastole' => 'required|numeric',
'respiration_rate' => 'required|numeric',
'analysis' => 'required',
'medical_plan' => 'required',
'non_medikamentosa_plan' => 'required',
],$this->messages());
// validation error
if ($validator->fails()) {
return response()->json([
'error' => true,
'message' => $validator->getMessageBag()
],400);
}
// get claim request
$request_log = DB::table('request_logs')
->select('id')
->where('code', $request_code)
->first();
DB::beginTransaction();
try {
// insert claim daily monitoring
$db_response = RequestDailyMonitoring::create([
'request_log_id' => $request_log->id,
'subject' => $request->subject,
'sistole' => $request->sistole,
'diastole' => $request->diastole,
'body_temperature' => $request->body_temperature,
'respiration_rate' => $request->respiration_rate,
'analysis' => $request->analysis,
'lab_date' => $request->lab_date,
'provider' => $request->provider,
'examination' => $request->examination,
'created_by' => auth()->user()->id,
]);
// cek medical plan
$num_medical_plan = 0;
foreach ($request->medical_plan as $row) {
if ($row['medical_plan_str']) {
$num_medical_plan++;
}
}
if ($num_medical_plan == 0) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => [
'medical_plan' => ['medical plan harus diisi']
],
'data' => []
],400);
}
// insert medical plan
foreach ($request->medical_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['medical_plan_str'],
'type' => 1,
'created_at' => date('Y-m-d'),
]);
}
// insert non medical plan
foreach ($request->non_medikamentosa_plan as $row) {
DB::table('request_log_medical_plan')->insert([
'request_log_daily_monitoring_id' => $db_response->id,
'plan' => $row['non_medikamentosa_plan_str'],
'type' => 2,
'created_at' => date('Y-m-d'),
]);
}
// insert file result
if ($request->confirmation_medical_leter){
foreach ($request->confirmation_medical_leter as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'confirmation-medical-letter',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => $path,
]);
}
}
if ($request->medical_action_letter){
foreach ($request->medical_action_letter as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'medical-action-letter',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => $path,
]);
// $file->storeAs($this->path_for_store, $fileName);
}
}
if ($request->result){
foreach ($request->result as $file) {
$name = 'labresult-' . uniqid();
$extension= $file->getClientOriginalExtension();
$fileName = $name . '.' . $extension;
$path = $file->storeAs($this->path_for_store, $fileName);
File::create([
'fileable_type' => 'App\Models\LaboratoriumResult',
'fileable_id' => $db_response->id,
'type' => 'laboratorium-result',
'name' => $name,
'original_name' => $fileName,
'extension' => $extension,
'path' => $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);
}
}
/**
* Update Status Request LOG
*/
public function UpdateListRequestLog(Request $request, $request_code)
{
// get claim request
$request_log = DB::table('request_logs')
->where('code', $request_code)
->update([
'discharge_date' => now(),
'updated_by' => auth()->user()->id,
'updated_at' => now()
]);
if ($request_log) {
return response()->json([
'error' => false,
'message' => "success",
'data' => []
], 200);
} else {
return response()->json([
'error' => true,
'message' => $e->getMessage(),
'data' => []
],500);
}
}
}

View File

@@ -3,40 +3,20 @@
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, $diagnosis_template_id)
public function index(Request $request)
{
$diagnosis = Icd::query()
->filter($request->toArray())
->where('icd_template_id', '=', $diagnosis_template_id)
->orderBy('code', 'ASC')
->paginate(15);
$diagnosis = Icd::withTrashed()->filter($request->toArray())->paginate();
return $diagnosis;
}
@@ -107,178 +87,4 @@ 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,7 +7,6 @@ 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;
@@ -18,8 +17,6 @@ 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
{
@@ -40,22 +37,6 @@ 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
@@ -235,13 +216,7 @@ 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),
@@ -293,7 +268,6 @@ class DiagnosisExclusionController extends Controller
$gender = implode(",", $gender);
$gender = trim($gender, ",");
$exclusion->rules()->corporate_id = $corporate_id;
$exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
@@ -319,6 +293,7 @@ class DiagnosisExclusionController extends Controller
'values' => $data['min_age'] ?? '',
]);
$exclusion->rules()->updateOrCreate([
'exclusion_id' => $exclusion->id,
'name' => 'max_age',
@@ -345,85 +320,4 @@ 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

@@ -1,314 +0,0 @@
<?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,7 +19,6 @@ class DivisionController extends Controller
$benefits = CorporateDivision::query()
->filter($request->all())
->where('corporate_id', $corporate_id)
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
@@ -53,7 +52,6 @@ class DivisionController extends Controller
'corporate_id' => $corporate_id,
'code' => $request->code,
'name' => $request->name,
'description' => $request->description ? $request->description : null,
]);
return $newCorporatePlan;
@@ -93,6 +91,8 @@ 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,
'description' => $request->description,
'active' => $request->active,
])->save();
return $corporatePlan;

View File

@@ -1,103 +0,0 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use App\Models\OLDLMS\DoctorRating;
class DoctorRatingController extends Controller
{
/**
* Display a listing of the resource.
* @param int|null $id
* @return \Illuminate\Http\JsonResponse
*/
public function index($id = null)
{
$query = DoctorRating::query();
if ($id !== null) {
$query->where('nID', $id);
}
$doctorRatings = $query->with([
'user' => function ($query) {
$query->select('nID', 'sFirstName'); // Select only necessary columns
}
])
->select('nIDUser', 'nIDDokter', 'nRating', 'sNotes', 'dCreateOn')
->get();
// $prescriptions->toArray();
// dd($prescriptions);
return response()->json($doctorRatings);
// return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
}
/**
* 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)
{
}
/**
* 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

@@ -6,8 +6,6 @@ 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
{
@@ -17,11 +15,8 @@ class DrugController extends Controller
*/
public function index(Request $request)
{
$drugs = Drug::query()
->filter($request->all())
->orderBy('id', 'DESC')
->paginate(0)
->appends($request->all());
$drugs = Drug::withTrashed()->filter($request->toArray())->paginate();
return $drugs;
}
@@ -84,110 +79,4 @@ 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,21 +3,9 @@
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
{
@@ -25,27 +13,10 @@ class FormulariumController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function __construct(FormulariumService $formulariumService)
public function index(Request $request)
{
$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;
}
$formulariums = Formularium::withTrashed()->withCount('items')->filter($request->toArray())->paginate();
return $formulariums;
}
@@ -63,7 +34,7 @@ class FormulariumController extends Controller
* @param Request $request
* @return Renderable
*/
public function store(Request $request, $id)
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
@@ -116,7 +87,7 @@ class FormulariumController extends Controller
//
}
public function import(Request $request, $id)
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xls,xlsx,csv,txt',
@@ -124,6 +95,7 @@ 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',
@@ -135,6 +107,7 @@ 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) {
@@ -157,19 +130,16 @@ class FormulariumController extends Controller
$row_data = [];
$row_map = [
0 => 'code',
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',
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'
];
foreach ($row->getCells() as $header_index => $cell) {
@@ -187,27 +157,20 @@ class FormulariumController extends Controller
if (
// empty($row_data['code']) &&
// empty($row_data['description']) &&
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'])
) {
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'])) {
continue;
}
// Save the Row
$formulariumService = new FormulariumService();
$formulariumService->handleFormuariumTemplateRow($row_data, $id);
$exclusionService = new ExclusionService();
$exclusionService->handleDiagnosisExclusionRow($corporate, $row_data);
// Write Success Result to File
$import->addArrayToRow(array_merge($row_data, [
@@ -248,64 +211,4 @@ 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

@@ -1,316 +0,0 @@
<?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

@@ -1,266 +0,0 @@
<?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

@@ -1,148 +0,0 @@
<?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

@@ -55,8 +55,8 @@ class PaymentController extends Controller
// });
$appointments = $appointments->where(function($q) use ($request) {
$q->where('dCreateOn', '>=', $request->appointment_start)
->where('dCreateOn', '<=', $request->appointment_end);
$q->where('dAgreeOn', '>=', $request->appointment_start)
->where('dAgreeOn', '<=', $request->appointment_end);
});
}

View File

@@ -4,16 +4,10 @@ namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\OLDLMS\Livechat;
use App\Models\OLDLMS\Appointment;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;
use Modules\Internal\Transformers\LivechatResource;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
class LivechatController extends Controller
{
@@ -21,29 +15,34 @@ class LivechatController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
public function index()
{
$startDate = $request->startDate;
$endDate = $request->endDate;
$livechat = Livechat::with('doctor.user', 'doctor.speciality', 'appointment.appointmentDetail', 'healthCare');
// ->where('nIDAppointment', '!=', null)
// ->where('nIDAppointment', '!=', '');
if ($startDate) {
$livechat = $livechat->where('dCreateOn', '>=', $startDate);
}
if ($endDate) {
$endDate = date('Y-m-d', strtotime($endDate . ' +1 day'));
$livechat = $livechat->where('dCreateOn', '<', $endDate);
}
$livechat = $livechat->latest()->paginate(15);
$livechat = Livechat::with('doctor.user', 'doctor.speciality', 'appointment.appointmentDetail', 'healthCare')
->where('nIDAppointment', '!=', null)->where('nIDAppointment', '!=', '')
->latest()
->paginate(15);
return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
}
/**
* 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
@@ -58,159 +57,34 @@ class LivechatController extends Controller
return response()->json(new LivechatResource($livechat));
}
public function export(Request $request)
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
$startDate = $request->has('startDate') ? $request->input('startDate') : '';
$endDate = $request->has('endDate') ? $request->input('endDate') : '';
return view('internal::edit');
}
$liveChats = Livechat::with('user:nID,sFirstName,sLastName,sEmail,sPhone,nIDUser', 'doctor:nID,nIDSpesialis,nIDUser', 'doctor.user:nID,sFirstName,sLastName', 'appointment:nID,sPaymentStatus,sPaymentMethod', 'appointment.appointmentDetail:nID,nIDAppointment,dTanggalAppointment,tTimeAppointment', 'healthCare:nID,sHealthCare')
->where(function (Builder $query) use ($startDate, $endDate) {
// $query->where('nIDAppointment', '!=', null);
// $query->where('nIDAppointment', '!=', '');
if ($startDate) {
$query->where('dCreateOn', '>=', $startDate);
}
if ($endDate) {
$endDate = date('Y-m-d', strtotime($endDate . ' +1 day'));
$query->where('dCreateOn', '<', $endDate);
}
})
->orderBy('nID', 'desc')
->get(['nID', 'nIDUser', 'nIDDokter', 'nIDHealthCare', 'nIDAppointment', 'sStatus', 'sMediaDokter', 'sMedia', 'dCreateOn']);
$headers = [
['value' => 'No', 'cell' => 'A1', 'mergeCell' => true, 'mergeToCell' => 'A2'],
['value' => 'Kode TC', 'cell' => 'B1', 'mergeCell' => true, 'mergeToCell' => 'B2'],
['value' => 'Tanggal', 'cell' => 'C1', 'mergeCell' => true, 'mergeToCell' => 'C2'],
['value' => 'Waktu', 'cell' => 'D1', 'mergeCell' => true, 'mergeToCell' => 'D2'],
['value' => 'Faskes', 'cell' => 'E1', 'mergeCell' => true, 'mergeToCell' => 'E2'],
['value' => 'Nama Dokter', 'cell' => 'F1', 'mergeCell' => true, 'mergeToCell' => 'F2'],
['value' => 'Spesialis', 'cell' => 'G1', 'mergeCell' => true, 'mergeToCell' => 'G2'],
['value' => 'Chat Via App/Website', 'cell' => 'H1', 'mergeCell' => true, 'mergeToCell' => 'I1'],
['value' => 'Pasien', 'cell' => 'H2', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'Dokter', 'cell' => 'I2', 'mergeCell' => false, 'mergeToCell' => ''],
['value' => 'nIDUser', 'cell' => 'J1', 'mergeCell' => true, 'mergeToCell' => 'J2'],
['value' => 'Nama Pasien', 'cell' => 'K1', 'mergeCell' => true, 'mergeToCell' => 'K2'],
['value' => 'No Telepon Pasien', 'cell' => 'L1', 'mergeCell' => true, 'mergeToCell' => 'L2'],
['value' => 'Email Pasien', 'cell' => 'M1', 'mergeCell' => true, 'mergeToCell' => 'M2'],
['value' => 'Status', 'cell' => 'N1', 'mergeCell' => true, 'mergeToCell' => 'N2'],
['value' => 'Record Type', 'cell' => 'O1', 'mergeCell' => true, 'mergeToCell' => 'O2'],
['value' => 'nID Principal', 'cell' => 'P1', 'mergeCell' => true, 'mergeToCell' => 'P2'],
['value' => 'Metode Pembayaran', 'cell' => 'Q1', 'mergeCell' => true, 'mergeToCell' => 'Q2'],
];
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Renderable
*/
public function update(Request $request, $id)
{
//
}
$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 = 3;
foreach ($liveChats as $indexLiveChat => $liveChat) {
$phone = $liveChat->user->sPhone ?? '-';
$status = $liveChat->sStatus;
$nIDUser = $liveChat->user->nIDUser ?? 0; // Principal or Dependent
$paymentMethod = $liveChat->appointment ? Helper::sPaymentMethod($liveChat->appointment->sPaymentMethod) : 'N/A';
$fullNameDoctor = '-';
if ($liveChat->doctor->user !== null) {
$fullNameDoctor = '';
if ($liveChat->doctor->user->detail !== null) {
if ($liveChat->doctor->user->detail->sTitlePrefix !== null) {
$fullNameDoctor .= $liveChat->doctor->user->detail->sTitlePrefix . '. ';
}
if ($liveChat->doctor->user->full_name !== null) {
$fullNameDoctor .= $liveChat->doctor->user->full_name . ' ';
}
if ($liveChat->doctor->user->detail->sTitleSuffix !== null) {
$fullNameDoctor .= $liveChat->doctor->user->detail->sTitleSuffix;
}
}
}
$recordType = 'P';
if ($nIDUser){
$recordType = 'D';
}
switch ($status) {
case 0:
$statusLivechat = "Request TC";
break;
case 1:
$statusLivechat = "Accepted by Doctor but User not Payment";
break;
case 2:
$statusLivechat = "Payment Success";
break;
case 3:
$statusLivechat = "Decline by Doctor";
break;
case 4:
$statusLivechat = "Payment Expired";
break;
default:
$statusLivechat = "Cancel by Patient";
}
$sheet->setCellValue('A' . $startFrom, $indexLiveChat + 1);
$sheet->setCellValue('B' . $startFrom, $liveChat->nID ?? '-');
$sheet->setCellValue('C' . $startFrom, Carbon::parse($liveChat->dCreateOn)->format('d-m-Y'));
$sheet->setCellValue('D' . $startFrom, Carbon::parse($liveChat->dCreateOn)->format('H:i:s'));
// $sheet->setCellValue('D' . $startFrom, Carbon::parse($liveChat->dRequestTime)->format('H:i:s'));
$sheet->setCellValue('E' . $startFrom, $liveChat->healthCare->sHealthCare ?? '-');
$sheet->setCellValue('F' . $startFrom, $fullNameDoctor);
$sheet->setCellValue('G' . $startFrom, $liveChat->doctor->speciality->sSpesialis ?? '-');
$sheet->setCellValue('H' . $startFrom, $liveChat->sMedia ?? '-');
$sheet->setCellValue('I' . $startFrom, $liveChat->sMediaDokter ?? '-');
$sheet->setCellValue('J' . $startFrom, $liveChat->user->nID ?? '-');
$sheet->setCellValue('K' . $startFrom, $liveChat->user->full_name ?? '-');
$sheet->setCellValue('L' . $startFrom, preg_replace('/(\d{3})(\d{4})(\d{3})/', '$1$2$3', $phone));
$sheet->setCellValue('M' . $startFrom, $liveChat->user->sEmail ?? '-');
$sheet->setCellValue('N' . $startFrom, $statusLivechat);
$sheet->setCellValue('O' . $startFrom, $recordType);
$sheet->setCellValue('P' . $startFrom, $nIDUser ?? '-');
$sheet->setCellValue('Q' . $startFrom, $paymentMethod ?? '-');
$startFrom++;
}
foreach (['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L', 'M', 'O', 'P'] 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('A3:A' . $startFrom)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
$sheet->getDefaultRowDimension()->setRowHeight(-1);
$sheet->setTitle('Live Chat Report');
$writer = new Xlsx($spreadsheet);
ob_start();
$writer->save('php://output');
$content = ob_get_contents();
ob_end_clean();
$fileName = 'result-' . now()->getPreciseTimestamp(3) . '-livechat-report.xlsx';
Storage::disk('public')->put('temp/' . $fileName, $content);
$fileUrl = url('storage/temp/' . $fileName);
return Helper::responseJson([
"file_url" => $fileUrl
]);
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
*/
public function destroy($id)
{
//
}
}

View File

@@ -13,14 +13,10 @@ class MemberController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
public function index()
{
return Member::query()
->when($request->search, function ($query, $search) {
return $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('member_id', 'LIKE', '%' . $search . '%');
})
->with('currentPlan', 'currentCorporate')
->with('currentPlan')
->paginate();
}

View File

@@ -120,6 +120,7 @@ class PlanController extends Controller
$result_headers = array_keys($headers_map_to_table_fields);
array_push($result_headers, ['Ingest Code', 'Ingest Note']);
$import->addArrayToRow($result_headers);
die('fuck');
$imported_plan_data = 0;
$failed_plan_data = [];

View File

@@ -1,96 +0,0 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Models\OLDLMS\Prescription;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
class PrescriptionController extends Controller
{
/**
* Display a listing of the resource.
* @param int|null $id
* @return \Illuminate\Http\JsonResponse
*/
public function index($id = null)
{
$query = Prescription::query();
if ($id !== null) {
$query->where('nID', $id);
}
$prescriptions = $query->select('nID','nIDLiveChat', 'nIDLiveChatSummary', 'nIDDokter', 'sDokterName', 'dTanggalResep', 'sSource', 'nIDUser', 'sKodeResep', 'sDiagnose', 'sStatus')
->get();
// $prescriptions->toArray();
// dd($prescriptions);
return response()->json($prescriptions);
// return response()->json(Helper::paginateResources(LivechatResource::collection($livechat)));
}
/**
* 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)
{
}
/**
* 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

@@ -1,145 +0,0 @@
<?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;
use Carbon\Carbon;
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'],
'created_by' => auth()->user()->id,
];
// 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->updated_by = auth()->user()->id;
$requestLogBenefit->updated_at = Carbon::now();
$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

@@ -1,837 +0,0 @@
<?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\Exceptions\ImportRowException;
use App\Events\RequestLoged;
use Carbon\Carbon;
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;
use Modules\Internal\Services\RequestLogService;
use App\Services\RequestLogService as AppRequestLogService;
class RequestLogController extends Controller
{
private static $code_prefix = 'LOG';
/**
* Display a listing of the resource.
* @return Renderable
*/
public function __construct()
{
$this->requestLogService = New RequestLogService;
}
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) {
if ($service_code == 'IP'){ // Penjagaan sementara agar ini hanya muncul di inpatient monitoring
$q->where('service_code', $service_code);
} else {
$q->where('service_code', '!=', 'IP'); // Dan selain IP muncul di final LOG
}
})
// ->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 = AppRequestLogService::storeRequestLog(
row: [],
code: $code,
member: $member,
paymentType: 'cashless',
serviceCode: $request->service_code,
submissionDate: null,
// status: 'approved',
status: 'requested', // di nonaktifkan dulu auto 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 = AppRequestLogService::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');
},
// 'member.current_policy',
'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->keterangan = $request->keterangan;
$requestLog->hak_kamar_pasien = $request->hak_kamar_pasien;
$requestLog->penempatan_kamar = $request->penempatan_kamar;
$requestLog->catatan = $request->catatan;
$requestLog->status = $request->status;
$requestLog->approved_by = auth()->user()->id;
$requestLog->approved_at = Carbon::now();
$requestLog->save();
// update nirc member
$member = Member::findOrFail($requestLog->member_id);
$member->nric = $request->no_identitas;
$member->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->catatan = $request->catatan;
$requestLog->final_log = 1;
$requestLog->status_final_log = $status;
$requestLog->approved_final_log_by = auth()->user()->id;
$requestLog->approved_final_log_at = Carbon::now();
$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);
$reader = ReaderEntityFactory::createXLSXReader(Storage::path('temp/' . $file_name));
$reader->open(Storage::path('temp/' . $file_name));
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile(Storage::disk('public')->path('temp/result-' . $file_name));
$headers_map_to_table_fields = $this->requestLogService->doc_headers_to_field_map;
// Write Header to File with certain Format from MemberEnrollmentService::$result_doc_headers
$result_headers = $this->requestLogService->listing_doc_headers;
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRow($result_headers));
$writer->addRow($singleRow);
$imported_member_data = 0;
$failed_member_data = [];
foreach ($reader->getSheetIterator() as $sheet) {
$doc_headers_indexes = [];
foreach ($sheet->getRowIterator() as $index => $row) {
if ($index == 1) { // First Row Must be Header
foreach ($row->getCells() as $index => $cell) {
// Clear up the string and remove all spaces
$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;
}
} else { // Next Row Should be Data
// Collecting Values from table rows and map it to correct fields
$requestLog = [];
foreach ($row->getCells() as $header_index => $cell) {
if (isset($headers_map_to_table_fields[$doc_headers_indexes[$header_index]])) {
$requestLog[$headers_map_to_table_fields[$doc_headers_indexes[$header_index]]] = $cell->getValue();
}
}
try {
$rowResponse = $this->requestLogService->handleImportRow($requestLog);
// Write Success Result to File
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($rowResponse));
$writer->addRow($singleRow);
$imported_member_data++;
} catch (ImportRowException $e) {
// Write Data Validation Error to File
$requestLog = array_merge($requestLog, [
'ingestion_code' => $e->getCode(),
'ingestion_status' => $e->getMessage(),
]);
// try {
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($requestLog));
$writer->addRow($singleRow);
// } catch (\Exception $e) {
$failed_member_data[] = ['row_number' => $index, 'error' => $e->getMessage(), 'data' => $requestLog];
// }
} catch (\Exception $e) {
// Write Server Error to File
$requestLog = array_merge($requestLog, [
'ingestion_code' => $e->getCode(),
'ingestion_status' => $e->getMessage(),
]);
$singleRow = WriterEntityFactory::createRow($this->requestLogService->makeResultRowWithResultFormat($requestLog));
$writer->addRow($singleRow);
$failed_member_data[] = ['row_number' => $index, 'error' => $e->getMessage()];
}
}
}
break; //only read first sheet
}
$reader->close();
$writer->close();
Storage::delete('temp/' . $file_name);
// throw(404);
return [
'total_success_row' => $imported_member_data,
'total_failed_row' => count($failed_member_data),
'failed_row' => $failed_member_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, 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\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

@@ -1,136 +0,0 @@
<?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

@@ -1,86 +0,0 @@
<?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

@@ -1,17 +0,0 @@
<?php
namespace Modules\Internal\Http\Controllers\Api;
use App\Helpers\Helper;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use App\Models\User;
class UserManagemet extends Controller
{
public function index(Request $request){
$user = User::all();
return Helper::responseJson(data: $user);
}
}

View File

@@ -12,7 +12,6 @@ use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
use Modules\Internal\Transformers\EncounterResource;
class ClaimEncounterController extends Controller
{
/**
@@ -32,13 +31,6 @@ class ClaimEncounterController extends Controller
{
return view('internal::create');
}
public function getAllData()
{
$encounters = Encounter::with('claim.member')->get();
return Helper::responseJson(data: EncounterResource::collection($encounters), message: 'Data berhasil diambil');
}
/**
* Store a newly created resource in storage.
@@ -263,22 +255,6 @@ class ClaimEncounterController extends Controller
}
}
public function xcounters($claim_id)
{
$claim = Claim::findOrFail($claim_id);
$encounters = $claim->encounters()->get();
return response()->json($encounters);
}
public function getEncounterData($encounter_id)
{
$encounter = Encounter::with('claim.member')->findOrFail($encounter_id);
return Helper::responseJson(data: EncounterResource::make($encounter), message: 'Data berhasil diambil');
}
/**
* Remove the specified resource from storage.
* @param int $id

View File

@@ -8,9 +8,6 @@ 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;
@@ -18,16 +15,12 @@ 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;
@@ -35,17 +28,10 @@ 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;
/*
|--------------------------------------------------------------------------
| API Routes
@@ -61,7 +47,6 @@ use Modules\Internal\Http\Controllers\ClaimEncounterController;
Route::prefix('internal')->group(function () {
Route::post('login', [AuthController::class, 'login'])->name('login');
Route::post('register', [AuthController::class, 'register'])->name('register');
Route::post('forget-password', [AuthController::class, 'forgetPassword'])->name('forget-password');
Route::post('verify-email', [AuthController::class, 'verifyEmail'])->name('verify-email');
@@ -81,16 +66,11 @@ 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']);
Route::get('corporates/{corporate_id}/corporate-plans', [CorporatePlanController::class, 'index']);
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']);
@@ -110,27 +90,13 @@ 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']);
@@ -139,88 +105,20 @@ 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::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']);
Route::post('detail/{claim_code}/add-request', [DailyMonitoringController::class, 'AddDetailMonitoringListRequestLog']);
Route::post('detail/{claim_code}/update-status', [DailyMonitoringController::class, 'UpdateListRequestLog']);
});
// 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/diagnosis', [DiagnosisController::class, 'index']);
Route::get('master/diagnosis/search', [DiagnosisController::class, 'search']);
Route::get('master/drugs', [DrugController::class, 'index']);
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('master/formulariums', [FormulariumController::class, 'index']);
Route::post('master/formulariums', [FormulariumController::class, 'store']);
Route::post('master/formulariums/import', [FormulariumController::class, 'import']);
Route::get('members', [MemberController::class, 'index']);
Route::get('members/{member_id}/benefits', [MemberController::class, 'benefits']);
@@ -235,85 +133,26 @@ 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);
Route::resource('appointments', AppointmentController::class);
Route::get('live-chat/export', [LivechatController::class, 'export']);
Route::resource('live-chat', LivechatController::class);
Route::get('prescription', [PrescriptionController::class, 'index']);
Route::get('prescription/{id}', [PrescriptionController::class, 'index']);
Route::get('doctorrating', [DoctorRatingController::class, 'index']);
Route::get('doctorrating/{id}', [PrescriptionController::class, 'index']);
Route::resource('doctors', DoctorController::class);
Route::post('generate-log/{member_id}', [CorporateMemberController::class, 'generateLog']);
Route::get('send_card/{corporate_id}', [CorporateMemberController::class, 'sendAllECard']);
Route::get('view_card/{member_id}', [CorporateMemberController::class, 'viewECard']);
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

@@ -6,131 +6,27 @@ use App\Exceptions\ImportRowException;
use App\Models\Benefit;
use App\Models\Corporate;
use App\Models\CorporateBenefit;
use App\Models\CorporatePolicy;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class CorporateService
{
/*
Refer to Coverage code :
MEDIVAC = Medical evacuation
MSO = Medical second opinion
PAC = Personal Assistant Concierge
OPDE = Outpatient Dental
IP=Inpatient
OP=Outpatient
MA=Maternity
ANC = Ante/Post Natal Care
DE=Dental
GL=Glasses
SP=Special Treatment
PF=Pooled Fund
MCU=Medical Check Up
KB-VACC = Family Planning/Vaccination
LAB = Test Diagnostic
PHAR = Pharmacy
**/
protected $service_code = ['MEDIVAC', 'MSO', 'PAC', 'OPDE', 'IP', 'OP', 'MA', 'ANC', 'DE', 'GL', 'SP', 'PF', 'MCU', 'KB-VACC', 'LAB', 'PHAR'];
protected function corporatePlansId($corporate_id){
$plans = Plan::where('corporate_id', $corporate_id)->get()->toArray();
$current_corporate_plans_id = [];
if($plans){
foreach($plans as $plan){
array_push($current_corporate_plans_id,$plan['corporate_plan_id']);
}
}
return $current_corporate_plans_id;
}
protected function validatePlanRow($row, $corporate_id)
protected function validatePlanRow($row)
{
// $corporate_policy = CorporatePolicy::where('corporate_id', $corporateId)->get();
$plans = Plan::where('corporate_id', $corporate_id)->get()->toArray();
$current_corporate_plans = $this->corporatePlansId($corporate_id);
$plan_code = [1, 2, 3, 4];
$prorate_type = [0, 1, 2];
$family_plan = ['F', 'S', 'N'];
if (empty($row['service_code'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Service Code'
] ), 0, null, $row);
} else if (!in_array($row['service_code'], $this->service_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Service Code',
'code' => $row['service_code']
]), 0, null, $row);
}
if (empty($row['corporate_plan_id'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Plan'
]), 0, null, $row);
} else if(!in_array($row['corporate_plan_id'], $current_corporate_plans)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plans',
// 'code' => $row['corporate_plan_id']
// ]), 0, null, $row);
throw new ImportRowException(__('plan.RECORD_TYPE_REQUIRED'), 0, null, $row);
}
if (empty($row['code'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Customer Plan'
]), 0, null, $row);
throw new ImportRowException(__('plan.CODE_REQUIRED'), 0, null, $row);
}
if (!in_array($row['type'], $plan_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Plan Type',
'code' => $row['type']
]), 0, null, $row);
} else if ($row['type'] == 2 && $row['limit_rules'] != 999999999){
throw new ImportRowException(__('plan.LIMIT_PLAN'), 0, null, $row);
}
// if (!empty($row['start'])) {
// throw new ImportRowException(__('plan.REQUIRED', [
// 'attribute' => 'Start Date of Plan'
// ]), 0, null, $row);
// }
// if (empty($row['type'])) {
// throw new ImportRowException(__('plan.TYPE_REQUIRED'), 0, null, $row);
// } else if (!in_array($row['type'],$plan_code)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plan Type',
// 'code' => $row['code']
// ]), 0, null, $row);
// }
if (!empty($row['family_plan']) && !in_array($row['family_plan'],$family_plan)) {
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Family Plan',
'code' => $row['family_plan']
]), 0, null, $row);
}
if (!empty($row['prorate_type']) && !in_array($row['prorate_type'], $prorate_type)) {
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Prorate Type',
'code' => $row['prorate_type']
]), 0, null, $row);
}
if (!empty($row['prorate_lookup']) && !in_array($row['prorate_lookup'], $prorate_type)) {
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Prorate Lookup',
'code' => $row['prorate_lookup']
]), 0, null, $row);
if (empty($row['type'])) {
throw new ImportRowException(__('plan.TYPE_REQUIRED'), 0, null, $row);
}
if (empty($row['limit_rules'])) {
throw new ImportRowException(__('plan.PLAN_LIMIT_REQUIRED'), 0, null, $row);
} else {
}
if (empty($row['msc'])) {
@@ -138,13 +34,12 @@ class CorporateService
}
}
public function handlePlanRow(Corporate $corporate, $row)
{
try {
$plan_data = $row;
$this->validatePlanRow($plan_data, $corporate->id);
$plan_data["corporate_id"] = $corporate->id;
$this->validatePlanRow($plan_data);
$plan = $corporate->plans()->updateOrCreate([
'corporate_plan_id' => $plan_data['corporate_plan_id'],
// 'active' => 0,
@@ -156,111 +51,68 @@ class CorporateService
}
}
protected function validateBenefitRow($row, $corporate_id)
protected function validateBenefitRow($row)
{
$max_frequence = 7;
$budget_aso = [1,2];
$current_corporate_plans = $this->corporatePlansId($corporate_id);
if (empty($row['service_code'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Service Code'
]), 0, null, $row);
} else if (!in_array($row['service_code'], $this->service_code)){
throw new ImportRowException(__('plan.NOT_MATCH', [
'attribute' => 'Service Code',
'code' => $row['service_code']
]), 0, null, $row);
throw new ImportRowException(__('benefit.SERVICE_CODE_REQUIRED'), 0, null, $row);
}
if (empty($row['plan_code'])) {
throw new ImportRowException(__('benefit.PLAN_CODE_REQUIRED'), 0, null, $row);
} else if (!in_array($row['plan_code'], $current_corporate_plans)){
// throw new ImportRowException(__('plan.NOT_MATCH', [
// 'attribute' => 'Plan',
// 'code' => $row['plan_code']
// ]), 0, null, $row);
}
if (empty($row['code'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Benefit Code'
]), 0, null, $row);
throw new ImportRowException(__('benefit.BENEFIT_CODE_REQUIRED'), 0, null, $row);
}
if (empty($row['corporate_benefit_code'])) {
throw new ImportRowException(__('Customer Benefit Code Required', [
'attribute' => 'Customer Benefit Code'
]), 0, null, $row);
throw new ImportRowException(__('benefit.CUSTOMER_BENEFIT_CODE_REQUIRED'), 0, null, $row);
}
if (empty($row['description'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Description'
]), 0, null, $row);
throw new ImportRowException(__('benefit.DESCRIPTION_REQUIRED'), 0, null, $row);
}
if (empty($row['limit_amount'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Limit Amount'
]), 0, null, $row);
throw new ImportRowException(__('benefit.LIMIT_AMOUNT_REQUIRED'), 0, null, $row);
}
if (empty($row['msc'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'MSC'
]), 0, null, $row);
throw new ImportRowException(__('benefit.MSC_REQUIRED'), 0, null, $row);
}
if (empty($row['genders'])) {
throw new ImportRowException(__('plan.REQUIRED', [
'attribute' => 'Gender'
]), 0, null, $row);
throw new ImportRowException(__('benefit.GENDER_REQUIRED'), 0, null, $row);
}
if (!empty($row['max_frequency_period']) && $row['max_frequency_period'] >= $max_frequence){ // jenis frequence
throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row);
}
if (!empty($row['budget']) && !in_array($budget_aso)) {
throw new ImportRowException(__('plan.MAX_FREQUENCY'), 0, null, $row);
}
// if (empty($row['limit_free_tc'])){
// throw new ImportRowException(__('plan.REQUIRED', [
// 'attribute' => 'Limit Free TC'
// ]), 0, null, $row);
// }
}
public function handleBenefitRow(Corporate $corporate, $row)
{
try {
$row['limit_free_tc'] = 0;
$benefit_data = $row;
$this->validateBenefitRow($benefit_data, $corporate->id);
$benefit_data["corporate_id"] = $corporate->id;
$this->validateBenefitRow($benefit_data);
$plan = $corporate->plans()
->where('corporate_plan_id', $benefit_data['plan_code'])
->first();
// $corporate->plans->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,
], [
'code' => $benefit_data['code'],
'service_code' => $plan->service_code,
'active' => 1,
'description' => $benefit_data['description'],
]);
$corporateBenefit = $corporate->corporateBenefits()->updateOrCreate([
'benefit_id' => $benefit->id,
'plan_id' => $plan->id,
'corporate_id' => $corporate->id,
'plan_id' => $plan->id
], $benefit_data);
return $corporateBenefit;
} catch (\Exception $e) {
// dd($e->getMessage());
throw $e;
}
}

View File

@@ -6,7 +6,6 @@ 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;
@@ -14,21 +13,23 @@ class ExclusionService
{
protected function validateDiagnosisExclusionRow($row)
{
if (empty($row['service_code'])) {
throw new ImportRowException(__('plan.REQUIRED'), 0, null, $row);
}
// if (empty($row['service_code'])) {
// throw new ImportRowException(__('plan.RECORD_TYPE_REQUIRED'), 0, null, $row);
// }
}
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' => 'IP',
'service_code' => 'OP',
'type' => 'diagnosis'
]);
@@ -88,8 +89,7 @@ class ExclusionService
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'OP',
'type' => 'diagnosis',
'active' => 1
'type' => 'diagnosis'
]);
if (!empty($excl_array[1])) { //msc
@@ -130,35 +130,11 @@ class ExclusionService
]);
}
if (!empty($excl_array[5])) { //plans
$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
]);
});
$exclusion->rules()->create([
'name' => 'plan',
'values' => $excl_array[5]
]);
}
} 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]);
}
}
}
@@ -168,7 +144,7 @@ class ExclusionService
$icd = Icd::where('code', $row['code'])->first();
$exclusion = $icd->exclusions()->create([
'corporate_id' => $corporate->id,
'service_code' => 'DE',
'service_code' => 'OP',
'type' => 'diagnosis'
]);
@@ -220,6 +196,7 @@ class ExclusionService
if (!empty($row['ma_exclusion'])) {
$excl_array = explode('|', $row['ma_exclusion']);
dd($excl_array);
if ($excl_array[0]) {
}
}

View File

@@ -7,11 +7,10 @@ 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 FormulariumService
class CorporateService
{
protected function validateFormulariumRow($row)
{
@@ -46,75 +45,4 @@ class FormulariumService
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

@@ -1,53 +0,0 @@
<?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

@@ -7,17 +7,11 @@ use App\Helpers\Helper;
use App\Models\Corporate;
use App\Models\CorporateEmployee;
use App\Models\CorporateDivision;
use App\Models\CorporatePolicy;
use App\Models\CorporatePlan;
use App\Models\Member;
use App\Models\MemberPolicy;
use App\Models\MemberPlan;
use App\Models\Person;
use App\Models\Plan;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\OLDLMS\UserInsurance;
use App\Models\OLDLMS\UserInsuranceDetail;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Carbon\Carbon;
@@ -32,7 +26,7 @@ class MemberEnrollmentService
"Payor ID" => "payor_id",
"Member ID" => "member_id",
"Mapping ID" => "principal_id",
"LinkSehat Member ID" => "halodoc_member_id",
"Halodoc Member ID" => "halodoc_member_id",
"Corporate ID" => "corporate_id",
"NIK" => "nik",
"Division" => "division_name",
@@ -56,7 +50,7 @@ class MemberEnrollmentService
"Agent Code / intermediary code" => "agent_code",
"Member Name" => "name",
"Address1" => "address1",
// "Address 1" => "address1",
"Address 1" => "address1",
"Address2" => "address2",
"Address3" => "address3",
"Address4" => "address4",
@@ -96,13 +90,12 @@ class MemberEnrollmentService
"Member Suspended" => "member_suspended",
"Activation Date" => "activation_date",
"Internal Use" => "internal_use_6",
"Date Terminated" => "date_terminated",
"StartNoClaim" => "start_no_claim",
"EndNoClaim" => "end_no_claim",
"Option Mode" => "option_mode",
"Policy Inforce" => "policy_in_force",
"Renewal activation date" => "renewal_activation_date",
// "Renewal Activation Date" => "renewal_activation_date",
"Renewal Activation Date" => "renewal_activation_date",
"Ingestion Code" => "ingestion_code", // TODO I think this should not be here because if user uploading result then ingestion code and status will be filled
"Ingestion Status" => "ingestion_status",
];
@@ -113,7 +106,7 @@ class MemberEnrollmentService
"payor_id" => "Payor ID",
"member_id" => "Member ID",
"principal_id" => "Mapping ID",
"halodoc_member_id" => "LinkSehat Member ID",
"halodoc_member_id" => "Halodoc Member ID",
"corporate_id" => "Corporate ID",
"nik" => "NIK",
"division_name" => "Division",
@@ -136,7 +129,7 @@ class MemberEnrollmentService
"agent_code" => "Agent Code / intermediary code",
"name" => "Member Name",
"address1" => "Address1",
// "address1" => "Address 1",
"address1" => "Address 1",
"address2" => "Address2",
"address3" => "Address3",
"address4" => "Address4",
@@ -175,18 +168,17 @@ class MemberEnrollmentService
"start_no_claim" => "StartNoClaim",
"end_no_claim" => "EndNoClaim",
"option_mode" => "Option Mode",
// "renewal_activation_date" => "Renewal Activation Date",
"renewal_activation_date" => "Renewal Activation Date",
"ingestion_code" => "Ingestion Code",
"ingestion_status" => "Ingestion Status",
];
public $result_doc_headers = [
"Record Mode",
"Record Type",
"Payor ID",
"Member ID",
"Mapping ID",
"LinkSehat Member ID",
"Halodoc Member ID",
"Corporate ID",
"NIK",
"Division",
@@ -209,7 +201,7 @@ class MemberEnrollmentService
"Internal Use",
"Member Name",
"Address1",
// "Address 1",
"Address 1",
"Address2",
"Address3",
"Address4",
@@ -247,127 +239,22 @@ class MemberEnrollmentService
"StartNoClaim",
"EndNoClaim",
"Option Mode",
// "Renewal Activation Date",
"Renewal Activation Date",
"Ingestion Code",
"Ingestion Status",
];
public $listing_doc_headers = [
"Record Mode",
"Record Type",
"Payor ID",
"Member ID",
"Mapping ID",
"LinkSehat Member ID",
"Corporate ID",
"NIK",
"Division",
"Branch Code",
"Bank Info",
"Language",
"Type of work",
"Race",
"Policy Number",
// "Policy No.",
"Marital Status",
"Relationship",
"Member's Effective Date",
"Member's Expiry Date",
"Faskes FKTP (First Level Provider) or Individual preferred provider",
"Faskes FKRTL (Next Level Provider) or Individual group preferred provider",
"The Right Classes Room of BPJS Participants",
"Name of Faskes",
"Rule BPJSK",
"Internal Use",
"Member Name",
"Address1",
// "Address 1",
"Address2",
"Address3",
"Address4",
"City",
"State",
"Post Code",
"Telephone - Mobile",
"Telephone - Res",
"Telephone - Office",
"NRIC",
"Passport No",
"Passport Country",
"Email",
"Identification Code",
"Date of Birth",
"Sex",
"Internal Use",
"Plan-ID",
"Employment-Status",
"Internal Use",
"Internal Use",
"Internal Use",
"Date Terminated",
"Pre Existing",
"BPJS ID",
"Endorsement Date",
"Remarks",
"Internal Use",
"Member Since",
"Internal Use",
"Policy Inforce",
"Member Suspended",
"Activation Date",
"Internal Use",
"StartNoClaim",
"EndNoClaim",
"Option Mode",
// "Renewal Activation Date",
// "Ingestion Code",
// "Ingestion Status",
];
public $doc_headers_send_email = [
"Name",
"Email",
"Message"
];
public function __construct(Member $member)
{
app()->setLocale('en');
$this->member = $member;
}
public function dateParser($date_from_row) {
if ($date_from_row instanceof DateTime) {
return $date_from_row->format('Y-m-d');
} else if ($date_from_row != null) {
return date('Y-m-d', strtotime($date_from_row));
} else {
return null;
}
}
public function validateDate($dateString, $dateFormat = 'Ymd'){
$date = DateTime::createFromFormat($dateFormat, $dateString);
if ($date && ($date->format($dateFormat) == $dateString)) {
return true;
} else {
return false;
}
return is_string($date_from_row) ? Carbon::parse(strtotime($date_from_row)) : Carbon::parse($date_from_row);
}
protected function validateRow($row)
{
$title =[
'member_effective_date' => 'Member Effective Date',
'member_expiry_date' => 'Member Expired Date',
'activation_date' => 'Activation Date',
'date_of_birth' => 'Date of Birth',
'date_terminated' => 'Date Terminated',
];
if (empty($row['record_type'])) {
throw new ImportRowException(__('enrollment.RECORD_TYPE_REQUIRED'), 0, null, $row);
}
@@ -380,10 +267,6 @@ class MemberEnrollmentService
throw new ImportRowException(__('enrollment.MEMBER_ID_REQUIRED'), 0, null, $row);
}
if (empty($row['plan_id'])) {
throw new ImportRowException(__('Plan ID Required'), 0, null, $row);
}
if ($row['record_type'] == 'P') {
if (!empty($row['principal_id'])) {
throw new ImportRowException(__('enrollment.PRINCIPAL_ID_NOT_REQUIRED'), 0, null, $row);
@@ -395,31 +278,9 @@ class MemberEnrollmentService
}
if ($row['record_type'] == 'D') {
$member = Member::query()
->where('member_id', $row['principal_id'])
// ->whereHas('employeds', function ($query) use ($corporate) {
// $query->where('corporate_id', $corporate->id);
// })
->first();
if(empty($member)){
// throw new ImportRowException(__('enrollment.PRINCIPAL_NOT_IN_MEMBER_ID'), 0, null, $row);
} else {
// if ($member['record_type'] != 'P'){
// throw new ImportRowException(__('enrollment.PRINCIPAL_ID_NOT_SAME_MEMBER_ID'), 0, null, $row);
// }
}
if (empty($row['principal_id'])) {
throw new ImportRowException(__('enrollment.PRINCIPAL_ID_REQUIRED'), 0, null, $row);
}
// if (empty($row['relationship_with_principal'])){
// throw new ImportRowException(__('enrollment.RELATIONSHIP_WITH_PRICIPAL_REQUIRED'), 0, null, $row);
// }
// if (!empty($row['relationship_with_principal']) && !in_array($row['relationship_with_principal'], ['H', 'W', 'D', 'S'])){
// throw new ImportRowException(__('enrollment.RELATIONSHIP_WITH_PRICIPAL_NOT_VALID'), 0, null, $row);
// }
}
// TODO RECORD BCA ONLY
@@ -432,141 +293,85 @@ class MemberEnrollmentService
// throw new ImportRowException(__('enrollment.BRANCH_CODE_NOT_REQUIRED'), 0, null, $row);
// }
// if (!empty($row['language']) && !in_array($row['language'], ['M', 'E', 'C', 'I', 'O'])) {
// throw new ImportRowException(__('enrollment.INVALID_LANGUAGE'), 0, null, $row);
// }
if (!empty($row['language']) && !in_array($row['language'], ['M', 'E', 'C', 'I', 'O'])) {
throw new ImportRowException(__('enrollment.INVALID_LANGUAGE'), 0, null, $row);
}
// if (!empty($row['type_of_work']) && !in_array($row['type_of_work'], ['0', '1', '2', '3'])) {
// throw new ImportRowException(__('enrollment.INVALID_TYPE_OF_WORK'), 0, null, $row);
// }
if (!empty($row['type_of_work']) && !in_array($row['type_of_work'], ['0', '1', '2', '3'])) {
throw new ImportRowException(__('enrollment.INVALID_TYPE_OF_WORK'), 0, null, $row);
}
// if (!empty($row['race']) && !in_array($row['race'], ['M', 'C', 'I', 'O'])) {
// throw new ImportRowException(__('enrollment.INVALID_RACE'), 0, null, $row);
// }
if (!empty($row['race']) && !in_array($row['race'], ['M', 'C', 'I', 'O'])) {
throw new ImportRowException(__('enrollment.INVALID_RACE'), 0, null, $row);
}
if (empty($row['policy_number'])) {
throw new ImportRowException(__('enrollment.POLICY_NUMBER_REQUIRED'), 0, null, $row);
}
// if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
// throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
// }
if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
}
// TODO EFFECTIVE DATE VALIDATION
if (empty($row['member_effective_date'])) {
throw new ImportRowException(__('enrollment.MEMBER_EFFECTIVE_REQUIRED'), 0, null, $row);
}
// if(!$this->validateDate($row['member_effective_date'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['member_effective_date']
// ]), 0, null, $row);
// }
// TODO EFFECTIVE DATE VALIDATION
if (empty($row['member_expiry_date'])) {
throw new ImportRowException(__('enrollment.MEMBER_EXPIRY_REQUIRED'), 0, null, $row);
}
// if(!$this->validateDate($row['member_expiry_date'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['member_expiry_date']
// ]), 0, null, $row);
// }
// TODO EFFECTIVE DATE VALIDATION
// if (empty($row['activation_date'])) {
// throw new ImportRowException(__('enrollment.ACTIVATION_DATE_REQUIRED'), 0, null, $row);
// }
// if(!empty($row['activation_date'])){
// if(!$this->validateDate($row['activation_date'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['activation_date']
// ]), 0, null, $row);
// }
// }
// TODO FKTP VALIDATION
// TODO FKRTL VALIDATION
// if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
// throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
// }
if (!empty($row['marital_status']) && !in_array($row['marital_status'], ['S', 'M', 'D'])) {
throw new ImportRowException(__('enrollment.INVALID_MARITAL_STATUS'), 0, null, $row);
}
if (empty($row['name'])) {
throw new ImportRowException(__('enrollment.NAME_REQUIRED'), 0, null, $row);
}
// if (!Helper::validatePhoneNumber($row['telephone_mobile'])){
// throw new ImportRowException(__('enrollment.PHONE_INVALID'), 0, null, $row);
// }
if (
!empty($row['telephone_mobile'])
&& !(substr($row['telephone_mobile'], 0, 4) == '+628' || substr($row['telephone_mobile'], 0, 3) == '628')
) {
throw new ImportRowException(__('enrollment.PHONE_INVALID'), 0, null, $row);
}
// if (
// !empty($row['telephone_mobile'])
// && !(substr($row['telephone_mobile'], 0, 4) == '+628' || substr($row['telephone_mobile'], 0, 3) == '628')
// ) {
// throw new ImportRowException(__('enrollment.PHONE_INVALID'), 0, null, $row);
// }
if (
!empty($row['email'])
&& !filter_var($row['email'], FILTER_VALIDATE_EMAIL)
) {
throw new ImportRowException(__('enrollment.EMAIL_INVALID'), 0, null, $row);
}
// if (
// !empty($row['email'])
// && !filter_var($row['email'], FILTER_VALIDATE_EMAIL)
// ) {
// throw new ImportRowException(__('enrollment.EMAIL_INVALID'), 0, null, $row);
// }
// if (empty($row['date_of_birth'])) {
// throw new ImportRowException(__('enrollment.DATE_OF_BIRTH_REQUIRED'), 0, null, $row);
// }
// if(!$this->validateDate($row['date_of_birth'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['date_of_birth']
// ]), 0, null, $row);
// }
// if (empty($row['date_terminated'])) {
// throw new ImportRowException(__('enrollment.DATE_OF_TERMINATED'), 0, null, $row);
// }
// if (!empty($row['date_terminated'])) {
// if(!$this->validateDate($row['date_terminated'])){
// throw new ImportRowException(__('enrollment.INVALID_DATE', [
// 'title' => $title['date_terminated']
// ]), 0, null, $row);
// }
// }
if (empty($row['date_of_birth'])) {
throw new ImportRowException(__('enrollment.DATE_OF_BIRTH_REQUIRED'), 0, null, $row);
}
// TODO DOB FORMAT VALIDATION
// if (empty($row['sex'])) {
// throw new ImportRowException(__('enrollment.SEX_REQUIRED'), 0, null, $row);
// }
// if (!in_array($row['sex'], ['F', 'M'])){
// throw new ImportRowException(__('enrollment.SEX_CODE_NOT_VALID'), 0, null, $row);
// }
if (empty($row['sex'])) {
throw new ImportRowException(__('enrollment.SEX_REQUIRED'), 0, null, $row);
}
}
public function handleImportRow(Corporate $corporate, $row)
{
try {
$activation_date = NULL;
if (!empty($row['activation_date'])){
$activation_date = $row['activation_date'];
}
$date_terminated = NULL;
if(!empty($row['date_terminated'])){
$date_terminated = $row['date_terminated'];
}
$member_data = [
"name" => $row['name'] ?? null,
"member_id" => $row['member_id'] ?? null,
"payor_id" => $row['payor_id'] ?? null,
"nik" => $row['nik'] ?? null,
// "birth_date" => $row['date_of_birth'] ? date("Y-m-d",$row['date_of_birth']) : null,
"birth_date" => $this->dateParser($row['date_of_birth']),
"gender" => Helper::genderNormalization($row['sex']),
"language" => $row['language'] ?? null,
"race" => $row['race'] ?? null,
// "language" => $row['language'] ?? null,
// "race" => $row['race'] ?? null,
"marital_status" => $row['marital_status'] ?? null,
"record_type" => $row['record_type'] ?? null,
"record_mode" => $row['record_mode'] ?? null,
"principal_id" => $row['principal_id'] ?? null,
"relation_with_principal" => $row['relationship_with_principal'] ?? null,
"bpjs_class" => $row['bpjs_class'] ?? null,
@@ -591,137 +396,23 @@ class MemberEnrollmentService
"policy_in_force" => $row['policy_in_force'] ?? null,
"start_no_claim" => $row['start_no_claim'] ?? null,
"end_no_claim" => $row['end_no_claim'] ?? null,
"plan_id" => $row['plan_id'] ?? null,
"members_effective_date" => $row['member_effective_date'] ?? null,
"members_expire_date" => $row['member_expiry_date'] ?? null,
"activation_date" => $activation_date,
"terminated_date" => $date_terminated,
"telephone_mobile" => $row['telephone_mobile'] ?? null,
"telephone_res" => $row['telephone_res'] ?? null,
"telephone_office" => $row['telephone_office'] ?? null,
"suspended" => $row['member_suspended'] ?? null,
"active" => $row['employment_status'] == 'INACTIVE' ? 0 : 1,
"employee_status" => $row['employment_status']
];
// $this->validateRow($row);
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->code != $row['policy_number']) {
throw new ImportRowException(__('enrollment.POLICY_NUMBER_NOT_MATCH', [
'policy_id' => $row['policy_number']
]), 0, null, $row);
}
// validasi member efektif date range date in periode date coroporate
// $member_effective_date = date("Y-m-d", strtotime($row['member_effective_date']));
// $date_terminated = date("Y-m-d", strtotime($row['date_terminated']));
$member_effective_date = $this->dateParser($row['member_effective_date']);
$date_terminated = $this->dateParser($row['date_terminated']);
if(!empty($row['activation_date'])){
// $activation_date = date("Y-m-d", strtotime($row['activation_date']));
// if (($activation_date == $date_terminated) && ($activation_date == $member_effective_date)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Activation Date',
// 'date' => $activation_date,
// 'date_param2' => 'Member Effective Date',
// 'start' => $activation_date
// ]), 0, null, $row);
// }
}
if (!empty($row['date_terminated'])){
// $date_terminated = date("Y-m-d", strtotime($row['date_terminated']));
// if($date_terminated){
// if ($date_terminated <= $member_effective_date && ($date_terminated != $member_effective_date)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Date Terminated Date',
// 'date' => $date_terminated,
// 'date_param2' => 'Member Effective Date',
// 'start' => $member_effective_date
// ]), 0, null, $row);
// }
// }
}
// validasi member expried date range date in periode date coroporate
// $members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
// validasi member expried date must less date member effective
// $members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
// $members_expire_date = date("Y-m-d", strtotime($row['member_expiry_date']));
// if ($member_effective_date <= $corporate->currentPolicy->start && ($member_effective_date != $corporate->currentPolicy->start)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Member Effective Date',
// 'date' => $member_effective_date,
// 'date_param2' => 'Start Period Date',
// 'start' => $corporate->currentPolicy->start
// ]), 0, null, $row);
// }
// if ($member_effective_date >= $corporate->currentPolicy->end && ($member_effective_date != $corporate->currentPolicy->end)) {
// throw new ImportRowException(__('enrollment.LESS_THAN', [
// 'date_param' => 'Member Effective Date',
// 'date' => $member_effective_date,
// 'date_param2' => 'End Period Date',
// 'end' => $corporate->currentPolicy->end
// ]), 0, null, $row);
// }
// if ($member_effective_date >= $corporate->currentPolicy->end && ($member_effective_date != $corporate->currentPolicy->end)) {
// throw new ImportRowException(__('enrollment.LESS_THAN', [
// 'date_param' => 'Member Effective Date',
// 'date' => $member_effective_date,
// 'date_param2' => 'End Period Date',
// 'end' => $corporate->currentPolicy->end
// ]), 0, null, $row);
// }
// if ($members_expire_date <= $corporate->currentPolicy->start && ($members_expire_date != $corporate->currentPolicy->start) ) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Member Expired Date',
// 'date' => $members_expire_date,
// 'date_param2' => 'Start Period Date',
// 'start' => $corporate->currentPolicy->start
// ]), 0, null, $row);
// }
// if ($members_expire_date >= $corporate->currentPolicy->end && ($members_expire_date != $corporate->currentPolicy->end)) {
// throw new ImportRowException(__('enrollment.LESS_THAN', [
// 'date_param' => 'Member Expired Date',
// 'date' => $members_expire_date,
// 'date_param2' => 'END Period Date',
// 'end' => $corporate->currentPolicy->end
// ]), 0, null, $row);
// }
// if ($members_expire_date <= $member_effective_date && ($members_expire_date != $member_effective_date)) {
// throw new ImportRowException(__('enrollment.MORE_THAN', [
// 'date_param' => 'Member Expired Date',
// 'date' => $members_expire_date,
// 'date_param2' => 'Member Effective Date',
// 'start' => $member_effective_date
// ]), 0, null, $row);
// }
if($corporate->code != $row['corporate_id']){
throw new ImportRowException(__('enrollment.CORPORATE_CODE_NOT_MATCH', [
'corporate_id' => $row['corporate_id']
]), 0, null, $row);
}
switch ($row['record_mode']) {
case "1": // New Member
$this->validateRow($row);
$member = Member::query()
->where('member_id', $row['member_id'])
// ->whereHas('employeds', function ($query) use ($corporate) {
// $query->where('corporate_id', $corporate->id);
// })
->first();
// Validate If Exist Member
if ($member) {
$person = Person::updateOrCreate(
@@ -730,11 +421,10 @@ class MemberEnrollmentService
],
[
'name' => $row['name'] ?? null,
'birth_date' => $this->dateParser($row['date_of_birth']) ?? null,
'gender' => Helper::genderNormalization($row['sex']),
'birth_date' => $this->dateParser($row['date_of_birth']),
'gender' => Helper::genderPerson($row['sex']),
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
'phone' => $row['telephone_mobile'] ?? null
]
);
$member->person_id = $person->id;
@@ -760,40 +450,29 @@ class MemberEnrollmentService
// Validate If Plan Exist
// TODO validate corporate 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);
}
}
} 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);
}
$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);
}
$this->validateRow($row);
try {
DB::beginTransaction();
$member->fill($member_data);
if ($member->save()) {
$person = Person::create([
'name' => $row['name'],
'birth_date' => $this->dateParser($row['date_of_birth']) ?? null,
'gender' => Helper::genderNormalization($row['sex']) ?? '-',
'birth_date' => $this->dateParser($row['date_of_birth']),
'gender' => Helper::genderPerson($row['sex']),
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
'phone' => $row['telephone_mobile'],
]);
$member->person_id = $person->id;
$member->save();
@@ -805,7 +484,6 @@ class MemberEnrollmentService
'end' => $this->dateParser($row['member_expiry_date']),
'status' => 'active'
]);
$memberPolicy->save();
if (!empty($row['division_name'])) {
@@ -821,7 +499,7 @@ class MemberEnrollmentService
$division_id = $division->id;
}
}
// Bisa disini penyebab data dobel
$member->employeds()->create([
'corporate_id' => $corporate->id,
'branch_code' => $row['branch_code'],
@@ -829,41 +507,13 @@ class MemberEnrollmentService
'nik' => $row['nik'],
'status' => $row['employment_status']
]);
// Bisa disini penyebab data dobel
$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']),
]);
}
$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) {
@@ -872,13 +522,11 @@ class MemberEnrollmentService
}
break;
case "2": // Member Information Update (Without Replacement Card)
$this->validateRow($row);
$member = Member::query()
->where('member_id', $row['member_id'])
->first();
// // Validate If Exist Member
// Validate If Exist Member
if (!$member) {
throw new ImportRowException(__('enrollment.MEMBER_NOT_FOUND', [
'member_id' => $row['member_id'],
@@ -886,195 +534,13 @@ class MemberEnrollmentService
]), 0, null, $row);
}
$person = Person::updateOrCreate(
[
'id' => $member->person_id
],
[
'name' => $row['name'] ?? null,
'birth_date' => $this->dateParser($row['date_of_birth']),
'gender' => Helper::genderPerson($row['sex']),
'language' => $row['language'] ?? null,
'race' => $row['race'] ?? null,
'phone' => $row['telephone_mobile']
]
);
$member->person_id = $person->id;
$member->name = $row['name'];
$member->employee_status = $row['employment_status'];
$member->gender = Helper::genderPerson($row['sex']);
$member->relation_with_principal = $row['relationship_with_principal'];
$member->marital_status = $row['marital_status'];
$member->birth_date = $this->dateParser($row['date_of_birth']);
$member->save();
try {
DB::beginTransaction();
$memberPolicy = MemberPolicy::query()
->where('policy_id', $row['policy_number'])
->where('member_id', $row['member_id'])
->with('member')
->first();
// 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();
// }
// Hapus Member plan terkait
$delete = MemberPlan::where('member_id', $member->id)->delete();
//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'])
->first();
if ($userInsuranceLms){
$userInsuranceLms->sNamaPeserta = $row['name'];
$userInsuranceLms->dStartDate = $row['member_effective_date'];
$userInsuranceLms->dExpireDate = $row['member_expiry_date'];
$nIDUser = $userInsuranceLms->nIDUser;
UserInsurance::updateOrCreate(
['nIDUser' => $nIDUser],
[
'sNamaPeserta' => $row['name'],
'dStartDate' => $row['member_effective_date'],
'dExpireDate' => $row['member_expiry_date'],
'dTanggalLahir' => $row['date_of_birth'] ? $this->dateParser($row['date_of_birth']) : null,
// 'nNoKTP' => $row['nric'] ?? ,
]
);
/* Lihat ID Marital status di table tm_status_pernikahan Linksehat */
if ($row['relationship_with_principal'] == 'H'){
$sMartialStatus= 6;
$nIDHubunganKeluarga = 3;
} else if ($row['relationship_with_principal'] == 'W'){
$sMartialStatus = 7;
$nIDHubunganKeluarga = 4;
} else if ($row['relationship_with_principal'] == 'S'){
$sMartialStatus = 4;
$nIDHubunganKeluarga = 5;
} else if ($row['relationship_with_principal'] == 'D'){
$sMartialStatus = 5;
$nIDHubunganKeluarga = 5;
} else {
$sMartialStatus = 0;
$nIDHubunganKeluarga = 0;
}
if($row['sex'] == 'M'){
$nIDJenisKelamin = 1;
} else {
$nIDJenisKelamin = 2;
};
// $ip_address = $CI->_prepare_ip($CI->input->ip_address());
$name = explode(" ", $row['name']);
// First name
$first_name = isset($name[0]) ? $name[0] : '';
// Middle name
$middle_name = isset($name[1]) ? $name[1] : '';
// Last name
$last_name = '';
if (count($name) > 2) {
$last_name = implode(" ", array_slice($name, 2));
}
$userLms = User::updateOrCreate(
[
'nID' => $nIDUser // Kondisi untuk mencari data dengan 'nID' yang sesuai dengan $nIDUser
],
[
'sFirstName' => $first_name,
'sLastName' => $middle_name . ' ' .$last_name, // Ubah ini dengan variabel yang sesuai dengan nama belakang (last name)
'sPhone' => $row['telephone_mobile'],
'sEmail' => str_replace(' ', '', $row['email']),
'nIDHubunganKeluarga' => $nIDHubunganKeluarga !== 0 ? $nIDHubunganKeluarga : null,
'dUpdateOn' => date('Y-m-d H:i:s'),
]
);
$userLmsDetail = UserDetail::updateOrCreate(
[
'nIDUser' => $nIDUser
],
[
'nIDUser' => $nIDUser,
// 'dTanggalLahir' => $row['date_of_birth'],
'dTanggalLahir' => $this->dateParser($row['date_of_birth']),
'dCreateOn' => date('Y-m-d H:i:s'),
'sMartialStatus' => $sMartialStatus != 0 ? $sMartialStatus : null,
'nIDJenisKelamin' => $nIDJenisKelamin,
'sCreateBy' => $nIDUser,
'sKTP' => $row['nric'] ?? null,
]
);
}
if (!$memberPolicy) {
throw new ImportRowException(__('enrollment.MEMBER_NOT_EXISTS', [
'member_id' => $row['member_id'],
@@ -1095,14 +561,6 @@ class MemberEnrollmentService
}
$memberPolicy->member->save();
$member->save();
// update informasi person
$person = Person::query()
->where('id', $member->person_id)
->first();
$person->fill($member_data);
$person->save();
DB::commit();
} catch (\Exception $e) {
DB::rollback();
@@ -1122,7 +580,6 @@ class MemberEnrollmentService
'policy_id' => $row['policy_number']
]), 0, null, $row);
}
$this->validateRow($row);
$memberPolicy = MemberPolicy::query()
->where('policy_id', $row['policy_number'])
@@ -1239,7 +696,7 @@ class MemberEnrollmentService
// if (empty($row["option_mode"])) {
// throw new ImportRowException(__('enrollment.OPTION_MODE_INVALID_FORMAT', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -1252,7 +709,7 @@ class MemberEnrollmentService
// // Validate
// if ( !in_array($option_mode[0], ['P', 'D']) || empty($corp_code) || empty($policy_number) || empty($member_id) ) {
// throw new ImportRowException(__('enrollment.OPTION_MODE_INVALID_FORMAT', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -1314,7 +771,7 @@ class MemberEnrollmentService
// $memberPolicy->member->record_type == $row['record_type']
// ) {
// throw new ImportRowException(__('enrollment.UNIQUE_CHANGE_PRINCIPAL_INVALID', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -1327,7 +784,7 @@ class MemberEnrollmentService
// $memberPolicy->member->payor_id == $row['payor_id']
// ) {
// throw new ImportRowException(__('enrollment.UNIQUE_CHANGE_DEPENDANT_INVALID', [
// 'member_id' => $row['member_id'],
// 'member_id' => $row['member_id'],
// 'policy_id' => $row['policy_number']
// ]), 0, null, $row);
// }
@@ -1567,10 +1024,10 @@ class MemberEnrollmentService
$value = $row_data[$this->doc_headers_to_field_map[$header]] ?? null;
if (is_string($value)) {
$cells[] = WriterEntityFactory::createCell($value);
}
}
else if ($value instanceof DateTime) {
$cells[] = WriterEntityFactory::createCell(Carbon::parse($value)->format('Ymd'));
}
}
else {
$cells[] = WriterEntityFactory::createCell($value);
}
@@ -1579,17 +1036,6 @@ class MemberEnrollmentService
return $cells;
}
// This validation for range date in period corporate // validasi untuk range tanggal dalam period corporate yang ditentukan
public function validateRangePeriode($dates){
$date = date("Y-m-d", strtotime($dates));
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->start <= $date) {
}
if (!isset($corporate->currentPolicy) || $corporate->currentPolicy->end >= $date) {
dd($corporate->currentPolicy->end, $dates);
}
}
// This returning row with format or order as it is
public function makeResultRow($row_data)
{

View File

@@ -1,284 +0,0 @@
<?php
namespace Modules\Internal\Services;
use App\Exceptions\ImportRowException;
use App\Models\Member;
use App\Models\Benefit;
use App\Models\RequestLog;
use App\Models\RequestLogBenefit;
use App\Models\Corporate;
use App\Models\Service;
use App\Models\Plan;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Common\Entity\Row;
use Carbon\Carbon;
use DateTime;
use DB;
class RequestLogService
{
private static $code_prefix = 'LOG';
public $doc_headers_to_field_map = [
"Date Of Request" => "submission_date",
"Date Addmission" => "submission_date",
"Member ID Peserta" => "member_id",
"Type of patient" => "service",
"Provider Name" => "organization_id",
"End Of Claim Numbers" => "code",
"Remarks" => "keterangan",
"Diagnosis" => "catatan",
"Tgl Billing dari RS" => "approved_final_log_at",
"Benefit Item" => "benefit_id",
"Total Billing" => "total_billing",
"Amount Approval" => "amount_approval",
"Amount Not Approval" => "amount_not_approval",
"QC 1" => "status_final_log",
"Ingestion Code" => "ingestion_code", // TODO I think this should not be here because if user uploading result then ingestion code and status will be filled
"Ingestion Status" => "ingestion_status",
];
public $field_to_doc_headers_map = [
"submission_date" => "Date Of Request",
"submission_date" => "Date Addmission",
"member_id" => "Member ID Peserta",
"service" => "Type of patient",
"organization_id" => "Provider Name",
"code" => "End Of Claim Numbers",
"keterangan" => "Remarks",
"catatan" => "Diagnosis",
"approved_final_log_at" => "Tgl Billing dari RS",
"benefit_id" => "Benefit Item",
"total_billing" => "Total Billing",
"amount_approval" => "Amount Approval",
"amount_not_approval" => "Amount Not Approval",
"status_final_log" => "QC 1" ,
"ingestion_code" => "Ingestion Code",
"ingestion_status" => "Ingestion Status",
];
public $result_doc_headers = [
"Date Of Request",
"Date Addmission",
"Member ID Peserta",
"Type of patient",
"Provider Name",
"End Of Claim Numbers",
"Remarks",
"Diagnosis",
"Tgl Billing dari RS",
"Benefit Item",
"Total Billing",
"Amount Approval",
"Amount Not Approval",
"QC 1",
"Ingestion Code",
"Ingestion Status",
];
public $listing_doc_headers = [
"Date Of Request",
"Date Addmission",
"Member ID Peserta",
"Type of patient",
"Provider Name",
"End Of Claim Numbers",
"Remarks",
"Diagnosis",
"Tgl Billing dari RS",
"Benefit Item",
"Total Billing",
"Amount Approval",
"Amount Not Approval",
"QC 1",
"Ingestion Code",
"Ingestion Status",
];
public function dateParser($date_from_row) {
if ($date_from_row instanceof DateTime) {
return $date_from_row->format('Y-m-d');
} else if ($date_from_row != null) {
return date('Y-m-d', strtotime($date_from_row));
} else {
return null;
}
}
public function dateParserCode($date_from_row) {
if ($date_from_row instanceof DateTime) {
return $date_from_row->format('ymd');
} else if ($date_from_row != null) {
return date('ymd', strtotime($date_from_row));
} else {
return null;
}
}
public function handleImportRow($row)
{
try {
// Memulai transaksi
DB::beginTransaction();
$member = Member::with('currentCorporate')->where(['member_id' => $row['member_id']])->first();
// // Validate If Exist Member
if (!$member) {
throw new ImportRowException(__('MEMBER_NOT_FOUND', [
'member_id' => $row['member_id'],
]), 0, null, $row);
}
// Membuat singkatan dari nama rumah sakit
$singkatan = "";
$words = explode(' ', $row['organization_id']);
foreach ($words as $word) {
$singkatan .= strtoupper(substr($word, 0, 1));
}
// Membuat kode organisasi
$kodeOrganisasi = "ORG000" . $singkatan;
// Insert data ke tabel organizations
$organization = DB::table('organizations')->where('code', $kodeOrganisasi)->first();
// dd( $organization);
if ($organization) {
$organization_id = $organization->id;
} else {
$organization_id = DB::table('organizations')
->insertGetId([
'name' => $row['organization_id'],
'code' => $kodeOrganisasi,
'type' => 'hospital',
'created_at' => now(),
'created_by' => auth()->user()->id
]);
}
$data = [
'source' => 'H',
'provideCode' => $kodeOrganisasi ,
'date' => $this->dateParserCode($row['submission_date']),
'policy' => $member->currentPolicy->code,
'member_code' => $row['member_id']
];
$code = $this->makeCode($row['code'], $data);
$status = $row['status_final_log'] == 'Y' ? 'approved' : 'requested';
$service = Service::where('name', $row['service'])->first();
if ($service){
$serviceCode = $service->code;
} else {
$serviceCode = 'Unk';
}
$benefit = Benefit::where('code', $row['benefit_id'])->first();
if (!$benefit){
$statusFinalLog = 'requested';
$final_log = 0;
} else {
$statusFinalLog = $status;
$final_log = 1;
}
$requestLog = RequestLog::updateOrCreate(
[
'code' => $code
],
[
'code' => $code,
'member_id' => $member->id,
'submission_date' => $row['submission_date'],
'discharge_date' => $row['submission_date'],
'payment_type' => 'cashless',
'status' => $status,
'status_final_log' => $statusFinalLog,
'final_log' =>$final_log,
'import_system' =>TRUE,
'catatan' => $row['catatan'],
'policy_id' => $member->currentPolicy->id ?? null,
'organization_id' => $organization_id,
'service_code' => $serviceCode,
'approved_final_log_at' => $row['approved_final_log_at'],
]);
if ($benefit) { // jika tidak ada benefit nya maka belum ngisi benefit nya
RequestLogBenefit::updateOrCreate(
[
'request_log_id' => $requestLog->id,
],
[
'request_log_id' => $requestLog->id,
'benefit_id' => $benefit->id,
'amount_incurred' => $row['total_billing'],
'amount_approved' => $row['amount_approval'],
'amount_not_approved' => $row['amount_not_approval'],
'excess_paid' => $row['amount_not_approval'],
'created_by' => auth()->user()->id,
]);
}
// Commit transaksi
DB::commit();
} catch (\Exception $e) {
DB::rollback();
throw new ImportRowException($e->getMessage(), $e->getCode(), $e, $row);
}
$row['ingestion_code'] = "200";
$row['ingestion_status'] = "SUCCESS";
return $row;
}
// This returning row with format or order as it is
public function makeResultRow($row_data)
{
$cells = [];
foreach ($row_data as $cellValue) {
$cells[] = WriterEntityFactory::createCell($cellValue);
}
return $cells;
}
// This returning row with format or order following $result_doc_headers
public function makeResultRowWithResultFormat($row_data)
{
$cells = [];
foreach ($this->result_doc_headers as $header) {
$value = $row_data[$this->doc_headers_to_field_map[$header]] ?? null;
if (is_string($value)) {
$cells[] = WriterEntityFactory::createCell($value);
}
else if ($value instanceof DateTime) {
$cells[] = WriterEntityFactory::createCell(Carbon::parse($value)->format('Ymd'));
}
else {
$cells[] = WriterEntityFactory::createCell($value);
}
}
return $cells;
}
public 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, 5, '0', STR_PAD_LEFT);
}
}

View File

@@ -1,30 +0,0 @@
<?php
namespace Modules\Internal\Transformers;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
class AuditTrailResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request
* @return array
*/
public function toArray($request)
{
$audit_trail = [
'id' => $this->id,
'old_values' => json_decode($this->old_values),
'new_values' => json_decode($this->new_values),
'action' => $this->action,
'user_id' => $this->user->email,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
return $audit_trail;
}
}

View File

@@ -1,36 +0,0 @@
<?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

@@ -1,44 +0,0 @@
<?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,7 +3,6 @@
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
class ClaimRequestResource extends JsonResource
{
@@ -16,7 +15,7 @@ class ClaimRequestResource extends JsonResource
public function toArray($request)
{
$filesGroupByType = $this->files->mapToGroups(function($file) {
return [Str::slug($file->type, '_') => $file];
return [$file->type => $file];
});
$data = [
@@ -25,7 +24,7 @@ class ClaimRequestResource extends JsonResource
'submission_date' => $this->submission_date,
'member' => $this->member,
'status' => $this->status ?? 'unknown',
'service_name' => $this->service ? $this->service->name : '',
'service_name' => $this->service->name,
'payment_type' => $this->payment_type,
'payment_type_name' => $this->payment_type_name,
'files_by_type' => $filesGroupByType

View File

@@ -3,9 +3,6 @@
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
@@ -18,55 +15,34 @@ class ClaimShowResource extends JsonResource
*/
public function toArray($request)
{
$claim = parent::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'];
$member_data = CorporateEmployee::where('member_id', $claim['member_id'])->first();
$claim_request = ClaimRequest::where('id', $claim['claim_request_id'])->first();
return $itemData;
});
$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']
$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->
return $data;
}

View File

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

View File

@@ -1,29 +0,0 @@
<?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,97 +41,38 @@ class CorporateServiceConfigResource extends JsonResource
];
$list_msc = $this->corporateServiceSpecialities->map(function ($speciality) {
$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 explode(',', $speciality->exclusions->first()->rules->where('name', 'msc')->first()->values ?? '');
})->map(function ($item) {
return [
'm' => in_array('m', $item),
's' => in_array('s', $item),
'c' => in_array('c', $item),
];
});
$list_gender = $this->corporateServiceSpecialities->map(function ($speciality) {
$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 = [];
}
// dd($speciality->exclusions->first()->rules);
return explode(',', $speciality->exclusions->first()->rules->where('name', 'gender')->first()->values ?? '');
})->map(function ($item) {
return [
'male' => in_array('male', $item),
'female' => in_array('female', $item),
];
});
$min_age = $this->corporateServiceSpecialities->map(function ($speciality) {
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'min_age')->first();
if ($rules) {
return $rules->values ?? '';
}
}
return '';
return $speciality->exclusions->first()->rules->where('name', 'min_age')->first()->values ?? '';
});
$max_age = $this->corporateServiceSpecialities->map(function ($speciality) {
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'max_age')->first();
if ($rules) {
return $rules->values ?? '';
}
}
return '';
return $speciality->exclusions->first()->rules->where('name', 'max_age')->first()->values ?? '';
});
$plan = $this->corporateServiceSpecialities->map(function ($speciality) {
$exclusions = $speciality->exclusions->first();
if ($exclusions) {
$rules = $exclusions->rules->where('name', 'plan')->first();
if ($rules) {
return $rules->values ?? null;
}
}
return null;
return $speciality->exclusions->first()->rules->where('name', 'plan')->first()->values ?? null;
});
$data['exclusions'] = $data['exclusions']->map(function ($item, $key) use (
$list_msc,
$list_gender,

View File

@@ -21,7 +21,6 @@ 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

@@ -4,7 +4,6 @@ namespace Modules\Internal\Transformers;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Helpers\Helper;
class LivechatResource extends JsonResource
{
@@ -18,19 +17,13 @@ class LivechatResource extends JsonResource
{
$livechat = [
'id' => $this->nID,
'doctor_name' => isset($this->doctor->user->sFirstName) ? $this->doctor->user->detail->sTitlePrefix . '. ' . $this->doctor->user->sFirstName . ' ' . $this->doctor->user->sLastName . ' ' . $this->doctor->user->detail->sTitleSuffix : null,
'pasien_name' => isset($this->user->sFirstName) ? $this->user->sFirstName . ' ' . $this->user->sLastName : null,
'pasien_phone' => isset($this->user->sPhone) ? $this->user->sPhone : '-',
'pasien_email' => isset($this->user->sEmail) ? $this->user->sEmail : '-',
'doctor_name' => isset($this->doctor->user->sFirstName) ? $this->doctor->user->sFirstName . ' ' . $this->doctor->user->sLastName : null,
'speciality' => $this->doctor->speciality->sKeterangan ?? null,
'health_care' => $this->healthCare->sHealthCare ?? null,
'date_appointment' => $this->appointment !== null ?
Carbon::parse($this->appointment->appointmentDetail->dTanggalAppointment)->format('d-m-Y')
. ' ' . $this->appointment->appointmentDetail->tTimeAppointment :
null,
'status_appointment' => $this->appointment->paymentStatus ?? null,
'date_created' => Carbon::parse($this->dCreateOn)->format('d-m-Y') ?? null,
'time_request' => Carbon::parse($this->dCreateOn)->format('H:i:s') ?? null,
'date_appointment' => Carbon::parse($this->appointment->appointmentDetail->dTanggalAppointment)->format('d-m-Y')
. ' ' . $this->appointment->appointmentDetail->tTimeAppointment ?? null,
'status_appointment' => $this->appointment->status_name ?? null,
'date_created' => Carbon::parse($this->appointment->dCreateOn)->format('d-m-Y H:i:s') ?? null,
'patient_media' => $this->sMedia ?? null,
'doctor_media' => $this->sMediaDokter ?? null,
'appointment_media' => $this->appointment->sMedia ?? null,
@@ -53,12 +46,11 @@ class LivechatResource extends JsonResource
$livechat['duration'] = $data_duration;
$payment_detail = null;
if ($this->appointment !== null && $this->appointment->appointmentDetail->sPaymentDetails !== null) {
if ($this->appointment->appointmentDetail->sPaymentDetails != null) {
$payment_detail = [
'payment_type' => $this->appointment->appointmentDetail->sPaymentDetails['payment_type'],
'transaction_time' => $this->appointment->appointmentDetail->sPaymentDetails['transaction_time'],
'gross_amount' => Helper::formatRupiah($this->appointment->appointmentDetail->sPaymentDetails['gross_amount']),
'gross_amount' => $this->appointment->appointmentDetail->sPaymentDetails['gross_amount'],
'currency' => $this->appointment->appointmentDetail->sPaymentDetails['currency'],
'status_message' => $this->appointment->appointmentDetail->sPaymentDetails['status_message'],
];

View File

@@ -1,40 +0,0 @@
<?php
namespace Modules\Internal\Transformers;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Str;
use App\Models\Organization;
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];
});
$provider = Organization::where('id', $this->organization_id)->first();
$data = [
'id' => $this->id,
'code' => $this->code,
'submission_date' => $this->submission_date,
'member_name' => $this->member->name,
'status' => $this->status ?? 'unknown',
'provider' => $provider ? $provider->name : '-',
'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

@@ -1,122 +0,0 @@
<?php
namespace Modules\Internal\Transformers;
use App\Models\Plan;
use App\Models\CorporateBenefit;
use App\Models\MemberPlan;
use App\Models\CorporateService;
use App\Models\RequestLogBenefit;
use App\Models\RequestLogMedicine;
use App\Models\Organization;
use App\Models\Exclusion;
use App\Models\Icd;
use App\Helpers\Helper;
use App\Models\CorporatePolicy;
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;
$member_id = $requestLog['member_id'];
$planMember = MemberPlan::where('member_id', $member_id)->get('plan_id');
$planId = Plan::whereIn('id', $planMember)->where('service_code', $requestLog['service_code'])->first();
$benefit = CorporateBenefit::with('benefit')->where('plan_id', $planId->id)->get()->toArray();
$benefitDetailLog = RequestLogBenefit::with('benefit')->where('request_log_id', $requestLog['id'])->get()->toArray();
$medicineDetailLog = RequestLogMedicine::where('request_log_id', $requestLog['id'])->get()->toArray();
$provider = Organization::where('id', $requestLog['organization_id'])->first();
if ($provider){
$providerName = $provider->name;
} else {
$providerName = '-';
}
$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();
// Policy Number
$policyNumber = CorporatePolicy::query()
->where('corporate_id', $corporateId)
->first();
$data = [
'id' => $requestLog['id'],
'code' => $requestLog['code'],
'member_id' => $requestLog['member']['member_id'],
'policy_number' =>$policyNumber->code ? $policyNumber->code : '-',
'name' => $requestLog['member']['name'],
'date_of_birth' => $requestLog['member']['birth_date'],
'gender' => $requestLog['member']['gender'],
'marital_status' => $requestLog['member']['status_marital'],
'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'],
'provider' => $providerName,
'no_identitas' => $requestLog['member']['nric'],
'keterangan' => $requestLog['keterangan'],
'hak_kamar_pasien' => $requestLog['hak_kamar_pasien'],
'penempatan_kamar' => $requestLog['penempatan_kamar'],
'catatan' => $requestLog['catatan'],
];
return $data;
}
}

View File

@@ -5,172 +5,126 @@ namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use App\Models\Person;
use App\Models\OLDLMS\User;
use App\Models\User;
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 Modules\Linksehat\Transformers\UserProfileResource;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Http;
use Validator;
class AuthController extends Controller
{
private $url;
public function otpRequest(Request $request)
{
$request->validate([
// 'phone' => 'required'
'phone_or_email' => 'required'
]);
public function __construct() {
$this->url = $_ENV['LMS_APP_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 login(Request $request)
{
{
$request->validate([
// 'email' => 'email',
'phone_or_email' => 'required',
// 'password' => 'required_with:email',
// 'phone' => '',
// 'otp' => 'required_with:phone',
'password' => 'required',
// 'otp' => 'required'
]);
// 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
]);
$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' => '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',
'otp' => 'required'
]);
$user = User::with('detail')
->where([
'sPhone' => $request->phone_or_email,
'sVerificationCode' => $request->otp
])
->first();
$loginType = filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? 'email' : 'phone';
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'
);
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);
}
} else {
return response(['message' => 'Mode Login Tidak Dikenal'], 403);
}
return Helper::responseJson(
data: [
'token' => $user->createToken('app')->plainTextToken,
'user' => UserProfileResource::make($user),
],
message: 'Selamat Datang'
);
}
public function register(Request $request)
@@ -209,7 +163,6 @@ class AuthController extends Controller
return Helper::responseJson(message: 'Behasil Logout.');
}
public function mockOtp(Request $request)
{
$request->validate([

View File

@@ -1,97 +0,0 @@
<?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

@@ -1,138 +0,0 @@
<?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,16 +3,12 @@
namespace Modules\Linksehat\Http\Controllers\Api;
use App\Helpers\Helper;
use App\Models\OLDLMS\User;
use App\Models\OLDLMS\UserDetail;
use App\Models\User;
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\User\ShowProfileResource;
use Modules\Linksehat\Transformers\User\UserProfileResource;
use Modules\Linksehat\Transformers\UserProfileResource;
class ProfileController extends Controller
{
@@ -20,11 +16,11 @@ class ProfileController extends Controller
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request, $id)
public function index()
{
$user = User::with(['detail'])->where('nID', $id)->get()->first();
$user = Auth::user()->load('person');
return Helper::responseJson(new ShowProfileResource($user));
return Helper::responseJson(new UserProfileResource($user));
}
/**
@@ -74,90 +70,58 @@ class ProfileController extends Controller
*/
public function update(Request $request)
{
$validator = Validator::make($request->all(), [
'id' => 'required',
'first_name' => 'required',
'last_name' => 'required',
'date_of_birth' => 'required',
// 'email' => 'required',
$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'
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
$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();
$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,
]);
}
} 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();
$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]);
if ($request->has('preferred_lang')) {
$user->metas()->updateOrCreate([
'type' => 'preferred_lang'
], [
'system' => 'default',
'type' => 'preferred_lang',
'value' => $request->preferred_lang,
]);
}
}
// 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);
$user = User::find($user->id); // ReLoad User Data
return Helper::responseJson(['users' => new UserProfileResource($user)]);
}
/**
@@ -169,17 +133,4 @@ 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,7 +3,6 @@
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;
@@ -11,7 +10,6 @@ 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;
/*
|--------------------------------------------------------------------------
@@ -37,11 +35,7 @@ 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');
});
@@ -65,22 +59,11 @@ Route::prefix('linksehat')->group(function () {
Route::middleware('auth:sanctum')->group(function () {
Route::get('profile/{id}', [ProfileController::class, 'index'])->name('profile');
Route::get('change-profile/{id}', [ProfileController::class, 'changeProfile'])->name('change-profile');
Route::get('profile', [ProfileController::class, 'index'])->name('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

@@ -1,90 +0,0 @@
<?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

@@ -1,174 +0,0 @@
<?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

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

View File

@@ -24,24 +24,9 @@ class MemberBuilder extends Builder
public function joinCorporateEmployees(string $value = 'join'): static
{
// return match ($value) {
// 'join' => $this->join('corporate_employees', 'members.id', '=', 'corporate_employees.member_id'),
// 'left' => $this->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
// };
return match ($value) {
'join' => $this->join('corporate_employees', function ($join) {
$join->on('members.id', '=', 'corporate_employees.member_id')
->orWhere('members.principal_id', '=', 'corporate_employees.member_id');
}),
'left' => $this->leftJoin('corporate_employees', function ($join) {
$join->on('members.id', '=', 'corporate_employees.member_id')
->orWhere('members.principal_id', '=', 'corporate_employees.member_id');
}),
'right' => $this->rightJoin('corporate_employees', function ($join) {
$join->on('members.id', '=', 'corporate_employees.member_id')
->orWhere('members.principal_id', '=', 'corporate_employees.member_id');
})
'join' => $this->join('corporate_employees', 'members.id', '=', 'corporate_employees.member_id'),
'left' => $this->leftJoin('corporate_employees', 'members.id', '=', 'corporate_employees.member_id')
};
}
@@ -55,31 +40,11 @@ class MemberBuilder extends Builder
public function joinClaimRequests(string $value = 'join'): static
{
// return match ($value) {
// 'join' => $this->join('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
// 'left' => $this->leftJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
// // 'right' => $this->rightJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id')
// 'right' => $this->rightJoin('claim_requests', function ($join) {
// $join->on('members.id', '=', 'claim_requests.member_id')
// ->orWhere('members.principal_id', '=', 'claim_requests.member_id');
// })
// };
return match ($value) {
'join' => $this->join('claim_requests', function ($join) {
$join->on('members.id', '=', 'claim_requests.member_id')
->orWhere('members.principal_id', '=', 'claim_requests.member_id');
}),
'left' => $this->leftJoin('claim_requests', function ($join) {
$join->on('members.id', '=', 'claim_requests.member_id')
->orWhere('members.principal_id', '=', 'claim_requests.member_id');
}),
'right' => $this->rightJoin('claim_requests', function ($join) {
$join->on('members.id', '=', 'claim_requests.member_id')
->orWhere('members.principal_id', '=', 'claim_requests.member_id');
})
'join' => $this->join('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
'left' => $this->leftJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id'),
'right' => $this->rightJoin('claim_requests', 'members.id', '=', 'claim_requests.member_id')
};
}
public function joinMemberPlans(string $value = 'join'): static

View File

@@ -6,16 +6,11 @@ use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Illuminate\Http\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use PHPMailer\PHPMailer\PHPMailer;
use Illuminate\Support\Facades\DB;
use App\Models\Member;
use App\Models\Service;
class Helper
{
public static function genderNormalization($anyGenderCode = '-')
public static function genderNormalization($anyGenderCode)
{
if ($anyGenderCode == 'M') {
return 'male';
} else if ($anyGenderCode == 'F') {
@@ -25,20 +20,7 @@ class Helper
} else if ($anyGenderCode == 'U') {
return 'unknown';
} else {
return '-';
}
}
public static function maritalNormalization($code)
{
if ($code == 'M') {
return 'Married';
} else if ($code == 'D') {
return 'Divorced';
} else if ($code == 'S') {
return 'Single';
} else {
return '-';
return null;
}
}
@@ -53,48 +35,10 @@ class Helper
} else if ($anyGenderCode == 'U') {
return 'unknown';
} else {
return '-';
return null;
}
}
public static function memberType($code)
{
if ($code == 'P') {
return 'Principal';
} else if ($code == 'D') {
return 'Dependent';
} else {
'-';
}
}
public static function relationWithPrincipal($code)
{
if ($code == 'H') {
return 'Husbund';
} else if ($code == 'W') {
return 'Wife';
} else if ($code == 'S') {
return 'Son';
} else if ($code == 'D') {
return 'Daughter';
} else {
'-';
}
}
public static function principalName($code)
{
$principalName = Member::where('member_id', $code)->get()->first();
return $principalName->name;
}
public static function serviceName($code)
{
$serviceName = Service::where('code', $code)->get()->first();
return $serviceName->name;
}
public static function paginateResources($resource)
{
return [
@@ -240,161 +184,4 @@ class Helper
'data' => $data,
], $statusCode);
}
public static function validatePhoneNumber($phoneNumber)
{
// Menghapus semua karakter selain angka dan +
$cleanedNumber = preg_replace('/[^0-9+]/', '', $phoneNumber);
// Memeriksa apakah nomor telepon hanya terdiri dari angka dan +
if ($cleanedNumber == $phoneNumber) {
// Nomor telepon valid
return true;
} else {
// Nomor telepon tidak valid
return false;
}
}
public static function formatRupiah($angka)
{
return "Rp " . number_format($angka, 0, ',', '.');
}
public static function sPaymentMethod($id)
{
$sPaymentMethod = [
1 => 'Pribadi',
2 => 'On-Site Payment',
3 => 'OVO',
4 => 'Asuransi',
5 => 'Voucher',
6 => 'ASO'
];
return $sPaymentMethod[$id];
}
public static function formatDateDB($date)
{
$convertedDate = Carbon::createFromFormat('d-m-Y', $date)->format('Y-m-d H:i:s');
return $convertedDate;
}
public static function formatDateOnly($date)
{
// Membuat objek Carbon dengan tanggal asli dan zona waktu UTC
$carbonDate = Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $date, 'UTC');
// Mengonversi tanggal ke zona waktu yang diinginkan
$carbonDate->setTimezone('Asia/Jakarta');
$convertedDate = $carbonDate->toDateString();
return $convertedDate;
}
public static function formatTimeOnly($date)
{
// Membuat objek Carbon dengan tanggal asli dan zona waktu UTC
$carbonDate = Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $date, 'UTC');
// Mengonversi tanggal ke zona waktu yang diinginkan
$carbonDate->setTimezone('Asia/Jakarta');
$convertedDate = $carbonDate->toTimeString();
return $convertedDate;
}
public static function insertNotification($data = array())
{
try {
DB::beginTransaction();
DB::table('notifications')->insert($data);
DB::commit();
return true;
} catch (\Exception $e) {
DB::rollback();
return $e->getMessage();
}
}
public static function sendEmail($data = array())
{
// Buat instance PHPMailer
$mail = new PHPMailer(true);
try {
// Server settings
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = env('EMAIL');
$mail->Password = env('PW_EMAIL');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 465;
$mail->SMTPSecure = "ssl";
// Penerima email
$mail->setFrom(env('EMAIL'), env('NAME_EMAIL'));
$mail->addAddress($data['email'], $data['name']);
// Konten email
$mail->isHTML(true);
$mail->Subject = $data['subject'];
$mail->Body = $data['body'];
// Kirim email
$mail->send();
return true;
} catch (\Exception $e) {
dd($e);
return ($mail->ErrorInfo);
return false;
}
}
public static function sendEmailattachData($data = array())
{
// Buat instance PHPMailer
$mail = new PHPMailer(true);
try {
// Server settings
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = env('EMAIL');
$mail->Password = env('PW_EMAIL');
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 465;
$mail->SMTPSecure = "ssl";
// Penerima email
$mail->setFrom(env('EMAIL'), env('NAME_EMAIL'));
$mail->addAddress($data['email'], $data['name']);
// Konten email
$mail->isHTML(true);
$mail->Subject = $data['subject'];
$mail->Body = $data['body'];
$mail->addAttachment($data['attach'], 'e-card.pdf');
// Kirim email
$mail->send();
return true;
} catch (\Exception $e) {
dd($mail->ErrorInfo);
return ($mail->ErrorInfo);
return false;
}
}
public static function setCustomPHPIniSettings()
{
ini_set('max_execution_time', '-1'); // Waktu untuk execution suatu function atau script
ini_set('post_max_size', '32M'); // Batas post Yang di Upload
ini_set('upload_max_filesize', '10M'); // Batas File yang di Upload
ini_set('max_input_time ', '-1'); // Batas max time menunggu input max 5 menit
ini_set('memory_limit', '256M');
}
}

View File

@@ -261,27 +261,6 @@ class MembershipController extends Controller
return Helper::responseJson(data: MemberResource::make($member));
}
public function automaticLinking(Request $request)
{
$member = Member::query()
->when(in_array('email', $linkingRulesArr), function($q) use ($request) {
$q->where('email', $request->email);
})
->with([
'memberPlans' => function ($memberPlan) {
$memberPlan->latest();
},
])
->first();
if ($member) {
$message = $member->currentPolicy->corporate->welcome_message;
return Helper::responseJson(data: MemberResource::make($member), message: $message);
}
}
public function removeInsurance($email)
{
$user = User::where('sEmail', $email)->firstOrFail();

View File

@@ -2,9 +2,7 @@
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Facades\Auth;
class Authenticate extends Middleware
{
@@ -20,13 +18,4 @@ class Authenticate extends Middleware
return route('login');
}
}
public function handle($request, Closure $next, ...$guards)
{
if (Auth::guard('sanctum')->guest()) {
return response()->json(['error' => 'Bearer Authorization is required'], 401);
}
return parent::handle($request, $next, ...$guards);
}
}

View File

@@ -1,32 +0,0 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class MemberListResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
$data = parent::toArray($request);
$data['claim_grouped_by_status'] = $this->claims->groupBy('status');
$data['total_claims'] = [
'draft' => count($data['claim_grouped_by_status']['draft'] ?? []),
'requested' => count($data['claim_grouped_by_status']['requested'] ?? []),
'received' => count($data['claim_grouped_by_status']['received'] ?? []),
'approved' => count($data['claim_grouped_by_status']['approved'] ?? []),
'paid' => count($data['claim_grouped_by_status']['paid'] ?? []),
'declined' => count($data['claim_grouped_by_status']['declined'] ?? [])
];
// $data = ['fuck' => 'you'];
return $data;
}
}

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