update requst dan final log

This commit is contained in:
2023-11-29 14:18:35 +07:00
parent a04153fa2a
commit a208d5f11e
43 changed files with 6756 additions and 47 deletions

View File

@@ -63,6 +63,7 @@ class Member extends Model
"policy_in_force",
"start_no_claim",
"end_no_claim",
"suspended"
];
protected $appends = [

264
app/Models/RequestLog.php Normal file
View File

@@ -0,0 +1,264 @@
<?php
namespace App\Models;
use App\Events\ClaimReceived;
use App\Events\ClaimRequested;
use App\Traits\Blameable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Str;
class RequestLog extends Model
{
use HasFactory, SoftDeletes, Blameable;
// protected static $code_prefix_hospital = 'CRQ-H';
// protected static $code_prefix_client = 'CRQ-R';
public $fillable = [
'uuid',
'submission_date',
'member_id',
'payment_type',
'service_code',
'policy_id',
'status',
'source',
'claim_id',
'organization_id',
'code'
];
protected $hidden = [
// 'created_at',
'updated_at',
'deleted_at',
'created_by',
'updated_by',
'deleted_by',
];
public static $doc_headers_to_field_map = [
"PAYOR ID" => "payor_id",
"CORPORATE ID" => "corporate_id",
"POLICY NUMBER" => "policy_number",
"MEMBER ID" => "member_id",
"MEMBER NAME" => "member_name",
"RECORD TYPE (P/D)" => "record_type",
"BENEFIT CODE" => "benefit_code",
"BENEFIT DESC" => "benefit_desc",
"CLAIM TYPE" => "claim_type",
"CLAIM PROCESS STATUS" => "status",
"CLIENT CLAIM ID" => "client_claim_id",
"REFERENCE NO" => "reference_no",
"ADMEDIKA CLAIM ID" => "admika_claim_id",
"PROVIDER CODE" => "provider_code",
"ADMISSION DATE" => "admission_date",
"DISCUTRGE DATE" => "discutrge_date",
"DURATION DAYS" => "duration_days",
"COVERAGE TYPE" => "coverage_type",
"PLAN ID" => "plan_id",
"DIAGNOSIS CODE" => "diagnosis_code",
"DIAGNOSIS DESC" => "diagnosis_desc",
"TOT AMT INCURRED" => "tot_amt_insurred",
"TOT AMT APPROVED" => "tot_amt_approved",
"TOT AMT NOT APPROVED" => "tot_amt_not_approved",
"TOT EXCESS PAID" => "tot_excess_paid",
"REMARKS" => "remarks",
"SECONDARY DIAGNOSIS CODE" => "secondary_diagnosis",
"APPROVED DATE" => "approved_date",
"APPROVED BY" => "approved_by",
"DATE RECEIVED" => "data_received",
"HOSPITAL INVOICE DATE" => "hospital_invoice_date",
];
public static $listing_doc_headers = [
"PAYOR ID",
"CORPORATE ID",
"POLICY NUMBER",
"MEMBER ID",
"MEMBER NAME",
"RECORD TYPE (P/D)",
"CLAIM TYPE",
"CLAIM PROCESS STATUS",
"CLIENT CLAIM ID",
"REFERENCE NO",
"ADMEDIKA CLAIM ID",
"PROVIDER CODE",
"ADMISSION DATE",
"DISCUTRGE DATE",
"DURATION DAYS",
"COVERAGE TYPE",
"PLAN ID",
"DIAGNOSIS CODE",
"DIAGNOSIS DESC",
"TOT AMT INCURRED",
"TOT AMT APPROVED",
"TOT AMT NOT APPROVED",
"TOT EXCESS PAID",
"REMARKS",
"SECONDARY DIAGNOSIS CODE",
"APPROVED DATE",
"APPROVED BY",
"DATE RECEIVED",
"HOSPITAL INVOICE DATE",
];
public static $status = [
'draft' => 'Draft',
'requested' => 'Requested',
'approved' => 'Approved',
'declined' => 'Declined'
];
public static $payment_types = [
'cashless' => 'Cashless',
'reimbursement' => 'Reimbursement'
];
public $appends = [
'payment_type_name'
];
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
try {
$model->uuid = (string) Str::orderedUuid(); // generate uuid
// $model->code = self::getNextCode();
} catch (\Exception $e) {
abort(500, $e->getMessage());
}
});
static::created(function ($model) {
// try {
// if (!empty($model->status) && $model->status == 'requested') {
// $model->histories()->create([
// 'title' => 'New Claim Requested',
// 'description' => "Claim Requested for Member : {$model->member->member_id} - ({$model->member->full_name})",
// 'type' => 'info'
// ]);
// }
// } catch (\Exception $e) {
// abort(500, $e->getMessage());
// }
});
static::updated(function ($model) {
if ($model->hasChanges(['status'])) {
// if ($model->status == 'requested') {
// $model->histories()->create([
// 'title' => 'New Claim Requested',
// 'description' => "Claim Requested for Member : {$model->member->member_id} - ({$model->member->full_name})",
// 'type' => 'info'
// ]);
// }
// if ($model->status == 'received') {
// ClaimReceived::dispatch($model);
// }
// if ($model->status == 'approved') {
// ClaimApproved::dispatch($model);
// }
// if ($model->status == 'postpone') {
// ClaimPostpone::dispatch($model);
// }
// if ($model->status == 'paid') {
// ClaimPaid::dispatch($model);
// }
// if ($model->status == 'declined') {
// ClaimDeclined::dispatch($model);
// }
}
});
}
// public static function getNextCode()
// {
// $last_number = self::withTrashed()->max('code');
// $next_number = empty($last_number) ? 1 : ((int) explode('-', $last_number)[1] + 1);
// return self::makeCode($next_number);
// }
// public static function makeCode($next_number)
// {
// return (string) self::$code_prefix .'-'. str_pad($next_number, 5, 0, STR_PAD_LEFT);
// }
public function claim()
{
return $this->belongsTo(Claim::class, 'claim_id');
}
public function claims()
{
return $this->hasMany(Claim::class, 'claim_request_id');
}
public function files()
{
return $this->morphMany(File::class, 'fileable');
}
public function claimResults()
{
return $this->files()->where('type', 'claim-result')->whereNull('deleted_at');
}
public function claimConditions()
{
return $this->files()->where('type', 'claim-kondisi')->whereNull('deleted_at');
}
public function claimDiagnosis()
{
return $this->files()->where('type', 'claim-diagnosis')->whereNull('deleted_at');
}
public function generatedDocuments()
{
return $this->morphMany(GeneratedDocument::class, 'generated_documentable');
}
public function histories()
{
return $this->morphMany(ClaimHistory::class, 'historiable');
}
public function organization()
{
return $this->belongsTo(Organization::class, 'organization_id');
}
public function member()
{
return $this->belongsTo(Member::class, 'member_id', 'id');
}
public function service()
{
return $this->belongsTo(Service::class, 'service_code', 'code');
}
public function getPaymentTypeNameAttribute()
{
return self::$payment_types[$this->payment_type] ?? $this->payment_type;
}
public function getStatusAttribute($value)
{
return self::$payment_types[$value] ?? $value;
}
}

