From eac696921ae057e2f368279a48550320917d0ec6 Mon Sep 17 00:00:00 2001 From: "NBJC\\bib" Date: Mon, 2 Sep 2024 13:55:13 +0200 Subject: [PATCH] Fertigstellung - Testing fehlt noch --- .../DesignTimeBuild/.dtbcache.v2 | Bin 105326 -> 121787 bytes .../Projekt_Calcan_Conze/v17/.futdcache.v2 | Bin 505 -> 633 bytes .../.vs/Projekt_Calcan_Conze/v17/.suo | Bin 55296 -> 64000 bytes .../v17/DocumentLayout.json | 4 +- .../Constants.cs | 32 +++- Projekt_Calcan_Conze/Core/Core.csproj | 9 + Projekt_Calcan_Conze/Projekt_Calcan_Conze.sln | 8 +- .../Projekt_Calcan_Conze/DTOs/UserDto.cs | 4 +- .../Projekt_Calcan_Conze/ImportUsers.cs | 3 + .../Projekt_Calcan_Conze/Models/User.cs | 3 + .../Projekt_Calcan_Conze/Program.cs | 1 + .../Projekt_Calcan_Conze_Import.csproj | 4 + .../{Repository => Repositories}/Database.cs | 10 +- .../obj/project.assets.json | 22 ++- .../obj/project.nuget.cache | 2 +- .../Projekt_Calcan_Conze_Export/Constants.cs | 10 -- .../Models/Billing.cs | 6 +- .../Projekt_Calcan_Conze_Export/Program.cs | 43 +++-- .../Projekt_Calcan_Conze_Export.csproj | 8 + .../Repositories/Database.cs | 162 ++++++++++++++++++ 20 files changed, 277 insertions(+), 54 deletions(-) rename Projekt_Calcan_Conze/{Projekt_Calcan_Conze => Core}/Constants.cs (58%) create mode 100644 Projekt_Calcan_Conze/Core/Core.csproj rename Projekt_Calcan_Conze/Projekt_Calcan_Conze/{Repository => Repositories}/Database.cs (98%) delete mode 100644 Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Constants.cs create mode 100644 Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Repositories/Database.cs diff --git a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/DesignTimeBuild/.dtbcache.v2 b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/DesignTimeBuild/.dtbcache.v2 index 995be35bee9433fe743475f6e9cb888f18980b61..708b329c7951ea928e12f704a2056c42151fa302 100644 GIT binary patch literal 121787 zcmeIb2Yeev7C*i#DJBF+p@mK`9fIN>C$z*)@5E^YhagL9TZt?=lAOf!dh`~0@4X%E zXh&}cN9X9hbHKq4=78hi?)QDO`=r&V#8|7`@BjNJ`MkH!+VAe0_jY#5o7tJI*3mR= z;5ehDtL@OS(e7c5v*sSE<0nnqx}hr^2{i_S?M7oPnhb=aiCKYoG8~AE3nT+tzX^dz z!q7IH6^|`3g2@TtXqyr5jEAF1ZA`#0s_KGuRh6SgwN}=*R*b3+L8=(pS~t=NhK$O} zK+C9#%3yuns6e2irFPV)ii-N$irUJ$%0OM9x^kqpiB#Lv9Syd}W6|)zM!Yc=GBi(R zt+qpBEE0jjxt()jNQlwcZUmRk>`HcaCC3?wa9eavxWmvrFhKVb^N}rMs_I$;6|I$( zqpAXR_4O@PE%kMwpb@C6tEp?LsH+||vU*fYFi=-rQ&V3N8r51;9jK|O3mQOGhN>zm z>hvJT;^$SV#%gEF(B+)PRsb5Ii!hXhMqk%{_-XmuQJRGjY>)VEBHf%yT zVkDYFu_W%$oCqy##>M`cii+l@(9%Tn^l&g9OT=1}lo~&NYEH_>ooM#^n*)4n2aH}< zsWK5x_#2zr1MyD(3}j%2`a_Y3=1a!A3~j|4N`eSe#s-Z%%1AR$mi|m=ahXXbQ%| zok{?b-PF{LBDljp$5@F6lz{G>i5X5w*n^m#*a)yvJTqrv zW*co?kwAR>%2c)E&&)U#l#)tfRg|3F>>{Tz*4aHLW>?MOIO^;eo;hqx*CTp0U9cY> z?UX=tF$(y_(_^8oh|xT2dLtE0ON^ySJ}zzyM1nw}F>D{ZNKV8<{8EVl-rq$4&_4MaXwomM8HPke2 zYOZ=!9|f#Fny%R1hK@}njEW+ly*yrAgCCTT6)@NWPm*iuTXxJBQn()B2R} zinpP#$H<0xWW&-v6moV6m{IaAMmdbCyE)dfB(v;88@oN0NcxSHMoF^v{BX3o%0DX} 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 Wy$Rw;SZ_gI3GCZA9^4O;u>KEol=f=? literal 105326 zcmdtL37lJH^*)}Pr0f*RzDg~tl%}(`(?X>))0Vb$qtk_DXvrjZX3}PoX_mIbzJu($ z>>{9oAR-_lCHXEO>VBA(%o!E>zmD{Nt0TdV`fwLFSlYiN zjS$WDUNg3OVLsQN&&@EiiJsJwM4xGlX87(7wB1bQGSTFsXl!+~$6RJ+vWavmYi!M! zy%w9vY>Nbk9nj=cGy;7kn+!2CBMW9O8QYF8#`2$|>~ocX>I0hdiLTB_Di0T( z{WkyE&c1;xQWZz4I@Ots?ZB?FJ*yp9?Fd!sv)-MehSC(NKa1&YhyYwnulmz{w4wAU z{wyACEIqUO(|xq$%#Cog5so(FN1G^zZ1Fdf3g58B-%Kui!xn$jQuv0gU7Tyνa| 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 delta 7302 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 YMpw>1YM4uNA;b^t-_^JZzVT)M276HGI{*Lx diff --git a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json index 8859089..9fb6c65 100644 --- a/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json +++ b/Projekt_Calcan_Conze/.vs/Projekt_Calcan_Conze/v17/DocumentLayout.json @@ -24,9 +24,9 @@ "RelativeDocumentMoniker": "Projekt_Calcan_Conze\\Program.cs", "ToolTip": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze\\Program.cs", "RelativeToolTip": "Projekt_Calcan_Conze\\Program.cs", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAA==", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAA7AAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-08-30T08:39:28.715Z", + "WhenOpened": "2024-09-02T11:44:49.844Z", "EditorCaption": "" } ] diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Constants.cs b/Projekt_Calcan_Conze/Core/Constants.cs similarity index 58% rename from Projekt_Calcan_Conze/Projekt_Calcan_Conze/Constants.cs rename to Projekt_Calcan_Conze/Core/Constants.cs index 3edb462..961b120 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Constants.cs +++ b/Projekt_Calcan_Conze/Core/Constants.cs @@ -1,13 +1,27 @@ -namespace Projekt_Calcan_Conze_Import; +namespace Core; -internal static class Constants +public static class Constants { - public const char Separator = ';'; - public const string FemaleAttributeIdentifier = "Frau"; - public const string MaleAttributeIdentifier = "Herr"; - public const string DiverseAttributeIdentifier = "Divers"; - public const string AddressAttributeIdentifier = "Adresse"; - public const string EmailAttributeIdentifier = "E-Mail"; - public const string PhoneNumberAttributeIdentifier = "Telefon"; + //set the correct values for your server, user, password and database name + public const string ConnectionString = "server=localhost;uid=root;pwd=root;database=import_export"; + public const string DateOfBirthFormat = "dd.MM.yyyy"; + + public const string DateFormat = "yyyy-MM-dd"; + + public const string MoneyFormat = "F3"; + + public const char Separator = ';'; + + public const string FemaleAttributeIdentifier = "Frau"; + + public const string MaleAttributeIdentifier = "Herr"; + + public const string DiverseAttributeIdentifier = "Divers"; + + public const string AddressAttributeIdentifier = "Adresse"; + + public const string EmailAttributeIdentifier = "E-Mail"; + + public const string PhoneNumberAttributeIdentifier = "Telefon"; } \ No newline at end of file diff --git a/Projekt_Calcan_Conze/Core/Core.csproj b/Projekt_Calcan_Conze/Core/Core.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Projekt_Calcan_Conze/Core/Core.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze.sln b/Projekt_Calcan_Conze/Projekt_Calcan_Conze.sln index 4d48572..4a235ca 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze.sln +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze.sln @@ -5,7 +5,9 @@ VisualStudioVersion = 17.10.34916.146 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Projekt_Calcan_Conze_Import", "Projekt_Calcan_Conze\Projekt_Calcan_Conze_Import.csproj", "{44DD7752-6BB5-4C3A-9053-671D8ADE49C4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Projekt_Calcan_Conze_Export", "Projekt_Calcan_Conze_Export\Projekt_Calcan_Conze_Export.csproj", "{9E018F4D-EED3-44D0-9179-E6637B984D74}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Projekt_Calcan_Conze_Export", "Projekt_Calcan_Conze_Export\Projekt_Calcan_Conze_Export.csproj", "{9E018F4D-EED3-44D0-9179-E6637B984D74}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "Core\Core.csproj", "{1A945077-A135-4756-974C-A87109DF411E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +23,10 @@ Global {9E018F4D-EED3-44D0-9179-E6637B984D74}.Debug|Any CPU.Build.0 = Debug|Any CPU {9E018F4D-EED3-44D0-9179-E6637B984D74}.Release|Any CPU.ActiveCfg = Release|Any CPU {9E018F4D-EED3-44D0-9179-E6637B984D74}.Release|Any CPU.Build.0 = Release|Any CPU + {1A945077-A135-4756-974C-A87109DF411E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A945077-A135-4756-974C-A87109DF411E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A945077-A135-4756-974C-A87109DF411E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A945077-A135-4756-974C-A87109DF411E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/DTOs/UserDto.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/DTOs/UserDto.cs index e8e9faf..225dab2 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/DTOs/UserDto.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/DTOs/UserDto.cs @@ -1,4 +1,6 @@ -namespace Projekt_Calcan_Conze_Import.DTOs; +using Projekt_Calcan_Conze_Import.DTOs; + +namespace Projekt_Calcan_Conze_Import.DTOs; internal class UserDto { diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/ImportUsers.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/ImportUsers.cs index 7e82111..ce310e8 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/ImportUsers.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/ImportUsers.cs @@ -1,7 +1,10 @@ using System.Net.Mail; +using Core; + using Projekt_Calcan_Conze_Import.DTOs; using Projekt_Calcan_Conze_Import.Models; +using Projekt_Calcan_Conze_Import.DTOs; using Projekt_Calcan_Conze_Import.Models; namespace Projekt_Calcan_Conze_Import; diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Models/User.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Models/User.cs index 9cba554..bb5aea8 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Models/User.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Models/User.cs @@ -1,5 +1,8 @@ using System.Text; +using Core; +using Projekt_Calcan_Conze_Import.Models; + namespace Projekt_Calcan_Conze_Import.Models; internal class User diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs index 48c480d..4b467f0 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Program.cs @@ -1,5 +1,6 @@ using Projekt_Calcan_Conze_Import; using Projekt_Calcan_Conze_Import.Repositories; +using Projekt_Calcan_Conze_Import; try { diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Import.csproj b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Import.csproj index e92aac5..21db241 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Import.csproj +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Import.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Repository/Database.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Repositories/Database.cs similarity index 98% rename from Projekt_Calcan_Conze/Projekt_Calcan_Conze/Repository/Database.cs rename to Projekt_Calcan_Conze/Projekt_Calcan_Conze/Repositories/Database.cs index 322c1d0..7ed4485 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Repository/Database.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/Repositories/Database.cs @@ -1,16 +1,18 @@ using System.Data; +using Core; + using Projekt_Calcan_Conze_Import.DTOs; using Projekt_Calcan_Conze_Import.Models; namespace Projekt_Calcan_Conze_Import.Repositories; using MySql.Data.MySqlClient; +using Projekt_Calcan_Conze_Import.DTOs; +using Projekt_Calcan_Conze_Import.Models; internal static class Database { - //set the correct values for your server, user, password and database name - private const string ConnectionString = "server=localhost;uid=root;pwd=root;database=import_export"; public static async Task> GetUserIdentifiers(string clientNumber) { @@ -19,7 +21,7 @@ internal static class Database try { // use "using" to automatically close the connection when done - await using var dbConnection = new MySqlConnection(ConnectionString); + await using var dbConnection = new MySqlConnection(Constants.ConnectionString); // open a connection await dbConnection.OpenAsync(); @@ -67,7 +69,7 @@ internal static class Database { try { - await using var dbConnection = new MySqlConnection(ConnectionString); + await using var dbConnection = new MySqlConnection(Constants.ConnectionString); await dbConnection.OpenAsync(); var transaction = await dbConnection.BeginTransactionAsync(); diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json index f125653..19af514 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.assets.json @@ -535,6 +535,16 @@ "runtime": { "lib/net7.0/ZstdSharp.dll": {} } + }, + "Core/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "compile": { + "bin/placeholder/Core.dll": {} + }, + "runtime": { + "bin/placeholder/Core.dll": {} + } } } }, @@ -1778,10 +1788,16 @@ "zstdsharp.port.0.7.1.nupkg.sha512", "zstdsharp.port.nuspec" ] + }, + "Core/1.0.0": { + "type": "project", + "path": "../Core/Core.csproj", + "msbuildProject": "../Core/Core.csproj" } }, "projectFileDependencyGroups": { "net8.0": [ + "Core >= 1.0.0", "MySql.Data >= 8.4.0" ] }, @@ -1811,7 +1827,11 @@ "frameworks": { "net8.0": { "targetAlias": "net8.0", - "projectReferences": {} + "projectReferences": { + "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Core\\Core.csproj": { + "projectPath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Core\\Core.csproj" + } + } } }, "warningProperties": { diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache index 4ffd075..0077d92 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze/obj/project.nuget.cache @@ -1,6 +1,6 @@ { "version": 2, - "dgSpecHash": "xTy/jRXZQLw=", + "dgSpecHash": "4Akg//gURuM=", "success": true, "projectFilePath": "C:\\Jan_bib_Module\\PMC\\Projekt\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze\\Projekt_Calcan_Conze_Import.csproj", "expectedPackageFiles": [ diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Constants.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Constants.cs deleted file mode 100644 index a2ab145..0000000 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Constants.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Projekt_Calcan_Conze_Export; - -internal static class Constants -{ - public const string DateFormat = "yyyy-MM-dd"; - - public const string Separator = ";"; - - public const string MoneyFormat = "F2"; -} \ No newline at end of file diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Models/Billing.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Models/Billing.cs index fb0b4c0..10edb12 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Models/Billing.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Models/Billing.cs @@ -1,4 +1,6 @@ -namespace Projekt_Calcan_Conze_Export.Models; +using Core; + +namespace Projekt_Calcan_Conze_Export.Models; internal class Billing { @@ -74,7 +76,7 @@ internal class BillingPosition public double BaseAmount { get; } - public int Count { get; } + public int Count { get; set; } public double TotalAmount => this.BaseAmount * this.Count; } \ No newline at end of file diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Program.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Program.cs index 03edec9..89d6ff0 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Program.cs +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Program.cs @@ -1,8 +1,9 @@ using System.Globalization; -using Projekt_Calcan_Conze_Export; -using Projekt_Calcan_Conze_Export.Models; -using Microsoft.VisualBasic; +using Core; + +using Projekt_Calcan_Conze_Export.Repositories; +using Projekt_Calcan_Conze_Export.Repositories; try { @@ -83,26 +84,22 @@ try } } - List billings = - [ - new Billing( - startDate: startDate.Value, - endDate: endDate.Value, - customerNumber: clientNumber, - customerName: "Max Mustermann", - positions: - [ - new BillingPosition( - description: "Testposition", - baseAmount: 100.0, - count: 3) - ]) - ]; - string fileName = - $"{DateTime.Today.ToString(Constants.DateFormat)}_{clientNumber}_{startDate.Value.ToString(Constants.DateFormat)}_{endDate.Value.ToString(Constants.DateFormat)}.csv"; - File.WriteAllLines( - Path.Combine(directoryPath, fileName), - billings.SelectMany(billing => billing.ToCsvLines())); + Console.WriteLine(); + + var billing = await Database.CreateBilling(startDate.Value, endDate.Value, clientNumber); + + if (billing is null) + { + Console.WriteLine("Es konnte keine Rechnung erstellt werden."); + } + else + { + string fileName = + $"{DateTime.Today.ToString(Constants.DateFormat)}_{clientNumber}_{startDate.Value.ToString(Constants.DateFormat)}_{endDate.Value.ToString(Constants.DateFormat)}.csv"; + string filePath = Path.Combine(directoryPath, fileName); + File.WriteAllLines(filePath, billing.ToCsvLines()); + Console.WriteLine($"Die Rechnung wurde unter \"{filePath}\" abgelegt."); + } } catch (Exception ex) { diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Projekt_Calcan_Conze_Export.csproj b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Projekt_Calcan_Conze_Export.csproj index 2150e37..b4cb502 100644 --- a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Projekt_Calcan_Conze_Export.csproj +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Projekt_Calcan_Conze_Export.csproj @@ -7,4 +7,12 @@ enable + + + + + + + + diff --git a/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Repositories/Database.cs b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Repositories/Database.cs new file mode 100644 index 0000000..ff53824 --- /dev/null +++ b/Projekt_Calcan_Conze/Projekt_Calcan_Conze_Export/Repositories/Database.cs @@ -0,0 +1,162 @@ +using System.Data; + +using Core; + +using Projekt_Calcan_Conze_Export.Models; + +using MySql.Data.MySqlClient; +using Projekt_Calcan_Conze_Export.Models; + +namespace Projekt_Calcan_Conze_Export.Repositories; + +internal static class Database +{ + public static async Task CreateBilling(DateOnly startDate, DateOnly endDate, string customerNumber) + { + Billing? billing = null; + + try + { + await using var dbConnection = new MySqlConnection(Constants.ConnectionString); + await dbConnection.OpenAsync(); + var transaction = await dbConnection.BeginTransactionAsync(); + + try + { + // ensure wasBilled column exists and activityDateTime does not refresh on update + var createWasBilledColumnCommand = + new MySqlCommand + { + Connection = dbConnection, + Transaction = transaction, + CommandText = + """ + ALTER TABLE activity ADD IF NOT EXISTS wasBilled BIT NOT NULL DEFAULT 0; + ALTER TABLE activity CHANGE COLUMN activityDatetime activityDatetime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; + ALTER TABLE activity ALTER COLUMN activityDatetime DROP DEFAULT; + """ + }; + await createWasBilledColumnCommand.ExecuteNonQueryAsync(); + + // tables: activityType, activity, contract, user, client + // one activityType can be assigned to multiple contracts, one contract has one activityType + // one contract can have multiple activities, one activity belongs to one contract + // one activity has one user, one user can have multiple activities + // one user belongs to one client, one client can have multiple users + // one contract belongs to one client, one client can have multiple contracts + // get all contracts of the client by the client number and the start and end date + // include all activities of the contracts + // include the client name (column of client table) + // only get activities that were not billed yet (wasBilled = 0) + var getActivities = + new MySqlCommand + { + Connection = dbConnection, + Transaction = transaction, + CommandText = + """ + SELECT + activity.id, + activity.contractId, + contract.amount, + contract.description + FROM activity + JOIN contract ON activity.contractId = contract.id + JOIN activityType ON contract.activityTypeId = activityType.id + JOIN user ON activity.userId = user.id + JOIN client ON contract.clientId = client.id + WHERE client.clientno = @clientNumber + AND activity.activityDateTime >= @startDate + AND activity.activityDateTime <= @endDate + AND activity.wasBilled = 0 + """ + }; + getActivities.Parameters.AddWithValue("@clientNumber", customerNumber); + getActivities.Parameters.AddWithValue("@startDate", startDate.ToString("yyyy-MM-dd")); + getActivities.Parameters.AddWithValue("@endDate", endDate.ToString("yyyy-MM-dd")); + + await using var activityReader = await getActivities.ExecuteReaderAsync(); + Dictionary positions = []; + List activityIds = []; + + while (await activityReader.ReadAsync()) + { + activityIds.Add(activityReader.GetInt32("id")); + int contractId = activityReader.GetInt32("contractId"); + + if (positions.TryGetValue(contractId, out var positionDto)) + { + positionDto.Count++; + } + else + { + positions[contractId] = + new BillingPosition( + description: activityReader.GetString("description"), + baseAmount: activityReader.GetDouble("amount"), + count: 1); + } + } + + await activityReader.CloseAsync(); + + // get the customer name separately in case we have no activities + + var getCustomerNameCommand = + new MySqlCommand + { + Connection = dbConnection, + Transaction = transaction, + CommandText = + """ + SELECT name + FROM client + WHERE clientno = @clientNumber + """ + }; + getCustomerNameCommand.Parameters.AddWithValue("@clientNumber", customerNumber); + + string customerName = await getCustomerNameCommand.ExecuteScalarAsync() as string ?? string.Empty; + + billing = + new Billing( + startDate: startDate, + endDate: endDate, + customerNumber: customerNumber, + customerName: customerName, + positions: positions.Values.ToList()); + + // set wasBilled to 1 for all retrieved activities + + string activityIdsString = string.Join(',', activityIds.Select((_, i) => $"@activityId{i}")); + var updateWasBilledCommand = + new MySqlCommand + { + Connection = dbConnection, + Transaction = transaction, + CommandText = $"UPDATE activity SET wasBilled = 1 WHERE id IN ({activityIdsString})" + }; + + for (int i = 0; i < activityIds.Count; i++) + { + updateWasBilledCommand.Parameters.AddWithValue($"@activityId{i}", activityIds[i]); + } + + await updateWasBilledCommand.ExecuteNonQueryAsync(); + } + catch (Exception) + { + await transaction.RollbackAsync(); + throw; + } + + await transaction.CommitAsync(); + } + catch (Exception ex) + { + Console.WriteLine("An error occurred while writing to or reading from the database: " + ex.Message); + } + + return billing; + } +} \ No newline at end of file