Commit graph

297 commits

Author SHA1 Message Date
18766df224
Optimize member count queries to avoid N+1 problem
Load all member counts in a single query during mount. Counts are stored in assigns
as a map and retrieved without additional queries.
2025-12-22 17:40:50 +01:00
46af6bbbed
Add required validation and error display for interval field
Show required asterisk and validation errors when interval is not selected
2025-12-22 17:22:12 +01:00
75dc7056ae Fix amount change warning and form value preservation
Add phx-debounce to amount input and preserve form values on confirm
2025-12-22 17:13:51 +01:00
562d7d6ab4 Fix handle_event for update_create_cycle_date to use correct param name 2025-12-22 17:02:07 +01:00
3241dd7d96 Fix cycle end calculation for misaligned cycle_start dates
Make cycle generation idempotent by skipping existing cycles
2025-12-22 16:39:49 +01:00
50a8657718
Fix cycle action buttons layout and visibility
Arrange Paid/Suspended/Unpaid/Delete buttons side by side without wrapping.
Hide Suspend button when cycle is already suspended, matching behavior
of Paid and Unpaid buttons.
2025-12-18 15:11:03 +01:00
f25e198b0e
Update cycle button styling and text
Make cycle button match PaymentFilterComponent and Columns button style.
Show 'Current Cycle Payment Status' or 'Last Cycle Payment Status'
based on active state. Button shows active state when current cycle
is selected.
2025-12-18 15:11:03 +01:00
adb107e6a4
Rename cycle button to Show Last/Current Cycle Payment Status
Update button text and styling to match PaymentFilterComponent.
Button now shows active state when filter is applied.
2025-12-18 15:11:02 +01:00
c65b3808bf
Refactor filters to use cycle status instead of paid field
Replace paid_filter with cycle_status_filter that filters based on
membership fee cycle status (last or current cycle). Update
PaymentFilterComponent to use new filter with options All, Paid, Unpaid.
Remove membership fee status filter dropdown. Extend
filter_members_by_cycle_status/3 to support both paid and unpaid filtering.
Update toggle_cycle_view to preserve filter state in URL.
2025-12-18 15:11:02 +01:00
098b3b0a2a
Remove paid field from members
Remove paid field from Member resource, database migration,
tests, seeds, and UI. This field is no longer needed as payment
status is now tracked via membership fee cycles.
2025-12-18 15:11:02 +01:00
be8a396ab6
Improve payment data box layout and translations
Change 'Payment Cycle' to 'Payment Interval' for accuracy.
Adjust width constraints to use min-w-* instead of fixed w-*
for better responsiveness. Use flex-wrap for better layout.
2025-12-18 15:11:00 +01:00
128866ead3
Replace dropdown with action buttons in cycles view
Replace dropdown menu with individual buttons for status changes.
Buttons are only shown when the status transition is possible.
Make amount clickable to edit instead of separate button.
2025-12-18 15:10:36 +01:00
9a1f0fbfa6
Remove future date validation for join_date
Allow join_date to be set in the future. Only validation remaining
is that exit_date must be after join_date.
2025-12-18 15:10:36 +01:00
8f8c3f258a
Reduce function nesting depth 2025-12-18 15:10:36 +01:00
128c712dbc
fix: improve get_last_completed_cycle and fix test helpers
- Fix get_last_completed_cycle to find most recent completed cycle
- Fix create_cycle helpers to delete auto-generated cycles first
- Fix Ash.destroy return value handling
- Fix form selectors to use specific IDs
- Fix URL parameter names for filters
- Fix Ash.read_one return value expectations in tests
2025-12-18 15:10:35 +01:00
98dc73ee37
refactor: fix credo warnings and format code
- Replace Enum.map/2 |> Enum.join/2 with Enum.map_join/3 for efficiency
- Refactor get_existing_form_values to reduce cyclomatic complexity
- Replace length/1 with Enum.empty?/1 for better performance
- Update gettext translations
2025-12-18 15:10:07 +01:00
97c9ef670b
fix: remove type="number" from amount input, use text input like postal_code
- Follow same pattern as postal_code field in member form
- Ash validates Decimal format automatically
- Text input allows better control and validation feedback
2025-12-18 15:08:37 +01:00
10fe866de6
feat: add phx-debounce to amount input for real-time validation
- Debounce validation to 300ms for better UX
- Ash will automatically validate Decimal format
- Provides immediate feedback on invalid input
2025-12-18 15:08:37 +01:00
acfbd8f62b
fix: remove unused validate_amount_format function
- Function was removed but definition remained
- Ash handles Decimal validation automatically
2025-12-18 15:08:37 +01:00
0ab6a75377
refactor: remove manual amount validation, use Ash default validation
- Remove validate_amount_format function - Ash handles Decimal validation automatically
- Remove oninput and pattern attributes - not needed with Ash validation
- Simplify validate handler - let AshPhoenix.Form.validate do its job
- Follows Ash best practices for form validation
2025-12-18 15:08:37 +01:00
004bf67f54
fix: add missing validate_amount_format function
- Function was referenced but not defined
- Cleans invalid characters from amount input
- Provides better UX by sanitizing input
2025-12-18 15:08:37 +01:00
e7fa3be74c
feat: add server-side amount validation in membership fee type form
- Validate amount format on input change
- Clean invalid characters from amount input
- Provides immediate feedback on invalid input
2025-12-18 15:08:36 +01:00
03aacefb6e
fix: improve amount validation, layout, and remove duplicate button
- Add oninput validation for amount field to catch invalid input immediately
- Fix Current Cycle layout with whitespace-nowrap and wider width
- Remove duplicate Regenerate Missing Cycles button (same functionality)
- Add tooltip to Regenerate Cycles button explaining functionality
2025-12-18 15:08:36 +01:00
b7a49eabe4
fix: handle empty cycles result in regenerate_cycles event
- Match {:ok, cycles, notifications} tuple correctly
- Handle case when no cycles are generated ({:ok, [], []})
- Prevents CaseClauseError when regeneration produces no new cycles
2025-12-18 15:08:36 +01:00
803d9a0a94
fix: normalize checkbox value and improve UI layout
- Normalize checkbox 'on' value to boolean true in settings
- Change Payment Data layout to flex-nowrap for horizontal display
- Replace membership fee type dropdown with display-only view
- Fix tests to use correct button selectors and switch to membership fees tab
2025-12-18 15:08:35 +01:00
3f723a3c3a
feat: add cycle management features to membership fees component
- Add regenerate cycles functionality
- Add delete cycle with confirmation
- Add edit cycle amount modal
- Add regenerate missing cycles button
- Complete cycle management UI implementation
2025-12-18 15:08:35 +01:00
75e6300637
feat: add membership fee types to navbar contributions menu
- Add Membership Fee Types link to Contributions dropdown
- Add Membership Fee Settings link to Contributions dropdown
- Enables easy navigation to membership fee management
2025-12-18 15:08:34 +01:00
29b39b2793
fix: handle form errors correctly in membership fee settings
- Fix Protocol.UndefinedError when iterating over form errors
- Handle both tuple and list error formats
- Prevents crash when saving settings with validation errors
2025-12-18 15:08:34 +01:00
8899e1986a
feat: add pattern validation for amount input field
- Add pattern="[0-9]+(\.[0-9]{1,2})?" to prevent invalid input
- Browser now validates number format before submission
- Improves UX by catching errors earlier
2025-12-18 15:08:34 +01:00
e0702240d3
feat: add membership fee type name to payment data section
- Display type name alongside amount, interval, and cycle statuses
- Improves clarity by showing which membership fee type is assigned
2025-12-18 15:08:34 +01:00
cd46478024
refactor: optimize format_currency using pipe operator
- Replace double assignment of normalized_str with pipe operator
- Improves code readability and follows Elixir best practices
2025-12-18 15:08:34 +01:00
4c66628802
fix: extract form values directly from form fields to preserve them
- Change get_existing_form_values to read from form[:field].value
- This ensures current form state is preserved when only interval changes
- Fixes issue where name and amount were cleared on interval selection
2025-12-18 15:08:33 +01:00
aece03c9c2
feat: show both last and current cycle status in payment data
- Add current cycle status calculation and display
- Show both Last Cycle and Current Cycle status badges
- Replace single Status field with two separate fields
2025-12-18 15:08:33 +01:00
e8e47fd92a
fix: remove unused variable in format_currency function
- Replace unused amount_str variable with normalized_str
- Ensure consistent variable naming throughout function
2025-12-18 15:08:33 +01:00
8ed9adeea0
fix: preserve form values when only interval field changes
- Merge existing form values with new params to prevent field loss
- Add get_existing_form_values helper to extract current form state
- Fixes issue where name and amount were cleared when selecting interval
2025-12-18 15:08:33 +01:00
5460ebdd5a
feat: add payment data section with membership fee type info
- Add Payment Data section showing membership fee amount, interval, and last cycle status
- Use real membership fee type data instead of mockup
- Calculate last cycle status from loaded cycles
2025-12-18 15:08:32 +01:00
bc989422e2
refactor: reduce function nesting depth to fix Credo warnings
Extract nested conditionals into separate helper functions:
- check_amount_change/2 and related helpers in MembershipFeeTypeLive.Form
- check_interval_change/2 and related helpers in MemberLive.Form

