Commit 537ed628 authored by Fares's avatar Fares

feat(death): collect form number at start, show in receipt, auto-complete after form fill

- Form number input added to death registration (shown for primary_member type)
- Stored in death_cases.form_number column (new migration Phase_99_002)
- Passed through payment request notes JSON to cashier
- Cashier process/queue views now display form_number from notes for death_fee
- saveFillForm() auto-triggers complete() — no manual button needed
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 6f55a167
......@@ -76,7 +76,7 @@ class CashierController extends Controller
$notesData = json_decode($pr['notes'], true);
if (!empty($notesData['recipient_name'])) {
$pr['member_name'] = $notesData['recipient_name'];
$pr['form_number'] = null;
$pr['form_number'] = $notesData['form_number'] ?? null;
$pr['membership_number'] = null;
}
}
......
......@@ -151,7 +151,14 @@
<span style="font-weight:600;"><?= e($r['description_ar'] ?? '—') ?></span>
<?php endif; ?>
</td>
<td style="font-weight:600;color:#D97706;"><?= e($r['form_number'] ?? '—') ?></td>
<td style="font-weight:600;color:#D97706;"><?php
$fnDisplay = $r['form_number'] ?? null;
if (!$fnDisplay && $r['payment_type'] === 'death_fee' && !empty($r['notes'])) {
$nd3 = json_decode($r['notes'], true);
$fnDisplay = $nd3['form_number'] ?? null;
}
echo e($fnDisplay ?: '—');
?></td>
<td><?= $typeLabel ?></td>
<td style="direction:ltr;text-align:right;font-weight:700;font-size:15px;">
<?= money($r['amount']) ?>
......
......@@ -220,6 +220,8 @@ class DeathController extends Controller
$initialStatus = ($deceasedType === 'primary_member') ? 'board_review' : 'recorded';
$formNumber = ($deceasedType === 'primary_member') ? trim($request->post('form_number', '')) : '';
$caseData = [
'member_id' => (int) $memberId,
'deceased_type' => $deceasedType,
......@@ -230,6 +232,7 @@ class DeathController extends Controller
'same_membership_number' => ($deceasedType === 'primary_member') ? 1 : 0,
'fee_amount' => '0.00',
'status' => $initialStatus,
'form_number' => $formNumber ?: null,
'notes' => $notes ?: null,
];
......@@ -529,6 +532,7 @@ class DeathController extends Controller
'notes' => json_encode([
'fee_breakdown' => $breakdown,
'recipient_name' => $recipientName,
'form_number' => $case['form_number'] ?? null,
'form_fee' => $fees['formFee'],
'annual_sub' => $annualSubTotal,
'trustee_fee' => $boardFeeAmount,
......@@ -714,7 +718,8 @@ class DeathController extends Controller
'updated_at' => date('Y-m-d H:i:s'),
], '`id` = ?', [(int) $id]);
return $this->redirect("/death/{$id}")->withSuccess('تم ملء الاستمارة — يمكن الآن إتمام نقل العضوية');
// Auto-complete the death case after form fill
return $this->complete($request, $id);
}
public function complete(Request $request, string $id): Response
......
......@@ -59,6 +59,11 @@
<label class="form-label">رقم شهادة الوفاة</label>
<input type="text" name="death_certificate_number" class="form-input">
</div>
<div class="form-group" id="form_number_group" style="display:none;">
<label class="form-label">رقم الاستمارة (للعضوية الجديدة) <span style="color:#DC2626;">*</span></label>
<input type="text" name="form_number" id="form_number_input" class="form-input" placeholder="مثال: 1530">
<p style="font-size:11px;color:#6B7280;margin:4px 0 0;">رقم استمارة العضوية الجديدة — يظهر في الإيصال</p>
</div>
<input type="hidden" name="spouse_id" id="hidden_spouse_id">
<input type="hidden" name="child_id" id="hidden_child_id">
</div>
......@@ -191,6 +196,9 @@ document.addEventListener('DOMContentLoaded', function() {
var docsSection = document.getElementById('docs-section');
var formNumberGroup = document.getElementById('form_number_group');
var formNumberInput = document.getElementById('form_number_input');
deceasedType.addEventListener('change', function() {
var selected = this.options[this.selectedIndex];
hiddenSpouse.value = selected.dataset.spouseId || '';
......@@ -200,12 +208,16 @@ document.addEventListener('DOMContentLoaded', function() {
primarySection.style.display = 'block';
feeSection.style.display = 'block';
docsSection.style.display = 'block';
formNumberGroup.style.display = 'block';
formNumberInput.required = true;
document.getElementById('death_certificate').required = true;
document.getElementById('inheritance_notice').required = true;
} else {
primarySection.style.display = 'none';
feeSection.style.display = 'none';
docsSection.style.display = 'none';
formNumberGroup.style.display = 'none';
formNumberInput.required = false;
document.getElementById('death_certificate').required = false;
document.getElementById('inheritance_notice').required = false;
}
......
<?php
declare(strict_types=1);
return function (\App\Core\Database $db): void {
$exists = $db->selectOne(
"SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'death_cases' AND column_name = 'form_number'"
);
if (!$exists) {
$db->raw("ALTER TABLE death_cases ADD COLUMN form_number VARCHAR(50) NULL AFTER primary_spouse_form_filled");
}
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment