Add project files.

This commit is contained in:
2022-09-09 11:07:33 +02:00
parent b4ddfa3c2c
commit 36c28196f4
29 changed files with 1083 additions and 0 deletions

View File

@ -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);
}
}
}

View File

@ -0,0 +1,7 @@
namespace LoadStockDbFromTrans.DbInitializers
{
public interface ISqliteDbInitializer
{
void Initialize();
}
}

View File

@ -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<SqliteDbInitializer> _log;
public SqliteDbInitializer(SqliteDbConnectionFactory sqliteDbConnectionFactory, ILogger<SqliteDbInitializer> log)
{
_sqliteDbConnectionFactory = sqliteDbConnectionFactory;
_log = log;
}
public void Initialize()
{
_log.LogInformation(INIT_TABLE);
using (IDbConnection database = _sqliteDbConnectionFactory.Connect())
{
database.Execute(INIT_TABLE);
}
}
}
}

View File

@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.123" />
<PackageReference Include="Microsoft.Data.Sqlite.core" Version="6.0.8" />
<PackageReference Include="SQLitePCLRaw.core" Version="2.1.0" />
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Serilog" Version="2.11.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="5.0.1" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -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<IFileToJson, FileToJson>();
string connectionString = hostContext.Configuration.GetConnectionString("Default");
services.AddSingleton(new SqliteDbConnectionFactory(connectionString));
services.AddSingleton<ISqliteDbInitializer, SqliteDbInitializer>();
services.AddSingleton<IDapperStocksProvider, DapperStocksProvider>();
})
.UseSerilog()
.Build();
var svc = ActivatorUtilities.CreateInstance<FileToJson>(host.Services);
svc.FetchJsonData();
//await svc.StockNameTable();
//foreach (var x in svc.NameConverter)
//{
// Console.WriteLine(x.ToString());
//}
//var sdi = host.Services.GetRequiredService<ISqliteDbInitializer>();
//sdi.Initialize();
//var dsp = host.Services.GetRequiredService<IDapperStocksProvider>();
//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();
}

View File

@ -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<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 == "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<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 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;
}
}
}
}

View File

@ -0,0 +1,12 @@
using LoadStockDbFromTrans.models;
namespace LoadStockDbFromTrans.Runners
{
public interface IFileToJson
{
Dictionary<string, string> NameConverter { get; set; }
Task<List<FileModel>> FetchJsonData();
void UpDateWithSold(FileModel rec);
}
}

View File

@ -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<DapperStocksProvider> _log;
public DapperStocksProvider(SqliteDbConnectionFactory sqliteDbConnectionFactory, ILogger<DapperStocksProvider> 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<IEnumerable<StockMember>> GetAllStocks()
{
using (IDbConnection database = _sqliteDbConnectionFactory.Connect())
{
_log.LogInformation(GET_ALL_STOCKS_SQL);
IEnumerable<StockMember> stockMembers = await database.QueryAsync<StockMember>(GET_ALL_STOCKS_SQL);
return stockMembers.ToList();
}
}
public async Task<IEnumerable<string>> GetStockNames()
{
using (IDbConnection database = _sqliteDbConnectionFactory.Connect())
{
_log.LogInformation("GET_WEB_STOCKNAMES");
IEnumerable<string> stockNames = await database.QueryAsync<string>(GET_WEB_STOCKNAMES);
return stockNames.ToList();
}
}
public async Task<IEnumerable<StockMember>> 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<StockMember> stockMembers = await database.QueryAsync<StockMember>(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<IEnumerable<StockNames>> GetStockNameTable()
{
using (IDbConnection database = _sqliteDbConnectionFactory.Connect())
{
_log.LogInformation("GET_WEB_STOCKNAMES");
IEnumerable<StockNames> stockNames = await database.QueryAsync<StockNames>(GET_WEB_STOCKNAM_FULL);
return stockNames.ToList();
}
}
}
}

View File

@ -0,0 +1,17 @@
using LoadStockDbFromTrans.models;
namespace LoadStockDbFromTrans.StocksProviders
{
public interface IDapperStocksProvider
{
Task AddStock(StockMember stockMember);
Task AddWebStockNames(string stockName);
Task CleanStockNames();
Task<IEnumerable<StockMember>> GetAllStocks();
Task<IEnumerable<string>> GetStockNames();
Task<IEnumerable<StockNames>> GetStockNameTable();
Task<IEnumerable<StockMember>> GetStocksByStockId(string stockId, DateTime Affärsdag);
Task UpdateStock(StockMember stockMember);
Task UpdateStockName(string stockNameBank, string stockNameWeb);
}
}

View File

@ -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"
}
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -0,0 +1,7 @@
namespace LoadStockDbFromTrans.models;
public class LatestSoldStock
{
public decimal SoldStockPrice { get; set; }
public DateTime? LatestSoldDate { get; set; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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; }
//}
}

View File

@ -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; }
}
}