Replace the hand-rolled model.Copy(target) pattern in every SaveXxx with FindIndex -> in-place replace (or Add on new). Move the two hidden defaults out of the deleted Copy bodies: Currency = "CHF" default now lives in AccountRepository.SaveAccount; BookingDate = ValueDate default now lives in TransactionRepository.SaveTransaction. Delete Copy from Account, BookingRule, BookingText, SubClass, and SplitPredefinition. Keep Transaction.Clone() (renamed from Copy, and now includes RelatedParty) for the defensive copy in GetTransaction and ViewService.WithDisplaySign. Fixes a pre-existing bug where Transaction.Copy silently dropped RelatedParty on every update save. 42 tests total, all passing. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
76 lines
No EOL
2.3 KiB
C#
76 lines
No EOL
2.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Microsoft.Extensions.Logging;
|
|
using Schaad.Accounting.Interfaces;
|
|
using Schaad.Accounting.Models;
|
|
|
|
namespace Schaad.Accounting.Repositories
|
|
{
|
|
public class SubclassRepository : BaseRepository, ISubclassRepository
|
|
{
|
|
private readonly Dictionary<int, string> classes = new Dictionary<int, string>();
|
|
private readonly string SUBCLASSES = "SubClasses.xml";
|
|
|
|
public SubclassRepository(ISettingsService settingsService, RepositoryCache cache, ILogger<SubclassRepository> logger)
|
|
: base(settingsService, cache, logger)
|
|
{
|
|
EnsureFileExists(SUBCLASSES);
|
|
|
|
classes.Add(ClassIds.Activa, "Aktiven");
|
|
classes.Add(ClassIds.Passiva, "Passiven");
|
|
classes.Add(ClassIds.Income, "Einnahmen");
|
|
classes.Add(ClassIds.Expenses, "Ausgaben");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Load subclasses
|
|
/// </summary>
|
|
public List<SubClass> GetSubClassList() => LoadList<SubClass>(SUBCLASSES);
|
|
|
|
/// <summary>
|
|
/// Save a subclass (insert/update)
|
|
/// </summary>
|
|
public void SaveSubClass(SubClass subClass)
|
|
{
|
|
var subclasses = GetSubClassList();
|
|
var idx = subclasses.FindIndex(s => s.Id == subClass.Id);
|
|
if (idx >= 0)
|
|
{
|
|
subclasses[idx] = subClass;
|
|
}
|
|
else
|
|
{
|
|
subClass.Id = Guid.NewGuid().ToString();
|
|
subclasses.Add(subClass);
|
|
}
|
|
Save(subclasses, SUBCLASSES);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get subclass
|
|
/// </summary>
|
|
public SubClass GetSubClass(string id)
|
|
{
|
|
var subclasses = GetSubClassList();
|
|
return subclasses.FirstOrDefault(t => t.Id == id);
|
|
}
|
|
|
|
public void DeleteSubClass(string id)
|
|
{
|
|
var subclasses = GetSubClassList();
|
|
subclasses.RemoveAll(t => t.Id == id);
|
|
Save(subclasses, SUBCLASSES);
|
|
}
|
|
|
|
public Dictionary<int, string> GetClasses()
|
|
{
|
|
return classes;
|
|
}
|
|
|
|
public string GetClass(int classId)
|
|
{
|
|
return classes[classId];
|
|
}
|
|
}
|
|
} |