diff --git a/src/l0/Flow.Domain.Analysis/Setup/CalendarConfig.cs b/src/l0/Flow.Domain.Analysis/Setup/CalendarConfig.cs deleted file mode 100644 index 1493967b..00000000 --- a/src/l0/Flow.Domain.Analysis/Setup/CalendarConfig.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Flow.Domain.Analysis.Setup; - -public record CalendarConfig( - IReadOnlyList Series, - Vector Dimensions, - int? Depth = null); \ No newline at end of file diff --git a/src/l0/Flow.Domain.Analysis/Tag.cs b/src/l0/Flow.Domain.Analysis/Tag.cs new file mode 100644 index 00000000..d4313078 --- /dev/null +++ b/src/l0/Flow.Domain.Analysis/Tag.cs @@ -0,0 +1,11 @@ +namespace Flow.Domain.Analysis; + +public sealed record Tag(string Name) +{ + public static Tag Invalid = new(string.Empty); + + public override string ToString() + { + return Name; + } +} diff --git a/src/l0/Flow.Domain.Analysis/TaggedTransaction.cs b/src/l0/Flow.Domain.Analysis/TaggedTransaction.cs new file mode 100644 index 00000000..28a2a61d --- /dev/null +++ b/src/l0/Flow.Domain.Analysis/TaggedTransaction.cs @@ -0,0 +1,14 @@ +using Flow.Domain.Transactions; + +namespace Flow.Domain.Analysis; + +public class TaggedTransaction : RecordedTransaction +{ + public TaggedTransaction(RecordedTransaction t, IEnumerable tags) : base(t.Key, t, t.Revision) + { + Overrides = t.Overrides; + Tags = tags.ToList().AsReadOnly(); + } + + public IReadOnlyCollection Tags { get; } +} diff --git a/src/l1/Flow.Application.Analysis/Aggregator.cs b/src/l1/Flow.Application.Analysis/Aggregator.cs index d7ca09dc..47b5993d 100644 --- a/src/l1/Flow.Application.Analysis/Aggregator.cs +++ b/src/l1/Flow.Application.Analysis/Aggregator.cs @@ -1,9 +1,9 @@ using System.Linq.Expressions; using Flow.Application.Analysis.Contract; +using Flow.Application.Analysis.Contract.Setup; using Flow.Application.ExchangeRates.Contract; using Flow.Application.Transactions.Contract; using Flow.Domain.Analysis; -using Flow.Domain.Analysis.Setup; using Flow.Domain.Patterns; using Flow.Domain.Transactions; diff --git a/src/l1/Flow.Application.Analysis/CalendarBuilder.cs b/src/l1/Flow.Application.Analysis/CalendarBuilder.cs index 892d6bad..a163a2e6 100644 --- a/src/l1/Flow.Application.Analysis/CalendarBuilder.cs +++ b/src/l1/Flow.Application.Analysis/CalendarBuilder.cs @@ -1,5 +1,5 @@ -using Flow.Domain.Analysis; -using Flow.Domain.Analysis.Setup; +using Flow.Application.Analysis.Contract.Setup; +using Flow.Domain.Analysis; using Flow.Domain.Transactions; namespace Flow.Application.Analysis; diff --git a/src/l1/Flow.Application.Analysis/Contract/IAggregator.cs b/src/l1/Flow.Application.Analysis/Contract/IAggregator.cs index df2b54b0..0f2010f4 100644 --- a/src/l1/Flow.Application.Analysis/Contract/IAggregator.cs +++ b/src/l1/Flow.Application.Analysis/Contract/IAggregator.cs @@ -1,5 +1,5 @@ -using Flow.Domain.Analysis; -using Flow.Domain.Analysis.Setup; +using Flow.Application.Analysis.Contract.Setup; +using Flow.Domain.Analysis; using Flow.Domain.Transactions; namespace Flow.Application.Analysis.Contract; diff --git a/src/l1/Flow.Application.Analysis/Contract/Setup/CalendarConfig.cs b/src/l1/Flow.Application.Analysis/Contract/Setup/CalendarConfig.cs new file mode 100644 index 00000000..99e46f8c --- /dev/null +++ b/src/l1/Flow.Application.Analysis/Contract/Setup/CalendarConfig.cs @@ -0,0 +1,8 @@ +using Flow.Domain.Analysis; + +namespace Flow.Application.Analysis.Contract.Setup; + +public record CalendarConfig( + IReadOnlyList Series, + Vector Dimensions, + int? Depth = null); diff --git a/src/l0/Flow.Domain.Analysis/Setup/FlowConfig.cs b/src/l1/Flow.Application.Analysis/Contract/Setup/FlowConfig.cs similarity index 54% rename from src/l0/Flow.Domain.Analysis/Setup/FlowConfig.cs rename to src/l1/Flow.Application.Analysis/Contract/Setup/FlowConfig.cs index b45c6dfe..545b5de4 100644 --- a/src/l0/Flow.Domain.Analysis/Setup/FlowConfig.cs +++ b/src/l1/Flow.Application.Analysis/Contract/Setup/FlowConfig.cs @@ -1,11 +1,11 @@ -using Flow.Domain.Transactions; -using System.Linq.Expressions; - -namespace Flow.Domain.Analysis.Setup; - -public record FlowConfig( - DateTime From, - DateTime Till, - string Currency, - Expression>? Criteria = null - ); \ No newline at end of file +using System.Linq.Expressions; +using Flow.Domain.Transactions; + +namespace Flow.Application.Analysis.Contract.Setup; + +public record FlowConfig( + DateTime From, + DateTime Till, + string Currency, + Expression>? Criteria = null + ); diff --git a/src/l0/Flow.Domain.Analysis/Setup/SeriesConfig.cs b/src/l1/Flow.Application.Analysis/Contract/Setup/SeriesConfig.cs similarity index 91% rename from src/l0/Flow.Domain.Analysis/Setup/SeriesConfig.cs rename to src/l1/Flow.Application.Analysis/Contract/Setup/SeriesConfig.cs index d2c007b2..cffa94d7 100644 --- a/src/l0/Flow.Domain.Analysis/Setup/SeriesConfig.cs +++ b/src/l1/Flow.Application.Analysis/Contract/Setup/SeriesConfig.cs @@ -1,50 +1,51 @@ -using Flow.Domain.Transactions; - -namespace Flow.Domain.Analysis.Setup; - -public class SeriesConfig -{ - private static readonly IReadOnlyList EmptySubSeriesList = new List().AsReadOnly(); - - public SeriesConfig(Vector measurement, IReadOnlyList> rules, IReadOnlyList? subSeries = null) - { - Measurement = measurement; - Rules = rules; - - SubSeries = subSeries ?? EmptySubSeriesList; - } - - public Vector Measurement { get; } - - public IReadOnlyList> Rules { get; } - - public IReadOnlyList SubSeries { get; } - - protected bool Equals(SeriesConfig other) - { - return Measurement.Equals(other.Measurement); - } - - public override bool Equals(object? obj) - { - if (obj is null) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; - return Equals((SeriesConfig)obj); - } - - public override int GetHashCode() - { - return Measurement.GetHashCode(); - } - - public static bool operator ==(SeriesConfig? left, SeriesConfig? right) - { - return Equals(left, right); - } - - public static bool operator !=(SeriesConfig? left, SeriesConfig? right) - { - return !Equals(left, right); - } -} \ No newline at end of file +using Flow.Domain.Analysis; +using Flow.Domain.Transactions; + +namespace Flow.Application.Analysis.Contract.Setup; + +public class SeriesConfig +{ + private static readonly IReadOnlyList EmptySubSeriesList = new List().AsReadOnly(); + + public SeriesConfig(Vector measurement, IReadOnlyList> rules, IReadOnlyList? subSeries = null) + { + Measurement = measurement; + Rules = rules; + + SubSeries = subSeries ?? EmptySubSeriesList; + } + + public Vector Measurement { get; } + + public IReadOnlyList> Rules { get; } + + public IReadOnlyList SubSeries { get; } + + protected bool Equals(SeriesConfig other) + { + return Measurement.Equals(other.Measurement); + } + + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((SeriesConfig)obj); + } + + public override int GetHashCode() + { + return Measurement.GetHashCode(); + } + + public static bool operator ==(SeriesConfig? left, SeriesConfig? right) + { + return Equals(left, right); + } + + public static bool operator !=(SeriesConfig? left, SeriesConfig? right) + { + return !Equals(left, right); + } +} diff --git a/src/l1/Flow.Application.Analysis/Flow.Application.Analysis.csproj b/src/l1/Flow.Application.Analysis/Flow.Application.Analysis.csproj index 97e73b35..2e0c9065 100644 --- a/src/l1/Flow.Application.Analysis/Flow.Application.Analysis.csproj +++ b/src/l1/Flow.Application.Analysis/Flow.Application.Analysis.csproj @@ -22,4 +22,8 @@ + + + + diff --git a/src/l1/Flow.Application.Analysis/SeriesBuilder.cs b/src/l1/Flow.Application.Analysis/SeriesBuilder.cs index 00fac94a..25eaf0a9 100644 --- a/src/l1/Flow.Application.Analysis/SeriesBuilder.cs +++ b/src/l1/Flow.Application.Analysis/SeriesBuilder.cs @@ -1,5 +1,5 @@ -using Flow.Domain.Analysis; -using Flow.Domain.Analysis.Setup; +using Flow.Application.Analysis.Contract.Setup; +using Flow.Domain.Analysis; using Flow.Domain.Transactions; using Range = Flow.Domain.Analysis.Range; diff --git a/src/l2/IO/Flow.Infrastructure.IO.CSV/Contract/CSVIO.cs b/src/l2/IO/Flow.Infrastructure.IO.CSV/Contract/CSVIO.cs index 3b77fbee..240b24dc 100644 --- a/src/l2/IO/Flow.Infrastructure.IO.CSV/Contract/CSVIO.cs +++ b/src/l2/IO/Flow.Infrastructure.IO.CSV/Contract/CSVIO.cs @@ -36,6 +36,9 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().AsImplementedInterfaces(); builder.RegisterType().AsImplementedInterfaces(); + builder.RegisterType().AsImplementedInterfaces(); + builder.RegisterType().AsImplementedInterfaces(); + builder.RegisterType().AsImplementedInterfaces(); builder.RegisterType().AsImplementedInterfaces(); builder.RegisterType().AsImplementedInterfaces(); diff --git a/src/l2/IO/Flow.Infrastructure.IO.CSV/Flow.Infrastructure.IO.CSV.csproj b/src/l2/IO/Flow.Infrastructure.IO.CSV/Flow.Infrastructure.IO.CSV.csproj index a68fb8df..866ad496 100644 --- a/src/l2/IO/Flow.Infrastructure.IO.CSV/Flow.Infrastructure.IO.CSV.csproj +++ b/src/l2/IO/Flow.Infrastructure.IO.CSV/Flow.Infrastructure.IO.CSV.csproj @@ -15,6 +15,7 @@ + diff --git a/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionRow.cs b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionRow.cs new file mode 100644 index 00000000..b673f681 --- /dev/null +++ b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionRow.cs @@ -0,0 +1,41 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text; +using Flow.Domain.Analysis; +using Flow.Domain.Transactions; + +namespace Flow.Infrastructure.IO.CSV.Transactions; + +[SuppressMessage("ReSharper", "InconsistentNaming")] +[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] +internal class TaggedTransactionRow : RecordedTransactionRow +{ + public string? TAGS { get; set; } + + public static explicit operator TaggedTransaction(TaggedTransactionRow row) + { + var recorded = (RecordedTransaction)(RecordedTransactionRow)row; + var tags = row.TAGS?.Split(',').Select(t => new Tag(t.Trim())) ?? Enumerable.Empty(); + + return new TaggedTransaction(recorded, tags); + } + + public static explicit operator TaggedTransactionRow(TaggedTransaction t) + { + return new TaggedTransactionRow() + { + TIMESTAMP = t.Timestamp.ToLocalTime(), + AMOUNT = t.Amount, + CURRENCY = t.Currency, + CATEGORY = t.Category, + TITLE = t.Title, + ACCOUNT = t.Account.Name, + BANK = t.Account.Bank, + KEY = t.Key, + CATEGORY_OVERRIDE = t.Overrides?.Category, + TITLE_OVERRIDE = t.Overrides?.Title, + COMMENT = t.Overrides?.Comment, + REVISION = t.Revision, + TAGS = t.Tags.Aggregate(new StringBuilder(), (b, t)=> b.Append(t.Name).Append(", ")).ToString() + }; + } +} diff --git a/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionRowMap.cs b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionRowMap.cs new file mode 100644 index 00000000..6d1f468d --- /dev/null +++ b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionRowMap.cs @@ -0,0 +1,26 @@ +using CsvHelper.Configuration; +using JetBrains.Annotations; + +namespace Flow.Infrastructure.IO.CSV.Transactions; + +[UsedImplicitly] +internal sealed class TaggedTransactionRowMap : ClassMap +{ + public TaggedTransactionRowMap() + { + Map(m => m.KEY).Index(0); + Map(m => m.TIMESTAMP).Index(1); + Map(m => m.AMOUNT).Index(2); + Map(m => m.CURRENCY).Index(3); + Map(m => m.CATEGORY).Index(4); + Map(m => m.TITLE).Index(5); + Map(m => m.ACCOUNT).Index(6); + Map(m => m.BANK).Index(7); + Map(m => m.COMMENT).Index(8); + Map(m => m.CATEGORY_OVERRIDE).Index(9); + Map(m => m.TITLE_OVERRIDE).Index(10); + Map(m => m.REVISION).Index(12); + Map(m => m.TAGS).Index(11); + } + +} \ No newline at end of file diff --git a/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionsReader.cs b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionsReader.cs new file mode 100644 index 00000000..7fa4b4ac --- /dev/null +++ b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionsReader.cs @@ -0,0 +1,11 @@ +using CsvHelper.Configuration; +using Flow.Domain.Analysis; + +namespace Flow.Infrastructure.IO.CSV.Transactions; + +internal class TaggedTransactionsReader : CsvReader +{ + public TaggedTransactionsReader(CsvConfiguration config) : base(config, r => (TaggedTransaction)r) + { + } +} diff --git a/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionsWriter.cs b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionsWriter.cs new file mode 100644 index 00000000..1f7e5a1a --- /dev/null +++ b/src/l2/IO/Flow.Infrastructure.IO.CSV/Transactions/TaggedTransactionsWriter.cs @@ -0,0 +1,11 @@ +using CsvHelper.Configuration; +using Flow.Domain.Analysis; + +namespace Flow.Infrastructure.IO.CSV.Transactions; + +internal class TaggedTransactionsWriter : CsvWriter +{ + public TaggedTransactionsWriter(CsvConfiguration config) : base(config, t => (TaggedTransactionRow)t) + { + } +} \ No newline at end of file diff --git a/src/l2/IO/Flow.Infrastructure.IO.Calendar/Contract/CalendarConfigParsingResult.cs b/src/l2/IO/Flow.Infrastructure.IO.Calendar/Contract/CalendarConfigParsingResult.cs index 75e9fecd..44c37eda 100644 --- a/src/l2/IO/Flow.Infrastructure.IO.Calendar/Contract/CalendarConfigParsingResult.cs +++ b/src/l2/IO/Flow.Infrastructure.IO.Calendar/Contract/CalendarConfigParsingResult.cs @@ -1,4 +1,4 @@ -using Flow.Domain.Analysis.Setup; +using Flow.Application.Analysis.Contract.Setup; namespace Flow.Infrastructure.IO.Calendar.Contract; @@ -25,4 +25,4 @@ public CalendarConfigParsingResult(params string[] errors) public bool Successful => Config != null; public IEnumerable Errors { get; } -} \ No newline at end of file +} diff --git a/src/l2/IO/Flow.Infrastructure.IO.Calendar/Flow.Infrastructure.IO.Calendar.csproj b/src/l2/IO/Flow.Infrastructure.IO.Calendar/Flow.Infrastructure.IO.Calendar.csproj index ad8933ce..1d5a6a5c 100644 --- a/src/l2/IO/Flow.Infrastructure.IO.Calendar/Flow.Infrastructure.IO.Calendar.csproj +++ b/src/l2/IO/Flow.Infrastructure.IO.Calendar/Flow.Infrastructure.IO.Calendar.csproj @@ -12,6 +12,7 @@ + diff --git a/src/l2/IO/Flow.Infrastructure.IO.Calendar/JsonCalendarConfigParser.cs b/src/l2/IO/Flow.Infrastructure.IO.Calendar/JsonCalendarConfigParser.cs index 1ec7391c..31991e07 100644 --- a/src/l2/IO/Flow.Infrastructure.IO.Calendar/JsonCalendarConfigParser.cs +++ b/src/l2/IO/Flow.Infrastructure.IO.Calendar/JsonCalendarConfigParser.cs @@ -1,6 +1,6 @@ using System.Linq.Expressions; +using Flow.Application.Analysis.Contract.Setup; using Flow.Domain.Analysis; -using Flow.Domain.Analysis.Setup; using Flow.Domain.Patterns; using Flow.Domain.Transactions; using Flow.Infrastructure.IO.Calendar.Contract; @@ -133,4 +133,4 @@ private IEnumerable>> GetRules(IEnume } -} \ No newline at end of file +} diff --git a/src/l2/IO/Flow.Infrastructure.IO.JSON/Contract/JSONIO.cs b/src/l2/IO/Flow.Infrastructure.IO.JSON/Contract/JSONIO.cs index 26f1a674..7179e2f6 100644 --- a/src/l2/IO/Flow.Infrastructure.IO.JSON/Contract/JSONIO.cs +++ b/src/l2/IO/Flow.Infrastructure.IO.JSON/Contract/JSONIO.cs @@ -27,6 +27,7 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().AsImplementedInterfaces(); builder.RegisterType().AsImplementedInterfaces(); + builder.RegisterType().AsImplementedInterfaces(); builder.RegisterType().AsImplementedInterfaces(); diff --git a/src/l2/IO/Flow.Infrastructure.IO.JSON/Flow.Infrastructure.IO.JSON.csproj b/src/l2/IO/Flow.Infrastructure.IO.JSON/Flow.Infrastructure.IO.JSON.csproj index 5c936587..b90af235 100644 --- a/src/l2/IO/Flow.Infrastructure.IO.JSON/Flow.Infrastructure.IO.JSON.csproj +++ b/src/l2/IO/Flow.Infrastructure.IO.JSON/Flow.Infrastructure.IO.JSON.csproj @@ -14,6 +14,7 @@ + diff --git a/src/l2/IO/Flow.Infrastructure.IO.JSON/Transactions/JsonTaggedTransaction.cs b/src/l2/IO/Flow.Infrastructure.IO.JSON/Transactions/JsonTaggedTransaction.cs new file mode 100644 index 00000000..e8c75af0 --- /dev/null +++ b/src/l2/IO/Flow.Infrastructure.IO.JSON/Transactions/JsonTaggedTransaction.cs @@ -0,0 +1,51 @@ +using Flow.Domain.Analysis; +using Flow.Domain.Transactions; + +namespace Flow.Infrastructure.IO.JSON.Transactions; + +internal class JsonTaggedTransaction : JsonRecordedTransaction +{ + public string[]? Tags { get; set; } + + public static explicit operator JsonTaggedTransaction(TaggedTransaction t) + { + var result = new JsonTaggedTransaction + { + Account = new JsonAccountInfo + { + Bank = t.Account.Bank, + Name = t.Account.Name + }, + + Amount = t.Amount, + Category = t.Category, + Currency = t.Currency, + Key = t.Key, + Timestamp = t.Timestamp, + Title = t.Title + }; + + if (t.Overrides != null) + { + result.Overrides = new JsonOverride + { + Category = t.Overrides.Category, + Comment = t.Overrides.Comment, + Title = t.Overrides.Title + }; + } + + result.Tags = t.Tags.Select(tg => tg.Name).ToArray(); + + return result; + } + + public static explicit operator TaggedTransaction(JsonTaggedTransaction js) + { + var transaction = (RecordedTransaction)(JsonRecordedTransaction)js; + var tags = (js.Tags ?? Enumerable.Empty()).Select(n => new Tag(n)); + var result = new TaggedTransaction(transaction, tags); + + return result; + } +} diff --git a/src/l2/IO/Flow.Infrastructure.IO.JSON/Transactions/TaggedTransactionsReader.cs b/src/l2/IO/Flow.Infrastructure.IO.JSON/Transactions/TaggedTransactionsReader.cs new file mode 100644 index 00000000..f1ae9b31 --- /dev/null +++ b/src/l2/IO/Flow.Infrastructure.IO.JSON/Transactions/TaggedTransactionsReader.cs @@ -0,0 +1,11 @@ +using Flow.Domain.Analysis; +using Newtonsoft.Json; + +namespace Flow.Infrastructure.IO.JSON.Transactions; + +internal class TaggedTransactionsReader : JsonReader +{ + public TaggedTransactionsReader(JsonSerializerSettings? settings) : base(settings, j => (TaggedTransaction)j) + { + } +} \ No newline at end of file diff --git a/src/l3/CommandLine/Flow.Host.Bundling.Cli/InstallationDebugger.cs b/src/l3/CommandLine/Flow.Host.Bundling.Cli/InstallationDebugger.cs index 84fda9f4..dc14e70d 100644 --- a/src/l3/CommandLine/Flow.Host.Bundling.Cli/InstallationDebugger.cs +++ b/src/l3/CommandLine/Flow.Host.Bundling.Cli/InstallationDebugger.cs @@ -2,6 +2,7 @@ using System.Reflection; using Autofac; using Flow.Application.Transactions.Contract; +using Flow.Domain.Analysis; using Flow.Domain.ExchangeRates; using Flow.Domain.Transactions; using Flow.Domain.Transactions.Transfers; @@ -78,7 +79,7 @@ public async Task PrintoutDebugInfo() private static readonly Type[] SupportedTypes = { - typeof(Transaction), typeof(IncomingTransaction), typeof(RecordedTransaction), typeof(RejectedTransaction), + typeof(Transaction), typeof(IncomingTransaction), typeof(RecordedTransaction), typeof(TaggedTransaction), typeof(RejectedTransaction), typeof(TransferKey), typeof(Transfer), typeof(RejectedTransferKey), typeof(ExchangeRate), typeof(RejectedRate) }; diff --git a/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildCalendarCommand.cs b/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildCalendarCommand.cs index 1069662b..d3596933 100644 --- a/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildCalendarCommand.cs +++ b/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildCalendarCommand.cs @@ -1,5 +1,5 @@ using Flow.Application.Analysis.Contract; -using Flow.Domain.Analysis.Setup; +using Flow.Application.Analysis.Contract.Setup; using Flow.Domain.Common.Collections; using Flow.Domain.Transactions; using Flow.Hosts.Common.Commands; diff --git a/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildFlowCommand.cs b/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildFlowCommand.cs index 8c754b2c..eb12c397 100644 --- a/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildFlowCommand.cs +++ b/src/l3/CommandLine/Flow.Hosts.Analysis.Cli/Commands/BuildFlowCommand.cs @@ -1,5 +1,5 @@ using Flow.Application.Analysis.Contract; -using Flow.Domain.Analysis.Setup; +using Flow.Application.Analysis.Contract.Setup; using Flow.Domain.Common.Collections; using Flow.Domain.Transactions; using Flow.Hosts.Common.Commands;