Add project files.

This commit is contained in:
2023-05-30 12:48:53 +02:00
parent e85e310884
commit ced65ad4b7
26 changed files with 1024 additions and 0 deletions

25
MyYearlyCountings.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33627.172
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MyYearlyCountings", "MyYearlyCountings\MyYearlyCountings.csproj", "{8C92891D-C347-4A5C-AAE4-D50F705F00A4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8C92891D-C347-4A5C-AAE4-D50F705F00A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8C92891D-C347-4A5C-AAE4-D50F705F00A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8C92891D-C347-4A5C-AAE4-D50F705F00A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8C92891D-C347-4A5C-AAE4-D50F705F00A4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {305DAD26-537A-41D7-9A94-9B4911FAF44A}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,26 @@

using Microsoft.Extensions.Configuration;
using MyYearlyCountings.Models;
namespace MyYearlyCountings.Data;
public class DataContext : DbContext
{
private readonly IConfiguration _configuration;
public DataContext(DbContextOptions<DataContext> options, IConfiguration configuration) : base(options)
{
_configuration = configuration;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder
.UseSqlite(_configuration.GetConnectionString("DefaultConnection"));
}
public DbSet<Member> Members { get; set; }
public DbSet<AccountRecord> AccountRecords { get; set; }
}

View File

@ -0,0 +1,8 @@
namespace MyYearlyCountings.Facades
{
public interface IReadingIn
{
bool ReadAndSaveInvoices(string fullFileName);
IEnumerable<AccountRecord> ReadExcelInvoices(string fullFileName);
}
}

View File

@ -0,0 +1,159 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MyYearlyCountings.Helpers;
using MyYearlyCountings.Repositories;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
namespace MyYearlyCountings.Facades;
public class ReadingIn : IReadingIn
{
private readonly IConfiguration _configuration;
private readonly ILogger<ReadingIn> _logger;
private readonly IAccountRecordRepository _accountRecordRepository;
public ReadingIn(
IConfiguration configuration,
ILogger<ReadingIn> logger,
IAccountRecordRepository accountRecordRepository)
{
_configuration = configuration;
_logger = logger;
_accountRecordRepository = accountRecordRepository;
}
// @"C:\dev\MyYearlyCountings\TransactionsTest.xls"
public IEnumerable<AccountRecord> ReadExcelInvoices(string fullFileName)
{
List<AccountRecord> records = new List<AccountRecord>();
AccountRecord? record = null;
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(fullFileName);
Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange;
var rowCount = xlRange.Rows.Count;
var colCount = xlRange.Columns.Count;
var prt = false;
//iterate over the rows and columns and print to the console as it appears in the file
//excel is not zero based!!
for (int i = 1; i <= rowCount; i++)
{
for (int j = 1; j <= colCount; j++)
{
//new line
if (j == 1)
{
if (prt)
{
Console.Write("\r\n");
records.Add(record);
}
prt = false;
}
//write the value to the console
if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
{
string xx = xlRange.Cells[i, j].Value2.ToString();
if ((j == 1) && xx.IsNumeric())
{
DateTime dt = DateTime.FromOADate(xlRange.Cells[i, j].Value2);
prt = true;
if (prt)
{
Console.Write(dt.ToShortDateString() + "\t");
record = new AccountRecord();
record.BetalDatum = dt;
}
}
else
{
if (prt)
{
Console.Write(xlRange.Cells[i, j].Value2.ToString() + "\t");
switch (j)
{
case 3:
{
record.Mottagare = xlRange.Cells[i, j].Value2.ToString();
break;
}
case 5:
{
record.Konto = xlRange.Cells[i, j].Value2.ToString();
break;
}
case 7:
{
record.Belopp = xlRange.Cells[i, j].Value2;
break;
}
case 9:
{
record.Avisering = xlRange.Cells[i, j].Value2.ToString();
break;
}
}
}
}
}
//add useful things here!
}
}
//cleanup
GC.Collect();
GC.WaitForPendingFinalizers();
//rule of thumb for releasing com objects:
// never use two dots, all COM objects must be referenced and released individually
// ex: [somthing].[something].[something] is bad
//release com objects to fully kill excel process from running in the background
Marshal.ReleaseComObject(xlRange);
Marshal.ReleaseComObject(xlWorksheet);
//close and release
xlWorkbook.Close();
Marshal.ReleaseComObject(xlWorkbook);
//quit and release
xlApp.Quit();
Marshal.ReleaseComObject(xlApp);
return records;
}
public bool ReadAndSaveInvoices(string fullFileName)
{
var result = true;
var restab = ReadExcelInvoices(fullFileName);
if (restab != null)
{
try
{
restab.ToList().ForEach(x => {
_accountRecordRepository.AddAccountRecord(x);
});
// restab.ToList().ForEach(x => { _accountRecordRepository.AddAccountRecord(x); });
}
catch (Exception ex)
{
_logger.LogError($"MassUppdatering misslyckat: {ex.Message}");
result = false;
}
}
return result;
}
}

View File

@ -0,0 +1,14 @@
namespace MyYearlyCountings.Helpers;
public static class Extensions
{
public static bool IsNumeric(this string value)
{
if (!string.IsNullOrEmpty(value))
{
if (value.All(char.IsDigit)) return true;
else return false;
}
else return false;
}
}

BIN
MyYearlyCountings/Local.db Normal file

Binary file not shown.

View File

@ -0,0 +1,81 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using MyYearlyCountings.Data;
#nullable disable
namespace MyYearlyCountings.Migrations
{
[DbContext(typeof(DataContext))]
[Migration("20230526154227_Initial")]
partial class Initial
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "7.0.5");
modelBuilder.Entity("MyYearlyCountings.Models.AccountRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Avisering")
.IsRequired()
.HasColumnType("TEXT");
b.Property<double>("Belopp")
.HasColumnType("REAL");
b.Property<DateTime>("BetalDatum")
.HasColumnType("TEXT");
b.Property<string>("Konto")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("Mottagare")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("AccountRecords");
});
modelBuilder.Entity("MyYearlyCountings.Models.Member", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("NickName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("PersonType")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Members");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,58 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MyYearlyCountings.Migrations
{
/// <inheritdoc />
public partial class Initial : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "AccountRecords",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
BetalDatum = table.Column<DateTime>(type: "TEXT", nullable: false),
Mottagare = table.Column<string>(type: "TEXT", nullable: false),
Konto = table.Column<string>(type: "TEXT", nullable: false),
Belopp = table.Column<double>(type: "REAL", nullable: false),
Avisering = table.Column<string>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AccountRecords", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Members",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
FirstName = table.Column<string>(type: "TEXT", nullable: false),
LastName = table.Column<string>(type: "TEXT", nullable: false),
NickName = table.Column<string>(type: "TEXT", nullable: false),
PersonType = table.Column<string>(type: "TEXT", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Members", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "AccountRecords");
migrationBuilder.DropTable(
name: "Members");
}
}
}

View File

@ -0,0 +1,78 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using MyYearlyCountings.Data;
#nullable disable
namespace MyYearlyCountings.Migrations
{
[DbContext(typeof(DataContext))]
partial class DataContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "7.0.5");
modelBuilder.Entity("MyYearlyCountings.Models.AccountRecord", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Avisering")
.IsRequired()
.HasColumnType("TEXT");
b.Property<double>("Belopp")
.HasColumnType("REAL");
b.Property<DateTime>("BetalDatum")
.HasColumnType("TEXT");
b.Property<string>("Konto")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("Mottagare")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("AccountRecords");
});
modelBuilder.Entity("MyYearlyCountings.Models.Member", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("NickName")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("PersonType")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Members");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyYearlyCountings.Models
{
public class AccountRecord
{
public int Id { get; set; }
public DateTime BetalDatum { get; set; } = DateTime.MinValue;
public string Mottagare { get; set; } = string.Empty;
public string Konto { get; set; } = string.Empty;
public double Belopp { get; set;}
public string Avisering { get; set; } = string.Empty;
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyYearlyCountings.Models;
public class Member
{
public int Id { get; set; }
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
public string NickName { get; set; } = string.Empty;
public string PersonType { get; set; } = string.Empty;
}

View File

@ -0,0 +1,58 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AssemblyName>MyYearlyCountings</AssemblyName>
<RootNamespace>MyYearlyCountings</RootNamespace>
</PropertyGroup>
<ItemGroup>
<COMReference Include="Microsoft.Office.Interop.Excel">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>9</VersionMinor>
<VersionMajor>1</VersionMajor>
<Guid>00020813-0000-0000-c000-000000000046</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
<EmbedInteropTypes>true</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<None Update="appsettings.Production.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="appsettings.Development.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Local.db">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="Migrations\" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,39 @@
// See https://aka.ms/new-console-template for more information
global using MyYearlyCountings.Models;
global using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MyYearlyCountings.Repositories;
using MyYearlyCountings.Data;
using MyYearlyCountings.Facades;
IHost host = CreateHostBuilder(args).Build();
var worker = ActivatorUtilities.CreateInstance<Worker>((IServiceProvider)host.Services);
worker.Run();
static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, configuration) =>
{
configuration.Sources.Clear();
var environmentName = Environment.GetEnvironmentVariable("DOTNETCORE_ENVIRONMENT");
configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
configuration.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true);
configuration.AddCommandLine(args);
})
.ConfigureServices((context, services) =>
{
services.AddScoped<ISampleRepository, SampleRepository>();
services.AddScoped<IMemberRepository, MemberRepository>();
services.AddScoped<IAccountRecordRepository, AccountRecordRepository>();
services.AddScoped<IReadingIn, ReadingIn>();
services.AddDbContext<DataContext>();
});
}

