AccountingNext/Schaad.Accounting.UI/Components/Pages/Reports/ProfitLossReport.razor.cs
Claudio Schaad 9f11f6490b PR A: correctness fixes and improvement plan
- Add IMPROVEMENT_PLAN.md with phased plan for follow-up work
- Consolidate DI registrations into a single AddAccounting() extension;
  drop the duplicate service registrations and the PdfParsingService
  self-registration
- TrySetYear: capture this.year before overwriting so rollback actually
  restores the previous value
- DummyFxService: check toCurrency (was checking fromCurrency twice)
- TransactionRepository.GetTransaction: return a copy instead of mutating
  the loaded entity, and guard against unknown ids
- ViewService.GetTransactionViewList(accountId): flip the sign on a copy
  rather than mutating the entity returned by the repository
- FileService.GetTransactionListCsv: same treatment; use a local
  signedValue instead of mutating trx.Value
- ProfitLossReport: use ClassIds.Income/Expenses instead of magic 3/4
- CLAUDE.md: correct the ClassIds documentation (1/2/3/4, not
  1000/2000/3000/4000)

SettingsService lifetime is intentionally left as Singleton for now;
making it Scoped requires persisting year/mandator selection across
page reloads first (tracked in the plan).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-02 20:37:03 +02:00

34 lines
No EOL
1.1 KiB
C#

using Microsoft.AspNetCore.Components;
using Schaad.Accounting;
using Schaad.Accounting.Datasets;
using Schaad.Accounting.Interfaces;
namespace Schaad.Accounting.UI.Components.Pages.Reports;
public partial class ProfitLossReport : ComponentBase
{
[Inject]
private IViewService viewService { get; set; } = null!;
[Inject]
private ISettingsService settingsService { get; set; } = null!;
private IReadOnlyList<AccountDataset> accounts = null!;
private decimal profit;
private decimal loss;
private decimal win;
private string header = null!;
private string footer = null!;
protected override Task OnInitializedAsync()
{
accounts = viewService.GetAccountViewList();
profit = Math.Abs(accounts.Where(m => m.Class == ClassIds.Income).Sum(m => m.Balance));
loss = Math.Abs(accounts.Where(m => m.Class == ClassIds.Expenses).Sum(m => m.Balance));
win = profit-loss;
(header, footer) = Report.GetViewDataTitleAndFooter("Erfolgsrechnung", settingsService);
return base.OnInitializedAsync();
}
}