View File

@@ -0,0 +1,189 @@
<?php
namespace App\Services;
use App\Events\ClaimApproved;
use App\Events\ClaimRequested;
use App\Models\Claim;
use App\Models\RequestLog;
use App\Models\Organization;
use App\Helpers\Helper;
use App\Models\Icd;
use App\Models\Member;
use Carbon\Carbon;
use App\Exceptions\ImportRowException;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use DB;
use Str;
class RequestLogService{
public static function storeRequestLog(
$row = null,
$code,
$member,
$paymentType,
$serviceCode,
$submissionDate = null,
$status, $organization_id = null,
$source
)
{
try {
$organization = False;
if($organization_id){
$organization = Organization::where('id', $organization_id)->first();
if (!$organization){
throw new ImportRowException(__('Code Provider Tidak ditemukan', [
'attribute' => 'provider_code',
'code' => $row['provider_code']
]), 403, null, $row);
}
};
DB::beginTransaction();
$requestLogData = [
'code' => $code,
'member_id' => $member->id,
'submission_date' => $submissionDate ?? now(),
'status' => $status,
'payment_type' => $paymentType,
'service_code' => $serviceCode,
'policy_id' => $member->currentPolicy->id ?? null,
'organization_id' => $organization ? $organization->id : 0,
'source' => $source,
];
$requestLog = RequestLog::create($requestLogData);
DB::commit();
return $requestLog;
} catch (\Exception $error) {
DB::rollBack();
throw new \Exception($error);
}
}
public static function storeClaimManagement($row, $member, $claim_request_id){
try {
$organization = 0;
if($row['provider_code']){
$organization = Organization::where('code', $row['provider_code'])->first();
if (!$organization){
throw new ImportRowException(__('Provider Tidak ditemukan'), 0, null, $row);
}
};
if(!$member){
throw new ImportRowException(__('Member Tidak ditemukan'), 0, null, $row);
};
DB::beginTransaction();
$data = [
'member_id' => $member->id,
'currency' => 'IDR',
'plan_id' => $member->currentPlan->id,
'total_claim' => $row['tot_amt_insurred'] ? $row['tot_amt_insurred'] : 0,
'benefit_code' => $row['benefit_code'] ? $row['benefit_code'] : '-',
'benefit_desc' => $row['benefit_desc'] ? $row['benefit_desc'] : '-',
'amount_incurred' => $row['tot_amt_insurred'] ? $row['tot_amt_insurred'] : 0,
'amount_approved' => $row['tot_amt_approved'] ? $row['tot_amt_approved'] : 0,
'amount_not_approved' => $row['tot_amt_not_approved'] ? $row['tot_amt_not_approved'] :0,
'excess_paid' => $row['tot_excess_paid'] ? $row['tot_excess_paid'] : 0,
'claim_request_id' => $claim_request_id,
'organization_id' => $organization ? $organization->id : NULL,
'status' => 'requested'
];
$claimManagement = Claim::create($data);
// update client id di claim request
ClaimRequest::where('id', $claim_request_id)->update([
'claim_id' => $claimManagement->id,
]);
DB::commit();
return $claimManagement;
} catch (\Exception $error) {
DB::rollBack();
throw new \Exception($error);
}
}
public static function updateClaimRequest($organization_id, $claim_request_id){
try {
$data = [
'organization_id' => $organization_id
];
DB::commit();
$update = ClaimRequest::where('id', $claim_request_id)->update($data);
return ClaimRequest::find($claim_request_id);
} catch (\Exception $error) {
DB::rollBack();
throw new \Exception($error);
}
}
protected function validatePlanRow($row)
{
if (empty($row['member_id'])) {
throw new ImportRowException(__('Member ID Required'), 0, null, $row);
}
}
public function handleClaimRequestRow($row)
{
try {
$member = Member::where('member_id', $row['member_id'])->with(['currentPlan'])->first();
if(!$member){
throw new ImportRowException(__('Member Tidak ditemukan'), 0, null, $row);
};
$code = $row['client_claim_id'];
$organization_id = $row['provider_code'];
$submissionDate = Helper::formatDateDB($row['admission_date']);
$paymentType = $row['claim_type'];
$status = $row['status'];
$serviceCode = $row['coverage_type'];
$newClaimRequest = $this->storeClaimRequest(
row: $row,
code: $code,
member: $member,
paymentType: $paymentType,
serviceCode: $serviceCode,
submissionDate: $submissionDate,
status: $status,
organization_code: $organization_id
);
$newlyCreatedID = $newClaimRequest->id;
$newClaimManangement = $this->storeClaimManagement($row, $member, $newlyCreatedID);
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' => 'import-internal-aso'
]);
$claim_request_data = $row;
$this->validatePlanRow($claim_request_data);
return $newClaimRequest;
} catch (\Exception $e) {
throw $e;
}
}
}