View File

@ -0,0 +1,18 @@
{
"profiles": {
"StandardConsole": {
"commandName": "Project",
"commandLineArgs": "key1=val1 key2=val2 UI=XLS",
"environmentVariables": {
"DOTNETCORE_ENVIRONMENT": "Development"
}
},
"ProductVersion": {
"commandName": "Project",
"commandLineArgs": "key1=val1 key2=val2",
"environmentVariables": {
"DOTNETCORE_ENVIRONMENT": "Production"
}
}
}
}

View File

@ -0,0 +1,57 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MyYearlyCountings.Data;
using System.Reflection;
namespace MyYearlyCountings.Repositories;
public class AccountRecordRepository : IAccountRecordRepository
{
private readonly DataContext _dataContext;
private readonly IConfiguration _configuration;
private readonly ILogger<MemberRepository> _logger;
public AccountRecordRepository(DataContext dataContext, IConfiguration configuration, ILogger<MemberRepository> logger)
{
_dataContext = dataContext;
_configuration = configuration;
_logger = logger;
}
public bool AddAccountRecord(AccountRecord record)
{
try
{
_dataContext.AccountRecords.Add(record);
_dataContext.SaveChanges();
return true;
}
catch (Exception e)
{
_logger.LogError($"Error occured in AddAccountRecord :{e.Message}");
}
return false;
}
public bool DeleteAccountRecord(AccountRecord record)
{
try
{
_dataContext.AccountRecords.Remove(record);
_dataContext.SaveChanges();
return true;
}
catch (Exception e)
{
_logger.LogError($"Error occured in DeleteAccountRecord :{e.Message}");
}
return false;
}
public IEnumerable<AccountRecord> GetAllAccounts()
{
return _dataContext.AccountRecords;
}
}

View File

@ -0,0 +1,9 @@
namespace MyYearlyCountings.Repositories
{
public interface IAccountRecordRepository
{
bool AddAccountRecord(AccountRecord record);
bool DeleteAccountRecord(AccountRecord record);
IEnumerable<AccountRecord> GetAllAccounts();
}
}

