@ -28,15 +28,18 @@ public class TransactionService : ITransactionService
private DataContext _context ;
private readonly IMapper _mapper ;
private readonly ILogger < TransactionService > _logger ;
private readonly IAutoclassService _autoclassService ;
public TransactionService (
DataContext context ,
IMapper mapper ,
ILogger < TransactionService > logger )
ILogger < TransactionService > logger ,
IAutoclassService autoclassService )
{
_context = context ;
_mapper = mapper ;
_logger = logger ;
_autoclassService = autoclassService ;
}
public IEnumerable < Transaction > GetAll ( )
@ -125,15 +128,18 @@ public class TransactionService : ITransactionService
_logger . LogInformation ( $"Aborted adding transaction '{transaction.Description}'." ) ;
return null ;
}
// At this point transaction itself is valid
transaction = this . ApplyAutoclassRules ( transaction ) ;
// At this point transaction itself is valid
_context . Transactions . Add ( transaction ) ;
_context . SaveChanges ( ) ;
_logger . LogInformation ( "New transaction successfully created." ) ;
if ( ! model . TriggerAutoclassRules . HasValue | | model . TriggerAutoclassRules . Value )
_autoclassService . ApplyRulesForTransaction ( transaction . Id ) ;
//transaction = this.ApplyAutoclassRules(transaction);
this . UpdateAccountsAndEnvelopes ( transaction ) ;
return transaction ;
@ -198,15 +204,16 @@ public class TransactionService : ITransactionService
transaction . Tags = model . Tags ;
this . ValidateTransaction ( transaction ) ;
if ( model . TriggerAutoclassRules . HasValue & & model . TriggerAutoclassRules = = true )
transaction = this . ApplyAutoclassRules ( transaction ) ;
_context . Transactions . Update ( transaction ) ;
_context . SaveChanges ( ) ;
_logger . LogInformation ( $"Transaction '{id}' successfully updated." ) ;
if ( model . TriggerAutoclassRules . HasValue & & model . TriggerAutoclassRules = = true )
_autoclassService . ApplyRulesForTransaction ( transaction . Id ) ;
//transaction = this.ApplyAutoclassRules(transaction);
this . UpdateAccountsAndEnvelopes ( transaction ) ;
}
@ -302,112 +309,6 @@ public class TransactionService : ITransactionService
return true ;
}
private Transaction ApplyAutoclassRules ( Transaction transaction )
{
if ( transaction . DebitAccount ! = null )
{
IEnumerable < AutoclassRule > debitAccountRules = _context . AutoclassRules
. Include ( r = > r . Account )
. Where ( r = > r . Account . Id = = transaction . DebitAccount . Id )
. Include ( r = > r . Expressions )
. Include ( r = > r . Changes )
. ToList ( ) ;
_logger . LogInformation ( $"Processing Autoclass Rules from DebitAccount '{transaction.DebitAccount.Id}' for new transaction '{transaction.Description}'." ) ;
foreach ( AutoclassRule rule in debitAccountRules )
transaction = ProcessRule ( transaction , rule ) ;
_logger . LogInformation ( $"...DebitAccount '{transaction.DebitAccount.Id}' rule processing complete." ) ;
}
if ( transaction . CreditAccount ! = null )
{
IEnumerable < AutoclassRule > creditAccountRules = _context . AutoclassRules
. Include ( r = > r . Account )
. Where ( r = > r . Account . Id = = transaction . CreditAccount . Id )
. Include ( r = > r . Expressions )
. Include ( r = > r . Changes )
. ToList ( ) ;
_logger . LogInformation ( $"Processing Autoclass Rules from CreditAccount '{transaction.CreditAccount.Id}' for new transaction '{transaction.Description}'." ) ;
foreach ( AutoclassRule rule in creditAccountRules )
transaction = ProcessRule ( transaction , rule ) ;
_logger . LogInformation ( $"...CreditAccount '{transaction.CreditAccount.Id}' rule processing complete." ) ;
}
return transaction ;
}
private Transaction ProcessRule ( Transaction transaction , AutoclassRule rule )
{
bool triggerRule = true ;
foreach ( AutoclassExpression exp in rule . Expressions )
{
triggerRule & = exp . Evaluate ( transaction ) ;
}
if ( triggerRule )
{
_logger . LogInformation ( $"Rule '{rule.Name}' was triggered." ) ;
foreach ( AutoclassChange chg in rule . Changes )
{
_logger . LogInformation ( $"\tField {chg.Field} will be set to '{chg.Value}'." ) ;
switch ( chg . Field )
{
case AutoclassTransactionField . DATE :
transaction . Date = Convert . ToDateTime ( chg . Value ) ;
break ;
case AutoclassTransactionField . EXTERNAL_ID :
transaction . ExternalId = chg . Value ;
break ;
case AutoclassTransactionField . DESCRIPTION :
transaction . Description = chg . Value ;
break ;
case AutoclassTransactionField . AMOUNT :
transaction . Amount = Convert . ToDecimal ( chg . Value ) ;
break ;
case AutoclassTransactionField . IS_PENDING :
transaction . IsPending = Convert . ToBoolean ( chg . Value ) ;
break ;
case AutoclassTransactionField . DEBIT_ACCOUNT :
transaction . DebitAccount = _context . Accounts . Find ( Convert . ToInt32 ( chg . Value ) ) ;
break ;
case AutoclassTransactionField . CREDIT_ACCOUNT :
transaction . CreditAccount = _context . Accounts . Find ( Convert . ToInt32 ( chg . Value ) ) ;
break ;
case AutoclassTransactionField . DEBIT_ENVELOPE :
transaction . DebitEnvelope = _context . Envelopes . Find ( Convert . ToInt32 ( chg . Value ) ) ;
break ;
case AutoclassTransactionField . CREDIT_ENVELOPE :
transaction . CreditEnvelope = _context . Envelopes . Find ( Convert . ToInt32 ( chg . Value ) ) ;
break ;
case AutoclassTransactionField . CURRENCY_TYPE :
transaction . CurrencyType = _context . CurrencyTypes . Find ( Convert . ToInt32 ( chg . Value ) ) ;
break ;
case AutoclassTransactionField . TAGS :
transaction = AddTag ( transaction , chg . Value ) ;
break ;
}
}
}
return transaction ;
}
private void UpdateAccountsAndEnvelopes ( Transaction transaction , bool invert = false )
{
_logger . LogInformation ( $"Updating accounts and envelopes affected by transaction '{transaction.Id}'." ) ;
@ -428,36 +329,6 @@ public class TransactionService : ITransactionService
_context . AddAmountToEnvelope ( transaction . CreditEnvelope . Id , creditAmount ) ;
}
public bool HasTag ( Transaction transaction , string tag )
{
return transaction . Tags = = null ? false : transaction . Tags . Any ( t = > t . ToUpper ( ) = = tag . ToUpper ( ) ) ;
}
private Transaction AddTag ( Transaction transaction , string tag )
{
if ( transaction . Tags = = null )
transaction . Tags = new List < string > ( ) { tag } ;
else if ( transaction . Tags . Any ( t = > t . ToUpper ( ) = = tag . ToUpper ( ) ) = = false )
transaction . Tags . Add ( tag ) ;
return transaction ;
}
private Transaction RemoveTag ( Transaction transaction , string tag )
{
if ( transaction . Tags ! = null )
{
string? actualTag = transaction . Tags
. Where ( t = > t . ToUpper ( ) = = tag . ToUpper ( ) )
. FirstOrDefault ( ) ;
if ( actualTag ! = null )
transaction . Tags . Remove ( actualTag ) ;
}
return transaction ;
}
public void Delete ( int id )
{
var transaction = getTransaction ( id ) ;