diff --git a/StockHistory/HandleCsvNotes.cs b/StockHistory/HandleCsvNotes.cs index 3d6c841..3fb567d 100644 --- a/StockHistory/HandleCsvNotes.cs +++ b/StockHistory/HandleCsvNotes.cs @@ -28,7 +28,9 @@ public class HandleCsvNotes : IHandleCsvNotes 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")]), + Currency = values[NamePos(Header_table, @"Instrumentvaluta")], StockQuantity = Math.Abs(ParseCsvNumber(values[NamePos(Header_table, "Antal")])), + ExchangeRate = decimal.Parse((values[NamePos(Header_table, "Valutakurs")] == "") ? "0" : "0" + values[NamePos(Header_table, "Valutakurs")]), 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")])) @@ -36,6 +38,43 @@ public class HandleCsvNotes : IHandleCsvNotes transactionNotes.Add(transactionNote); } catch (Exception ex) + { + MessageBox.Show($"Warning: '{ex.Message}'"); + } + } + } + return transactionNotes; + } + + public List GetSHBTransactionNotes(string filePath) + { + lines = File.ReadAllLines(filePath).ToList(); + Header_table = lines[0].Split(';'); + var transactionNotes = new List(); + foreach (var line in lines.Skip(1)) + { + var values = line.Split(';'); + var test = values[NamePos(Header_table, "Transaktion")]; + if (test == "Köp" || test == "Sälj") + { + try + { + var transactionNote = new TransactionNote + { + TransactionDate = DateTime.Parse(values[NamePos(Header_table, "Affärsdag")]), + TransactionType = values[NamePos(Header_table, "Transaktion")] == "Köp" ? "KÖP" : "SÄLJ", + StockCode = values[NamePos(Header_table, @"Värdepapper")], + StockPrice = decimal.Parse((values[NamePos(Header_table, "Kurs")] == "") ? "0" : values[NamePos(Header_table, "Kurs")]), + Currency = values[NamePos(Header_table, @"Noteringsvaluta")], + StockQuantity = Math.Abs(ParseCsvNumber(values[NamePos(Header_table, "Innehavsförändring")])), + ExchangeRate = decimal.Parse((values[NamePos(Header_table, "Växlingskurs")] == "") ? "0" : "0" + values[NamePos(Header_table, "Växlingskurs")]), + Commission = decimal.Parse((values[NamePos(Header_table, "Courtage")] == "") ? "0" : "0" + values[NamePos(Header_table, "Courtage")]), + TotalAmount = Math.Abs(decimal.Parse((values[NamePos(Header_table, "Likvidbelopp (Betalvaluta)")] == "") ? "0" : values[NamePos(Header_table, "Likvidbelopp (Betalvaluta)")])) - decimal.Parse((values[NamePos(Header_table, "Courtage")] == "") ? "0" : values[NamePos(Header_table, "Courtage")]), + AmountToPay = Math.Abs(decimal.Parse((values[NamePos(Header_table, "Likvidbelopp (Betalvaluta)")] == "") ? "0" : values[NamePos(Header_table, "Likvidbelopp (Betalvaluta)")])) + }; + transactionNotes.Add(transactionNote); + } + catch (Exception ex) { MessageBox.Show($"Warning: '{ex.Message}'"); // throw; @@ -45,6 +84,7 @@ public class HandleCsvNotes : IHandleCsvNotes return transactionNotes; } + private int NamePos(string[] h_table, string value) { var pos = Array.IndexOf(h_table, value); diff --git a/StockHistory/IHandleCsvNotes.cs b/StockHistory/IHandleCsvNotes.cs index b6a21af..e0251ae 100644 --- a/StockHistory/IHandleCsvNotes.cs +++ b/StockHistory/IHandleCsvNotes.cs @@ -5,5 +5,6 @@ namespace StockHistory public interface IHandleCsvNotes { List GetTransactionNotes(string filePath); + List GetSHBTransactionNotes(string filePath); } } \ No newline at end of file diff --git a/StockHistory/Migrations/20260830144416_CurrencyAndExchangeRate.Designer.cs b/StockHistory/Migrations/20260830144416_CurrencyAndExchangeRate.Designer.cs new file mode 100644 index 0000000..d052f93 --- /dev/null +++ b/StockHistory/Migrations/20260830144416_CurrencyAndExchangeRate.Designer.cs @@ -0,0 +1,148 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using StockHistory.Data; + +#nullable disable + +namespace StockHistory.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20260830144416_CurrencyAndExchangeRate")] + partial class CurrencyAndExchangeRate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.6"); + + modelBuilder.Entity("StockHistory.Models.SglStockEquity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Bought") + .HasColumnType("TEXT"); + + b.Property("BoughtPrice") + .HasColumnType("TEXT"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("Sold") + .HasColumnType("TEXT"); + + b.Property("SoldPrice") + .HasColumnType("TEXT"); + + b.Property("SoldQuant") + .HasColumnType("INTEGER"); + + b.Property("StockCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Bought"); + + b.HasIndex("Sold"); + + b.HasIndex("Bought", "StockCode", "Quantity"); + + b.ToTable("SglStocks"); + }); + + modelBuilder.Entity("StockHistory.Models.StockEquity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Bought") + .HasColumnType("TEXT"); + + b.Property("BoughtPrice") + .HasColumnType("TEXT"); + + b.Property("Quantity") + .HasColumnType("INTEGER"); + + b.Property("Sold") + .HasColumnType("TEXT"); + + b.Property("SoldPrice") + .HasColumnType("TEXT"); + + b.Property("SoldQuant") + .HasColumnType("INTEGER"); + + b.Property("StockCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Bought"); + + b.HasIndex("Sold"); + + b.HasIndex("Bought", "StockCode", "Quantity"); + + b.ToTable("Stocks"); + }); + + modelBuilder.Entity("StockHistory.Models.TransactionNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AmountToPay") + .HasColumnType("TEXT"); + + b.Property("Commission") + .HasColumnType("TEXT"); + + b.Property("Currency") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ExchangeRate") + .HasColumnType("TEXT"); + + b.Property("StockCode") + .HasColumnType("TEXT"); + + b.Property("StockPrice") + .HasColumnType("TEXT"); + + b.Property("StockQuantity") + .HasColumnType("INTEGER"); + + b.Property("TotalAmount") + .HasColumnType("TEXT"); + + b.Property("TransactionDate") + .HasColumnType("TEXT"); + + b.Property("TransactionType") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("StockCode", "TransactionDate") + .IsUnique(); + + b.ToTable("TransactionNotes"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/StockHistory/Migrations/20260830144416_CurrencyAndExchangeRate.cs b/StockHistory/Migrations/20260830144416_CurrencyAndExchangeRate.cs new file mode 100644 index 0000000..3a26319 --- /dev/null +++ b/StockHistory/Migrations/20260830144416_CurrencyAndExchangeRate.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace StockHistory.Migrations +{ + /// + public partial class CurrencyAndExchangeRate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Currency", + table: "TransactionNotes", + type: "TEXT", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "ExchangeRate", + table: "TransactionNotes", + type: "TEXT", + nullable: false, + defaultValue: 0m); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Currency", + table: "TransactionNotes"); + + migrationBuilder.DropColumn( + name: "ExchangeRate", + table: "TransactionNotes"); + } + } +} diff --git a/StockHistory/Migrations/AppDbContextModelSnapshot.cs b/StockHistory/Migrations/AppDbContextModelSnapshot.cs index c95d8dd..9907137 100644 --- a/StockHistory/Migrations/AppDbContextModelSnapshot.cs +++ b/StockHistory/Migrations/AppDbContextModelSnapshot.cs @@ -107,6 +107,13 @@ namespace StockHistory.Migrations b.Property("Commission") .HasColumnType("TEXT"); + b.Property("Currency") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("ExchangeRate") + .HasColumnType("TEXT"); + b.Property("StockCode") .HasColumnType("TEXT"); diff --git a/StockHistory/Models/TransactionNote.cs b/StockHistory/Models/TransactionNote.cs index 0aea10c..38e6525 100644 --- a/StockHistory/Models/TransactionNote.cs +++ b/StockHistory/Models/TransactionNote.cs @@ -7,8 +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 decimal ExchangeRate { get; set; } + public string Currency { get; set; } public int StockQuantity { get; set; } public decimal TotalAmount { get; set; } public decimal Commission { get; set; } @@ -17,7 +17,7 @@ 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} | {TransactionType} | {StockCode} | {StockPrice} | {StockQuantity} | {TotalAmount} | {Commission} | {AmountToPay}"; + return $" {TransactionDate} | {TransactionType} | {StockCode} | {StockPrice} | {ExchangeRate} | {Currency} | {StockQuantity} | {TotalAmount} | {Commission} | {AmountToPay}"; } } diff --git a/StockHistory/NoWrapMessageBoxForm.cs b/StockHistory/NoWrapMessageBoxForm.cs new file mode 100644 index 0000000..9e4c92c --- /dev/null +++ b/StockHistory/NoWrapMessageBoxForm.cs @@ -0,0 +1,83 @@ +namespace StockHistory.Forms; + +public class NoWrapMessageBox : Form +{ + private Label line1; + private Label line2; + private Label line3; + private Button yesButton; + private Button noButton; + + public NoWrapMessageBox(string row1, string row2) + { + Text = "Bekräfta"; + StartPosition = FormStartPosition.CenterScreen; + FormBorderStyle = FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + ShowInTaskbar = false; + Size = new Size(1000, 180); + + TopMost = true; // ← gör att dialogen hamnar överst + + line1 = new Label() + { + Text = row1, + AutoSize = true, + Location = new Point(20, 20), + Font = new Font("Consolas", 9), + MaximumSize = Size.Empty // ingen wrapping + }; + + line2 = new Label() + { + Text = row2, + AutoSize = true, + Location = new Point(20, 50), + Font = new Font("Consolas", 9), + MaximumSize = Size.Empty + }; + + line3 = new Label() + { + Text = "Kan posten läggas till ?", + AutoSize = true, + Location = new Point(20, 80), + Font = new Font("Consolas", 10), + MaximumSize = Size.Empty + }; + + yesButton = new Button() + { + Text = "Yes", + DialogResult = DialogResult.Yes, + Location = new Point(350, 100), + Size = new Size(100, 30) + }; + + noButton = new Button() + { + Text = "No", + DialogResult = DialogResult.No, + Location = new Point(460, 100), + Size = new Size(100, 30) + }; + + Controls.Add(line1); + Controls.Add(line2); + Controls.Add(line3); + Controls.Add(yesButton); + Controls.Add(noButton); + + AcceptButton = yesButton; + CancelButton = noButton; + } + + public static DialogResult Show(string row1, string row2) + { + using (var dlg = new NoWrapMessageBox(row1, row2)) + { + return dlg.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/StockHistory/NoWrapMessageBoxForm.resx b/StockHistory/NoWrapMessageBoxForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/StockHistory/NoWrapMessageBoxForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/StockHistory/Services/ITransactionNotesServices.cs b/StockHistory/Services/ITransactionNotesServices.cs index 403068c..0ac07ec 100644 --- a/StockHistory/Services/ITransactionNotesServices.cs +++ b/StockHistory/Services/ITransactionNotesServices.cs @@ -8,6 +8,7 @@ namespace StockHistory.Services Task DeleteAsync(int id); Task> GetAllAsync(); Task GetByIdAsync(int id); + Task GetByIndexAsync(string stockCode, DateTime transDate); Task> GetByStockCodeAsync(string stockCode); Task UpdateAsync(TransactionNote transactionNote); } diff --git a/StockHistory/Services/TransactionNotesServices.cs b/StockHistory/Services/TransactionNotesServices.cs index 3db480e..b22da15 100644 --- a/StockHistory/Services/TransactionNotesServices.cs +++ b/StockHistory/Services/TransactionNotesServices.cs @@ -31,6 +31,13 @@ public class TransactionNotesServices : ITransactionNotesServices return await _dbContext.TransactionNotes.FindAsync(id); } + public async Task GetByIndexAsync(string stockCode, DateTime transDate) + { + return await _dbContext.TransactionNotes + .FirstOrDefaultAsync(s => s.StockCode == stockCode && s.TransactionDate == transDate); + } + + public async Task> GetByStockCodeAsync(string stockCode) { if (string.IsNullOrEmpty(stockCode)) diff --git a/StockHistory/Stockbrokerage.db b/StockHistory/Stockbrokerage.db new file mode 100644 index 0000000..21078bc Binary files /dev/null and b/StockHistory/Stockbrokerage.db differ diff --git a/StockHistory/frmStockHistoryInit.Designer.cs b/StockHistory/frmStockHistoryInit.Designer.cs index 66a40a7..42294d0 100644 --- a/StockHistory/frmStockHistoryInit.Designer.cs +++ b/StockHistory/frmStockHistoryInit.Designer.cs @@ -47,6 +47,7 @@ btnNext = new Button(); btnDtaAnalyse1 = new Button(); btnListNoteDates = new Button(); + btnSaveAllToDB = new Button(); SuspendLayout(); // // btnChooseFile @@ -81,7 +82,7 @@ btnAnalysera.Location = new Point(23, 94); btnAnalysera.Margin = new Padding(3, 2, 3, 2); btnAnalysera.Name = "btnAnalysera"; - btnAnalysera.Size = new Size(125, 28); + btnAnalysera.Size = new Size(97, 28); btnAnalysera.TabIndex = 2; btnAnalysera.Text = "Analysera"; btnAnalysera.UseVisualStyleBackColor = false; @@ -103,10 +104,10 @@ btnSaveToDb.BackColor = Color.FromArgb(128, 255, 128); btnSaveToDb.FlatStyle = FlatStyle.Flat; btnSaveToDb.Font = new Font("Segoe UI", 11F); - btnSaveToDb.Location = new Point(307, 94); + btnSaveToDb.Location = new Point(202, 94); btnSaveToDb.Margin = new Padding(3, 2, 3, 2); btnSaveToDb.Name = "btnSaveToDb"; - btnSaveToDb.Size = new Size(125, 28); + btnSaveToDb.Size = new Size(110, 28); btnSaveToDb.TabIndex = 4; btnSaveToDb.Text = "Spara till DB"; btnSaveToDb.UseVisualStyleBackColor = false; @@ -186,10 +187,10 @@ btnNext.Enabled = false; btnNext.FlatStyle = FlatStyle.Flat; btnNext.Font = new Font("Segoe UI", 11F); - btnNext.Location = new Point(164, 94); + btnNext.Location = new Point(126, 94); btnNext.Margin = new Padding(3, 2, 3, 2); btnNext.Name = "btnNext"; - btnNext.Size = new Size(125, 28); + btnNext.Size = new Size(70, 28); btnNext.TabIndex = 8; btnNext.Text = "Nästa"; btnNext.UseVisualStyleBackColor = false; @@ -224,12 +225,30 @@ btnListNoteDates.UseVisualStyleBackColor = false; btnListNoteDates.Click += btnListNoteDates_Click; // + // btnSaveAllToDB + // + btnSaveAllToDB.BackColor = Color.FromArgb(255, 192, 128); + btnSaveAllToDB.Cursor = Cursors.IBeam; + btnSaveAllToDB.Enabled = false; + btnSaveAllToDB.FlatStyle = FlatStyle.Flat; + btnSaveAllToDB.Font = new Font("Segoe UI", 11F); + btnSaveAllToDB.Location = new Point(318, 94); + btnSaveAllToDB.Margin = new Padding(3, 2, 3, 2); + btnSaveAllToDB.Name = "btnSaveAllToDB"; + btnSaveAllToDB.Size = new Size(114, 28); + btnSaveAllToDB.TabIndex = 11; + btnSaveAllToDB.Text = "Spara Alla"; + btnSaveAllToDB.UseVisualStyleBackColor = false; + btnSaveAllToDB.Visible = false; + btnSaveAllToDB.Click += btnSaveAllToDB_Click; + // // frmStockHistoryInit // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; BackColor = Color.LightGray; ClientSize = new Size(1236, 423); + Controls.Add(btnSaveAllToDB); Controls.Add(btnListNoteDates); Controls.Add(btnDtaAnalyse1); Controls.Add(btnNext); @@ -268,5 +287,6 @@ private Button btnNext; private Button btnDtaAnalyse1; private Button btnListNoteDates; + private Button btnSaveAllToDB; } } \ No newline at end of file diff --git a/StockHistory/frmStockHistoryInit.cs b/StockHistory/frmStockHistoryInit.cs index 2fec8a6..98aea46 100644 --- a/StockHistory/frmStockHistoryInit.cs +++ b/StockHistory/frmStockHistoryInit.cs @@ -1,5 +1,6 @@ using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; +using StockHistory.Forms; using StockHistory.Models; using StockHistory.Services; using System.ComponentModel; @@ -20,6 +21,8 @@ public partial class frmStockHistoryInit : Form private TaskCompletionSource _waiter; private TransactionNote trans = new(); private bool SHB = false; + private bool PDF = false; + private bool MULTIRUN = false; private string pdfFilePath = string.Empty; // Sortering private int _sortColumn = -1; @@ -70,12 +73,14 @@ public partial class frmStockHistoryInit : Form btnAnalysera.Enabled = true; SHB = true; + PDF = true; } else if (lblFileName.Text.Length > 5 && lblFileName.Text.ToLower().EndsWith("csv")) { btnAnalysera.Enabled = true; - SHB = false; + SHB = lblFileName.Text.ToLower().Contains("shbnotor"); + PDF = false; } else { @@ -84,34 +89,104 @@ public partial class frmStockHistoryInit : Form } - private void btnAnalysera_Click(object sender, EventArgs e) + private async void btnAnalysera_Click(object sender, EventArgs e) { string PdfResult = string.Empty; - // if (lblFileName.Text.ToLower().EndsWith("csv")) if (!SHB) { - var Result = string.Empty; //DocoticPdfReading.ExtractText(lblFileName.Text); - SelectAvanzaPdfData(lblFileName.Text); + var Result = string.Empty; + await SelectCsvData(lblFileName.Text); } else { - PdfResult = _pdfFormatter.ExtractFormattedTextUsingWords(_pdfSidor); - SelectPdfData(PdfResult); + if (lblFileName.Text.ToLower().EndsWith("pdf")) + { + PdfResult = _pdfFormatter.ExtractFormattedTextUsingWords(_pdfSidor); + SelectPdfData(PdfResult); + } + else + { + if (lblFileName.Text.ToLower().EndsWith("csv")) + { + await SelectCsvData(lblFileName.Text); + } + } } btnAnalysera.Enabled = false; pdfFilePath = lblFileName.Text; lblFileName.Text = string.Empty; } - private async Task SelectAvanzaPdfData(string infile) + //private async Task SelectSHBCsvData(string infile) + //{ + // txtFound.Text = string.Empty; + + // List result = _handleCsvNotes.GetSHBTransactionNotes(infile); + // txtFound.Refresh(); + // btnNext.Enabled = true; + // btnNext.Visible = true; + // btnNext.Refresh(); + + // await Task.Delay(100); // Liten fördröjning för att säkerställa att UI uppdateras innan vi börjar visa resultaten + + // await ShowListAsync(result); + + // btnNext.Enabled = false; + // btnNext.Visible = false; + // btnNext.Refresh(); + + + //} + + + + //private async Task SelectAvanzaCsvData(string infile) + //{ + // txtFound.Text = string.Empty; + + // List result = _handleCsvNotes.GetTransactionNotes(infile); + // txtFound.Refresh(); + // btnNext.Enabled = true; + // btnNext.Visible = true; + // btnNext.Refresh(); + // btnSaveAllToDB.Enabled = true; + // btnSaveAllToDB.Visible = true; + // btnSaveAllToDB.Refresh(); + + // await Task.Delay(100); // Liten fördröjning för att säkerställa att UI uppdateras innan vi börjar visa resultaten + + // await ShowListAsync(result); + + // btnNext.Enabled = false; + // btnNext.Visible = false; + // btnNext.Refresh(); + // btnSaveAllToDB.Enabled = false; + // btnSaveAllToDB.Visible = true; + // btnSaveAllToDB.Refresh(); + + + //} + + private async Task SelectCsvData(string infile) { txtFound.Text = string.Empty; + List result = new List(); + if (SHB) + { + result = _handleCsvNotes.GetSHBTransactionNotes(infile); + } + else + { + result = _handleCsvNotes.GetTransactionNotes(infile); + } - List result = _handleCsvNotes.GetTransactionNotes(infile); txtFound.Refresh(); btnNext.Enabled = true; btnNext.Visible = true; btnNext.Refresh(); + btnSaveAllToDB.Enabled = true; + btnSaveAllToDB.Visible = true; + btnSaveAllToDB.Refresh(); await Task.Delay(100); // Liten fördröjning för att säkerställa att UI uppdateras innan vi börjar visa resultaten @@ -120,6 +195,9 @@ public partial class frmStockHistoryInit : Form btnNext.Enabled = false; btnNext.Visible = false; btnNext.Refresh(); + btnSaveAllToDB.Enabled = false; + btnSaveAllToDB.Visible = false; + btnSaveAllToDB.Refresh(); } @@ -132,13 +210,27 @@ public partial class frmStockHistoryInit : Form trans = note; - _waiter = new TaskCompletionSource(); + if (!MULTIRUN) + { + _waiter = new TaskCompletionSource(); - await _waiter.Task; // Väntar utan att blockera UI + await _waiter.Task; // Väntar utan att blockera UI + } + else + { + HandleMultiSave(); + } + } + if (MULTIRUN) + { + await LoadBusinessAsync(); + btnSaveAllToDB.BackColor = Color.FromArgb(128, 255, 128); + MULTIRUN = false; } } + private void btnNext_Click(object sender, EventArgs e) { _waiter?.TrySetResult(true); @@ -173,7 +265,7 @@ public partial class frmStockHistoryInit : Form private async void btnSaveToDb_Click(object sender, EventArgs e) { - if (SHB) + if (SHB && PDF) { trans = new(); @@ -259,24 +351,53 @@ public partial class frmStockHistoryInit : Form } } - try + HandleMultiSave(); + await LoadBusinessAsync(); + } + + private async void HandleMultiSave() + { + bool retry = true; + + while (retry) { - await _transactionNotes.AddAsync(trans); - txtFound.Text = string.Empty; - if (SHB) RenameHandledFile(pdfFilePath); - } - catch (DbUpdateException ex) when (ex.InnerException is SqliteException sqlite && sqlite.SqliteErrorCode == 19) - { - MessageBox.Show("Den här transaktionen finns redan."); - } - catch (Exception ex) - { - MessageBox.Show("Fel vid sparande till databas: " + ex.Message); + try + { + await _transactionNotes.AddAsync(trans); + txtFound.Text = string.Empty; + if (SHB && PDF) RenameHandledFile(pdfFilePath); + retry = false; + } + catch (DbUpdateException ex) when (ex.InnerException is SqliteException sqlite && sqlite.SqliteErrorCode == 19) + { + MessageBox.Show("Den här transaktionen finns redan."); + if (!await showChooseIns(trans)) + retry = false; + } + catch (Exception ex) + { + MessageBox.Show("Fel vid sparande till databas: " + ex.Message); + retry = false; + } + } Selected.Clear(); + } + private async Task showChooseIns(TransactionNote localTrans) + { + var result = false; + var jmfPost = await _transactionNotes.GetByIndexAsync(localTrans.StockCode, localTrans.TransactionDate); - await LoadBusinessAsync(); + if (NoWrapMessageBox.Show($"I DB: {jmfPost.ToString()}", $"Nytt: {localTrans.ToString()}") == DialogResult.Yes) + { + DateTime transDatTemp = localTrans.TransactionDate.AddSeconds(5); + localTrans.TransactionDate = transDatTemp; + trans = localTrans; + result = true; + } + + return result; } @@ -352,5 +473,20 @@ public partial class frmStockHistoryInit : Form ); } + private void btnSaveAllToDB_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Multikörning ?", "Transladdning", MessageBoxButtons.OKCancel) != DialogResult.OK) + { + MessageBox.Show("OK, inget händer!!", "Transladdning", MessageBoxButtons.OK); + MULTIRUN = false; + return; + } + else + { + btnSaveAllToDB.BackColor = Color.Red; + MULTIRUN = true; + _waiter?.TrySetResult(true); + } + } }