View File

@ -0,0 +1,9 @@
using MyYearlyCountings.Models;
namespace MyYearlyCountings.Repositories
{
public interface IMemberRepository
{
IEnumerable<Member> InsertMember(Member member);
}
}

View File

@ -0,0 +1,7 @@
namespace MyYearlyCountings.Repositories
{
public interface ISampleRepository
{
void DoSomething();
}
}

View File

@ -0,0 +1,33 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MyYearlyCountings.Data;
using MyYearlyCountings.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyYearlyCountings.Repositories;
public class MemberRepository : IMemberRepository
{
private readonly DataContext _dataContext;
private readonly IConfiguration _configuration;
private readonly ILogger _logger;
public MemberRepository(DataContext dataContext, IConfiguration configuration, ILogger<MemberRepository> logger)
{
_dataContext = dataContext;
_configuration = configuration;
_logger = logger;
}
public IEnumerable<Member> InsertMember(Member member)
{
_dataContext.Members.Add(member);
_dataContext.SaveChanges();
return _dataContext.Members.ToArray();
}
}

View File

@ -0,0 +1,28 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyYearlyCountings.Repositories;
public class SampleRepository : ISampleRepository
{
private readonly IConfiguration _configuration;
private readonly ILogger<SampleRepository> _logger;
public void DoSomething()
{
_logger.LogInformation($"{nameof(SampleRepository)}.Dosomething - just did something");
var connString = _configuration.GetConnectionString("DefaultConnection");
_logger.LogInformation($"The Connection string from Sample Repository: {connString}");
}
public SampleRepository(IConfiguration configuration, ILogger<SampleRepository> logger)
{
_configuration = configuration;
_logger = logger;
}
}

View File

@ -0,0 +1,23 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyYearlyCountings.UI
{
public class KeyHandling
{
private readonly IConfiguration _configuration;
private readonly ILogger<KeyHandling> _logger;
public KeyHandling(IConfiguration configuration, ILogger<KeyHandling> logger)
{
_configuration = configuration;
_logger = logger;
}
}
}

View File

@ -0,0 +1,66 @@
// See https://aka.ms/new-console-template for more information
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using MyYearlyCountings.Facades;
using MyYearlyCountings.Repositories;
public class Worker
{
private readonly IConfiguration _configuration;
private readonly ILogger<Worker> _logger;
private readonly ISampleRepository _sampleRepository;
private readonly IMemberRepository _memberRepository;
private readonly IAccountRecordRepository _accountRecordRepository;
private readonly IReadingIn _readingIn;
public Worker(IConfiguration configuration,
ILogger<Worker> logger,
ISampleRepository sampleRepository,
IMemberRepository memberRepository,
IAccountRecordRepository accountRecordRepository,
IReadingIn readingIn)
{
_configuration = configuration;
_logger = logger;
_sampleRepository = sampleRepository;
_memberRepository = memberRepository;
_accountRecordRepository = accountRecordRepository;
_readingIn = readingIn;
}
public void Run()
{
if (_configuration["UI"] == "NO") {
_logger.LogInformation("Hello, world!!!");
var connString = _configuration.GetConnectionString("DefaultConnection");
_logger.LogInformation($"Connection string: {connString}");
_logger.LogInformation($"key1: {_configuration["key1"]}");
_logger.LogInformation($"key2: {_configuration["key2"]}");
_sampleRepository.DoSomething();
}
else
{
if (_configuration["UI"] == "XLS")
{
if (!_readingIn.ReadAndSaveInvoices(@"C:\dev\MyYearlyCountings\TransactionsTest.xls"))
{
var resUlt = _readingIn.ReadExcelInvoices(@"C:\dev\MyYearlyCountings\TransactionsTest.xls");
resUlt.ToList().ForEach(rec => _logger.LogInformation($"Konto :{rec.Konto}, {rec.Belopp}"));
}
}
else
{
var ar = new AccountRecord { Konto = "BG 0867-4533", Mottagare = "NoOne", Belopp = 1270.34, BetalDatum = DateTime.Now.AddDays(10), Avisering = "Efaktura" };
if (_accountRecordRepository.AddAccountRecord(ar))
{
var records = _accountRecordRepository.GetAllAccounts();
records.ToList().ForEach(rec => _logger.LogInformation($"Konto :{rec.Konto}, {rec.Belopp}"));
}
var member = new Member { FirstName = "Per", LastName = "Persson", NickName = "Peppe", PersonType = "Kontohavare" };
var members = _memberRepository.InsertMember(member);
members.ToList().ForEach(member => _logger.LogInformation($"medlem: {member.FirstName}, {member.LastName} "));
}
}
}
}

