using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Xml.Serialization; namespace Schaad.Accounting.Models { public class Transaction { public string Id { get; set; } public string BankTransactionId { get; set; } /// /// Needed for booking rule /// public string BankTransactionText { get; set; } public string RelatedParty { get; set; } [Display(Name = "Valuta")] [Required] public DateTime ValueDate { get; set; } [Display(Name = "Buchung")] public DateTime BookingDate { get; set; } [Display(Name = "Buchungstext")] [Required] public string Text { get; set; } [Display(Name = "Betrag")] [Required] public decimal Value { get; set; } [Display(Name = "Habenkonto")] [Required] public string OriginAccountId { get; set; } [Display(Name = "Sollkonto")] [Required] public string TargetAccountId { get; set; } [Display(Name = "Währungskurs")] public decimal? FxRate { get; set; } [XmlIgnore] public bool ReadOnly {get; set;} public Transaction() { } public Transaction(BankTransaction bankTransaction, List accounts) { BankTransactionId = bankTransaction.Id; BankTransactionText = bankTransaction.Text; Value = bankTransaction.Value; ValueDate = bankTransaction.ValueDate; BookingDate = bankTransaction.BookingDate; // Depending on positiv or negative value, set the account var bankAccount = accounts.FirstOrDefault(a => a.BankAccountNumber == bankTransaction.BankAccountNumber); if (Value >= 0) { TargetAccountId = bankAccount.Id; RelatedParty = bankTransaction.Debtor; } else { OriginAccountId = bankAccount.Id; RelatedParty = bankTransaction.Creditor; } } /// /// Returns a shallow independent copy — used to hand out defensive copies /// (e.g. from repository reads) without exposing the caller to later mutation. /// public Transaction Clone() => new() { Id = Id, BankTransactionId = BankTransactionId, BankTransactionText = BankTransactionText, RelatedParty = RelatedParty, OriginAccountId = OriginAccountId, TargetAccountId = TargetAccountId, Text = Text, Value = Value, ValueDate = ValueDate, BookingDate = BookingDate, FxRate = FxRate }; } }