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
};
}
}