feat(claims): enrich claims with insurance details and item specifics

This commit is contained in:
hamed
2026-06-24 04:48:11 +03:30
parent 27840da78d
commit c189daa860
8 changed files with 188 additions and 11 deletions
+44 -7
View File
@@ -5,6 +5,7 @@ namespace App\Billing\Controller;
use App\Auth\Entity\User;
use App\Billing\Entity\Claim;
use App\Billing\Repository\ClaimRepository;
use App\Billing\Repository\InvoiceItemRepository;
use App\Billing\Repository\InvoiceRepository;
use App\Billing\Service\ClaimService;
use App\Billing\Service\InvoiceService;
@@ -28,6 +29,7 @@ class BillingController extends BaseController
public function __construct(
private readonly InvoiceService $invoiceService,
private readonly InvoiceRepository $invoiceRepo,
private readonly InvoiceItemRepository $invoiceItemRepo,
private readonly ClaimService $claimService,
private readonly ClaimRepository $claimRepo,
private readonly PatientSessionRepository $sessionRepo,
@@ -36,11 +38,46 @@ class BillingController extends BaseController
private readonly InsuranceRepository $insuranceRepo,
) {}
private function claimArray(Claim $claim): array
/**
* مطالبات را با نام بیمه و جزئیات هر آیتم (نوع/نام، تاریخ مراجعه، تعداد) غنی می‌کند.
* @param Claim[] $claims
*/
private function enrichClaims(array $claims): array
{
$data = $claim->toArray();
$data['insurance_name'] = $this->insuranceRepo->find($claim->getInsuranceId())?->getName();
return $data;
// جمع‌آوری همه‌ی invoice_item_idها در یک رفت‌وآمد
$invoiceItemIds = [];
foreach ($claims as $claim) {
foreach ($claim->getItems() as $ci) {
$invoiceItemIds[] = $ci->getInvoiceItemId();
}
}
$itemDetails = $this->invoiceItemRepo->detailsForIds(array_values(array_unique($invoiceItemIds)));
$sessionIds = [];
foreach ($itemDetails as $d) {
if ($d['patient_session_id'] !== null) {
$sessionIds[] = $d['patient_session_id'];
}
}
$sessionDates = $this->sessionRepo->datesForIds(array_values(array_unique($sessionIds)));
return array_map(function (Claim $claim) use ($itemDetails, $sessionDates) {
$data = $claim->toArray();
$data['insurance_name'] = $this->insuranceRepo->find($claim->getInsuranceId())?->getName();
$data['items'] = array_map(function (array $item) use ($itemDetails, $sessionDates) {
$detail = $itemDetails[$item['invoice_item_id']] ?? null;
$sessionId = $detail['patient_session_id'] ?? null;
$item['title'] = $detail['title'] ?? null;
$item['is_visit'] = $detail !== null && $detail['service_item_id'] === null;
$item['quantity'] = $detail['quantity'] ?? 1;
$item['total_rials'] = $detail['total_rials'] ?? null;
$item['visit_date'] = $sessionId !== null ? ($sessionDates[$sessionId] ?? null) : null;
return $item;
}, $data['items']);
return $data;
}, $claims);
}
#[Route('/api/v1/billing/invoices', methods: ['POST'])]
@@ -116,7 +153,7 @@ class BillingController extends BaseController
$claims = $this->claimService->createFromInvoice($invoice);
return $this->success(['data' => array_map(fn(Claim $c) => $this->claimArray($c), $claims)], 201);
return $this->success(['data' => $this->enrichClaims($claims)], 201);
}
#[Route('/api/v1/billing/claims', methods: ['GET'])]
@@ -130,7 +167,7 @@ class BillingController extends BaseController
$status = $request->query->get('status') ?: null;
$claims = $this->claimRepo->findByTenant($entityType, $entityId, $status);
return $this->success(['data' => array_map(fn(Claim $c) => $this->claimArray($c), $claims)]);
return $this->success(['data' => $this->enrichClaims($claims)]);
}
#[Route('/api/v1/billing/claims/{uuid}/{action}', methods: ['POST'], requirements: ['action' => 'submit|approve|reject|pay'])]
@@ -160,7 +197,7 @@ class BillingController extends BaseController
'reason' => trim($data['reason'] ?? ''),
]);
return $this->success(['data' => $this->claimArray($claim)]);
return $this->success(['data' => $this->enrichClaims([$claim])[0]]);
}
#[Route('/api/v1/billing/reports/insurance-debt', methods: ['GET'])]