Commit 76ca34c3 authored by Fares's avatar Fares

feat(transfers): manual form_number input for child separation

Instead of auto-generating form_number at execution time, require
the user to enter it when creating the separation request. Stored
in transfer_requests.form_number and used during TransferProcessor
execution. Falls back to auto-generation if empty.
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 772a86ba
...@@ -63,6 +63,7 @@ class TransferController extends Controller ...@@ -63,6 +63,7 @@ class TransferController extends Controller
$spouseId = $request->post('spouse_id') ? (int) $request->post('spouse_id') : null; $spouseId = $request->post('spouse_id') ? (int) $request->post('spouse_id') : null;
$notes = trim($request->post('notes', '')); $notes = trim($request->post('notes', ''));
$paymentMethod = trim($request->post('payment_method', 'cash')); $paymentMethod = trim($request->post('payment_method', 'cash'));
$formNumber = trim((string) $request->post('form_number', ''));
$validTypes = ['child_separation', 'child_mandatory_25', 'sports_conversion', 'cross_branch', 'full_transfer']; $validTypes = ['child_separation', 'child_mandatory_25', 'sports_conversion', 'cross_branch', 'full_transfer'];
if (!in_array($transferType, $validTypes)) { if (!in_array($transferType, $validTypes)) {
...@@ -289,6 +290,7 @@ class TransferController extends Controller ...@@ -289,6 +290,7 @@ class TransferController extends Controller
'spouse_id' => $spouseId, 'spouse_id' => $spouseId,
'source_membership_number' => $member['membership_number'], 'source_membership_number' => $member['membership_number'],
'new_membership_value' => $feeCalc['new_membership_value'] ?? $feeCalc['subscription_price'] ?? '0.00', 'new_membership_value' => $feeCalc['new_membership_value'] ?? $feeCalc['subscription_price'] ?? '0.00',
'form_number' => $formNumber !== '' ? $formNumber : null,
'source_companions_count' => $sourceCompanionsCount, 'source_companions_count' => $sourceCompanionsCount,
'target_companions_count' => $targetCompanionsCount, 'target_companions_count' => $targetCompanionsCount,
'companion_surcharge' => $companionSurcharge, 'companion_surcharge' => $companionSurcharge,
......
...@@ -18,7 +18,7 @@ class TransferRequest extends Model ...@@ -18,7 +18,7 @@ class TransferRequest extends Model
protected static array $fillable = [ protected static array $fillable = [
'source_member_id', 'target_member_id', 'transfer_type', 'source_member_id', 'target_member_id', 'transfer_type',
'child_id', 'spouse_id', 'source_membership_number', 'child_id', 'spouse_id', 'source_membership_number',
'new_membership_number', 'new_membership_value', 'new_membership_number', 'new_membership_value', 'form_number',
'source_companions_count', 'target_companions_count', 'source_companions_count', 'target_companions_count',
'companion_surcharge', 'companion_surcharge_breakdown', 'companion_surcharge', 'companion_surcharge_breakdown',
'years_since_acquisition', 'qualification_code', 'years_since_acquisition', 'qualification_code',
......
...@@ -147,8 +147,10 @@ final class TransferProcessor ...@@ -147,8 +147,10 @@ final class TransferProcessor
?? $sourceMember['phone_mobile'] ?? $sourceMember['phone_mobile']
?? '00000000000'; ?? '00000000000';
// Generate form_number for new member // Use manually entered form_number, or auto-generate as fallback
$formNumber = FormNumberGenerator::next(); $formNumber = !empty($request['form_number'])
? $request['form_number']
: FormNumberGenerator::next();
$newMemberData = [ $newMemberData = [
'full_name_ar' => $recipientData['full_name_ar'] ?? $subjectData['full_name_ar'] ?? $subjectName, 'full_name_ar' => $recipientData['full_name_ar'] ?? $subjectData['full_name_ar'] ?? $subjectName,
......
...@@ -50,6 +50,12 @@ ...@@ -50,6 +50,12 @@
</div> </div>
<div style="padding:20px;display:grid;grid-template-columns:1fr 1fr;gap:15px;"> <div style="padding:20px;display:grid;grid-template-columns:1fr 1fr;gap:15px;">
<!-- Form Number (manual input) -->
<div class="form-group" style="grid-column:1/-1;margin-bottom:15px;">
<label class="form-label">رقم الاستمارة <span style="color:#DC2626;">*</span></label>
<input type="text" name="form_number" id="form_number" class="form-input" required placeholder="أدخل رقم الاستمارة" style="max-width:300px;">
</div>
<!-- MALE-only fields --> <!-- MALE-only fields -->
<div id="male-separation-fields"> <div id="male-separation-fields">
<!-- Employment Status --> <!-- Employment Status -->
......
...@@ -26,6 +26,7 @@ if ($transfer['transfer_type'] === 'full_transfer' && !empty($transfer['notes']) ...@@ -26,6 +26,7 @@ if ($transfer['transfer_type'] === 'full_transfer' && !empty($transfer['notes'])
<tr><td style="padding:8px 0;color:#6B7280;">النوع</td><td style="padding:8px 0;font-weight:600;"><?= e($typeLabels[$transfer['transfer_type']] ?? $transfer['transfer_type']) ?></td></tr> <tr><td style="padding:8px 0;color:#6B7280;">النوع</td><td style="padding:8px 0;font-weight:600;"><?= e($typeLabels[$transfer['transfer_type']] ?? $transfer['transfer_type']) ?></td></tr>
<tr><td style="padding:8px 0;color:#6B7280;">الحالة</td><td style="padding:8px 0;font-weight:700;color:<?= match($transfer['status']) { 'completed' => '#059669', 'fee_paid' => '#2563EB', 'approved' => '#0284C7', 'rejected' => '#DC2626', default => '#D97706' } ?>;"><?= match($transfer['status']) { 'completed' => 'مكتمل', 'fee_paid' => 'تم الدفع', 'approved' => 'معتمد', 'rejected' => 'مرفوض', default => 'مقدّم' } ?></td></tr> <tr><td style="padding:8px 0;color:#6B7280;">الحالة</td><td style="padding:8px 0;font-weight:700;color:<?= match($transfer['status']) { 'completed' => '#059669', 'fee_paid' => '#2563EB', 'approved' => '#0284C7', 'rejected' => '#DC2626', default => '#D97706' } ?>;"><?= match($transfer['status']) { 'completed' => 'مكتمل', 'fee_paid' => 'تم الدفع', 'approved' => 'معتمد', 'rejected' => 'مرفوض', default => 'مقدّم' } ?></td></tr>
<?php if ($transfer['new_membership_number']): ?><tr><td style="padding:8px 0;color:#6B7280;">رقم العضوية (نفس الرقم)</td><td style="padding:8px 0;font-weight:700;color:#0D7377;font-size:20px;"><?= e($transfer['new_membership_number']) ?></td></tr><?php endif; ?> <?php if ($transfer['new_membership_number']): ?><tr><td style="padding:8px 0;color:#6B7280;">رقم العضوية (نفس الرقم)</td><td style="padding:8px 0;font-weight:700;color:#0D7377;font-size:20px;"><?= e($transfer['new_membership_number']) ?></td></tr><?php endif; ?>
<?php if (!empty($transfer['form_number'])): ?><tr><td style="padding:8px 0;color:#6B7280;">رقم الاستمارة</td><td style="padding:8px 0;font-weight:700;color:#1A1A2E;"><?= e($transfer['form_number']) ?></td></tr><?php endif; ?>
<?php if ($transfer['source_companions_count'] !== null): ?> <?php if ($transfer['source_companions_count'] !== null): ?>
<tr><td style="padding:8px 0;color:#6B7280;">ملحقين العضوية الأصلية</td><td style="padding:8px 0;"><?= (int) $transfer['source_companions_count'] ?></td></tr> <tr><td style="padding:8px 0;color:#6B7280;">ملحقين العضوية الأصلية</td><td style="padding:8px 0;"><?= (int) $transfer['source_companions_count'] ?></td></tr>
<?php endif; ?> <?php endif; ?>
......
<?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 = 'transfer_requests' AND column_name = 'form_number'"
);
if (!$exists) {
$db->raw("ALTER TABLE `transfer_requests` ADD COLUMN `form_number` VARCHAR(50) NULL AFTER `new_membership_number`");
}
};
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