From 83d02a807fc9d3480d3e4a52241e479cd92c5c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tommy=20=C3=96man?= Date: Sun, 30 Aug 2026 16:38:17 +0200 Subject: [PATCH] =?UTF-8?q?inl=C3=A4sning=20av=20csv-fil=20r=C3=A4ttad=20,?= =?UTF-8?q?=20nu=20f=C3=B6re=20migration=20av=20transactionNote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- StockHistory/HandleCsvNotes.cs | 66 ++++++++-- StockHistory/Models/TransactionNote.cs | 5 +- StockHistory/Services/IStockEquityServices.cs | 2 +- StockHistory/Services/StockEquityServices.cs | 119 ++++++++++++------ .../Services/TransactionNotesServices.cs | 5 +- StockHistory/StockHistory.csproj | 5 - StockHistory/Stockbrokerage.db | Bin 81920 -> 0 bytes .../frmStockHistoryAnalyse.Designer.cs | 12 ++ StockHistory/frmStockHistoryAnalyse.cs | 30 ++++- StockHistory/frmStockHistoryInit.cs | 2 + 10 files changed, 186 insertions(+), 60 deletions(-) delete mode 100644 StockHistory/Stockbrokerage.db diff --git a/StockHistory/HandleCsvNotes.cs b/StockHistory/HandleCsvNotes.cs index bd120b6..3d6c841 100644 --- a/StockHistory/HandleCsvNotes.cs +++ b/StockHistory/HandleCsvNotes.cs @@ -1,4 +1,5 @@ using StockHistory.Models; +using System.Globalization; namespace StockHistory; @@ -19,18 +20,26 @@ public class HandleCsvNotes : IHandleCsvNotes var test = values[NamePos(Header_table, "Typ av transaktion")]; if (test == "Köp" || test == "Sälj") { - var transactionNote = new TransactionNote + try { - TransactionDate = DateTime.Parse(values[NamePos(Header_table, "Datum")]), - TransactionType = values[NamePos(Header_table, "Typ av transaktion")] == "Köp" ? "KÖP" : "SÄLJ", - StockCode = values[NamePos(Header_table, @"Värdepapper/beskrivning")], - StockPrice = decimal.Parse((values[NamePos(Header_table, "Kurs")] == "") ? "0" : values[NamePos(Header_table, "Kurs")]), - StockQuantity = Math.Abs(int.Parse(values[NamePos(Header_table, "Antal")])), - Commission = decimal.Parse((values[NamePos(Header_table, "Courtage")] == "") ? "0" : values[NamePos(Header_table, "Courtage")]), - TotalAmount = Math.Abs(decimal.Parse((values[NamePos(Header_table, "Belopp")] == "") ? "0" : values[NamePos(Header_table, "Belopp")])) - decimal.Parse((values[NamePos(Header_table, "Courtage")] == "") ? "0" : values[NamePos(Header_table, "Courtage")]), - AmountToPay = Math.Abs(decimal.Parse((values[NamePos(Header_table, "Belopp")] == "") ? "0" : values[NamePos(Header_table, "Belopp")])) - }; - transactionNotes.Add(transactionNote); + var transactionNote = new TransactionNote + { + TransactionDate = DateTime.Parse(values[NamePos(Header_table, "Datum")]), + TransactionType = values[NamePos(Header_table, "Typ av transaktion")] == "Köp" ? "KÖP" : "SÄLJ", + StockCode = values[NamePos(Header_table, @"Värdepapper/beskrivning")], + StockPrice = decimal.Parse((values[NamePos(Header_table, "Kurs")] == "") ? "0" : values[NamePos(Header_table, "Kurs")]), + StockQuantity = Math.Abs(ParseCsvNumber(values[NamePos(Header_table, "Antal")])), + Commission = decimal.Parse((values[NamePos(Header_table, "Courtage")] == "") ? "0" : "0" + values[NamePos(Header_table, "Courtage")]), + TotalAmount = Math.Abs(decimal.Parse((values[NamePos(Header_table, "Belopp")] == "") ? "0" : values[NamePos(Header_table, "Belopp")])) - decimal.Parse((values[NamePos(Header_table, "Courtage")] == "") ? "0" : values[NamePos(Header_table, "Courtage")]), + AmountToPay = Math.Abs(decimal.Parse((values[NamePos(Header_table, "Belopp")] == "") ? "0" : values[NamePos(Header_table, "Belopp")])) + }; + transactionNotes.Add(transactionNote); + } + catch (Exception ex) + { + MessageBox.Show($"Warning: '{ex.Message}'"); + // throw; + } } } return transactionNotes; @@ -45,8 +54,41 @@ public class HandleCsvNotes : IHandleCsvNotes } else { - Console.WriteLine($"Warning: Unable to find '{value}'"); + MessageBox.Show($"Warning: Unable to find '{value}'"); return 0; } } + + public static int ParseCsvNumber(string input) + { + if (string.IsNullOrWhiteSpace(input)) + throw new ArgumentException("Input is empty"); + + // Försök först som int (snabbast) + if (int.TryParse(input, out int intValue)) + return intValue; + + // Försök som decimal (t.ex. "123.45" eller "123,45") + if (decimal.TryParse( + input, + NumberStyles.Any, + CultureInfo.InvariantCulture, + out decimal decValue)) + { + return (int)Math.Round(decValue, MidpointRounding.AwayFromZero); + } + + // Försök med svensk kultur (CSV från Excel brukar använda komma) + if (decimal.TryParse( + input, + NumberStyles.Any, + new CultureInfo("sv-SE"), + out decValue)) + { + return (int)Math.Round(decValue, MidpointRounding.AwayFromZero); + } + + throw new FormatException($"Kan inte tolka talet: '{input}'"); + } + } \ No newline at end of file diff --git a/StockHistory/Models/TransactionNote.cs b/StockHistory/Models/TransactionNote.cs index 57716b6..0aea10c 100644 --- a/StockHistory/Models/TransactionNote.cs +++ b/StockHistory/Models/TransactionNote.cs @@ -7,6 +7,8 @@ public class TransactionNote public string? TransactionType { get; set; } public string? StockCode { get; set; } public decimal StockPrice { get; set; } + public decimal ExchangeCours { get; set; } + public string Valuta { get; set; } public int StockQuantity { get; set; } public decimal TotalAmount { get; set; } public decimal Commission { get; set; } @@ -14,7 +16,8 @@ public class TransactionNote public override string ToString() { - return $"TransactionDate: {TransactionDate},\r\nTransactionType: {TransactionType},\r\nStockCode: {StockCode},\r\nStockPrice: {StockPrice},\r\nStockQuantity: {StockQuantity},\r\nTotalAmount: {TotalAmount},\r\nCommission: {Commission},\r\nAmountToPay: {AmountToPay}\r\n"; + //return $"TransactionDate: {TransactionDate},\r\nTransactionType: {TransactionType},\r\nStockCode: {StockCode},\r\nStockPrice: {StockPrice},\r\nStockQuantity: {StockQuantity},\r\nTotalAmount: {TotalAmount},\r\nCommission: {Commission},\r\nAmountToPay: {AmountToPay}\r\n"; + return $" {TransactionDate} | {TransactionType} | {StockCode} | {StockPrice} | {StockQuantity} | {TotalAmount} | {Commission} | {AmountToPay}"; } } diff --git a/StockHistory/Services/IStockEquityServices.cs b/StockHistory/Services/IStockEquityServices.cs index 6328a00..030f86e 100644 --- a/StockHistory/Services/IStockEquityServices.cs +++ b/StockHistory/Services/IStockEquityServices.cs @@ -4,7 +4,7 @@ namespace StockHistory.Services { public interface IStockEquityServices { - Task GenerateStockVision(); + Task> GenerateStockVision(); Task> GetAllAsync(); Task> GetAllAsync(DateTime equityDate); Task> GetByCodeAsync(string stockCode); diff --git a/StockHistory/Services/StockEquityServices.cs b/StockHistory/Services/StockEquityServices.cs index fec0622..56336eb 100644 --- a/StockHistory/Services/StockEquityServices.cs +++ b/StockHistory/Services/StockEquityServices.cs @@ -42,8 +42,11 @@ public class StockEquityServices : IStockEquityServices /// utgående från alla befintliga notor skapa en lista med aktieinnehav. /// /// - public async Task GenerateStockVision() + public async Task> GenerateStockVision() { + var oldStock = "OldStock"; + var nyAktie = false; + List equityWarningList = new List(); await _dbContext.Stocks.ExecuteDeleteAsync(); await _dbContext.SaveChangesAsync(); @@ -58,6 +61,16 @@ public class StockEquityServices : IStockEquityServices { // Kontrollera om TransactionType är null och StockCode inte är null // (om det är fallet, hoppa över denna iteration) + Debug.WriteLine(note.ToString()); + + nyAktie = false; + if (note.StockCode != null && + note.StockCode != oldStock) + { + oldStock = note.StockCode; + nyAktie = true; + } + if (note.TransactionType == null && note.StockCode != null) { } else @@ -81,58 +94,87 @@ public class StockEquityServices : IStockEquityServices }; _dbContext.Stocks.Add(equity); await _dbContext.SaveChangesAsync(); - Debug.WriteLine($"Köpnotering: {equity.StockCode} | {equity.Bought} | {equity.BoughtPrice} | {equity.Quantity} | {equity.BoughtPrice * equity.Quantity}"); + // Debug.WriteLine($"Köpnotering: {equity.StockCode} | {equity.Bought} | {equity.BoughtPrice} | {equity.Quantity} | {equity.BoughtPrice * equity.Quantity}"); } // Kontrollera om TransactionType är en säljnotering else if (note.TransactionType.ToLower() == "sälj") { - var equityList = await _dbContext.Stocks - .Where(s => s.StockCode == note.StockCode && s.SoldQuant == 0) - .OrderBy(s => s.Quantity).ToListAsync(); - - if (equityList != null) + if (nyAktie) { - var soldQuant = Math.Abs(note.StockQuantity); - foreach (var eq in equityList.OrderBy(e => e.Quantity)) + Debug.WriteLine("<--" + note.ToString()); + + if (note.StockCode != null) { - if (soldQuant == 0) + equityWarningList.Add(new StockEquity { - break; - } - else + //StockCode = note.StockCode, + //Bought = DateTime.MinValue, + //BoughtPrice = 0, + //Quantity = 0, + //Sold = note.TransactionDate, + //SoldPrice = note.StockPrice, + //SoldQuant = note.StockQuantity + StockCode = note.StockCode, + Bought = note.TransactionDate, + BoughtPrice = note.StockPrice * -1, + Quantity = note.StockQuantity, + Sold = DateTime.MinValue, + SoldPrice = 0m, + SoldQuant = 0 + }); + } + ; + } + else + { + var equityList = await _dbContext.Stocks + .Where(s => s.StockCode == note.StockCode && s.SoldQuant == 0) + .OrderBy(s => s.Quantity).ToListAsync(); + + if (equityList != null) + { + var soldQuant = Math.Abs(note.StockQuantity); + foreach (var eq in equityList.OrderBy(e => e.Quantity)) { - if (eq.Quantity <= soldQuant) + if (soldQuant == 0) { - eq.Sold = note.TransactionDate; - eq.SoldPrice = note.StockPrice; - eq.SoldQuant = eq.Quantity; - soldQuant -= eq.Quantity; - _dbContext.Stocks.Update(eq); - await _dbContext.SaveChangesAsync(); - Debug.WriteLine($"Säljnotering: {eq.StockCode} | {eq.Sold} | {eq.SoldPrice} | {eq.SoldQuant}"); + break; } else { - var splitEquity = new StockEquity + if (eq.Quantity <= soldQuant) { - StockCode = eq.StockCode, - Bought = eq.Bought, - BoughtPrice = eq.BoughtPrice, - Quantity = soldQuant, - Sold = note.TransactionDate, - SoldPrice = note.StockPrice, - SoldQuant = soldQuant - }; - _dbContext.Stocks.Add(splitEquity); - await _dbContext.SaveChangesAsync(); - Debug.WriteLine($"Säljnotering (split): {splitEquity.StockCode} | {splitEquity.Bought} | {splitEquity.BoughtPrice} | {splitEquity.SoldQuant} | {splitEquity.Sold} | {splitEquity.SoldPrice} | {splitEquity.SoldQuant}"); - eq.Quantity -= soldQuant; - _dbContext.Stocks.Update(eq); - await _dbContext.SaveChangesAsync(); - Debug.WriteLine($"Säljnotering (split): {eq.StockCode} | {eq.Bought} | {eq.BoughtPrice} | {eq.SoldQuant} | {eq.Sold} | {eq.SoldPrice} | {eq.SoldQuant}"); - soldQuant = 0; + eq.Sold = note.TransactionDate; + eq.SoldPrice = note.StockPrice; + eq.SoldQuant = eq.Quantity; + soldQuant -= eq.Quantity; + _dbContext.Stocks.Update(eq); + await _dbContext.SaveChangesAsync(); + //Debug.WriteLine($"Säljnotering: {eq.StockCode} | {eq.Sold} | {eq.SoldPrice} | {eq.SoldQuant}"); + } + else + { + var splitEquity = new StockEquity + { + StockCode = eq.StockCode, + Bought = eq.Bought, + BoughtPrice = eq.BoughtPrice, + Quantity = soldQuant, + Sold = note.TransactionDate, + SoldPrice = note.StockPrice, + SoldQuant = soldQuant + }; + _dbContext.Stocks.Add(splitEquity); + await _dbContext.SaveChangesAsync(); + //Debug.WriteLine($"Säljnotering (split): {splitEquity.StockCode} | {splitEquity.Bought} | {splitEquity.BoughtPrice} | {splitEquity.SoldQuant} | {splitEquity.Sold} | {splitEquity.SoldPrice} | {splitEquity.SoldQuant}"); + eq.Quantity -= soldQuant; + _dbContext.Stocks.Update(eq); + await _dbContext.SaveChangesAsync(); + //Debug.WriteLine($"Säljnotering (split): {eq.StockCode} | {eq.Bought} | {eq.BoughtPrice} | {eq.SoldQuant} | {eq.Sold} | {eq.SoldPrice} | {eq.SoldQuant}"); + soldQuant = 0; + } } } } @@ -140,5 +182,6 @@ public class StockEquityServices : IStockEquityServices } } } + return equityWarningList; } } diff --git a/StockHistory/Services/TransactionNotesServices.cs b/StockHistory/Services/TransactionNotesServices.cs index 83f9bc8..3db480e 100644 --- a/StockHistory/Services/TransactionNotesServices.cs +++ b/StockHistory/Services/TransactionNotesServices.cs @@ -20,7 +20,10 @@ public class TransactionNotesServices : ITransactionNotesServices public async Task> GetAllAsync() { - return await _dbContext.TransactionNotes.ToListAsync(); + return await _dbContext.TransactionNotes + .OrderBy(t => t.StockCode) + .ThenBy(t => t.TransactionDate) + .ToListAsync(); } public async Task GetByIdAsync(int id) diff --git a/StockHistory/StockHistory.csproj b/StockHistory/StockHistory.csproj index 6328792..7c37198 100644 --- a/StockHistory/StockHistory.csproj +++ b/StockHistory/StockHistory.csproj @@ -35,9 +35,4 @@ Resources.Designer.cs - - - PreserveNewest - - \ No newline at end of file diff --git a/StockHistory/Stockbrokerage.db b/StockHistory/Stockbrokerage.db deleted file mode 100644 index f4a51e0dcbb175a64ef0d8d286183e789ace9d3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81920 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 warningList) //, DateTime equityDate) + { + if (warningList != null) + { + lblVarning.Visible = true; + lwStockHistory.Items.Clear(); + foreach (var histRec in warningList) + { + var l_item = new ListViewItem(histRec.StockCode); + l_item.SubItems.Add(histRec.Bought.ToString()); + l_item.SubItems.Add(histRec.Quantity.ToString()); + l_item.SubItems.Add(histRec.BoughtPrice.ToString()); + Debug.WriteLine(histRec.ToString()); + var totval = (histRec.SoldQuant > 0) ? histRec.SoldQuant * histRec.SoldPrice - histRec.BoughtPrice * histRec.Quantity : histRec.BoughtPrice * histRec.Quantity; + l_item.SubItems.Add((totval).ToString("C")); + l_item.SubItems.Add((histRec.SoldQuant > 0) ? "B" : "K"); + lwStockHistory.Items.Add(l_item); + } + } + lwStockHistory.Refresh(); + } } diff --git a/StockHistory/frmStockHistoryInit.cs b/StockHistory/frmStockHistoryInit.cs index 0694899..2fec8a6 100644 --- a/StockHistory/frmStockHistoryInit.cs +++ b/StockHistory/frmStockHistoryInit.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using StockHistory.Models; using StockHistory.Services; using System.ComponentModel; +using System.Diagnostics; namespace StockHistory; @@ -301,6 +302,7 @@ public partial class frmStockHistoryInit : Form item.SubItems.Add(t.Commission.ToString()); item.SubItems.Add(t.AmountToPay.ToString()); lwTransactions.Items.Add(item); + Debug.WriteLine(t.ToString()); } }