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.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LoadStockDbFromTrans.Runners; public class FileToJson : IFileToJson { //private const string BYTE_INLAGG_VP = "BYTE INLÄGG VP"; //private const string BYTE_UTTAG_VP = "BYTE UTTAG VP"; //private const string DECIMALER_LIKVID = "DECIMALER LIKVID"; //private const string DECIMALER_UTTAG_VP = "DECIMALER UTTAG VP"; //private const string INLAGG_FISSION = "INLÄGG FISSION"; //private const string INLOSEN_LIKVID = "INLÖSEN LIKVID"; //private const string INLOSEN_UTTAG_VP = "INLÖSEN UTTAG VP"; //private const string INSATTNING = "INSÄTTNING"; //private const string KOPT = "KÖPT"; //private const string SPLIT_INLÄGG_VP = "SPLIT INLÄGG VP"; //private const string SPLIT_UTTAG_VP = "SPLIT UTTAG VP"; //private const string SALT = "SÅLT"; //private const string UTDELNING = "UTDELNING"; //private const string UTL_KUPSKATT = "UTL KUPSKATT"; //private const string UTTAG = "UTTAG"; 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 == ProcName.KOPT) { try { 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++; } catch (Exception e) { _log.LogError(e.Message, e.StackTrace); } } } _log.LogInformation($"Köpta klart {skrivna} st skrivna" ); skrivna = 0; foreach (var rec in recList) { if (rec.Transaktionstyp == ProcName.SPLIT_INLÄGG_VP) { UpDateWithSplitPlus(rec); skrivna++; } if (rec.Transaktionstyp == ProcName.SPLIT_UTTAG_VP) { UpDateWithSplitMinus(rec); skrivna++; } if (rec.Transaktionstyp == ProcName.SALT) { 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 void UpDateWithSplitMinus(FileModel rec) { var members = await _dapperStocksProvider.GetStocksByStockIdPart(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; await _dapperStocksProvider.RemoveStockById(member.Id); } else { member.ActAmount -= remaining; member.Comment += ",-Split"; await _dapperStocksProvider.UpdateStock(member); } _log.LogInformation($"Splittade {member.StockId}({member.Id}) st ändrad (minskad)"); if (remaining <= 0) { break; } } } private async void UpDateWithSplitPlus(FileModel rec) { var members = await _dapperStocksProvider.GetStocksByStockIdPart( rec.Beskrivning, rec.Affärsdag); foreach (var member in members) { member.ActAmount += rec.Antal; member.Comment += ", +split"; await _dapperStocksProvider.UpdateStock(member); _log.LogInformation($"Sålda {member.Id} st ändrad"); break; } } 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; } } } }