301 lines
9.8 KiB
C#
301 lines
9.8 KiB
C#
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<FileToJson> _log;
|
|
private readonly IConfiguration _config;
|
|
private readonly IDapperStocksProvider _dapperStocksProvider;
|
|
|
|
public Dictionary<string, string> NameConverter { get; set; } = new Dictionary<string, string>();
|
|
public FileToJson(ILogger<FileToJson> log, IConfiguration config, IDapperStocksProvider dapperStocksProvider)
|
|
{
|
|
_log = log;
|
|
_config = config;
|
|
_dapperStocksProvider = dapperStocksProvider;
|
|
}
|
|
public async Task<List<FileModel>> FetchJsonData()
|
|
{
|
|
_log.LogInformation("Starting with reading from Json!");
|
|
|
|
Console.WriteLine("FileName ?");
|
|
var fileName = Console.ReadLine();
|
|
if (fileName == "xx") fileName = _config.GetValue<string>("StdFileName"); //"StockData2022-08-29.txt";
|
|
_log.LogInformation("fileName = {fname}", fileName);
|
|
List<FileModel> recList = new List<FileModel>();
|
|
recList = JsonConvert.DeserializeObject<List<FileModel>>(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<FileModel> recList)
|
|
{
|
|
var tempListNew = new HashSet<string>();
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|