- 22 Jul, 2026 25 commits
-
-
Fares authored
Removed membership_type gates that restricted the family tree section, add-family buttons, and related messaging to only working/foreign members. All types now see their dependents with payment status on the profile page. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Inline family member forms now collect all fields matching standalone creation forms (NID with auto-parsing, passport, DOB, gender, nationality, qualification, contact info, etc.) instead of just names. Also adds temporary member inline creation. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The seasonal membership form now allows adding spouses and children directly during registration (not just selecting pre-existing ones). New family members are created as actual spouse/child records and included in the pricing calculation. The price preview API also reflects inline additions in real-time. All discounts work correctly with inline members: - Parent + child <15: 500 EGP off - Husband + wife: 1000 EGP off - Family of 5+: 1000 EGP off - No qualification: 10% off - VAT applied on all amounts Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Sports, seasonal, and honorary members were blocked from adding spouses, children, and temporary members because allows_dependents was set to false. All membership types now allow dependents. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Sports membership fee is 50% of the membership price tier which is determined by the qualification. Added a qualification dropdown that appears when membership type is 'sports', with server-side validation requiring it. The qualification_id is saved on the member record so the billing and sports registration can correctly calculate the fee. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Three fixes applied across all non-working membership types: 1. Sports registration now calculates 50% fee and sends payment request to treasury automatically (like Seasonal already did). Also fixed billing fallback to find branch pricing without qualification_id. 2. Type-specific CTA now checks if registration record already exists in the DB (foreign_member_details, sports_members, etc.) — won't reappear after filling the form regardless of billing state. 3. Added duplicate-registration guards to all four type controllers (foreign, sports, seasonal, honorary) so users can't accidentally submit the registration form twice. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The SUB_MEM treasury queue was filtering payment_type with an allowlist that didn't include foreign_membership_fee or sports_membership_fee. Requests were created successfully but never appeared in the cashier queue. Also added proper Arabic labels and filter dropdown options. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The type-specific CTA (e.g. "تسجيل بيانات العضوية الأجنبية") was reappearing after sending payment to treasury because total_pending dropped to 0 (fee moved to in_queue). Now the CTA is suppressed when a payment is already pending, in queue, or paid. The "pending at cashier" block also now shows independently of total_pending. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Foreign membership dependents (spouses, children, temporary) are included in the membership fee — zero additional charges. Add a "not Egyptian" checkbox that toggles between NID and passport number fields on all three dependent creation forms. Server-side validation skips NID requirement when non-Egyptian is checked and requires passport instead. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Non-working types (foreign, sports, seasonal, honorary) stay in 'potential' status after form fee since they skip the acceptance process. The payment section and pending detection now recognize this status for those types. Also adds a type-specific CTA guiding members to their registration form when needed (seasonal/honorary where fee=0 until filled). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Foreign members can now add spouse/children (allowsDependents=true), and the $10k fee routes through the cashier queue instead of inline processing, matching the standard activation path used by other membership types. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Step 6 now shows year cards where each financial year contains all family members (member + spouses + children + temps) with a single shared status dropdown and payment date. Replaces the flat per-person-per-year table. Backend format unchanged — same hidden input naming for full compatibility. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- Payment request includes child's name + fee breakdown in notes JSON - Cashier/Treasury queues display child's name instead of parent's - Skip archive snapshot for child_separation (parent keeps membership) - Generate form_number for new member via FormNumberGenerator - Auto-complete transfer immediately after cashier payment (no manual button) - Hide manual "إتمام التحويل" button for child_separation type Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The سجل العمليات التفصيلي now shows step-by-step entries for ALL procedure types — death, waiver, and transfer/separation — not just death cases. Waiver and transfer timelines are reconstructed from request data (submission, approval, payment, data transfer, completion). Timeline entries are sorted chronologically and color-coded by type. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
payments table uses related_entity_type/related_entity_id, not payment_request_id. Simplified query to filter by payment_type directly. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The السجل التأميني page now shows a complete record of ALL procedures that affected a membership — death cases, waiver transfers, and transfer/separation requests. Works for both active and archived members. Shows: procedure details, role (source/target), fees, approval info, payments related to procedures, death audit timeline, archive snapshots. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Debt tables still show for reference but the payment navigation button is removed per user request — from create, show, and JS debt checker. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
WaiverProcessor now transfers ALL active data (dependents, payments, subscriptions, installments, fines, documents) from source to target member during waiver execution. Snapshot is taken first so archive retains the complete historical state. Changes: - WaiverProcessor::transferActiveData() moves spouses, children, temps, payments, subscriptions, installment_plans, fines, documents, and payment_requests from source to target member - ArchiveService snapshot now includes installment_cheques and installment_schedule for complete financial history - Archive show page displays cheques per installment plan - Member show page adds "عرض العضوية المؤرشفة" button for waiver transfers - Archive page adds "الانتقال إلى العضوية الحالية" link to current holder Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
form_number was being stripped by the model's mass-assignment guard, so it was never saved to the database despite being in the POST data. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The form_number wasn't showing because earlier payment requests had notes without form_number. Now both cashier process and queue views fall back to reading form_number directly from death_cases table when not in notes JSON. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- 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:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The archive show page now displays ALL original data: - Dependents from snapshot (not live DB where they may have been moved) - Full payments history with amounts and receipt numbers - All annual subscriptions with status and amounts - Installment plans with expandable payment schedules - Fines with amounts and reasons - Documents with file details - Financial summary box (membership value + total paid) - Insurance record link for death case audit trail Previously, dependents showed empty because children/temps are moved during death transfer. Now uses snapshot related_data as source of truth. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- Add DeathAuditService for full Arabic audit logging of every step - Create death_case_audit_log table (migration Phase_99_001) - Transfer active installment plans to new membership on completion - Duplicate documents to new membership (originals preserved on archived) - Create annual subscriptions for new membership (current financial year) - Set membership_value to current plan price (not old historical value) - Add "عرض العضوية الأصلية" button linking to archived member - Add "السجل التأميني" (Insurance Record) page on member profile - Add insurance-record route and view with timeline UI - Update architecture map with new services, tables, and flows Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 21 Jul, 2026 15 commits
-
-
Fares authored
The cashier payment page was displaying the deceased husband's info (name, form number, membership number). For death_fee payments, the recipient is the wife — extracted from the notes JSON. Form/membership numbers are hidden since the wife doesn't have them yet. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The board approval percentage calculation had fragile fallbacks that could miss the pricing_configs data and fall back to the old membership_value. Added cascading fallbacks: PricingEngine → branch+qual → branch-only → any active pricing → membership_value (last resort). Also fixed the JS preview in show.php which was using the stored membership_value (114,000) instead of the current plan price (150,000) for the real-time calculation hint. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Child separation is not a death/full transfer — the parent stays active with their original membership number. The separated child gets a brand new sequential number via MemberNumberGenerator::getNextMembershipNumber(). Only full_transfer type archives the source member and passes the same number to the new member. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Form now collects for spouses: date_of_birth, nationality, marriage_date, join_date, payment_date. For children: date_of_birth, join_date. Validates spouse minimum age (SPOUSE_MIN_AGE rule, default 21) and requires marriage_date. Non-Egyptian spouses get addition_fee calculated as SPOUSE_FOREIGN_FEE% of current plan price at completion time. TransferProcessor now uses submitted dates instead of defaults and stores nationality and addition_fee on the spouse record. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The column was in the model's fillable but never had a migration. Causes 'Column not found' error when storing female child separation requests. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Empty form fields post as '' which ?? doesn't catch (only null). MySQL rejects '' for decimal columns. Switched to ?: so empty strings fall through to the '0.00' default. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Reflects that deceased is excluded from annual sub, trustee fee uses current plan price via PricingEngine, and Pricing module is now a dependency. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The deceased member should not be charged annual subscription — the primary spouse becomes the new member. Trustee fee percentage now uses the current membership plan price from pricing_configs (e.g. 150,000) instead of the historical membership_value stored at enrollment time (e.g. 114,000). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The TransferProcessor::execute() was failing with "Field 'date_of_birth' doesn't have a default value" because: 1. Child's date_of_birth could be empty string (not null), bypassing ?? operator 2. Children table has no phone_mobile column, causing NOT NULL violation on members 3. Spouse creation was missing required fields (date_of_birth, marriage_date, join_date) 4. Temporary member creation was missing required fields (date_of_birth, gender, category) Changes: - Sanitize DOB: treat empty string and '0000-00-00' as null before NID fallback - Add phone_mobile fallback chain: subject → source member → placeholder - Spouse inserts now include all NOT NULL fields with sensible defaults - Children inserts include child_order - Temporary member inserts include category, date_of_birth, gender with NID parsing - Death module: fix secondary spouse phone_mobile NULL issue Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Death module: - Annual subscription now includes ALL family members (spouses, children, temps + dev fee) - Temporary members distribution UI added to create form - Payment receipt created in primary spouse's name (not deceased) - Form number field added to membership application - Deceased member name stored on new membership record - Full Arabic audit trail logging on completion Waiver module: - Mark ALL family subscriptions as paid after completion (not just member) - Set activated_by_payment_id on all dependents - Copy membership_value from source to target member - Add transferred_from_waiver_id and waived_from_member_name to members - Display waiver source badge and archive section on member profile Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Expanded the special discounts system to support: - Discount types: percentage, fixed amount, or free subscription - Date range (effective_from/effective_to) for time-bounded offers - Conditions: none (direct), full_payment, or min_payment threshold - Bonus: free subscription years granted when discount activates - Applies-to targeting: membership_fee, subscription, or all Added SpecialDiscountService for evaluating conditional discounts and applying free subscription bonuses on member.activated event. Updated form UI with dynamic visibility and validation. Migration: Phase_98_003 adds new columns to special_discounts table. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The children table requires date_of_birth (NOT NULL). The dependent creation loop now derives DOB from national_id via NationalIdParser, falling back to a placeholder if neither is available. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
When creating the new member record, date_of_birth may be NULL on the child record. Now attempts to derive DOB and gender from national_id via NationalIdParser before falling back to a placeholder. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
1. isCurrentYearSubscriptionCovered() was comparing activation date against its own fiscal year (always true) — now correctly compares against the current fiscal year's July 1st. 2. Annual subscription in calculate() now includes all family members (spouses, children, temps) not just the member alone. 3. marriage_date and dep count columns are only included in INSERT when non-null, preventing column-not-found error if migration hasn't run. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-