Commit a2cdc876 authored by Administrator's avatar Administrator

Update 3 files via Son of Anton

parent 35e407e0
...@@ -153,7 +153,6 @@ class MemberController extends Controller ...@@ -153,7 +153,6 @@ class MemberController extends Controller
$gender = $parsed['gender']; $gender = $parsed['gender'];
$govCode = $parsed['governorate_code']; $govCode = $parsed['governorate_code'];
// Check duplicate
$dup = $db->selectOne( $dup = $db->selectOne(
"SELECT id, full_name_ar, membership_number FROM members WHERE national_id = ? AND is_archived = 0", "SELECT id, full_name_ar, membership_number FROM members WHERE national_id = ? AND is_archived = 0",
[$nationalId] [$nationalId]
...@@ -164,7 +163,6 @@ class MemberController extends Controller ...@@ -164,7 +163,6 @@ class MemberController extends Controller
} }
} }
} else { } else {
// Without NID, we need DOB and gender manually
$dob = $request->post('date_of_birth', ''); $dob = $request->post('date_of_birth', '');
$gender = $request->post('gender', ''); $gender = $request->post('gender', '');
if ($dob === '') $errors[] = 'تاريخ الميلاد مطلوب'; if ($dob === '') $errors[] = 'تاريخ الميلاد مطلوب';
...@@ -184,13 +182,11 @@ class MemberController extends Controller ...@@ -184,13 +182,11 @@ class MemberController extends Controller
return $this->redirect('/members/create'); return $this->redirect('/members/create');
} }
// Generate form number
$formNumber = FormNumberGenerator::next(); $formNumber = FormNumberGenerator::next();
if ($formNumber === null) { if ($formNumber === null) {
return $this->redirect('/members/create')->withError('يجب تحديد رقم بداية الاستمارات أولاً'); return $this->redirect('/members/create')->withError('يجب تحديد رقم بداية الاستمارات أولاً');
} }
// Create member with basic info
$member = Member::create([ $member = Member::create([
'full_name_ar' => $fullNameAr, 'full_name_ar' => $fullNameAr,
'national_id' => $nationalId ?: null, 'national_id' => $nationalId ?: null,
...@@ -219,7 +215,7 @@ class MemberController extends Controller ...@@ -219,7 +215,7 @@ class MemberController extends Controller
$formFee = FormNumberGenerator::getFormFee(); $formFee = FormNumberGenerator::getFormFee();
return $this->redirect('/members/' . $member->id) return $this->redirect('/members/' . $member->id)
->withSuccess('تم تسجيل العضو — استمارة رقم: ' . $formNumber . ' — رسوم الاستمارة: ' . money($formFee)); ->withSuccess('تم تسجيل العضو — استمارة رقم: ' . $formNumber . ' — يجب دفع رسوم الاستمارة ' . money($formFee) . ' لملء البيانات');
} }
public function show(Request $request, string $id): Response public function show(Request $request, string $id): Response
...@@ -235,6 +231,21 @@ class MemberController extends Controller ...@@ -235,6 +231,21 @@ class MemberController extends Controller
? $db->selectOne("SELECT name_ar FROM qualifications WHERE id = ?", [(int) $member->qualification_id]) ? $db->selectOne("SELECT name_ar FROM qualifications WHERE id = ?", [(int) $member->qualification_id])
: null; : null;
// Check if form fee is paid
$formFeePaid = false;
$formFeePayment = null;
try {
$formFeePayment = $db->selectOne(
"SELECT p.*, r.receipt_number
FROM payments p
LEFT JOIN receipts r ON r.id = p.receipt_id
WHERE p.member_id = ? AND p.payment_type = 'form_fee' AND p.is_voided = 0
LIMIT 1",
[(int) $id]
);
$formFeePaid = ($formFeePayment !== null);
} catch (\Throwable $e) {}
// Load family data // Load family data
$spouses = []; $spouses = [];
$children = []; $children = [];
...@@ -268,12 +279,8 @@ class MemberController extends Controller ...@@ -268,12 +279,8 @@ class MemberController extends Controller
$totalPaid = $totalPaidRow['total'] ?? '0.00'; $totalPaid = $totalPaidRow['total'] ?? '0.00';
} catch (\Throwable $e) {} } catch (\Throwable $e) {}
// Load notes
$notes = $member->getNotes(); $notes = $member->getNotes();
$formFee = FormNumberGenerator::getFormFee(); $formFee = FormNumberGenerator::getFormFee();
// Check if form is filled (has qualification = minimum indicator of filled form)
$formFilled = ($member->qualification_id !== null && $member->qualification_id > 0); $formFilled = ($member->qualification_id !== null && $member->qualification_id > 0);
return $this->view('Members.Views.show', [ return $this->view('Members.Views.show', [
...@@ -287,9 +294,111 @@ class MemberController extends Controller ...@@ -287,9 +294,111 @@ class MemberController extends Controller
'notes' => $notes, 'notes' => $notes,
'formFee' => $formFee, 'formFee' => $formFee,
'formFilled' => $formFilled, 'formFilled' => $formFilled,
'formFeePaid' => $formFeePaid,
'formFeePayment' => $formFeePayment,
]);
}
/**
* Pay form fee — quick inline payment
*/
public function payFormFee(Request $request, string $id): Response
{
$db = App::getInstance()->db();
$member = Member::find((int) $id);
if (!$member || $member->is_archived) {
return $this->redirect('/members')->withError('العضو غير موجود');
}
// Check if already paid
$existing = $db->selectOne(
"SELECT id FROM payments WHERE member_id = ? AND payment_type = 'form_fee' AND is_voided = 0",
[(int) $id]
);
if ($existing) {
return $this->redirect('/members/' . $id)->withError('رسوم الاستمارة مدفوعة بالفعل');
}
$formFee = FormNumberGenerator::getFormFee();
$employee = App::getInstance()->currentEmployee();
$paymentMethod = trim((string) $request->post('payment_method', 'cash'));
$db->beginTransaction();
try {
// Create receipt number
$year = date('Y');
$prefix = 'REC-' . $year . '-';
$lastReceipt = $db->selectOne(
"SELECT receipt_number FROM receipts WHERE receipt_number LIKE ? ORDER BY id DESC LIMIT 1",
[$prefix . '%']
);
if ($lastReceipt) {
$parts = explode('-', $lastReceipt['receipt_number']);
$seq = (int) end($parts) + 1;
} else {
$seq = 1;
}
$receiptNumber = $prefix . str_pad((string) $seq, 6, '0', STR_PAD_LEFT);
// Create payment
$paymentId = $db->insert('payments', [
'member_id' => (int) $id,
'payment_type' => 'form_fee',
'amount' => $formFee,
'currency' => 'EGP',
'payment_method' => $paymentMethod,
'payment_date' => date('Y-m-d'),
'received_by_employee_id' => $employee ? (int) $employee->id : null,
'related_entity_type' => 'members',
'related_entity_id' => (int) $id,
'notes' => 'رسوم استمارة عضوية رقم ' . ($member->form_number ?? ''),
'is_voided' => 0,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
'created_by' => $employee ? (int) $employee->id : null,
]);
// Create receipt
$receiptId = $db->insert('receipts', [
'receipt_number' => $receiptNumber,
'member_id' => (int) $id,
'payment_id' => $paymentId,
'receipt_type' => 'payment',
'amount' => $formFee,
'amount_in_words_ar' => number_to_arabic_words((float) $formFee),
'description_ar' => 'رسوم استمارة عضوية رقم ' . ($member->form_number ?? ''),
'issued_by_employee_id' => $employee ? (int) $employee->id : null,
'issued_at' => date('Y-m-d H:i:s'),
'is_voided' => 0,
'print_count' => 0,
'created_at' => date('Y-m-d H:i:s'),
]); ]);
// Link receipt to payment
$db->update('payments', ['receipt_id' => $receiptId], '`id` = ?', [$paymentId]);
$db->commit();
EventBus::dispatch('payment.completed', [
'payment_id' => $paymentId,
'receipt_id' => $receiptId,
'member_id' => (int) $id,
'type' => 'form_fee',
'amount' => $formFee,
]);
return $this->redirect('/members/' . $id)
->withSuccess('تم دفع رسوم الاستمارة ' . money($formFee) . ' — إيصال رقم: ' . $receiptNumber . ' — يمكنك الآن ملء الاستمارة');
} catch (\Throwable $e) {
$db->rollBack();
return $this->redirect('/members/' . $id)->withError('فشل تسجيل الدفع: ' . $e->getMessage());
}
} }
/**
* Fill form — BLOCKED if form fee not paid
*/
public function fillForm(Request $request, string $id): Response public function fillForm(Request $request, string $id): Response
{ {
$db = App::getInstance()->db(); $db = App::getInstance()->db();
...@@ -298,6 +407,16 @@ class MemberController extends Controller ...@@ -298,6 +407,16 @@ class MemberController extends Controller
return $this->redirect('/members')->withError('العضو غير موجود'); return $this->redirect('/members')->withError('العضو غير موجود');
} }
// CHECK: Form fee must be paid
$formFeePaid = $db->selectOne(
"SELECT id FROM payments WHERE member_id = ? AND payment_type = 'form_fee' AND is_voided = 0 LIMIT 1",
[(int) $id]
);
if (!$formFeePaid) {
return $this->redirect('/members/' . $id)
->withError('⚠ يجب دفع رسوم الاستمارة (' . money(FormNumberGenerator::getFormFee()) . ') قبل ملء البيانات');
}
$branches = $db->select("SELECT id, name_ar FROM branches WHERE is_active = 1 ORDER BY name_ar"); $branches = $db->select("SELECT id, name_ar FROM branches WHERE is_active = 1 ORDER BY name_ar");
$qualifications = $db->select("SELECT id, name_ar FROM qualifications WHERE is_active = 1 ORDER BY sort_order"); $qualifications = $db->select("SELECT id, name_ar FROM qualifications WHERE is_active = 1 ORDER BY sort_order");
$governorates = $db->select("SELECT code, name_ar FROM governorates WHERE is_active = 1 ORDER BY name_ar"); $governorates = $db->select("SELECT code, name_ar FROM governorates WHERE is_active = 1 ORDER BY name_ar");
...@@ -320,10 +439,19 @@ class MemberController extends Controller ...@@ -320,10 +439,19 @@ class MemberController extends Controller
return $this->redirect('/members')->withError('العضو غير موجود'); return $this->redirect('/members')->withError('العضو غير موجود');
} }
// CHECK: Form fee must be paid
$formFeePaid = $db->selectOne(
"SELECT id FROM payments WHERE member_id = ? AND payment_type = 'form_fee' AND is_voided = 0 LIMIT 1",
[(int) $id]
);
if (!$formFeePaid) {
return $this->redirect('/members/' . $id)
->withError('⚠ يجب دفع رسوم الاستمارة قبل ملء البيانات');
}
$data = $request->all(); $data = $request->all();
unset($data['_csrf_token']); unset($data['_csrf_token']);
// Build update array — only update non-empty fields
$updateFields = [ $updateFields = [
'full_name_en', 'place_of_birth', 'nationality', 'religion', 'full_name_en', 'place_of_birth', 'nationality', 'religion',
'qualification_id', 'marital_status', 'id_issue_date', 'id_expiry_date', 'qualification_id', 'marital_status', 'id_issue_date', 'id_expiry_date',
...@@ -344,7 +472,6 @@ class MemberController extends Controller ...@@ -344,7 +472,6 @@ class MemberController extends Controller
} }
} }
// Handle qualification_id as integer
if (isset($update['qualification_id'])) { if (isset($update['qualification_id'])) {
$update['qualification_id'] = $update['qualification_id'] ? (int) $update['qualification_id'] : null; $update['qualification_id'] = $update['qualification_id'] ? (int) $update['qualification_id'] : null;
} }
...@@ -366,7 +493,6 @@ class MemberController extends Controller ...@@ -366,7 +493,6 @@ class MemberController extends Controller
} catch (\Throwable $e) {} } catch (\Throwable $e) {}
} }
// Update status to under_review if still potential
if ($member->status === 'potential') { if ($member->status === 'potential') {
$update['status'] = 'under_review'; $update['status'] = 'under_review';
} }
......
...@@ -10,11 +10,14 @@ return [ ...@@ -10,11 +10,14 @@ return [
['GET', '/members/{id}', 'Members\Controllers\MemberController@show', ['auth'], 'member.view'], ['GET', '/members/{id}', 'Members\Controllers\MemberController@show', ['auth'], 'member.view'],
['GET', '/members/{id}/edit', 'Members\Controllers\MemberController@edit', ['auth'], 'member.edit'], ['GET', '/members/{id}/edit', 'Members\Controllers\MemberController@edit', ['auth'], 'member.edit'],
['POST', '/members/{id}', 'Members\Controllers\MemberController@update', ['auth'], 'member.edit'], ['POST', '/members/{id}', 'Members\Controllers\MemberController@update', ['auth'], 'member.edit'],
['POST', '/members/{id}/status', 'Members\Controllers\MemberController@changeStatus',['auth'], 'member.change_status'], ['POST', '/members/{id}/status', 'Members\Controllers\MemberController@changeStatus', ['auth'], 'member.change_status'],
// Fill Form (استمارة) // Form fee payment
['POST', '/members/{id}/pay-form-fee', 'Members\Controllers\MemberController@payFormFee', ['auth'], 'member.edit'],
// Fill Form (استمارة) — blocked until form fee paid
['GET', '/members/{id}/fill-form', 'Members\Controllers\MemberController@fillForm', ['auth'], 'member.edit'], ['GET', '/members/{id}/fill-form', 'Members\Controllers\MemberController@fillForm', ['auth'], 'member.edit'],
['POST', '/members/{id}/fill-form', 'Members\Controllers\MemberController@saveFillForm',['auth'], 'member.edit'], ['POST', '/members/{id}/fill-form', 'Members\Controllers\MemberController@saveFillForm', ['auth'], 'member.edit'],
// API endpoints // API endpoints
['POST', '/api/members/parse-nid', 'Members\Controllers\MemberApiController@parseNid', ['auth'], 'member.create'], ['POST', '/api/members/parse-nid', 'Members\Controllers\MemberApiController@parseNid', ['auth'], 'member.create'],
......
...@@ -13,27 +13,73 @@ $statusLabel = $member->getStatusLabel(); ...@@ -13,27 +13,73 @@ $statusLabel = $member->getStatusLabel();
$statusColor = $member->getStatusColor(); $statusColor = $member->getStatusColor();
?> ?>
<!-- Form Not Filled Banner --> <!-- ══════════════════════════════════════════════════════ -->
<?php if (!$formFilled && in_array($member->status, ['potential'])): ?> <!-- STEP 1: Form Fee Not Paid — BIG RED BLOCKER -->
<div class="card" style="margin-bottom:20px;padding:25px;background:linear-gradient(135deg, #FFF7ED, #FEF3C7);border:2px solid #F59E0B;"> <!-- ══════════════════════════════════════════════════════ -->
<?php if (!$formFeePaid && $member->status === 'potential'): ?>
<div class="card" style="margin-bottom:20px;padding:30px;background:linear-gradient(135deg, #FEF2F2, #FEE2E2);border:2px solid #DC2626;">
<div style="text-align:center;margin-bottom:20px;">
<div style="font-size:48px;">🔒</div>
<h2 style="color:#DC2626;margin:10px 0 5px;">يجب دفع رسوم الاستمارة أولاً</h2>
<p style="color:#6B7280;font-size:14px;margin:0;">لا يمكن ملء بيانات الاستمارة قبل دفع الرسوم</p>
</div>
<div style="max-width:500px;margin:0 auto;background:#fff;border-radius:12px;padding:25px;box-shadow:0 4px 12px rgba(0,0,0,0.1);">
<table style="width:100%;font-size:15px;margin-bottom:20px;">
<tr>
<td style="padding:8px 0;color:#6B7280;">رقم الاستمارة</td>
<td style="padding:8px 0;text-align:left;font-weight:700;font-size:20px;color:#0D7377;"><?= e($member->form_number ?? '—') ?></td>
</tr>
<tr>
<td style="padding:8px 0;color:#6B7280;">اسم العضو</td>
<td style="padding:8px 0;text-align:left;font-weight:600;"><?= e($member->full_name_ar) ?></td>
</tr>
<tr>
<td style="padding:8px 0;color:#6B7280;">رسوم الاستمارة</td>
<td style="padding:8px 0;text-align:left;font-weight:700;font-size:24px;color:#DC2626;"><?= money($formFee) ?></td>
</tr>
</table>
<form method="POST" action="/members/<?= (int) $member->id ?>/pay-form-fee">
<?= csrf_field() ?>
<div class="form-group" style="margin-bottom:15px;">
<label class="form-label">طريقة الدفع</label>
<select name="payment_method" class="form-select" style="font-size:16px;">
<option value="cash">نقدي 💵</option>
<option value="visa">فيزا / بطاقة 💳</option>
<option value="bank_transfer">تحويل بنكي 🏦</option>
</select>
</div>
<button type="submit" class="btn btn-primary" style="width:100%;padding:15px;font-size:18px;background:#059669;border-color:#059669;" onclick="return confirm('تأكيد دفع رسوم الاستمارة <?= e(money($formFee)) ?>؟')">
💰 تسجيل دفع رسوم الاستمارة
</button>
</form>
</div>
</div>
<!-- ══════════════════════════════════════════════════════ -->
<!-- STEP 2: Fee Paid but Form Not Filled -->
<!-- ══════════════════════════════════════════════════════ -->
<?php elseif ($formFeePaid && !$formFilled && in_array($member->status, ['potential', 'under_review'])): ?>
<div class="card" style="margin-bottom:20px;padding:25px;background:linear-gradient(135deg, #F0FDF4, #DCFCE7);border:2px solid #059669;">
<div style="display:flex;justify-content:space-between;align-items:center;"> <div style="display:flex;justify-content:space-between;align-items:center;">
<div> <div>
<h3 style="color:#D97706;margin:0 0 8px;">📋 الاستمارة لم تُملأ بعد</h3> <h3 style="color:#059669;margin:0 0 8px;">✅ تم دفع رسوم الاستمارة — جاهز لملء البيانات</h3>
<p style="color:#92400E;margin:0;font-size:14px;"> <p style="color:#6B7280;margin:0;font-size:14px;">
استمارة رقم <strong style="font-size:18px;"><?= e($member->form_number) ?></strong> استمارة رقم <strong style="font-size:18px;color:#0D7377;"><?= e($member->form_number) ?></strong>
— رسوم الاستمارة: <strong><?= money($formFee) ?></strong> — إيصال: <strong><?= e($formFeePayment['receipt_number'] ?? '—') ?></strong>
— المبلغ: <strong><?= money($formFee) ?></strong>
</p> </p>
<p style="color:#6B7280;margin:8px 0 0;font-size:13px;">يجب دفع رسوم الاستمارة ثم ملء باقي البيانات</p>
</div> </div>
<a href="/members/<?= (int) $member->id ?>/fill-form" class="btn btn-primary" style="padding:15px 30px;font-size:16px;background:#D97706;border-color:#D97706;"> <a href="/members/<?= (int) $member->id ?>/fill-form" class="btn btn-primary" style="padding:15px 30px;font-size:18px;">
📝 ملء الاستمارة 📝 ملء الاستمارة الآن
</a> </a>
</div> </div>
</div> </div>
<?php endif; ?> <?php endif; ?>
<!-- Member Header Card --> <!-- Member Header Card -->
<div class="card" style="margin-bottom:20px;overflow:visible;"> <div class="card" style="margin-bottom:20px;">
<div style="padding:25px;"> <div style="padding:25px;">
<div style="display:flex;justify-content:space-between;align-items:start;"> <div style="display:flex;justify-content:space-between;align-items:start;">
<div> <div>
...@@ -51,6 +97,11 @@ $statusColor = $member->getStatusColor(); ...@@ -51,6 +97,11 @@ $statusColor = $member->getStatusColor();
<?php if ($member->age_years): ?> <?php if ($member->age_years): ?>
<span>🎂 <?= (int) $member->age_years ?> سنة</span> <span>🎂 <?= (int) $member->age_years ?> سنة</span>
<?php endif; ?> <?php endif; ?>
<?php if ($formFeePaid): ?>
<span style="color:#059669;">✅ الرسوم مدفوعة</span>
<?php else: ?>
<span style="color:#DC2626;">❌ الرسوم غير مدفوعة</span>
<?php endif; ?>
</div> </div>
</div> </div>
<div style="text-align:left;"> <div style="text-align:left;">
...@@ -105,23 +156,24 @@ $statusColor = $member->getStatusColor(); ...@@ -105,23 +156,24 @@ $statusColor = $member->getStatusColor();
<div style="color:#6B7280;font-size:12px;">إجمالي المدفوع</div> <div style="color:#6B7280;font-size:12px;">إجمالي المدفوع</div>
</div> </div>
</div> </div>
<a href="/payments/member/<?= (int) $member->id ?>" class="btn btn-outline" style="width:100%;text-align:center;">عرض كل المدفوعات</a>
</div> </div>
</div> </div>
</div> </div>
<!-- Quick Actions --> <!-- Quick Actions -->
<div class="card" style="margin-bottom:20px;padding:15px;"> <div class="card" style="margin-bottom:20px;padding:15px;">
<h4 style="margin:0 0 10px;color:#6B7280;font-size:13px;">إجراءات سريعة</h4>
<div style="display:flex;gap:10px;flex-wrap:wrap;"> <div style="display:flex;gap:10px;flex-wrap:wrap;">
<?php if (!$formFilled && $member->status === 'potential'): ?> <?php if ($formFeePaid && !$formFilled): ?>
<a href="/members/<?= (int) $member->id ?>/fill-form" class="btn btn-primary">📝 ملء الاستمارة</a> <a href="/members/<?= (int) $member->id ?>/fill-form" class="btn btn-primary">📝 ملء الاستمارة</a>
<?php endif; ?> <?php endif; ?>
<?php if ($formFilled): ?>
<a href="/members/<?= (int) $member->id ?>/spouses/create" class="btn btn-outline">💍 إضافة زوج/ة</a> <a href="/members/<?= (int) $member->id ?>/spouses/create" class="btn btn-outline">💍 إضافة زوج/ة</a>
<a href="/members/<?= (int) $member->id ?>/children/create" class="btn btn-outline">👶 إضافة ابن/ة</a> <a href="/members/<?= (int) $member->id ?>/children/create" class="btn btn-outline">👶 إضافة ابن/ة</a>
<a href="/payments/process/<?= (int) $member->id ?>" class="btn btn-outline">💰 تسجيل دفعة</a>
<a href="/documents/upload/<?= (int) $member->id ?>" class="btn btn-outline">📁 رفع مستندات</a> <a href="/documents/upload/<?= (int) $member->id ?>" class="btn btn-outline">📁 رفع مستندات</a>
<a href="/interviews/schedule/<?= (int) $member->id ?>" class="btn btn-outline">🗓️ تحديد مقابلة</a> <a href="/interviews/schedule/<?= (int) $member->id ?>" class="btn btn-outline">🗓️ تحديد مقابلة</a>
<a href="/installments/create/<?= (int) $member->id ?>" class="btn btn-outline">📅 خطة تقسيط</a> <a href="/installments/create/<?= (int) $member->id ?>" class="btn btn-outline">📅 خطة تقسيط</a>
<?php endif; ?>
<?php if ($member->status === 'active'): ?> <?php if ($member->status === 'active'): ?>
<a href="/carnets/issue/<?= (int) $member->id ?>" class="btn btn-outline">🪪 إصدار كارنيه</a> <a href="/carnets/issue/<?= (int) $member->id ?>" class="btn btn-outline">🪪 إصدار كارنيه</a>
<?php endif; ?> <?php endif; ?>
...@@ -226,21 +278,4 @@ $statusColor = $member->getStatusColor(); ...@@ -226,21 +278,4 @@ $statusColor = $member->getStatusColor();
</div> </div>
</div> </div>
<!-- Notes -->
<?php if (!empty($notes)): ?>
<div class="card">
<div style="padding:15px 20px;border-bottom:1px solid #E5E7EB;">
<h3 style="margin:0;color:#0D7377;font-size:15px;">📝 الملاحظات</h3>
</div>
<div style="padding:15px 20px;">
<?php foreach ($notes as $note): ?>
<div style="padding:10px 0;border-bottom:1px solid #F3F4F6;">
<div style="font-size:13px;"><?= nl2br(e($note['note_text'])) ?></div>
<div style="font-size:11px;color:#9CA3AF;margin-top:5px;"><?= e($note['employee_name'] ?? 'النظام') ?><?= e($note['created_at']) ?></div>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<?php $__template->endSection(); ?> <?php $__template->endSection(); ?>
\ No newline at end of file
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