Skip to content

Conversation

@xnodeoncode
Copy link
Owner

v1.0.1 Hotfix Release
v1.0.1: Invoice processing fixes, AppImage naming, notification improvements, payment auto-apply late fees

@xnodeoncode xnodeoncode merged commit 42282e5 into main Jan 29, 2026
2 checks passed
Copy link

Copilot AI left a 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;
Copy link

Copilot AI Jan 29, 2026

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.

Suggested change
invoice.Amount += lateFee;

Copilot uses AI. Check for mistakes.
Comment on lines +500 to +507
// 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;
Copy link

Copilot AI Jan 29, 2026

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.

Copilot uses AI. Check for mistakes.
Comment on lines +471 to +476
// If invoice just became overdue, check if late fee should be applied
if (statusChangedToOverdue &&
(invoice.LateFeeApplied == null || !invoice.LateFeeApplied.Value))
{
await ApplyLateFeeIfEligibleAsync(invoice, organizationId);
}
Copy link

Copilot AI Jan 29, 2026

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.

Copilot uses AI. Check for mistakes.
Comment on lines +300 to +316
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++;
}
Copy link

Copilot AI Jan 29, 2026

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).

Copilot uses AI. Check for mistakes.
Comment on lines 14 to 17
"ApplicationSettings": {
"AppName": "Aquiis",
"Version": "1.0.0",
"Version": "1.0.1",
"Author": "CIS Guru",
Copy link

Copilot AI Jan 29, 2026

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.

Copilot uses AI. Check for mistakes.
Comment on lines +520 to +530
// 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}";

Copy link

Copilot AI Jan 29, 2026

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.

Copilot uses AI. Check for mistakes.
Comment on lines +564 to +578
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++;
}
Copy link

Copilot AI Jan 29, 2026

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).

Copilot uses AI. Check for mistakes.
Comment on lines 47 to 58
"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}"
}
Copy link

Copilot AI Jan 29, 2026

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.

Copilot uses AI. Check for mistakes.
Comment on lines 76 to 81
<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>
Copy link

Copilot AI Jan 29, 2026

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.

Copilot uses AI. Check for mistakes.
</button>
</div>
@if (taskResults.ContainsKey(TaskType.ApplyLateFees))
@if (taskResults.ContainsKey(TaskType.ProcessOverdueInvoices))
Copy link

Copilot AI Jan 29, 2026

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.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants