diff --git a/FileCreator.cs b/FileCreator.cs new file mode 100644 index 0000000..9224b0c --- /dev/null +++ b/FileCreator.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SolutionItems +{ + public class FileCreator + { + + } +} diff --git a/LoadStockDbFromTrans/DbConnections/SqliteDbConnectionFactory.cs b/LoadStockDbFromTrans/DbConnections/SqliteDbConnectionFactory.cs new file mode 100644 index 0000000..2c98609 --- /dev/null +++ b/LoadStockDbFromTrans/DbConnections/SqliteDbConnectionFactory.cs @@ -0,0 +1,25 @@ +using Microsoft.Data.Sqlite; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LoadStockDbFromTrans.DbConnections +{ + public class SqliteDbConnectionFactory + { + private string? _connectionString; + + public SqliteDbConnectionFactory(string? connectionString) + { + _connectionString = connectionString; + } + + public IDbConnection Connect() + { + return new SqliteConnection(_connectionString); + } + } +} diff --git a/LoadStockDbFromTrans/DbInitializers/ISqliteDbInitializer.cs b/LoadStockDbFromTrans/DbInitializers/ISqliteDbInitializer.cs new file mode 100644 index 0000000..2781a5a --- /dev/null +++ b/LoadStockDbFromTrans/DbInitializers/ISqliteDbInitializer.cs @@ -0,0 +1,7 @@ +namespace LoadStockDbFromTrans.DbInitializers +{ + public interface ISqliteDbInitializer + { + void Initialize(); + } +} \ No newline at end of file diff --git a/LoadStockDbFromTrans/DbInitializers/SqliteDbInitializer.cs b/LoadStockDbFromTrans/DbInitializers/SqliteDbInitializer.cs new file mode 100644 index 0000000..16d5700 --- /dev/null +++ b/LoadStockDbFromTrans/DbInitializers/SqliteDbInitializer.cs @@ -0,0 +1,44 @@ +using Dapper; +using LoadStockDbFromTrans.DbConnections; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data; + +namespace LoadStockDbFromTrans.DbInitializers +{ + + public class SqliteDbInitializer : ISqliteDbInitializer + { + private const string INIT_TABLE = @" + CREATE TABLE [NewBackupRegings] ( + [Id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL + , [BackedUp] text NOT NULL + , [DbName] + text NULL + , [BackupDbName] text NULL + , [BackupPath] text NULL + )"; + + private readonly SqliteDbConnectionFactory _sqliteDbConnectionFactory; + private readonly ILogger _log; + + public SqliteDbInitializer(SqliteDbConnectionFactory sqliteDbConnectionFactory, ILogger log) + { + _sqliteDbConnectionFactory = sqliteDbConnectionFactory; + _log = log; + } + + public void Initialize() + { + _log.LogInformation(INIT_TABLE); + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + database.Execute(INIT_TABLE); + } + } + } +} diff --git a/LoadStockDbFromTrans/LoadStockDbFromTrans.csproj b/LoadStockDbFromTrans/LoadStockDbFromTrans.csproj new file mode 100644 index 0000000..f3f739e --- /dev/null +++ b/LoadStockDbFromTrans/LoadStockDbFromTrans.csproj @@ -0,0 +1,30 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + + + + + + + + Always + + + + diff --git a/LoadStockDbFromTrans/Program.cs b/LoadStockDbFromTrans/Program.cs new file mode 100644 index 0000000..351617f --- /dev/null +++ b/LoadStockDbFromTrans/Program.cs @@ -0,0 +1,71 @@ +// See https://aka.ms/new-console-template for more information +// +using LoadStockDbFromTrans.DbConnections; +using LoadStockDbFromTrans.DbInitializers; +using LoadStockDbFromTrans.models; +using LoadStockDbFromTrans.Runners; +using LoadStockDbFromTrans.StocksProviders; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; +using Serilog; + +var builder = new ConfigurationBuilder(); +BuildConfig(builder); + +Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Build()) + .Enrich.FromLogContext() + .WriteTo.Console() + .CreateLogger(); + +var host = Host.CreateDefaultBuilder() + .ConfigureServices((hostContext, services) => + { + services.AddSingleton(); + string connectionString = hostContext.Configuration.GetConnectionString("Default"); + services.AddSingleton(new SqliteDbConnectionFactory(connectionString)); + services.AddSingleton(); + services.AddSingleton(); + }) + .UseSerilog() + .Build(); + +var svc = ActivatorUtilities.CreateInstance(host.Services); +svc.FetchJsonData(); +//await svc.StockNameTable(); +//foreach (var x in svc.NameConverter) +//{ +// Console.WriteLine(x.ToString()); +//} + +//var sdi = host.Services.GetRequiredService(); +//sdi.Initialize(); + +//var dsp = host.Services.GetRequiredService(); +//var recs = await dsp.GetAllStocks(); + +//foreach (var stock in recs) +//{ +// Log.Logger.Information($"{stock.Id} " + +// $"{stock.StockId} " + +// $"{stock.StockExtId} " + +// $"{stock.ActValue} " + +// $"{stock.BuyValue} " + +// $"{stock.BuyDate} " + +// $"{stock.SoldDate} " + +// $"{stock.SoldValue} " + +// $"{stock.ActAmount} " + +// $"{stock.Comment} "); +//} + +static void BuildConfig(IConfigurationBuilder builder) +{ + builder.SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddJsonFile($"appsettings{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true) + .AddEnvironmentVariables(); +} + + diff --git a/LoadStockDbFromTrans/Runners/FileToJson.cs b/LoadStockDbFromTrans/Runners/FileToJson.cs new file mode 100644 index 0000000..d0162a8 --- /dev/null +++ b/LoadStockDbFromTrans/Runners/FileToJson.cs @@ -0,0 +1,215 @@ +using LoadStockDbFromTrans.models; +using LoadStockDbFromTrans.StocksProviders; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LoadStockDbFromTrans.Runners; + + +public class FileToJson : IFileToJson +{ + private readonly ILogger _log; + private readonly IConfiguration _config; + private readonly IDapperStocksProvider _dapperStocksProvider; + + public Dictionary NameConverter { get; set; } = new Dictionary(); + public FileToJson(ILogger log, IConfiguration config, IDapperStocksProvider dapperStocksProvider) + { + _log = log; + _config = config; + _dapperStocksProvider = dapperStocksProvider; + } + public async Task> FetchJsonData() + { + _log.LogInformation("Starting with reading from Json!"); + + Console.WriteLine("FileName ?"); + var fileName = Console.ReadLine(); + if (fileName == "xx") fileName = _config.GetValue("StdFileName"); //"StockData2022-08-29.txt"; + _log.LogInformation("fileName = {fname}", fileName); + List recList = new List(); + recList = JsonConvert.DeserializeObject>(File.ReadAllText($@"C:\tommycsharp\Source\Consoles\ReadSBAktieTransApp\ReadSBAktieTrans\bin\Debug\net6.0\DataFiles\{fileName}")); + + _log.LogInformation("InLäsning klar!"); + + Console.WriteLine("Create Name Converter ?"); + var answ = Console.ReadLine(); + + if (answ == "Y" || answ == "J") + { + await PrepareNameConverter(recList); + } + await UpDateNameConverter(); + + + Console.WriteLine("Show data ?"); + answ = Console.ReadLine(); + + if (answ == "ok") + { + foreach (var rec in recList) + { + Console.WriteLine($"Bokföringsdag {rec.Bokföringsdag} Affärsdag {rec.Affärsdag} Likviddag {rec.Likviddag}"); + } + } + + var skrivna = 0; + foreach (var rec in recList) + { + if (rec.Transaktionstyp == "KÖPT") + { + var stockmember = new StockMember(); + stockmember.StockId = NameConverter[rec.Beskrivning.Trim()]; + stockmember.StockExtId = NameConverter[rec.Beskrivning.Trim()]; + stockmember.BuyValue = rec.Kurs; + stockmember.BuyDate = rec.Affärsdag; + stockmember.ActValue = rec.Kurs; + stockmember.ActDate = rec.Affärsdag; + stockmember.ActAmount = rec.Antal; + stockmember.SoldValue = 0; + stockmember.SoldDate = null; + stockmember.Comment = "from trans"; + stockmember.PostAmount = rec.Antal; + stockmember.SoldStockPrice = 0; + + _dapperStocksProvider.AddStock(stockmember); + skrivna++; + } + } + + _log.LogInformation("Köpta klart {skrivna} st skrivna", skrivna); + skrivna = 0; + foreach (var rec in recList) + { + if (rec.Transaktionstyp == "SÅLT") + { + UpDateWithSold(rec); + + skrivna++; + } + } + _log.LogInformation($"Sålda klart {skrivna} st skrivna"); + + + + return recList; + + + } + + private async Task PrepareNameConverter(List recList) + { + var tempListNew = new HashSet(); + await _dapperStocksProvider.CleanStockNames(); + + foreach (var rec in recList) + { + if (rec.Transaktionstyp == "KÖPT") + { + try + { + tempListNew.Add(rec.Beskrivning); + } + catch (Exception) + { + _log.LogInformation($"Dublett : {rec.Beskrivning}"); + } + } + } + + var templist = await _dapperStocksProvider.GetStockNames(); + foreach (var webName in templist) + { + _log.LogInformation($"Upplägg : {webName}, --"); + await _dapperStocksProvider.AddWebStockNames(webName); + } + + foreach (var newName in tempListNew) + { + var founds = templist.Where(t => t.StartsWith(newName.Substring(0, 3))).ToList(); + if (founds.Any()) + { + if (founds.Count > 1) + { + var choseNr = 0; + Console.WriteLine($"{newName} skall passas ihop med en av nedan nr:"); + Console.WriteLine(); + foreach (var found in founds) + { + Console.WriteLine($"välj {choseNr++} for {found}"); + } + Console.WriteLine(); + Console.Write("Chose a number: "); + var valNumber = Console.ReadLine(); + await _dapperStocksProvider.UpdateStockName(newName, founds[int.Parse(valNumber)]); + } + else + { + await _dapperStocksProvider.UpdateStockName(newName, founds[0]); + } + } + else + { + Console.WriteLine($"{newName} skall passas ihop med ?"); + Console.WriteLine(); + Console.Write("Write the correct name: "); + var valNumber = Console.ReadLine(); + await _dapperStocksProvider.UpdateStockName(newName, valNumber); + } + } + + } + + private async Task UpDateNameConverter() + { + var stockNameList = await _dapperStocksProvider.GetStockNameTable(); + NameConverter.Clear(); + foreach (var stockname in stockNameList) + { + NameConverter.Add(stockname.StockNameBank, stockname.StockNameWeb); + } + } + + public async void UpDateWithSold(FileModel rec) + { + var members = await _dapperStocksProvider.GetStocksByStockId(NameConverter[rec.Beskrivning], rec.Affärsdag); + var remainingInit = rec.Antal; + var remaining = rec.Antal; + foreach (var member in members) + { + if (remaining >= member.ActAmount) + { + remaining -= (int)member.ActAmount; + member.SoldValue = ((int)member.ActAmount * rec.Belopp) / remainingInit; + member.ActAmount = 0; + } + else + { + member.ActAmount -= remaining; + member.SoldValue = (remaining * rec.Belopp) / remainingInit; + remaining = 0; + } + member.SoldDate = rec.Affärsdag; + member.Comment += ",Sold"; + member.SoldStockPrice = rec.Kurs; + + await _dapperStocksProvider.UpdateStock(member); + _log.LogInformation($"Sålda {member.Id} st ändrad"); + + if (remaining <= 0) + { + break; + } + } + } + + + +} diff --git a/LoadStockDbFromTrans/Runners/IFileToJson.cs b/LoadStockDbFromTrans/Runners/IFileToJson.cs new file mode 100644 index 0000000..c664500 --- /dev/null +++ b/LoadStockDbFromTrans/Runners/IFileToJson.cs @@ -0,0 +1,12 @@ +using LoadStockDbFromTrans.models; + +namespace LoadStockDbFromTrans.Runners +{ + public interface IFileToJson + { + Dictionary NameConverter { get; set; } + + Task> FetchJsonData(); + void UpDateWithSold(FileModel rec); + } +} \ No newline at end of file diff --git a/LoadStockDbFromTrans/StocksProviders/DapperStocksProvider.cs b/LoadStockDbFromTrans/StocksProviders/DapperStocksProvider.cs new file mode 100644 index 0000000..6ca48a3 --- /dev/null +++ b/LoadStockDbFromTrans/StocksProviders/DapperStocksProvider.cs @@ -0,0 +1,239 @@ +using Dapper; +using LoadStockDbFromTrans.DbConnections; +using LoadStockDbFromTrans.models; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LoadStockDbFromTrans.StocksProviders +{ + public class DapperStocksProvider : IDapperStocksProvider + { + private const string GET_ALL_STOCKS_SQL = @" + SELECT * + FROM Stocks"; + + private const string ADD_NEW_STOCKMEMBER = @" + INSERT INTO STOCKS ( + StockId, + StockExtId, + BuyValue, + BuyDate, + ActValue, + ActDate, + ActAmount, + SoldValue, + SoldDate, + Comment, + PostAmount, + SoldStockPrice + ) + VALUES ( + @StockId, + @StockExtId, + @BuyValue, + @BuyDate, + @ActValue, + @ActDate, + @ActAmount, + @SoldValue, + @SoldDate, + @Comment, + @PostAmount, + @SoldStockPrice + )"; + + private const string UPDATE_STOCKMEMBER = @" + UPDATE Stocks + SET StockId = @StockId, + StockExtId = @StockExtId, + BuyValue = @BuyValue, + BuyDate = @BuyDate, + ActValue = @ActValue, + ActDate = @ActDate, + ActAmount = @ActAmount, + SoldValue = @SoldValue, + SoldDate = @SoldDate, + Comment = @Comment, + PostAmount = @PostAmount, + SoldStockPrice = @SoldStockPrice + WHERE Id = @Id"; + + private const string GET_STOCKS_BY_STOCKID = @" + SELECT * + FROM Stocks + WHERE StockId = @StockId + AND BuyDate <= @BuyDate + ORDER BY BuyDate DESC"; + + private const string ADD_TO_STOCKNAME = @" + Insert into StockNames (StockNameWeb, StockNameBank) + values ( @StockId, @StockId)"; + + private const string REMOVE_STOCKNAMES = @" + Delete + from StockNames"; + + private const string GET_WEB_STOCKNAMES = @" + select distinct StockId + from StocksOld"; + + private const string UPDATE_STOCKNAME_BANK = @" + UPDATE StockNames + SET StockNameBank = @StockNameBank + WHERE StockNameWeb = @StockNameWeb"; + + private const string GET_WEB_STOCKNAM_FULL = @" + SELECT * + FROM StockNames"; + + private readonly SqliteDbConnectionFactory _sqliteDbConnectionFactory; + private readonly ILogger _log; + + public DapperStocksProvider(SqliteDbConnectionFactory sqliteDbConnectionFactory, ILogger log) + { + _sqliteDbConnectionFactory = sqliteDbConnectionFactory; + _log = log; + } + public async Task AddStock(StockMember stockMember) + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + _log.LogInformation("ADD_NEW_STOCKMEMBER"); + + object parameters = new + { + StockId = stockMember.StockId, + StockExtId = stockMember.StockExtId, + BuyValue = stockMember.BuyValue, + BuyDate = stockMember.BuyDate, + ActValue = stockMember.ActValue, + ActDate = stockMember.ActDate, + ActAmount = stockMember.ActAmount, + SoldValue = stockMember.SoldValue, + SoldDate = stockMember.SoldDate, + Comment = stockMember.Comment, + PostAmount = stockMember.PostAmount, + SoldStockPrice = stockMember.SoldStockPrice + }; + + await database.ExecuteAsync(ADD_NEW_STOCKMEMBER, parameters); + } + } + public async Task AddWebStockNames(string stockName) + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + _log.LogInformation("ADD_TO_STOCKNAME"); + object parameters = new + { + StockId = stockName + }; + await database.ExecuteAsync(ADD_TO_STOCKNAME, parameters); + } + } + public async Task CleanStockNames() + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + _log.LogInformation("REMOVE_NEW_STOCKNAME"); + await database.ExecuteAsync(REMOVE_STOCKNAMES); + } + } + public async Task> GetAllStocks() + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + _log.LogInformation(GET_ALL_STOCKS_SQL); + IEnumerable stockMembers = await database.QueryAsync(GET_ALL_STOCKS_SQL); + return stockMembers.ToList(); + } + } + public async Task> GetStockNames() + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + _log.LogInformation("GET_WEB_STOCKNAMES"); + + IEnumerable stockNames = await database.QueryAsync(GET_WEB_STOCKNAMES); + return stockNames.ToList(); + } + } + public async Task> GetStocksByStockId(string stockId, DateTime Affärsdag) + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + // Obs ta hänsyn till köpdatum + _log.LogInformation("GET_STOCKS_BY_STOCKID"); + + object parameters = new + { + StockId = stockId, + BuyDate = Affärsdag + }; + + IEnumerable stockMembers = await database.QueryAsync(GET_STOCKS_BY_STOCKID, parameters); + return stockMembers.ToList(); + } + } + public async Task UpdateStock(StockMember stockMember) + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + + object parameters = new + { + Id = stockMember.Id, + StockId = stockMember.StockId, + StockExtId = stockMember.StockExtId, + BuyValue = stockMember.BuyValue, + BuyDate = stockMember.BuyDate, + ActValue = stockMember.ActValue, + ActDate = stockMember.ActDate, + ActAmount = stockMember.ActAmount, + SoldValue = stockMember.SoldValue, + SoldDate = stockMember.SoldDate, + Comment = stockMember.Comment, + PostAmount = stockMember.PostAmount, + SoldStockPrice = stockMember.SoldStockPrice + }; + + _log.LogInformation($"UPDATE_STOCKMEMBER {stockMember.Id} = {stockMember.StockId}"); + + await database.ExecuteAsync(UPDATE_STOCKMEMBER, parameters); + } + } + public async Task UpdateStockName(string stockNameBank, string stockNameWeb) + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + + object parameters = new + { + StockNameBank = stockNameBank, + StockNameWeb = stockNameWeb, + }; + + _log.LogInformation($"UPDATE_STOCKNAME_BANK {stockNameBank} , {stockNameWeb}"); + + await database.ExecuteAsync(UPDATE_STOCKNAME_BANK, parameters); + } + } + + public async Task> GetStockNameTable() + { + using (IDbConnection database = _sqliteDbConnectionFactory.Connect()) + { + _log.LogInformation("GET_WEB_STOCKNAMES"); + + IEnumerable stockNames = await database.QueryAsync(GET_WEB_STOCKNAM_FULL); + return stockNames.ToList(); + } + } + + } +} diff --git a/LoadStockDbFromTrans/StocksProviders/IDapperStocksProvider.cs b/LoadStockDbFromTrans/StocksProviders/IDapperStocksProvider.cs new file mode 100644 index 0000000..2a9a969 --- /dev/null +++ b/LoadStockDbFromTrans/StocksProviders/IDapperStocksProvider.cs @@ -0,0 +1,17 @@ +using LoadStockDbFromTrans.models; + +namespace LoadStockDbFromTrans.StocksProviders +{ + public interface IDapperStocksProvider + { + Task AddStock(StockMember stockMember); + Task AddWebStockNames(string stockName); + Task CleanStockNames(); + Task> GetAllStocks(); + Task> GetStockNames(); + Task> GetStockNameTable(); + Task> GetStocksByStockId(string stockId, DateTime Affärsdag); + Task UpdateStock(StockMember stockMember); + Task UpdateStockName(string stockNameBank, string stockNameWeb); + } +} \ No newline at end of file diff --git a/LoadStockDbFromTrans/appsettings.json b/LoadStockDbFromTrans/appsettings.json new file mode 100644 index 0000000..9117a38 --- /dev/null +++ b/LoadStockDbFromTrans/appsettings.json @@ -0,0 +1,15 @@ +{ + "StdFileName": "StockData2022-09-05.txt", + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Information", + "System": "Warning" + } + } + }, + "ConnectionStrings": { + "Default": "Data source=C:\\tommycsharp\\Source\\Consoles\\LoadStocks\\Stocks.db" + } +} \ No newline at end of file diff --git a/LoadStockDbFromTrans/models/Address.cs b/LoadStockDbFromTrans/models/Address.cs new file mode 100644 index 0000000..2ab1147 --- /dev/null +++ b/LoadStockDbFromTrans/models/Address.cs @@ -0,0 +1,11 @@ +namespace LoadStockDbFromTrans.models; + +public class Address +{ + public int Id { get; set; } + public string Street { get; set; } + public string Street2 { get; set; } + public int Zipcode { get; set; } + public string Destination { get; set; } + public string Nation { get; set; } +} diff --git a/LoadStockDbFromTrans/models/BackupRegister.cs b/LoadStockDbFromTrans/models/BackupRegister.cs new file mode 100644 index 0000000..f6a5171 --- /dev/null +++ b/LoadStockDbFromTrans/models/BackupRegister.cs @@ -0,0 +1,10 @@ +namespace LoadStockDbFromTrans.models; + +public class BackupRegister +{ + public int Id { get; set; } + public DateTime BackedUp { get; set; } + public string DbName { get; set; } + public string BackupDbName { get; set; } + public string BackupPath { get; set; } +} diff --git a/LoadStockDbFromTrans/models/DiTraderStockRow.cs b/LoadStockDbFromTrans/models/DiTraderStockRow.cs new file mode 100644 index 0000000..d0cbb97 --- /dev/null +++ b/LoadStockDbFromTrans/models/DiTraderStockRow.cs @@ -0,0 +1,15 @@ +namespace LoadStockDbFromTrans.models; + +public class DiTraderStockRow +{ + public string StockName { get; set; } + public decimal ProcChange { get; set; } + public decimal RealChange { get; set; } + public decimal BuyPrice { get; set; } + public decimal SellPrice { get; set; } + public decimal LatestPrice { get; set; } + public decimal HighestPrice { get; set; } + public decimal LowestPrice { get; set; } + public long Volume { get; set; } + public TimeSpan TimeOfDay { get; set; } +} diff --git a/LoadStockDbFromTrans/models/FileModel.cs b/LoadStockDbFromTrans/models/FileModel.cs new file mode 100644 index 0000000..dd31005 --- /dev/null +++ b/LoadStockDbFromTrans/models/FileModel.cs @@ -0,0 +1,18 @@ +namespace LoadStockDbFromTrans.models; + +public class FileModel +{ + public DateTime Bokföringsdag { get; set; } + public DateTime Affärsdag { get; set; } + public DateTime Likviddag { get; set; } + public string Valuta { get; set; } + public string ISIN { get; set; } + public string Transaktionstyp { get; set; } + public string Beskrivning { get; set; } + public string Specifikation { get; set; } + public int Antal { get; set; } + public decimal Kurs { get; set; } + public decimal Belopp { get; set; } + public decimal Saldo { get; set; } + +} diff --git a/LoadStockDbFromTrans/models/LatestSoldStock.cs b/LoadStockDbFromTrans/models/LatestSoldStock.cs new file mode 100644 index 0000000..2aefbb7 --- /dev/null +++ b/LoadStockDbFromTrans/models/LatestSoldStock.cs @@ -0,0 +1,7 @@ +namespace LoadStockDbFromTrans.models; + +public class LatestSoldStock +{ + public decimal SoldStockPrice { get; set; } + public DateTime? LatestSoldDate { get; set; } +} diff --git a/LoadStockDbFromTrans/models/Person.cs b/LoadStockDbFromTrans/models/Person.cs new file mode 100644 index 0000000..41c74ea --- /dev/null +++ b/LoadStockDbFromTrans/models/Person.cs @@ -0,0 +1,15 @@ +namespace LoadStockDbFromTrans.models; + +public class Person +{ + public int Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string NickName { get; set; } + public string Born { get; set; } + public string Comments { get; set; } + public int HomeAddress { get; set; } + public int InvoiceAddress { get; set; } + public int ClearingNo { get; set; } + public long AccountNo { get; set; } +} diff --git a/LoadStockDbFromTrans/models/PersonStock.cs b/LoadStockDbFromTrans/models/PersonStock.cs new file mode 100644 index 0000000..964f161 --- /dev/null +++ b/LoadStockDbFromTrans/models/PersonStock.cs @@ -0,0 +1,10 @@ +namespace LoadStockDbFromTrans.models; + +public class PersonStock +{ + public int Id { get; set; } + public int PersonId { get; set; } + public int StockId { get; set; } + public string Comment { get; set; } + +} diff --git a/LoadStockDbFromTrans/models/ShareModel.cs b/LoadStockDbFromTrans/models/ShareModel.cs new file mode 100644 index 0000000..b53822a --- /dev/null +++ b/LoadStockDbFromTrans/models/ShareModel.cs @@ -0,0 +1,9 @@ +namespace LoadStockDbFromTrans.models; + +public class ShareModel +{ + public int Id { get; set; } + public string GroupName { get; set; } + public string StockName { get; set; } + +} \ No newline at end of file diff --git a/LoadStockDbFromTrans/models/StockGroupModel.cs b/LoadStockDbFromTrans/models/StockGroupModel.cs new file mode 100644 index 0000000..631d95b --- /dev/null +++ b/LoadStockDbFromTrans/models/StockGroupModel.cs @@ -0,0 +1,8 @@ +namespace LoadStockDbFromTrans.models; + +public class StockGroupModel +{ + public int Id { get; set; } + public string StockGroup { get; set; } + public string StockName { get; set; } +} diff --git a/LoadStockDbFromTrans/models/StockGrpPers.cs b/LoadStockDbFromTrans/models/StockGrpPers.cs new file mode 100644 index 0000000..7352427 --- /dev/null +++ b/LoadStockDbFromTrans/models/StockGrpPers.cs @@ -0,0 +1,8 @@ +namespace LoadStockDbFromTrans.models; + +public class StockGrpPers +{ + public string StockId { get; set; } + public string StockGroup { get; set; } + public int PersId { get; set; } +} diff --git a/LoadStockDbFromTrans/models/StockMember.cs b/LoadStockDbFromTrans/models/StockMember.cs new file mode 100644 index 0000000..3387e51 --- /dev/null +++ b/LoadStockDbFromTrans/models/StockMember.cs @@ -0,0 +1,26 @@ +namespace LoadStockDbFromTrans.models; + +public class StockMember +{ + public int Id { get; set; } + public string StockId { get; set; } + public string StockExtId { get; set; } + public decimal BuyValue { get; set; } + public DateTime BuyDate { get; set; } + public decimal ActValue { get; set; } + public DateTime? ActDate { get; set; } + public long ActAmount { get; set; } + public decimal? SoldValue { get; set; } + public DateTime? SoldDate { get; set; } + // public string PostId { get; set; } + public string Comment { get; set; } + public long PostAmount { get; set; } + public decimal SoldStockPrice { get; set; } + + //public decimal PostValue + //{ + // get { return ActAmount * ActValue; } + //} + + +} diff --git a/LoadStockDbFromTrans/models/StockNames.cs b/LoadStockDbFromTrans/models/StockNames.cs new file mode 100644 index 0000000..a0868ae --- /dev/null +++ b/LoadStockDbFromTrans/models/StockNames.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace LoadStockDbFromTrans.models +{ + public class StockNames + { + public string StockNameWeb { get; set; } + public string StockNameBank { get; set; } + } +} diff --git a/ReadSBAktieTrans/FileCreator.cs b/ReadSBAktieTrans/FileCreator.cs new file mode 100644 index 0000000..18e0add --- /dev/null +++ b/ReadSBAktieTrans/FileCreator.cs @@ -0,0 +1,64 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Threading.Tasks; + +namespace ReadSBAktieTrans +{ + public class FileCreator + { + public string CreateAndSave(Dictionary dataStore) + { + var FileModelList = new List(); + for (var i = 1; i < dataStore.Count - 1; i++) + { + var item = dataStore[i]; + var fmRec = CreateRecord(item); + FileModelList.Add(fmRec); + } + + var fileSaved = SaveUpdateFile(FileModelList); + return fileSaved; + } + + private FileModel CreateRecord(string[] item) + { + var record = new FileModel(); + record.Bokföringsdag = DateTime.Parse(item[0]); + record.Affärsdag = DateTime.Parse(item[1]); + record.Likviddag = DateTime.Parse(item[2]); + record.Valuta = item[3]; + record.ISIN = item[4]; + record.Transaktionstyp = item[5]; + record.Beskrivning = item[6]; + record.Specifikation = item[7]; + record.Antal = int.Parse(item[8] == "" ? "0" : item[8]); + record.Kurs = decimal.Parse(item[9] == "" ? "0" : item[9]); + record.Belopp = decimal.Parse(item[10] == "" ? "0" : item[10]); + record.Saldo = decimal.Parse(item[11] == "" ? "0" : item[11]); + return record; + } + + private string SaveUpdateFile(List DumpObjects) + { + var output = JsonConvert.SerializeObject(DumpObjects, Formatting.Indented); + // Assembly assem = typeof(ReadSBAktieTrans).Assembly; + Assembly assem = Assembly.GetExecutingAssembly(); + var programPath = assem.Location.Substring(0, assem.Location.LastIndexOf("\\")); + var DataPath = new DirectoryInfo(programPath + "\\DataFiles"); + if (!DataPath.Exists) + { + DataPath.Create(); + } + var outFileName = $"StockData{DateTime.Now.ToShortDateString()}.txt"; + File.WriteAllText($"{programPath}\\DataFiles\\{outFileName}", output); + return outFileName; + } + + + } +} diff --git a/ReadSBAktieTrans/FileModel.cs b/ReadSBAktieTrans/FileModel.cs new file mode 100644 index 0000000..5203a8a --- /dev/null +++ b/ReadSBAktieTrans/FileModel.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +public class FileModel +{ + public DateTime Bokföringsdag { get; set; } + public DateTime Affärsdag { get; set; } + public DateTime Likviddag { get; set; } + public string Valuta { get; set; } + public string ISIN { get; set; } + public string Transaktionstyp { get; set; } + public string Beskrivning { get; set; } + public string Specifikation { get; set; } + public int Antal { get; set; } + public decimal Kurs { get; set; } + public decimal Belopp { get; set; } + public decimal Saldo { get; set; } + +} diff --git a/ReadSBAktieTrans/Helpers.cs b/ReadSBAktieTrans/Helpers.cs new file mode 100644 index 0000000..e91de2e --- /dev/null +++ b/ReadSBAktieTrans/Helpers.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ReadSBAktieTrans +{ + public static class Helpers + { + public static bool isnumeric(this string x) + { + var checkString = "+-0123456789,"; + var checkVar = x.ToArray(); + foreach(var check in checkVar) + { + if(!checkString.Contains(check)) return false; + } + return true; + } + } +} diff --git a/ReadSBAktieTrans/Program.cs b/ReadSBAktieTrans/Program.cs new file mode 100644 index 0000000..f629381 --- /dev/null +++ b/ReadSBAktieTrans/Program.cs @@ -0,0 +1,91 @@ + + +using ReadSBAktieTrans; + +var headers = new Dictionary(); +var fileName = @"C:\tommycsharp\Source\Consoles\LoadStocks\Skandiabanken_transaktioner.txt"; + +string contents = File.ReadAllText(fileName, System.Text.Encoding.Latin1); + +string[] records = contents.Split("\r\n"); + +Console.WriteLine($"{records.Count()} records read"); + +Dictionary dataStore = new Dictionary(); +var rNr = 0; + +foreach (var record in records.Skip(1).ToArray()) +{ + var fieldArr = record.Split("\t"); + dataStore.Add(rNr++, fieldArr); +} + + + +CreateFileModel(headers, records); + +var fc = new FileCreator(); + +var latestFileName = fc.CreateAndSave(dataStore); + +Console.WriteLine($"Lates saved files name is {latestFileName}"); + + + void CreateFileModel(Dictionary headers, string[] records) +{ + var recordOne = records[0]; + var fields = recordOne.Split("\t"); + var recordTwo = records[1]; + var data = recordTwo.Split("\t"); + int fnr = 0; + foreach (var field in fields) + { + headers.Add(fnr++, field); + } + + for (int i = 0; i < fields.Length; i++) + { + Console.WriteLine($"field ({i}) = \"{headers[i]}\" "); + } + + Console.WriteLine(); + Console.WriteLine("--------------- Model Class ---------------"); + Console.WriteLine(); + + Console.WriteLine("using System;"); + Console.WriteLine("using System.Collections.Generic;"); + Console.WriteLine("using System.Linq;"); + Console.WriteLine("using System.Text;"); + Console.WriteLine("using System.Threading.Tasks;"); + Console.WriteLine(""); + Console.WriteLine("public class FileModel"); + Console.WriteLine("{"); + for (int i = 0; i < fields.Length; i++) + { + Console.WriteLine($" public {DataType(i, data[i])} {headers[i]} {{get; set; }}"); + } + Console.WriteLine(""); + Console.WriteLine("}"); + + Console.WriteLine(); + Console.WriteLine("--------------- Model Class ---------------"); + Console.WriteLine(); + +} + + +string DataType(int hdrnr, string field) +{ + var retStr = "string"; + if(field.Split('-',StringSplitOptions.RemoveEmptyEntries).Length > 1) return "DateTime"; + if (field.isnumeric()) + { + for (var i = 0; i < dataStore.Keys.Count-1; i++) + { + if (dataStore[i][hdrnr].Contains(",")) return "decimal"; + } + return "int"; + } + return retStr; +} + diff --git a/ReadSBAktieTrans/ReadSBAktieTrans.csproj b/ReadSBAktieTrans/ReadSBAktieTrans.csproj new file mode 100644 index 0000000..11b28f3 --- /dev/null +++ b/ReadSBAktieTrans/ReadSBAktieTrans.csproj @@ -0,0 +1,14 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + diff --git a/ReadSBAktieTransApp.sln b/ReadSBAktieTransApp.sln new file mode 100644 index 0000000..61ca047 --- /dev/null +++ b/ReadSBAktieTransApp.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32630.192 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReadSBAktieTrans", "ReadSBAktieTrans\ReadSBAktieTrans.csproj", "{24707A9D-5173-41DF-8F32-D32F8B035A0E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LoadStockDbFromTrans", "LoadStockDbFromTrans\LoadStockDbFromTrans.csproj", "{3B41412F-D5B0-4613-8CCF-34D6D7FF06BC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {24707A9D-5173-41DF-8F32-D32F8B035A0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {24707A9D-5173-41DF-8F32-D32F8B035A0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24707A9D-5173-41DF-8F32-D32F8B035A0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {24707A9D-5173-41DF-8F32-D32F8B035A0E}.Release|Any CPU.Build.0 = Release|Any CPU + {3B41412F-D5B0-4613-8CCF-34D6D7FF06BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B41412F-D5B0-4613-8CCF-34D6D7FF06BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B41412F-D5B0-4613-8CCF-34D6D7FF06BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B41412F-D5B0-4613-8CCF-34D6D7FF06BC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0A3F25EA-03B4-419D-AF3B-940EEC196B49} + EndGlobalSection +EndGlobal