From c7d4307f473e152a76c1bc012d95d9e57c1ed32a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tommy=20=C3=96man?= Date: Wed, 22 May 2024 11:10:37 +0200 Subject: [PATCH] =?UTF-8?q?Inf=C3=B6rande=20av=20repository=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Accounting.BLI/Accounting.BLI.csproj | 13 ++ Accounting.BLI/IAccountRecords.cs | 16 ++ Accounting.BLI/IExcellent.cs | 13 ++ Accounting.BLI/IReadingIn.cs | 11 ++ Accounting.BLR/AccountRecords.cs | 139 ++++++++++++++ Accounting.BLR/Accounting.BLR.csproj | 26 +++ Accounting.BLR/Excellent.cs | 61 +++++++ Accounting.BLR/ReadingIn.cs | 169 ++++++++++++++++++ Accounting.DAL/Accounting.DAL.csproj | 23 +++ .../Data => Accounting.DAL}/DataContext.cs | 5 +- .../20240429161713_Initial.Designer.cs | 2 +- .../Migrations/20240429161713_Initial.cs | 0 .../Migrations/DataContextModelSnapshot.cs | 2 +- .../AccountRecord.cs | 3 +- Accounting.Models/Accounting.Models.csproj | 9 + Accounting.Models/Common/BaseEntity.cs | 8 + Accounting/Accounting.csproj | 7 + .../Controllers/AccountingController.cs | 3 +- Accounting/Entities/Common/BaseEntity.cs | 7 - Accounting/GlobalUsings.cs | 4 +- Accounting/Program.cs | 6 +- Accounting/libman.json | 5 + AccountingApi.sln | 26 ++- 23 files changed, 541 insertions(+), 17 deletions(-) create mode 100644 Accounting.BLI/Accounting.BLI.csproj create mode 100644 Accounting.BLI/IAccountRecords.cs create mode 100644 Accounting.BLI/IExcellent.cs create mode 100644 Accounting.BLI/IReadingIn.cs create mode 100644 Accounting.BLR/AccountRecords.cs create mode 100644 Accounting.BLR/Accounting.BLR.csproj create mode 100644 Accounting.BLR/Excellent.cs create mode 100644 Accounting.BLR/ReadingIn.cs create mode 100644 Accounting.DAL/Accounting.DAL.csproj rename {Accounting/Data => Accounting.DAL}/DataContext.cs (66%) rename {Accounting => Accounting.DAL}/Migrations/20240429161713_Initial.Designer.cs (98%) rename {Accounting => Accounting.DAL}/Migrations/20240429161713_Initial.cs (100%) rename {Accounting => Accounting.DAL}/Migrations/DataContextModelSnapshot.cs (98%) rename {Accounting/Entities => Accounting.Models}/AccountRecord.cs (85%) create mode 100644 Accounting.Models/Accounting.Models.csproj create mode 100644 Accounting.Models/Common/BaseEntity.cs delete mode 100644 Accounting/Entities/Common/BaseEntity.cs create mode 100644 Accounting/libman.json diff --git a/Accounting.BLI/Accounting.BLI.csproj b/Accounting.BLI/Accounting.BLI.csproj new file mode 100644 index 0000000..d6224ca --- /dev/null +++ b/Accounting.BLI/Accounting.BLI.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/Accounting.BLI/IAccountRecords.cs b/Accounting.BLI/IAccountRecords.cs new file mode 100644 index 0000000..fcf9096 --- /dev/null +++ b/Accounting.BLI/IAccountRecords.cs @@ -0,0 +1,16 @@ +using Accounting.Models; + +namespace Accounting.BLI +{ + public interface IAccountRecords + { + bool AddAccountRecord(AccountRecord record); + AccountRecord SaveAcountRecord(AccountRecord record); + bool DeleteAccountRecord(AccountRecord record); + bool DeleteAllAccountRecords(); + IEnumerable GetAllAccBetweenDates(DateTime dateFrom, DateTime dateTo); + IEnumerable GetAllAccounts(); + AccountRecord GetAccount(int id); + AccountRecord GetAccountByDateBelKonto(DateTime _date, double _belopp, string _konto); + } +} diff --git a/Accounting.BLI/IExcellent.cs b/Accounting.BLI/IExcellent.cs new file mode 100644 index 0000000..d62590f --- /dev/null +++ b/Accounting.BLI/IExcellent.cs @@ -0,0 +1,13 @@ +namespace Accounting.BLI +{ + public interface IExcellent + { + int Columns { get; set; } + string DataType { get; set; } + int Rows { get; set; } + + void Dispose(); + void ExcellentStart(string path, int Sheet); + string ReadCell(int i, int j); + } +} diff --git a/Accounting.BLI/IReadingIn.cs b/Accounting.BLI/IReadingIn.cs new file mode 100644 index 0000000..439aec5 --- /dev/null +++ b/Accounting.BLI/IReadingIn.cs @@ -0,0 +1,11 @@ +using Accounting.Models; + +namespace Accounting.BLI +{ + public interface IReadingIn + { + bool ReadAndSaveInvoices(string fullFileName); + IEnumerable readXLS(string FilePath); + void Dispose(); + } +} diff --git a/Accounting.BLR/AccountRecords.cs b/Accounting.BLR/AccountRecords.cs new file mode 100644 index 0000000..fa5d5b1 --- /dev/null +++ b/Accounting.BLR/AccountRecords.cs @@ -0,0 +1,139 @@ +using Accounting.BLI; +using Accounting.DAL; +using Accounting.Models; +using Microsoft.Extensions.Logging; + +namespace Accounting.BLR +{ + public class AccountRecords : IAccountRecords + { + private readonly DataContext _dataContext; + private readonly ILogger _logger; + + public AccountRecords(DataContext dataContext, ILogger logger) + { + _dataContext = dataContext; + _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 :-->{iMessage}", e.Message); + } + return false; + + } + + public AccountRecord SaveAcountRecord(AccountRecord record) + { + try + { + var entity = (from account in _dataContext.AccountRecords + where account.Id == record.Id + select account).FirstOrDefault(); + if (entity == null) + { + entity = new AccountRecord(); + _dataContext.AccountRecords.Add(entity); + } + else + { + entity.Stored = record.Stored; + } + + entity.Avisering = record.Avisering; + entity.BetalDatum = record.BetalDatum; + entity.Belopp = record.Belopp; + entity.Konto = record.Konto; + entity.Mottagare = record.Mottagare; + + _dataContext.SaveChanges(); + + record.Id = entity.Id; + + return entity; + } + catch (Exception e) + { + _logger.LogError("Error occured in SaveAccountRecord :-->{iMessage}", e.Message); + return null; + } + + } + + public bool DeleteAccountRecord(AccountRecord record) + { + try + { + _dataContext.AccountRecords.Remove(record); + _dataContext.SaveChanges(); + return true; + } + catch (Exception e) + { + _logger.LogError("Error occured in DeleteAccountRecord :-->{iMessage}", e.Message); + } + return false; + } + + public bool DeleteAllAccountRecords() + { + try + { + var all = from c in _dataContext.AccountRecords select c; + _dataContext.AccountRecords.RemoveRange(all); + _dataContext.SaveChanges(); + return true; + } + catch (Exception e) + { + _logger.LogError("Error occured in DeleteAllAccountRecord :-->{iMessage}", e.Message); + } + return false; + } + public IEnumerable GetAllAccBetweenDates(DateTime dateFrom, DateTime dateTo) + { + IEnumerable result = null; + result = (from acc in _dataContext.AccountRecords + where acc.BetalDatum > dateFrom && acc.BetalDatum < dateTo + orderby acc.Mottagare, acc.BetalDatum descending + select new AccountRecord + { + Id = acc.Id, + BetalDatum = acc.BetalDatum, + Mottagare = acc.Mottagare, + Avisering = acc.Avisering, + Belopp = acc.Belopp, + Konto = acc.Konto, + Stored = acc.Stored + }).ToList(); + return result; + } + + public IEnumerable GetAllAccounts() + { + return _dataContext.AccountRecords; + } + + public AccountRecord GetAccount(int id) + { + var accountRec = _dataContext.AccountRecords.FirstOrDefault(a => a.Id == id); + return accountRec; + } + + public AccountRecord GetAccountByDateBelKonto(DateTime _date, double _belopp, string _konto) + { + var accountRec = _dataContext.AccountRecords.FirstOrDefault(a => a.BetalDatum == _date && a.Belopp == _belopp && a.Konto == _konto); + return accountRec; + } + } +} diff --git a/Accounting.BLR/Accounting.BLR.csproj b/Accounting.BLR/Accounting.BLR.csproj new file mode 100644 index 0000000..41c9ddd --- /dev/null +++ b/Accounting.BLR/Accounting.BLR.csproj @@ -0,0 +1,26 @@ + + + + net8.0 + enable + enable + + + + + tlbimp + 9 + 1 + 00020813-0000-0000-c000-000000000046 + 0 + false + true + + + + + + + + + diff --git a/Accounting.BLR/Excellent.cs b/Accounting.BLR/Excellent.cs new file mode 100644 index 0000000..d849484 --- /dev/null +++ b/Accounting.BLR/Excellent.cs @@ -0,0 +1,61 @@ +using Accounting.BLI; +using Microsoft.Extensions.Logging; +using Microsoft.Office.Interop.Excel; +using _Excel = Microsoft.Office.Interop.Excel; + +namespace Accounting.BLR +{ + public class Excellent : IDisposable, IExcellent + { + string path = string.Empty; + _Application excel = new _Excel.Application(); + Workbook wb; + Worksheet ws; + private readonly ILogger _logger; + public int Columns { get; set; } + public int Rows { get; set; } + public string DataType { get; set; } + + public Excellent(ILogger logger) + { + _logger = logger; + } + public void ExcellentStart(string path, int Sheet) + { + if (wb != null) + { + wb.Close(); + } + this.path = path; + wb = excel.Workbooks.Open(path); + ws = wb.Worksheets[Sheet]; + _Excel.Range usedRange = ws.UsedRange; + Columns = usedRange.Columns.Count; + Rows = usedRange.Rows.Count; + } + + public string ReadCell(int i, int j) + { + i++; + j++; + if (ws.Cells[i, j].Value2 != null) + { + _Excel.Range cell = ws.Cells[i, j]; + object value = cell.get_Value(Type.Missing); + if (value != null) + { + Type type = value.GetType(); + DataType = type.Name; + //Console.WriteLine($"Cell ({i},{j}) contains value of type {DataType}"); + } + return Convert.ToString(ws.Cells[i, j].Value2); + } + return string.Empty; + } + + public void Dispose() + { + excel.Workbooks.Close(); + } + } +} diff --git a/Accounting.BLR/ReadingIn.cs b/Accounting.BLR/ReadingIn.cs new file mode 100644 index 0000000..c6d2b13 --- /dev/null +++ b/Accounting.BLR/ReadingIn.cs @@ -0,0 +1,169 @@ +using Accounting.BLI; +using Accounting.Models; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace Accounting.BLR +{ + public class ReadingIn : IReadingIn, IDisposable + { + private readonly IConfiguration _configuration; + private readonly ILogger _logger; + private readonly IAccountRecords _accountRecords; + private readonly IExcellent _excellent; + + public ReadingIn( + IConfiguration configuration, + ILogger logger, + IAccountRecords accountRecords, + IExcellent excellent) + { + _configuration = configuration; + _logger = logger; + _accountRecords = accountRecords; + _excellent = excellent; + } + + public IEnumerable readXLS(string FilePath) + { + List records = new List(); + AccountRecord? record = null; + FileInfo existingFile = new FileInfo(FilePath); + var fieldNr = 0; + + _excellent.ExcellentStart(existingFile.FullName, 1); ; + + //get the first worksheet in the workbook + int colCount = _excellent.Columns; + int rowCount = _excellent.Rows; //get row count + bool prt = false; + for (int row = 0; row <= rowCount; row++) + { + if (prt) + { + //Console.WriteLine(); + record.Id = row; + _logger.LogInformation(record.ToString()); + record.Id = 0; + records.Add(record); + } + prt = false; + for (int col = 0; col <= colCount; col++) + { + var x = _excellent.ReadCell(row, col); + + if (_excellent.ReadCell(row, col) == null) + { + // Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + "null"); + } + else + { + if (col == 0 && _excellent.DataType == "DateTime") + { + prt = true; + record = new AccountRecord(); + fieldNr = 0; + } + else + { + if (col == 0) + { + col = colCount; + } + } + //Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + worksheet.Cells[row, col].Value.ToString().Trim()); + if (prt) + { + if (x == "") { } + else + { + fieldNr++; + + // _logger.LogInformation($"{exObject.ReadCell(row, col).ToString().Trim()}/t"); + switch (fieldNr) + { + case 1: + { + record.BetalDatum = DateTime.FromOADate(double.Parse(_excellent.ReadCell(row, col))); + break; + } + case 2: + { + record.Mottagare = _excellent.ReadCell(row, col).ToString().Trim(); + break; + } + case 3: + { + record.Konto = _excellent.ReadCell(row, col).ToString().Trim(); + if (record.Konto.ToLower().StartsWith("bg") + || record.Konto.ToLower().StartsWith("pg") + || record.Konto.ToLower().StartsWith("hs")) { } + else + { + prt = false; + col = colCount; + } + break; + } + case 4: + { + record.Belopp = double.Parse(_excellent.ReadCell(row, col).ToString().Trim()); + break; + } + case 5: + { + record.Avisering = _excellent.ReadCell(row, col).ToString().Trim(); + break; + } + + } + } + } + } + } + } + return records; + } + public bool ReadAndSaveInvoices(string fullFileName) + { + var result = true; + var restab = readXLS(fullFileName); + if (restab != null) + { + //restab.ToList().ForEach(x => + //{ + // _logger.LogInformation(x.ToString()); + //}); + + try + { + + restab.ToList().ForEach(x => + { + if (_accountRecords.GetAccountByDateBelKonto(x.BetalDatum, x.Belopp, x.Konto) == null) + _accountRecords.AddAccountRecord(x); + else { }; + }); + + // restab.ToList().ForEach(x => { _accountRecordRepository.AddAccountRecord(x); }); + } + catch (Exception ex) + { + _logger.LogError("MassUppdatering misslyckat: -->{iMessage}", ex.Message); + result = false; + } + } + + return result; + } + + public void Dispose() + { + _excellent.Dispose(); + } + + + + + } +} diff --git a/Accounting.DAL/Accounting.DAL.csproj b/Accounting.DAL/Accounting.DAL.csproj new file mode 100644 index 0000000..60052cf --- /dev/null +++ b/Accounting.DAL/Accounting.DAL.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + enable + enable + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/Accounting/Data/DataContext.cs b/Accounting.DAL/DataContext.cs similarity index 66% rename from Accounting/Data/DataContext.cs rename to Accounting.DAL/DataContext.cs index 8172735..bc9e802 100644 --- a/Accounting/Data/DataContext.cs +++ b/Accounting.DAL/DataContext.cs @@ -1,4 +1,7 @@ -namespace Accounting.Data; +using Accounting.Models; +using Microsoft.EntityFrameworkCore; + +namespace Accounting.DAL; public class DataContext : DbContext { diff --git a/Accounting/Migrations/20240429161713_Initial.Designer.cs b/Accounting.DAL/Migrations/20240429161713_Initial.Designer.cs similarity index 98% rename from Accounting/Migrations/20240429161713_Initial.Designer.cs rename to Accounting.DAL/Migrations/20240429161713_Initial.Designer.cs index 342a9c8..664d816 100644 --- a/Accounting/Migrations/20240429161713_Initial.Designer.cs +++ b/Accounting.DAL/Migrations/20240429161713_Initial.Designer.cs @@ -1,6 +1,6 @@ // using System; -using Accounting.Data; +using Accounting.DAL; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; diff --git a/Accounting/Migrations/20240429161713_Initial.cs b/Accounting.DAL/Migrations/20240429161713_Initial.cs similarity index 100% rename from Accounting/Migrations/20240429161713_Initial.cs rename to Accounting.DAL/Migrations/20240429161713_Initial.cs diff --git a/Accounting/Migrations/DataContextModelSnapshot.cs b/Accounting.DAL/Migrations/DataContextModelSnapshot.cs similarity index 98% rename from Accounting/Migrations/DataContextModelSnapshot.cs rename to Accounting.DAL/Migrations/DataContextModelSnapshot.cs index 360c2a8..4c404a9 100644 --- a/Accounting/Migrations/DataContextModelSnapshot.cs +++ b/Accounting.DAL/Migrations/DataContextModelSnapshot.cs @@ -1,6 +1,6 @@ // using System; -using Accounting.Data; +using Accounting.DAL; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; diff --git a/Accounting/Entities/AccountRecord.cs b/Accounting.Models/AccountRecord.cs similarity index 85% rename from Accounting/Entities/AccountRecord.cs rename to Accounting.Models/AccountRecord.cs index e89b329..cacb4e9 100644 --- a/Accounting/Entities/AccountRecord.cs +++ b/Accounting.Models/AccountRecord.cs @@ -1,4 +1,5 @@ -namespace Accounting.Entities; +using Accounting.Models.Common; +namespace Accounting.Models; public class AccountRecord : BaseEntity { diff --git a/Accounting.Models/Accounting.Models.csproj b/Accounting.Models/Accounting.Models.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Accounting.Models/Accounting.Models.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Accounting.Models/Common/BaseEntity.cs b/Accounting.Models/Common/BaseEntity.cs new file mode 100644 index 0000000..3815aa0 --- /dev/null +++ b/Accounting.Models/Common/BaseEntity.cs @@ -0,0 +1,8 @@ +using System.ComponentModel.DataAnnotations; +namespace Accounting.Models.Common; + +public abstract class BaseEntity +{ + [Key] + public int Id { get; set; } +} diff --git a/Accounting/Accounting.csproj b/Accounting/Accounting.csproj index b96965f..e7c0a4f 100644 --- a/Accounting/Accounting.csproj +++ b/Accounting/Accounting.csproj @@ -13,8 +13,15 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + diff --git a/Accounting/Controllers/AccountingController.cs b/Accounting/Controllers/AccountingController.cs index 8a2c0a7..390394c 100644 --- a/Accounting/Controllers/AccountingController.cs +++ b/Accounting/Controllers/AccountingController.cs @@ -1,4 +1,5 @@ -using Accounting.Data; +using Accounting.DAL; +using Accounting.Models; using Newtonsoft.Json; diff --git a/Accounting/Entities/Common/BaseEntity.cs b/Accounting/Entities/Common/BaseEntity.cs deleted file mode 100644 index 8808847..0000000 --- a/Accounting/Entities/Common/BaseEntity.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Accounting.Entities.Common; - -public abstract class BaseEntity -{ - [Key] - public int Id { get; set; } -} diff --git a/Accounting/GlobalUsings.cs b/Accounting/GlobalUsings.cs index 4a3daa7..6801a17 100644 --- a/Accounting/GlobalUsings.cs +++ b/Accounting/GlobalUsings.cs @@ -1,8 +1,6 @@ -global using Accounting.Entities; -global using Accounting.Entities.Common; + global using Microsoft.AspNetCore.Mvc; global using Microsoft.EntityFrameworkCore; -global using System.ComponentModel.DataAnnotations; namespace Accounting; diff --git a/Accounting/Program.cs b/Accounting/Program.cs index e957dde..769d7b1 100644 --- a/Accounting/Program.cs +++ b/Accounting/Program.cs @@ -1,4 +1,5 @@ -using Accounting.Data; + +using Accounting.DAL; var builder = WebApplication.CreateBuilder(args); @@ -14,6 +15,9 @@ builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")); }); + + + var app = builder.Build(); // Configure the HTTP request pipeline. diff --git a/Accounting/libman.json b/Accounting/libman.json new file mode 100644 index 0000000..ceee271 --- /dev/null +++ b/Accounting/libman.json @@ -0,0 +1,5 @@ +{ + "version": "1.0", + "defaultProvider": "cdnjs", + "libraries": [] +} \ No newline at end of file diff --git a/AccountingApi.sln b/AccountingApi.sln index 761477a..a3ff2b6 100644 --- a/AccountingApi.sln +++ b/AccountingApi.sln @@ -3,7 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.9.34728.123 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting", "Accounting\Accounting.csproj", "{EA69CE3F-020D-482B-82DB-3A5141E67774}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Accounting", "Accounting\Accounting.csproj", "{EA69CE3F-020D-482B-82DB-3A5141E67774}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.BLI", "Accounting.BLI\Accounting.BLI.csproj", "{3C7E3952-2AE1-422D-9325-7E85D8D35F57}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.DAL", "Accounting.DAL\Accounting.DAL.csproj", "{AF338983-D9FF-4DC3-B418-F14E83036DEC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.Models", "Accounting.Models\Accounting.Models.csproj", "{42192805-C79D-447E-AE45-866FC4CF9DC5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.BLR", "Accounting.BLR\Accounting.BLR.csproj", "{F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +23,22 @@ Global {EA69CE3F-020D-482B-82DB-3A5141E67774}.Debug|Any CPU.Build.0 = Debug|Any CPU {EA69CE3F-020D-482B-82DB-3A5141E67774}.Release|Any CPU.ActiveCfg = Release|Any CPU {EA69CE3F-020D-482B-82DB-3A5141E67774}.Release|Any CPU.Build.0 = Release|Any CPU + {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Release|Any CPU.Build.0 = Release|Any CPU + {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Release|Any CPU.Build.0 = Release|Any CPU + {42192805-C79D-447E-AE45-866FC4CF9DC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42192805-C79D-447E-AE45-866FC4CF9DC5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42192805-C79D-447E-AE45-866FC4CF9DC5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42192805-C79D-447E-AE45-866FC4CF9DC5}.Release|Any CPU.Build.0 = Release|Any CPU + {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE