-
Notifications
You must be signed in to change notification settings - Fork 0
v1.0.1: Hotfix Release #25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…vements, payment auto-apply late fees
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Hotfix release update to v1.0.1 focused on overdue invoice processing/late-fee behavior, Electron packaging naming/versioning, and notification UI adjustments.
Changes:
- Consolidates overdue invoice processing into a single “process overdue invoices” operation (status update + optional late-fee apply) and adds late-fee application during payment processing.
- Updates Electron build metadata (product name, build version, artifact naming) and bumps app version to 1.0.1.
- Adjusts notification UX (bell empty state; preferences sections marked as “Coming Soon”) and removes Tenants links from nav menus.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| 5-Aquiis.Professional/Shared/Layout/NavMenu.razor | Removes Tenants nav link(s) from Professional navigation. |
| 5-Aquiis.Professional/Features/Administration/Settings/Pages/ServiceSettings.razor | Replaces separate invoice tasks with a combined “Process Overdue Invoices” manual task. |
| 4-Aquiis.SimpleStart/electron.manifest.json | Renames product/build version and customizes artifact naming. |
| 4-Aquiis.SimpleStart/appsettings.json | Bumps SimpleStart application version to 1.0.1. |
| 4-Aquiis.SimpleStart/Shared/Layout/NavMenu.razor | Removes Tenants nav link from SimpleStart navigation. |
| 4-Aquiis.SimpleStart/Features/Administration/Settings/Pages/ApplicationSettings.razor | Merges invoice-status update and late-fee apply into a single task path. |
| 3-Aquiis.UI.Shared/Components/Notifications/NotificationPreferences.razor | Disables email/SMS/digest options and labels them as “Coming Soon”. |
| 3-Aquiis.UI.Shared/Components/Notifications/NotificationBell.razor | Improves empty-state behavior and badge display when there are no notifications. |
| 2-Aquiis.Application/Services/ScheduledTaskService.cs | Combines scheduled invoice status updates + late-fee application into one method. |
| 2-Aquiis.Application/Services/PaymentService.cs | Adds late-fee application when payment changes cause an invoice to become overdue. |
Comments suppressed due to low confidence (1)
5-Aquiis.Professional/Shared/Layout/NavMenu.razor:76
- The Tenants nav entry was removed from the primary property-management navigation, but the PR description doesn’t mention any navigation/IA changes. If this is intentional, please document it in the release notes/PR description; if not, restore the link so tenant management remains discoverable.
<div class="nav-item px-3">
<NavLink class="nav-link" href="propertymanagement/prospectivetenants">
<div><span class="bi bi-person-plus-fill" aria-hidden="true"></span>Prospects</div>
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="propertymanagement/tours">
<div><span class="bi bi-calendar-event" aria-hidden="true"></span>Tours</div>
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="propertymanagement/leases">
<div><span class="bi bi-file-earmark-text-fill" aria-hidden="true"></span>Leases</div>
</NavLink>
| invoice.LateFeeAmount = lateFee; | ||
| invoice.LateFeeApplied = true; | ||
| invoice.LateFeeAppliedOn = DateTime.UtcNow; | ||
| invoice.Amount += lateFee; |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Late fee application here mutates both invoice.LateFeeAmount and also increments invoice.Amount (invoice.Amount += lateFee). Elsewhere, InvoiceService calculates totals as invoice.Amount + (invoice.LateFeeAmount ?? 0) (e.g., 2-Aquiis.Application/Services/InvoiceService.cs:372), which will double-count late fees once this code runs. Pick a single semantic: either keep Amount as the base amount and never add the late fee to it, or treat Amount as total-due and update services/computed properties accordingly.
| invoice.Amount += lateFee; |
| // Get organization settings | ||
| var settings = await _context.OrganizationSettings | ||
| .FirstOrDefaultAsync(s => s.OrganizationId == organizationId); | ||
|
|
||
| if (settings == null || !settings.LateFeeEnabled || !settings.LateFeeAutoApply) | ||
| { | ||
| // Late fees not enabled or not set to auto-apply | ||
| return; |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ApplyLateFeeIfEligibleAsync loads organization settings without filtering out soft-deleted rows. Other code paths filter !s.IsDeleted when reading settings; this should do the same to avoid using stale/deleted configuration.
| // If invoice just became overdue, check if late fee should be applied | ||
| if (statusChangedToOverdue && | ||
| (invoice.LateFeeApplied == null || !invoice.LateFeeApplied.Value)) | ||
| { | ||
| await ApplyLateFeeIfEligibleAsync(invoice, organizationId); | ||
| } |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
New late-fee auto-apply behavior was added during payment processing, but the existing PaymentService unit tests don’t cover the scenario where an invoice becomes Overdue and a late fee is applied (including grace period + settings gating). Please add tests for: (1) eligible overdue invoice gets late fee applied, (2) within grace period does not apply, (3) LateFeeAutoApply disabled does not apply, (4) late fee isn’t applied twice.
| if (settings.LateFeeEnabled && | ||
| settings.LateFeeAutoApply && | ||
| invoice.DueOn < gracePeriodCutoff && | ||
| (invoice.LateFeeApplied == null || !invoice.LateFeeApplied.Value)) | ||
| { | ||
| var lateFee = Math.Min(invoice.Amount * settings.LateFeePercentage, settings.MaxLateFeeAmount); | ||
|
|
||
| invoice.LateFeeAmount = lateFee; | ||
| invoice.LateFeeApplied = true; | ||
| invoice.LateFeeAppliedOn = DateTime.UtcNow; | ||
| invoice.Amount += lateFee; | ||
| invoice.Notes = string.IsNullOrEmpty(invoice.Notes) | ||
| ? $"Late fee of {lateFee:C} applied on {DateTime.Now:MMM dd, yyyy}" | ||
| : $"{invoice.Notes}\nLate fee of {lateFee:C} applied on {DateTime.Now:MMM dd, yyyy}"; | ||
|
|
||
| lateFeesAppliedCount++; | ||
| } |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This manual ‘Process Overdue Invoices’ path also increments invoice.Amount when applying late fees. Given other services calculate totals as Amount + LateFeeAmount, this risks double-counting late fees. Align this logic with the chosen invoice/late-fee accounting model (ideally by calling a single shared service method).
| "ApplicationSettings": { | ||
| "AppName": "Aquiis", | ||
| "Version": "1.0.0", | ||
| "Version": "1.0.1", | ||
| "Author": "CIS Guru", |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
App version was bumped to 1.0.1 here, but the project packaging versions appear to still be 1.0.0 (e.g., 4-Aquiis.SimpleStart/Aquiis.SimpleStart.csproj <Version> and ElectronHostHook/package.json). This can lead to inconsistent version reporting and artifact naming for the hotfix release; consider updating all version sources used for builds/releases together.
| // Calculate and apply late fee | ||
| var lateFee = Math.Min(invoice.Amount * settings.LateFeePercentage, settings.MaxLateFeeAmount); | ||
|
|
||
| invoice.LateFeeAmount = lateFee; | ||
| invoice.LateFeeApplied = true; | ||
| invoice.LateFeeAppliedOn = DateTime.UtcNow; | ||
| invoice.Amount += lateFee; | ||
| invoice.Notes = string.IsNullOrEmpty(invoice.Notes) | ||
| ? $"Late fee of {lateFee:C} applied on {DateTime.Now:MMM dd, yyyy}" | ||
| : $"{invoice.Notes}\nLate fee of {lateFee:C} applied on {DateTime.Now:MMM dd, yyyy}"; | ||
|
|
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ApplyLateFeeIfEligibleAsync applies the late fee by setting LateFeeAmount and also doing invoice.Amount += lateFee, which conflicts with other parts of the codebase that compute totals as Amount + LateFeeAmount (e.g., InvoiceService.UpdateInvoiceStatusAsync). This can lead to double-charging/incorrect balances. Please standardize late-fee accounting (either don’t mutate Amount, or stop adding LateFeeAmount elsewhere) before expanding this behavior.
| if (settings.LateFeeEnabled && | ||
| settings.LateFeeAutoApply && | ||
| invoice.DueOn < gracePeriodCutoff && | ||
| (invoice.LateFeeApplied == null || !invoice.LateFeeApplied.Value)) | ||
| { | ||
| var lateFee = Math.Min(invoice.Amount * settings.LateFeePercentage, settings.MaxLateFeeAmount); | ||
| invoice.LateFeeAmount = lateFee; | ||
| invoice.LateFeeApplied = true; | ||
| invoice.LateFeeAppliedOn = DateTime.UtcNow; | ||
| invoice.Amount += lateFee; | ||
| invoice.Notes = string.IsNullOrEmpty(invoice.Notes) | ||
| ? $"Late fee of {lateFee:C} applied on {DateTime.Now:MMM dd, yyyy}" | ||
| : $"{invoice.Notes}\nLate fee of {lateFee:C} applied on {DateTime.Now:MMM dd, yyyy}"; | ||
| lateFeesAppliedCount++; | ||
| } |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This task now applies late fees by mutating both LateFeeAmount and Amount (invoice.Amount += lateFee). Other parts of the application compute totals as Amount + LateFeeAmount, which can double-count late fees. Please standardize the late-fee accounting approach and update this logic accordingly (preferably via a shared service method).
| "win": { | ||
| "target": "portable", | ||
| "icon": "bin/Assets/icon.ico", | ||
| "signAndEditExecutable": false | ||
| "signAndEditExecutable": false, | ||
| "artifactName": "${productName}-${version}-${arch}.${ext}" | ||
| }, | ||
| "linux": { | ||
| "target": "AppImage", | ||
| "icon": "bin/Assets/icon.png", | ||
| "category": "Office" | ||
| "category": "Office", | ||
| "artifactName": "${productName}-${version}-${arch}.${ext}" | ||
| } |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
artifactName uses ${version}, but the Electron host ElectronHostHook/package.json is still at version 1.0.0 while this manifest sets buildVersion to 1.0.1. Depending on how packaging resolves ${version}, your output filenames may still show 1.0.0. Consider aligning the underlying package/app version used by the builder, or switch the template to a variable that reflects buildVersion if supported by your build tooling.
| <div><span class="bi bi-house-fill" aria-hidden="true"></span>Properties</div> | ||
| </NavLink> | ||
| </div> | ||
| <div class="nav-item px-3"> | ||
| <NavLink class="nav-link" href="propertymanagement/tenants"> | ||
| <div><span class="bi bi-people-fill" aria-hidden="true"></span>Tenants</div> | ||
| </NavLink> | ||
| </div> | ||
| </OrganizationAuthorizeView> | ||
|
|
||
| <AuthorizeView> |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tenants nav entry was removed here. Since the PR description is focused on invoice/notification/AppImage fixes, please confirm this navigation change is intentional and document it in the PR/release notes; otherwise restore the tenant link to avoid a navigation regression.
| </button> | ||
| </div> | ||
| @if (taskResults.ContainsKey(TaskType.ApplyLateFees)) | ||
| @if (taskResults.ContainsKey(TaskType.ProcessOverdueInvoices)) |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Inefficient use of 'ContainsKey' and indexer.
v1.0.1 Hotfix Release
v1.0.1: Invoice processing fixes, AppImage naming, notification improvements, payment auto-apply late fees