This reduces nesting depth from 3 to 2, improving code readability.
2025-12-18 15:08:32 +01:00
1fde2985e5
feat: add routes for membership fee types admin
- GET /membership_fee_types - List view
- GET /membership_fee_types/new - Create form
- GET /membership_fee_types/:id/edit - Edit form
2025-12-18 15:08:32 +01:00
810a54c11f
feat: add membership fee types admin interface
- Add list view showing name, amount, interval, member count
- Add create/edit forms for membership fee types
- Gray out interval field on edit (immutable)
- Show warning on amount change with impact information
- Prevent deletion if type is in use
2025-12-18 15:08:31 +01:00
35cafd6e6a
feat: add membership fee type dropdown to member form
- Add membership fee type selection in member create/edit form
- Show warning if different interval selected
- Filter available types to same interval only
2025-12-18 15:08:31 +01:00
920cae656e
feat: add membership fees section to member detail view
- Add membership fees section with cycle table
- Display cycles with interval, amount, status, and actions
- Add membership fee type dropdown (same interval only)
- Add status change actions (mark as paid/suspended/unpaid)
- Add cycle regeneration (manual and missing cycles)
- Add cycle amount editing
- Add cycle deletion with confirmation
2025-12-18 15:08:31 +01:00
99dc17bf4d
feat: add membership fee status column to member list
- Add status column showing last completed or current cycle status
- Add toggle to switch between last/current cycle view
- Add color coding (green/red/gray) for paid/unpaid/suspended
- Add filters for unpaid cycles in last/current cycle
- Efficiently load cycles to avoid N+1 queries
2025-12-18 15:08:31 +01:00
06de9d2c8b
feat: allow amount updates for membership fee cycles 2025-12-18 15:08:31 +01:00
09dfbe455b
feat: add membership fee helper modules
MembershipFeeHelpers: formatting functions for currency, intervals, cycles
MembershipFeeStatus: helper for loading and determining cycle status in member list
2025-12-18 15:08:30 +01:00
017ee5bc0c
refactor: reduce nesting depth in process_batch function
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-18 15:00:45 +01:00
d720670fd2
fix: address notification handling review feedback
1. Fix misleading comment in async create_member path
2. Use skip_lock?: true in test case for create_member
3. Fix generate_cycles_for_all_members/1
2025-12-18 15:00:45 +01:00
c25ffdc034
refactor: implement proper notification handling via after_action hooks
Refactor notification handling according to Ash best practices
2025-12-18 15:00:44 +01:00
98b56fc406
fix: resolve notification handling and maintain after_action for cycle regeneration 2025-12-18 15:00:44 +01:00
ba0ece9dc6
fix: correct return_notifications? logic to prevent missed notifications
Fix the logic for return_notifications? in create_cycles
2025-12-18 15:00:44 +01:00
0783a2fe18
refactor: reduce nesting depth in regenerate_cycles_on_type_change
Split the function into smaller, focused functions to reduce nesting depth
2025-12-18 15:00:44 +01:00