View File

@ -0,0 +1,5 @@
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=.\\Local.db"
}
}

View File

@ -0,0 +1,5 @@
{
"ConnectionStrings": {
"DefaultConnection": "Server=Prodserver;Database=ProdDb;User Id==MeMyselfAndI;Password=SuperSecret"
}
}

View File

@ -0,0 +1,5 @@
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=.\\Local.db"
}
}

177
TransactionsTest.xls Normal file
View File

@ -0,0 +1,177 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<style type="text/css">
.personInfo {
font-size: 10pt;
font-weight: bold;
}
.SHBHeader {
font-weight: bold;
}
.eventSum {
font-weight: bold;
}
.colBelopp, .totalSeparatorExcel, .amountSeparatorExcel {
mso-number-format: #\ ##0\.00;
}
</style>
</HEAD>
<BODY>
<span class="person">
<table border="0" cellpadding="0" cellspacing="0" width="585">
<tbody>
<tr><td colspan="9" nowrap>
<span class="personInfo">
Period:&nbsp;2023-05-29&nbsp;till&nbsp;2023-07-13
&nbsp;
Trans.typ:&nbsp;Alla
&nbsp;
Person:&nbsp;TOMMY <20>MAN
&nbsp;
Antal transaktioner:&nbsp;9
</span>
</td></tr>
</tbody>
</table>
<table class="eventTable" border="0" cellpadding="0" cellspacing="0" width="585">
<tbody>
<tr class="groupSeparator"><td colspan="9"></td></tr>
<tr class="groupHeader"><td colspan="9">
<b>
Maj
&nbsp;&nbsp;&nbsp;
R<>kningar o L<>n 256 658 498
</b>
&nbsp;&nbsp;&nbsp;&nbsp;
<b>Disponibelt belopp:
&nbsp;19 165,19
</b>
</td></tr>
<TR><TD class="SHBHeader">Datum</TD><TD width="5" class="SHBHeader">&nbsp;</TD><TD class="SHBHeader">Mottagare</TD><TD width="5" class="SHBHeader">&nbsp;</TD><TD class="SHBHeader">Konto</TD><TD width="5" class="SHBHeader">&nbsp;</TD><TD align="right" class="SHBHeader">Belopp</TD><TD width="5" class="SHBHeader">&nbsp;</TD><TD class="SHBHeader">Avisering</TD></TR>
<TR><TD height="15" align="left">2023-05-30</TD><TD>&nbsp;</TD><TD align="left">ST1 FINANCE MASTERCARD</TD><TD>&nbsp;</TD><TD align="left">PG 4779504-2</TD><TD>&nbsp;</TD><TD align="right" class="colBelopp">2 240,79</TD><TD>&nbsp;</TD><TD nowrap>E-faktura</TD></TR>
<TR BGCOLOR="#F0F0F0"><TD height="15" align="left">2023-05-31</TD><TD>&nbsp;</TD><TD align="left">ECSTER - KONTO OCH KORT</TD><TD>&nbsp;</TD><TD align="left">Bg 847-2425</TD><TD>&nbsp;</TD><TD align="right" class="colBelopp">2 358,00</TD><TD>&nbsp;</TD><TD nowrap>E-faktura</TD></TR>
<TR><TD height="15" align="left">2023-05-31</TD><TD>&nbsp;</TD><TD align="left">TRANSPORTSTYRELSEN FORDONSSKATT</TD><TD>&nbsp;</TD><TD align="left">Bg 5051-6822</TD><TD>&nbsp;</TD><TD align="right" class="colBelopp">3 636,00</TD><TD>&nbsp;</TD><TD nowrap>E-faktura</TD></TR>
<TR BGCOLOR="#F0F0F0"><TD height="15" align="left">2023-05-31</TD><TD>&nbsp;</TD><TD align="left">VERISURE SVERIGE</TD><TD>&nbsp;</TD><TD align="left">PG 4784604-3</TD><TD>&nbsp;</TD><TD align="right" class="colBelopp">1 978,00</TD><TD>&nbsp;</TD><TD nowrap>E-faktura</TD></TR>
<tr><td height="4" colspan="9"></td></tr>
<tr class="groupFooter">
<td colspan="6">
<b>Totalt</b>
</td>
<td align="right" class="amountSeparatorExcel"><b><b>10 212,79</b></b></td>
<td colspan="2">&nbsp;</td>
</tr>
<tr class="groupHeader"><td colspan="9" class="monthSeparator">
<b>
Juni
</b>
</td></tr>
<TR><TD height="15" align="left">2023-06-01</TD><TD width="5">&nbsp;</TD><TD align="left">STADSHYPOTEK</TD><TD width="5">&nbsp;</TD><TD align="left">HS 10272130</TD><TD width="5">&nbsp;</TD><TD align="right" class="colBelopp">6 778,00</TD><TD width="5">&nbsp;</TD><TD nowrap>L<>neavi</TD></TR>
<TR BGCOLOR="#F0F0F0"><TD height="15" align="left">2023-06-05</TD><TD width="5">&nbsp;</TD><TD align="left">IF SKADEF<45>RS<52>KRING AB</TD><TD width="5">&nbsp;</TD><TD align="left">Bg 5270-6009</TD><TD width="5">&nbsp;</TD><TD align="right" class="colBelopp">71,00</TD><TD width="5">&nbsp;</TD><TD nowrap>E-faktura</TD></TR>
<TR><TD height="15" align="left">2023-06-07</TD><TD width="5">&nbsp;</TD><TD align="left">ERIKS F<>NSTERPUTS</TD><TD width="5">&nbsp;</TD><TD align="left">Bg 5787-1030</TD><TD width="5">&nbsp;</TD><TD align="right" class="colBelopp">1 066,00</TD><TD width="5">&nbsp;</TD><TD nowrap>E-faktura</TD></TR>
<TR BGCOLOR="#F0F0F0"><TD height="15" align="left">2023-06-12</TD><TD width="5">&nbsp;</TD><TD align="left">AMERICAN EXPRESS 3757</TD><TD width="5">&nbsp;</TD><TD align="left">Bg 730-8596</TD><TD width="5">&nbsp;</TD><TD align="right" class="colBelopp">276,00</TD><TD width="5">&nbsp;</TD><TD nowrap>E-faktura</TD></TR>
<TR><TD height="15" align="left">2023-06-22</TD><TD width="5">&nbsp;</TD><TD align="left">SVEA EKONOMI AB</TD><TD width="5">&nbsp;</TD><TD align="left">PG 4163600-2</TD><TD width="5">&nbsp;</TD><TD align="right" class="colBelopp">218,00</TD><TD width="5">&nbsp;</TD><TD nowrap>&nbsp;</TD></TR>
<tr><td height="4" colspan="9"></td></tr>
<tr class="groupFooter">
<td colspan="6">
<b>Totalt</b>
</td>
<td align="right" class="amountSeparatorExcel"><b><b>8 409,00</b></b></td>
<td colspan="2">&nbsp;</td>
</tr>
</span>
</tbody>
</table>
</BODY>
</HTML>