diff --git a/README.md b/README.md
deleted file mode 100644
index 76d1cf5..0000000
--- a/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Samples
-
-Repozytorium zawiera szereg przykładów pokazujących możliwości oraz sposób tworzenia dodatków dla enova365:
-
-* folder [doc](./doc) zawiera ich indywidualną dokumentację
-* w folderze [src](./src) znajduje się ich kod źródłowy
diff --git a/Samples.sln b/Samples.sln
index 6ad70ca..257f5d4 100644
--- a/Samples.sln
+++ b/Samples.sln
@@ -40,64 +40,470 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soneta.Szkolenie.Tests", "s
{5110FB90-B5CA-48B9-B518-CB2764F4CA5F} = {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}
EndProjectSection
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9988A292-3657-421B-BFBA-55C479DE1216}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example2", "Example2", "{170192A9-6512-46E0-843E-F1E4184C24D4}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example2\Readme.md = src\Example2\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example2", "src\Example2\Example2\Example2.csproj", "{AE8400E0-6DE5-4857-9306-28C29C089A44}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example2.UI", "src\Example2\Example2.UI\Example2.UI.csproj", "{C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example2.Tests", "src\Example2\Example2.Tests\Example2.Tests.csproj", "{69218F9E-6DF2-4489-9B5F-4CCB3209E627}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example1", "Example1", "{C436FCE2-9D48-4A6C-B4D1-FEA65F362562}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example1\README.md = src\Example1\README.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example1", "src\Example1\Example1\Example1.csproj", "{7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example1.UI", "src\Example1\Example1.UI\Example1.UI.csproj", "{359D3C43-5D95-4031-B693-392745618E36}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example1.Tests", "src\Example1\Example1.Tests\Example1.Tests.csproj", "{7E96485D-CD13-4E85-8830-1ECDAC687679}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example3", "Example3", "{6BA3954F-A731-44F3-B8B9-93253321CE9E}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example3\Readme.md = src\Example3\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example3", "src\Example3\Example3\Example3.csproj", "{2F6258C6-DF86-412C-945F-DB6728FBB7D5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example3.UI", "src\Example3\Example3.UI\Example3.UI.csproj", "{757906CE-6C18-457E-9979-713B372CFD18}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example3.Tests", "src\Example3\Example3.Tests\Example3.Tests.csproj", "{FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example4", "Example4", "{690B0B2F-9184-4047-9F47-8408ADDB0EE4}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example4\Readme.md = src\Example4\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example4", "src\Example4\Example4\Example4.csproj", "{B6EF0217-7110-4CEA-9450-B30D8F3D55E5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example4.UI", "src\Example4\Example4.UI\Example4.UI.csproj", "{9D33DA69-0D14-4442-8DAE-2FE528AA962B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example4.Tests", "src\Example4\Example4.Tests\Example4.Tests.csproj", "{BC71E9BE-8765-4444-A16E-E786EAB6CF7F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example5", "Example5", "{41C4BA4C-C3B5-4AA6-9C44-2EEC916B86A2}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example5\Readme.md = src\Example5\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example5.Config", "src\Example5\Example5.Config\Example5.Config.csproj", "{98856534-6E7D-4A81-BDEF-5F9493CFC2FF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example5", "src\Example5\Example5\Example5.csproj", "{D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example5.UI", "src\Example5\Example5.UI\Example5.UI.csproj", "{26C693A4-2DFE-4BB9-9484-1F88F037F994}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example5.Tests", "src\Example5\Example5.Tests\Example5.Tests.csproj", "{35BFCDB3-E35A-4619-9F9F-454CC430A403}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example6", "Example6", "{DF9DC272-8E6D-4CD6-BE55-0FD8AFBA1543}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example6\Readme.md = src\Example6\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example6", "src\Example6\Example6\Example6.csproj", "{96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example6.UI", "src\Example6\Example6.UI\Example6.UI.csproj", "{33313A3A-7423-4FEA-9C51-93928A4655DA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example6.Tests", "src\Example6\Example6.Tests\Example6.Tests.csproj", "{39A516AD-9A04-4121-B519-88284D4C0BB7}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example7", "Example7", "{C1E3F91E-8F66-4AF9-88EE-4116E2445542}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example7\Readme.md = src\Example7\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example7", "src\Example7\Example7\Example7.csproj", "{AF462CC2-86F4-454F-AD40-871CB945B741}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example7.UI", "src\Example7\Example7.UI\Example7.UI.csproj", "{9140DBE8-468D-4A3A-88CB-E5CAC8E93612}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example7.Tests", "src\Example7\Example7.Tests\Example7.Tests.csproj", "{1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example8", "Example8", "{B70C2CCA-794F-4962-9C13-E8A07033BA04}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example8\Readme.md = src\Example8\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example8", "src\Example8\Example8\Example8.csproj", "{A0D78F56-7F17-446D-B7CB-575CFE521C9C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example8.UI", "src\Example8\Example8.UI\Example8.UI.csproj", "{F3242DBA-D695-482C-9DE0-E4A5DF1B7075}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example8.Tests", "src\Example8\Example8.Tests\Example8.Tests.csproj", "{7B38993A-946A-4ADD-A0E7-A9F858B6F084}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example9", "Example9", "{4F926038-013A-41CA-AF6A-3237AFA7D90D}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example9\Readme.md = src\Example9\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example9", "src\Example9\Example9\Example9.csproj", "{79915F94-7CEA-4202-90F2-B0378E6F9073}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example9.UI", "src\Example9\Example9.UI\Example9.UI.csproj", "{BF6DF90F-8E0F-4010-A723-D0A69429CC0E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example9.Tests", "src\Example9\Example9.Tests\Example9.Tests.csproj", "{5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example10", "Example10", "{C342F069-9167-477E-85EE-33307F203AC1}"
+ ProjectSection(SolutionItems) = preProject
+ src\Example10\Readme.md = src\Example10\Readme.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example10", "src\Example10\Example10\Example10.csproj", "{269E2147-1390-49E2-A2A2-8F4293710389}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example10.UI", "src\Example10\Example10.UI\Example10.UI.csproj", "{FE619DF2-A254-41E6-8413-4AB906F32A8D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example10.Tests", "src\Example10\Example10.Tests\Example10.Tests.csproj", "{9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FilesOperations", "FilesOperations", "{0E8EBB14-1B5B-4695-8924-C567352FE1B3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SaveDataFromList", "src\FilesOperations\SaveDataFromList\SaveDataFromList.csproj", "{617BFEFC-31DE-450A-8CBE-23841EF3DFE8}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SaveDataFromList", "src\FilesOperations\SaveDataFromList\SaveDataFromList.csproj", "{617BFEFC-31DE-450A-8CBE-23841EF3DFE8}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SaveInvoicesGroupingByContractor", "src\FilesOperations\SaveInvoicesGroupingByContractor\SaveInvoicesGroupingByContractor.csproj", "{997696F9-1F53-46F6-92B7-85174830F3A7}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SaveInvoicesGroupingByContractor", "src\FilesOperations\SaveInvoicesGroupingByContractor\SaveInvoicesGroupingByContractor.csproj", "{997696F9-1F53-46F6-92B7-85174830F3A7}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReadFileFromList", "src\FilesOperations\ReadFileFromList\ReadFileFromList.csproj", "{CC481775-AF23-4F08-95D6-2C9E852E02E6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReadFileFromList", "src\FilesOperations\ReadFileFromList\ReadFileFromList.csproj", "{CC481775-AF23-4F08-95D6-2C9E852E02E6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D939A54E-F862-4B24-8CCF-1504134C12A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D939A54E-F862-4B24-8CCF-1504134C12A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D939A54E-F862-4B24-8CCF-1504134C12A8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D939A54E-F862-4B24-8CCF-1504134C12A8}.Debug|x64.Build.0 = Debug|Any CPU
{D939A54E-F862-4B24-8CCF-1504134C12A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D939A54E-F862-4B24-8CCF-1504134C12A8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D939A54E-F862-4B24-8CCF-1504134C12A8}.Release|x64.ActiveCfg = Release|Any CPU
+ {D939A54E-F862-4B24-8CCF-1504134C12A8}.Release|x64.Build.0 = Release|Any CPU
{A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Debug|x64.Build.0 = Debug|Any CPU
{A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Release|x64.ActiveCfg = Release|Any CPU
+ {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Release|x64.Build.0 = Release|Any CPU
{49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Debug|x64.Build.0 = Debug|Any CPU
{49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Release|Any CPU.Build.0 = Release|Any CPU
+ {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Release|x64.ActiveCfg = Release|Any CPU
+ {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Release|x64.Build.0 = Release|Any CPU
{4FC4954B-C8AF-4159-8B6E-24F11C605690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FC4954B-C8AF-4159-8B6E-24F11C605690}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Debug|x64.Build.0 = Debug|Any CPU
{4FC4954B-C8AF-4159-8B6E-24F11C605690}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FC4954B-C8AF-4159-8B6E-24F11C605690}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Release|x64.ActiveCfg = Release|Any CPU
+ {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Release|x64.Build.0 = Release|Any CPU
{2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Debug|x64.Build.0 = Debug|Any CPU
{2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Release|x64.ActiveCfg = Release|Any CPU
+ {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Release|x64.Build.0 = Release|Any CPU
{5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Debug|x64.Build.0 = Debug|Any CPU
{5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Release|x64.ActiveCfg = Release|Any CPU
+ {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Release|x64.Build.0 = Release|Any CPU
{9F525776-985A-4D51-8B92-E530B97D9545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9F525776-985A-4D51-8B92-E530B97D9545}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9F525776-985A-4D51-8B92-E530B97D9545}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9F525776-985A-4D51-8B92-E530B97D9545}.Debug|x64.Build.0 = Debug|Any CPU
{9F525776-985A-4D51-8B92-E530B97D9545}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9F525776-985A-4D51-8B92-E530B97D9545}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9F525776-985A-4D51-8B92-E530B97D9545}.Release|x64.ActiveCfg = Release|Any CPU
+ {9F525776-985A-4D51-8B92-E530B97D9545}.Release|x64.Build.0 = Release|Any CPU
{CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Debug|x64.Build.0 = Debug|Any CPU
{CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Release|x64.ActiveCfg = Release|Any CPU
+ {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Release|x64.Build.0 = Release|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Debug|x64.Build.0 = Debug|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Release|x64.ActiveCfg = Release|Any CPU
+ {AE8400E0-6DE5-4857-9306-28C29C089A44}.Release|x64.Build.0 = Release|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Debug|x64.Build.0 = Debug|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Release|x64.ActiveCfg = Release|Any CPU
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3}.Release|x64.Build.0 = Release|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Debug|x64.Build.0 = Debug|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Release|Any CPU.Build.0 = Release|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Release|x64.ActiveCfg = Release|Any CPU
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627}.Release|x64.Build.0 = Release|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Debug|x64.Build.0 = Debug|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Release|x64.ActiveCfg = Release|Any CPU
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6}.Release|x64.Build.0 = Release|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Debug|x64.Build.0 = Debug|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Release|Any CPU.Build.0 = Release|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Release|x64.ActiveCfg = Release|Any CPU
+ {359D3C43-5D95-4031-B693-392745618E36}.Release|x64.Build.0 = Release|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Debug|x64.Build.0 = Debug|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Release|x64.ActiveCfg = Release|Any CPU
+ {7E96485D-CD13-4E85-8830-1ECDAC687679}.Release|x64.Build.0 = Release|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Debug|x64.Build.0 = Debug|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Release|x64.ActiveCfg = Release|Any CPU
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5}.Release|x64.Build.0 = Release|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Debug|x64.Build.0 = Debug|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Release|Any CPU.Build.0 = Release|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Release|x64.ActiveCfg = Release|Any CPU
+ {757906CE-6C18-457E-9979-713B372CFD18}.Release|x64.Build.0 = Release|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Debug|x64.Build.0 = Debug|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Release|x64.ActiveCfg = Release|Any CPU
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0}.Release|x64.Build.0 = Release|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Debug|x64.Build.0 = Debug|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Release|x64.ActiveCfg = Release|Any CPU
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5}.Release|x64.Build.0 = Release|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Debug|x64.Build.0 = Debug|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Release|x64.ActiveCfg = Release|Any CPU
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B}.Release|x64.Build.0 = Release|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Debug|x64.Build.0 = Debug|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Release|x64.ActiveCfg = Release|Any CPU
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F}.Release|x64.Build.0 = Release|Any CPU
+ {98856534-6E7D-4A81-BDEF-5F9493CFC2FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {98856534-6E7D-4A81-BDEF-5F9493CFC2FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {98856534-6E7D-4A81-BDEF-5F9493CFC2FF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {98856534-6E7D-4A81-BDEF-5F9493CFC2FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {98856534-6E7D-4A81-BDEF-5F9493CFC2FF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {98856534-6E7D-4A81-BDEF-5F9493CFC2FF}.Release|x64.ActiveCfg = Release|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Debug|x64.Build.0 = Debug|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Release|x64.ActiveCfg = Release|Any CPU
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7}.Release|x64.Build.0 = Release|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Debug|x64.Build.0 = Debug|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Release|Any CPU.Build.0 = Release|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Release|x64.ActiveCfg = Release|Any CPU
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994}.Release|x64.Build.0 = Release|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Debug|x64.Build.0 = Debug|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Release|Any CPU.Build.0 = Release|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Release|x64.ActiveCfg = Release|Any CPU
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403}.Release|x64.Build.0 = Release|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Debug|x64.Build.0 = Debug|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Release|x64.ActiveCfg = Release|Any CPU
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8}.Release|x64.Build.0 = Release|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Debug|x64.Build.0 = Debug|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Release|x64.ActiveCfg = Release|Any CPU
+ {33313A3A-7423-4FEA-9C51-93928A4655DA}.Release|x64.Build.0 = Release|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Debug|x64.Build.0 = Debug|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Release|x64.ActiveCfg = Release|Any CPU
+ {39A516AD-9A04-4121-B519-88284D4C0BB7}.Release|x64.Build.0 = Release|Any CPU
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Debug|x64.ActiveCfg = Debug|x64
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Debug|x64.Build.0 = Debug|x64
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Release|x64.ActiveCfg = Release|x64
+ {AF462CC2-86F4-454F-AD40-871CB945B741}.Release|x64.Build.0 = Release|x64
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Debug|x64.Build.0 = Debug|Any CPU
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Release|x64.ActiveCfg = Release|Any CPU
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612}.Release|x64.Build.0 = Release|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Debug|x64.Build.0 = Debug|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Release|x64.ActiveCfg = Release|Any CPU
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9}.Release|x64.Build.0 = Release|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Debug|x64.Build.0 = Debug|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Release|x64.ActiveCfg = Release|Any CPU
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C}.Release|x64.Build.0 = Release|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Debug|x64.Build.0 = Debug|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Release|x64.ActiveCfg = Release|Any CPU
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075}.Release|x64.Build.0 = Release|Any CPU
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Debug|x64.ActiveCfg = Debug|x64
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Debug|x64.Build.0 = Debug|x64
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Release|x64.ActiveCfg = Release|x64
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084}.Release|x64.Build.0 = Release|x64
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Debug|x64.Build.0 = Debug|Any CPU
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Release|Any CPU.Build.0 = Release|Any CPU
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Release|x64.ActiveCfg = Release|Any CPU
+ {79915F94-7CEA-4202-90F2-B0378E6F9073}.Release|x64.Build.0 = Release|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Debug|x64.Build.0 = Debug|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Release|x64.ActiveCfg = Release|Any CPU
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E}.Release|x64.Build.0 = Release|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Debug|x64.Build.0 = Debug|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Release|x64.ActiveCfg = Release|Any CPU
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753}.Release|x64.Build.0 = Release|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Debug|x64.Build.0 = Debug|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Release|Any CPU.Build.0 = Release|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Release|x64.ActiveCfg = Release|Any CPU
+ {269E2147-1390-49E2-A2A2-8F4293710389}.Release|x64.Build.0 = Release|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Debug|x64.Build.0 = Debug|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Release|x64.ActiveCfg = Release|Any CPU
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D}.Release|x64.Build.0 = Release|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Debug|x64.Build.0 = Debug|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Release|x64.ActiveCfg = Release|Any CPU
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71}.Release|x64.Build.0 = Release|Any CPU
{617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Debug|x64.Build.0 = Debug|Any CPU
{617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Release|x64.ActiveCfg = Release|Any CPU
+ {617BFEFC-31DE-450A-8CBE-23841EF3DFE8}.Release|x64.Build.0 = Release|Any CPU
{997696F9-1F53-46F6-92B7-85174830F3A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{997696F9-1F53-46F6-92B7-85174830F3A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {997696F9-1F53-46F6-92B7-85174830F3A7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {997696F9-1F53-46F6-92B7-85174830F3A7}.Debug|x64.Build.0 = Debug|Any CPU
{997696F9-1F53-46F6-92B7-85174830F3A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{997696F9-1F53-46F6-92B7-85174830F3A7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {997696F9-1F53-46F6-92B7-85174830F3A7}.Release|x64.ActiveCfg = Release|Any CPU
+ {997696F9-1F53-46F6-92B7-85174830F3A7}.Release|x64.Build.0 = Release|Any CPU
{CC481775-AF23-4F08-95D6-2C9E852E02E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CC481775-AF23-4F08-95D6-2C9E852E02E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CC481775-AF23-4F08-95D6-2C9E852E02E6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CC481775-AF23-4F08-95D6-2C9E852E02E6}.Debug|x64.Build.0 = Debug|Any CPU
{CC481775-AF23-4F08-95D6-2C9E852E02E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC481775-AF23-4F08-95D6-2C9E852E02E6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CC481775-AF23-4F08-95D6-2C9E852E02E6}.Release|x64.ActiveCfg = Release|Any CPU
+ {CC481775-AF23-4F08-95D6-2C9E852E02E6}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -111,6 +517,37 @@ Global
{5110FB90-B5CA-48B9-B518-CB2764F4CA5F} = {A82FAF26-B549-4058-86A3-B4EA4EEEB7BD}
{9F525776-985A-4D51-8B92-E530B97D9545} = {A82FAF26-B549-4058-86A3-B4EA4EEEB7BD}
{CE036F3E-32C3-45B6-A7C3-2F01442CD5F7} = {A82FAF26-B549-4058-86A3-B4EA4EEEB7BD}
+ {AE8400E0-6DE5-4857-9306-28C29C089A44} = {170192A9-6512-46E0-843E-F1E4184C24D4}
+ {C13484B2-8653-4424-A3C8-A4C8E7EBC6F3} = {170192A9-6512-46E0-843E-F1E4184C24D4}
+ {69218F9E-6DF2-4489-9B5F-4CCB3209E627} = {170192A9-6512-46E0-843E-F1E4184C24D4}
+ {7FB5AE53-C4D0-4B84-97F0-2BC5873CCEF6} = {C436FCE2-9D48-4A6C-B4D1-FEA65F362562}
+ {359D3C43-5D95-4031-B693-392745618E36} = {C436FCE2-9D48-4A6C-B4D1-FEA65F362562}
+ {7E96485D-CD13-4E85-8830-1ECDAC687679} = {C436FCE2-9D48-4A6C-B4D1-FEA65F362562}
+ {2F6258C6-DF86-412C-945F-DB6728FBB7D5} = {6BA3954F-A731-44F3-B8B9-93253321CE9E}
+ {757906CE-6C18-457E-9979-713B372CFD18} = {6BA3954F-A731-44F3-B8B9-93253321CE9E}
+ {FE3FCDBF-93F8-4BA1-A494-387E2DBC2DD0} = {6BA3954F-A731-44F3-B8B9-93253321CE9E}
+ {B6EF0217-7110-4CEA-9450-B30D8F3D55E5} = {690B0B2F-9184-4047-9F47-8408ADDB0EE4}
+ {9D33DA69-0D14-4442-8DAE-2FE528AA962B} = {690B0B2F-9184-4047-9F47-8408ADDB0EE4}
+ {BC71E9BE-8765-4444-A16E-E786EAB6CF7F} = {690B0B2F-9184-4047-9F47-8408ADDB0EE4}
+ {98856534-6E7D-4A81-BDEF-5F9493CFC2FF} = {41C4BA4C-C3B5-4AA6-9C44-2EEC916B86A2}
+ {D079568A-C4A5-4F6B-A80C-8FA45D4FA0E7} = {41C4BA4C-C3B5-4AA6-9C44-2EEC916B86A2}
+ {26C693A4-2DFE-4BB9-9484-1F88F037F994} = {41C4BA4C-C3B5-4AA6-9C44-2EEC916B86A2}
+ {35BFCDB3-E35A-4619-9F9F-454CC430A403} = {41C4BA4C-C3B5-4AA6-9C44-2EEC916B86A2}
+ {96F95100-CD7D-4A42-8D94-E7AC7C91E2A8} = {DF9DC272-8E6D-4CD6-BE55-0FD8AFBA1543}
+ {33313A3A-7423-4FEA-9C51-93928A4655DA} = {DF9DC272-8E6D-4CD6-BE55-0FD8AFBA1543}
+ {39A516AD-9A04-4121-B519-88284D4C0BB7} = {DF9DC272-8E6D-4CD6-BE55-0FD8AFBA1543}
+ {AF462CC2-86F4-454F-AD40-871CB945B741} = {C1E3F91E-8F66-4AF9-88EE-4116E2445542}
+ {9140DBE8-468D-4A3A-88CB-E5CAC8E93612} = {C1E3F91E-8F66-4AF9-88EE-4116E2445542}
+ {1C17DDEC-CFD0-4A2E-AD4D-F0536B6CC1E9} = {C1E3F91E-8F66-4AF9-88EE-4116E2445542}
+ {A0D78F56-7F17-446D-B7CB-575CFE521C9C} = {B70C2CCA-794F-4962-9C13-E8A07033BA04}
+ {F3242DBA-D695-482C-9DE0-E4A5DF1B7075} = {B70C2CCA-794F-4962-9C13-E8A07033BA04}
+ {7B38993A-946A-4ADD-A0E7-A9F858B6F084} = {B70C2CCA-794F-4962-9C13-E8A07033BA04}
+ {79915F94-7CEA-4202-90F2-B0378E6F9073} = {4F926038-013A-41CA-AF6A-3237AFA7D90D}
+ {BF6DF90F-8E0F-4010-A723-D0A69429CC0E} = {4F926038-013A-41CA-AF6A-3237AFA7D90D}
+ {5E1FBA2A-1BF2-4C2F-9F3D-751B67787753} = {4F926038-013A-41CA-AF6A-3237AFA7D90D}
+ {269E2147-1390-49E2-A2A2-8F4293710389} = {C342F069-9167-477E-85EE-33307F203AC1}
+ {FE619DF2-A254-41E6-8413-4AB906F32A8D} = {C342F069-9167-477E-85EE-33307F203AC1}
+ {9D9A75F9-6A2B-438A-BE15-66F5BCE69C71} = {C342F069-9167-477E-85EE-33307F203AC1}
{617BFEFC-31DE-450A-8CBE-23841EF3DFE8} = {0E8EBB14-1B5B-4695-8924-C567352FE1B3}
{997696F9-1F53-46F6-92B7-85174830F3A7} = {0E8EBB14-1B5B-4695-8924-C567352FE1B3}
{CC481775-AF23-4F08-95D6-2C9E852E02E6} = {0E8EBB14-1B5B-4695-8924-C567352FE1B3}
diff --git a/src/Example1/Example1.Tests/Example1.Tests.csproj b/src/Example1/Example1.Tests/Example1.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example1/Example1.Tests/Example1.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example1/Example1.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example1/Example1.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example1/Example1.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example1/Example1.UI/Example1.UI.csproj b/src/Example1/Example1.UI/Example1.UI.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example1/Example1.UI/Example1.UI.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example1/Example1.UI/UI/TowaryUlubioneKontaktu.viewform.xml b/src/Example1/Example1.UI/UI/TowaryUlubioneKontaktu.viewform.xml
new file mode 100644
index 0000000..6a1e0a7
--- /dev/null
+++ b/src/Example1/Example1.UI/UI/TowaryUlubioneKontaktu.viewform.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example1/Example1.UI/ViewInfo/Menu.cs b/src/Example1/Example1.UI/ViewInfo/Menu.cs
new file mode 100644
index 0000000..8c83b2e
--- /dev/null
+++ b/src/Example1/Example1.UI/ViewInfo/Menu.cs
@@ -0,0 +1,18 @@
+
+using Soneta.Business.Licence;
+using Soneta.Business.UI;
+using Samples.Example1.UI.Extender;
+
+[assembly: FolderView("Samples",
+ Priority = 10,
+ Description = "Przykłady implementacji enova365",
+ BrickColor = FolderViewAttribute.BlueBrick,
+ Contexts = new object[] { LicencjeModułu.All }
+)]
+
+[assembly: FolderView("Samples/Towary własne",
+ Priority = 11,
+ Description = "Towary ulubione osoby kontaktowej",
+ TableName = "TowaryUlubione",
+ ViewType = typeof(TowaryUlubioneKontaktuViewInfo)
+)]
\ No newline at end of file
diff --git a/src/Example1/Example1.UI/ViewInfo/TowaryUlubioneKontaktuViewInfo.cs b/src/Example1/Example1.UI/ViewInfo/TowaryUlubioneKontaktuViewInfo.cs
new file mode 100644
index 0000000..392e67a
--- /dev/null
+++ b/src/Example1/Example1.UI/ViewInfo/TowaryUlubioneKontaktuViewInfo.cs
@@ -0,0 +1,94 @@
+using Soneta.Business;
+using Soneta.CRM;
+using Soneta.Towary;
+
+namespace Samples.Example1.UI.Extender
+{
+ ///
+ /// Lista oparta na przykładzie pochodzącym z repozytorium Soneta.Examples - https://github.com/soneta/Examples (Example 1)
+ ///
+ ///
+ public class TowaryUlubioneKontaktuViewInfo : ViewInfo
+ {
+
+ public TowaryUlubioneKontaktuViewInfo()
+ {
+ // View wiążemy z odpowiednią definicją viewform.xml poprzez property ResourceName
+ ResourceName = "TowaryUlubioneKontaktu";
+
+ // Inicjowanie contextu
+ InitContext += (sender, args) => { args.Context.TryAdd(() => new WParams(args.Context)); };
+
+ // Tworzenie view zawierającego konkretne dane
+ CreateView += TowaryWlasneViewInfo_CreateView;
+ }
+
+ void TowaryWlasneViewInfo_CreateView(object sender, CreateViewEventArgs args)
+ {
+ WParams parameters;
+ if (!args.Context.Get(out parameters))
+ return;
+
+ args.View = ViewCreate(parameters);
+ args.View.AllowNew = false;
+ }
+
+ protected View ViewCreate(WParams pars)
+ {
+ var rc = RowCondition.Empty;
+ var tm = TowaryModule.GetInstance(pars.Context.Session);
+ var view = tm.TowaryUlubione.CreateView();
+
+ if (pars.KontaktOsoba != null)
+ rc &= new FieldCondition.Equal("Zapis", pars.KontaktOsoba);
+
+ view.Condition &= rc;
+
+ return view;
+ }
+
+ }
+
+ public class WParams : ContextBase
+ {
+ private const string Key = "Samples.TowaryWlasne";
+
+ public WParams(Context context) : base(context)
+ {
+ Load();
+ }
+
+ public KontaktOsoba KontaktOsoba
+ {
+ get
+ {
+ if (Context.Contains(typeof(KontaktOsoba)))
+ return (KontaktOsoba)Context[typeof(KontaktOsoba)];
+ return null;
+ }
+ set
+ {
+ Context[typeof(KontaktOsoba)] = value;
+ Save();
+ }
+ }
+
+ ///
+ /// Ładowanie parametrów z kontekstu login'a
+ ///
+ protected void Load()
+ {
+ var property = Context.LoadProperty(this, "KontaktOsoba", Key);
+ SetContext(typeof(KontaktOsoba), property);
+ }
+
+ ///
+ /// Zapisywanie parametrów w kontekście login'a
+ ///
+ protected void Save()
+ {
+ Context.SaveProperty(this, "KontaktOsoba", Key);
+ }
+ }
+
+}
diff --git a/src/Example1/Example1.UI/Workers/TowaryUlubionePokazKontaktWorker.cs b/src/Example1/Example1.UI/Workers/TowaryUlubionePokazKontaktWorker.cs
new file mode 100644
index 0000000..068222d
--- /dev/null
+++ b/src/Example1/Example1.UI/Workers/TowaryUlubionePokazKontaktWorker.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Soneta.Business;
+using Soneta.Commands;
+using Soneta.Towary;
+using Soneta.Types;
+using Samples.Example1.UI.Extender;
+
+[assembly: Worker(typeof(TowaryUlubionePokazKontaktWorker), typeof(TowarUlubiony))]
+
+namespace Samples.Example1.UI.Extender
+{
+ class TowaryUlubionePokazKontaktWorker
+ {
+ [Context]
+ public TowarUlubiony TowarUlubiony
+ {
+ get;
+ set;
+ }
+
+ [Action("Pokaż osobę", Target = ActionTarget.ToolbarWithText, Mode = ActionMode.SingleSession,
+ CommandShortcut = CommandShortcut.Shift | CommandShortcut.F8, Priority = 10, Icon =ActionIcon.Phone)]
+ public Row PokazZapis()
+ {
+ Row zapis = TowarUlubiony.Zapis.Root;
+
+ if (zapis is IRowWithHistory)
+ {
+ return (zapis as IRowWithHistory).Historia[Date.Today];
+ }
+
+ return zapis;
+ }
+
+ [Action("Pokaż towar", Target = ActionTarget.ToolbarWithText, Mode = ActionMode.SingleSession,
+ Priority = 11, Icon = ActionIcon.Open)]
+ public Row PokazTowar()
+ {
+ Row towar = TowarUlubiony.Towar;
+
+ if (towar is IRowWithHistory)
+ {
+ return (towar as IRowWithHistory).Historia[Date.Today];
+ }
+
+ return towar;
+ }
+ }
+}
diff --git a/src/Example1/Example1/Example1.csproj b/src/Example1/Example1/Example1.csproj
new file mode 100644
index 0000000..f424872
--- /dev/null
+++ b/src/Example1/Example1/Example1.csproj
@@ -0,0 +1,15 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Example1/README.md b/src/Example1/README.md
new file mode 100644
index 0000000..0028189
--- /dev/null
+++ b/src/Example1/README.md
@@ -0,0 +1,33 @@
+### Example 1
+-----------------------------------------------------------------------------------------------------
+
+Przykad pokazuje moliwo zastosowania wasnej listy w oparciu o istniejce obiekty enova. Zawiera zdefiniowane wasne View, z ktrym zostaa powizana odpowiednia definicja w postaci struktury viewform.xml.
+
+W wyniku zastosowania dodatku, powinna pojawi si dodatkowa grupa w menu gwnym programu o nazwie *`Samples`* z opcj *`Towary wasne`*, po wybraniu ktrej pojawi si zaimplementowana lista.
+
+
+W skad przykadu wchodz trzy projekty:
+
+* `Example1` - zawierajcy elementy logiki biznesowej
+* `Example1.UI` - interfejsu uytkownika
+* `Example1.Tests` - testy
+
+
+#### Zawarto przykadu:
+> Przykad zawiera jedynie elementy interfejsu uytkownika wiec cao znajduje si w `Example1.UI`.
+
+* `Example1.UI`\Extender\TowaryUlubioneKontaktuViewInfo.cs
+
+ Przykadowan klasa z implementacj View zbudowanego na bazie tabel enova.
+* `Example1.UI`\Extender\Menu.cs
+
+ Rejestracja listy dla View
+
+* `Example1.UI`\UI\TowaryUlubioneKontaktu.viewform.xml
+
+ Definicja page'a dla View
+
+
+* `Example1.UI`\Extender\TowaryUlubionePokazKontaktWorker.cs
+
+ Rejestracja akcji dla listy towarw ulubionych
\ No newline at end of file
diff --git a/src/Example10/Example10.Tests/Example10.Tests.csproj b/src/Example10/Example10.Tests/Example10.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example10/Example10.Tests/Example10.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example10/Example10.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example10/Example10.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example10/Example10.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example10/Example10.UI/Example10.UI.csproj b/src/Example10/Example10.UI/Example10.UI.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example10/Example10.UI/Example10.UI.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example10/Example10/Example10.csproj b/src/Example10/Example10/Example10.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example10/Example10/Example10.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example10/Example10/Extender/CennikSerwis.EksportujCennik.cs b/src/Example10/Example10/Extender/CennikSerwis.EksportujCennik.cs
new file mode 100644
index 0000000..cf9b2fd
--- /dev/null
+++ b/src/Example10/Example10/Extender/CennikSerwis.EksportujCennik.cs
@@ -0,0 +1,30 @@
+using Soneta.Business;
+using Soneta.Towary;
+
+namespace Samples.Example10.Extender {
+
+ public partial class CennikSerwis {
+
+ public string EksportujCennik(string tsvContent) {
+ var tcsvr = initCsvReader();
+ tcsvr.Read(tsvContent);
+ return tcsvr.ImportException != null ? tcsvr.ImportException.Message : "";
+ }
+
+ private SessionCsvReader initCsvReader() {
+ var csv = new SessionCsvReader {
+ View = initView()
+ };
+ return csv;
+ }
+
+ private View initView() {
+ var tm = TowaryModule.GetInstance(_session);
+ var view = tm.Towary.CreateView();
+ view.Context = Context.Empty.Clone(_session);
+ view.NewRowType = typeof (Towar);
+ return view;
+ }
+
+ }
+}
diff --git a/src/Example10/Example10/Extender/CennikSerwis.ImportujCennik.cs b/src/Example10/Example10/Extender/CennikSerwis.ImportujCennik.cs
new file mode 100644
index 0000000..3314786
--- /dev/null
+++ b/src/Example10/Example10/Extender/CennikSerwis.ImportujCennik.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Soneta.Business;
+using Soneta.Towary;
+
+namespace Samples.Example10.Extender {
+
+ public partial class CennikSerwis {
+
+ public string ImportujCennik() {
+ string result;
+ try {
+ var tcsvw = initCsvWriter();
+ using (var writer = new StringWriter()) {
+ tcsvw.Write(writer);
+ result = writer.ToString();
+ }
+ }
+ catch (Exception exc) {
+ result = exc.Message;
+ }
+ return result;
+ }
+
+ private SessionCsvWriter initCsvWriter() {
+ var data = initDatasource();
+ var accessor = new AccessorContext {
+ Context = Context.Empty.Clone(_session),
+ MemberType = data.GetRowType()
+ };
+
+ var tsvw = new SessionCsvWriter {
+ HeaderMode = CsvWriterHeaderMode.Path,
+ DataSource = data,
+ Accessors = new List {
+ accessor.GetAccessor("Kod"),
+ accessor.GetAccessor("Ceny.Podstawowa.Netto")
+ }
+ };
+
+ foreach (var acc in tsvw.Accessors)
+ acc.Prepare();
+
+ return tsvw;
+ }
+
+ private SubTable initDatasource() {
+ var tm = TowaryModule.GetInstance(_session);
+ var tkey = tm.Towary.PrimaryKey;
+ var condition = RowCondition.Empty;
+ condition &= new FieldCondition.Equal("Typ", TypTowaru.Towar);
+ condition &= new FieldCondition.Equal("Features.Synchronizowany", true);
+ return tkey[condition];
+ }
+ }
+}
diff --git a/src/Example10/Example10/Extender/CennikSerwis.cs b/src/Example10/Example10/Extender/CennikSerwis.cs
new file mode 100644
index 0000000..5258c37
--- /dev/null
+++ b/src/Example10/Example10/Extender/CennikSerwis.cs
@@ -0,0 +1,15 @@
+using Soneta.Business;
+using Samples.Example10.Extender;
+
+[assembly: Service(typeof(ICennikSerwis), typeof(CennikSerwis), Published = true)]
+namespace Samples.Example10.Extender {
+
+ public partial class CennikSerwis : ICennikSerwis {
+
+ private readonly Session _session;
+
+ public CennikSerwis(Session session) {
+ _session = session;
+ }
+ }
+}
diff --git a/src/Example10/Example10/Extender/ICennikSerwis.cs b/src/Example10/Example10/Extender/ICennikSerwis.cs
new file mode 100644
index 0000000..ea3d018
--- /dev/null
+++ b/src/Example10/Example10/Extender/ICennikSerwis.cs
@@ -0,0 +1,6 @@
+namespace Samples.Example10.Extender {
+ interface ICennikSerwis {
+ string ImportujCennik();
+ string EksportujCennik(string tsvContent);
+ }
+}
diff --git a/src/Example10/Readme.md b/src/Example10/Readme.md
new file mode 100644
index 0000000..dbacda1
--- /dev/null
+++ b/src/Example10/Readme.md
@@ -0,0 +1,18 @@
+### Example 10
+-----------------------------------------------------------------------------------------------------
+
+
+Przykład pokazuje możliwość zdalnej wymiany danych przy wykorzystaniu zaimplementowanego w enova365 serwisu WCF. Przykład zawiera implementacje serwisu enova, którego metody zostaną udostępnione przez serwis WCF co umożliwi wymianę danych z dowolnej maszyny w sieci. Przykadowy serwis zawiera prostą implementaję importu i eksportu cennika.
+
+W ramach interfejsu użytkownika zarejestrowanie takiego serwisu nie powoduje pojawienia się żadnej grupy w menu głównym programu.
+
+* Extender\CennikSerwis.cs
+
+ Definicja klasy serwisu oraz jego rejestracja.
+* Extender\CennikSerwis.ImportujCennik.cs
+
+ Zawiera definicje metody importującej cennik
+* Extender\CennikSerwis.EksportujCennik.cs
+
+ Zawiera definicje metody eksportującej cennik
+
diff --git a/src/Example2/Example2.Tests/Example2.Tests.csproj b/src/Example2/Example2.Tests/Example2.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example2/Example2.Tests/Example2.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example2/Example2.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example2/Example2.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example2/Example2.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example2/Example2.UI/Example2.UI.csproj b/src/Example2/Example2.UI/Example2.UI.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example2/Example2.UI/Example2.UI.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example2/Example2.UI/Extender/KontrahentNewOgolneExtender.cs b/src/Example2/Example2.UI/Extender/KontrahentNewOgolneExtender.cs
new file mode 100644
index 0000000..ced6b1f
--- /dev/null
+++ b/src/Example2/Example2.UI/Extender/KontrahentNewOgolneExtender.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Soneta.Business;
+using Soneta.Business.Db;
+using Soneta.CRM;
+using Samples.Example2.UI.Extender;
+
+[assembly: Worker(typeof(KontrahentNewOgolneExtender))]
+
+namespace Samples.Example2.UI.Extender
+{
+ class KontrahentNewOgolneExtender
+ {
+ // Atrybut Context pozwala na wskazanie mechanizmowi tworzenia extenderów
+ // jakie property powinny zostać ustawione automatycznie po utworzeniu obiektu
+ // extendera. Jeśli w kontekście istnieje obiekt pasujący typem do opisanego
+ // atrybutem property, to po utworzeniu obiektu extendera wartość property zostanie
+ // ustawiona wartością znajdującą sie w kontekście (obiekt Context).
+ [Context]
+ public Kontrahent Kontrahent { get; set; }
+
+ public Image Logo
+ {
+ get
+ {
+ // Wyszukujemy w załącznikach pierwszy o typie obraz, który jest oznaczony jako domyślny
+ foreach (Attachment attachemnt in Kontrahent.Attachments)
+ if (attachemnt.SubType == SubTypeType.Picture && attachemnt.IsDefault)
+ // i zwracamy go na zewnątrz
+ return attachemnt.DataAsImage;
+
+ // lub zwracamy null
+ return null;
+ }
+ }
+ }
+}
diff --git a/src/Example2/Example2.UI/UI/Kontrahent.KontrahentNewOgolne.pageform.xml b/src/Example2/Example2.UI/UI/Kontrahent.KontrahentNewOgolne.pageform.xml
new file mode 100644
index 0000000..e6d3e90
--- /dev/null
+++ b/src/Example2/Example2.UI/UI/Kontrahent.KontrahentNewOgolne.pageform.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Example2/Example2/Example2.csproj b/src/Example2/Example2/Example2.csproj
new file mode 100644
index 0000000..c5f0cba
--- /dev/null
+++ b/src/Example2/Example2/Example2.csproj
@@ -0,0 +1,9 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Example2/Readme.md b/src/Example2/Readme.md
new file mode 100644
index 0000000..c97a2ce
--- /dev/null
+++ b/src/Example2/Readme.md
@@ -0,0 +1,31 @@
+### Example 2
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje możliwość podpięcia dodatkowej zakładki użytkownika dla klasy *Kontrahent*.
+Implementacja dodatkowego extendera pokazuje w jaki sposób można dodawać własne informacje
+w postaci różnych danych (np. dodatkowe pola nie związane z logiką enova365). W przypadku
+zakładki wprowadzone zostało dodatkowe pole wyświetlające logo kontrahenta.
+Aby logo się pojawiło konieczne jest wstawienie kontrahentowi załącznika o typie obraz i ustawieniu go jako domyślny.
+
+W wyniku zastosowania dodatku, powinna pojawić się dodatkowa zakładka na formularzu
+kontrahenta, która oprócz danych standardowych zakładki ogólnej będzie posiadała również
+logo kontrahenta.
+
+
+W skład przykładu wchodzą trzy projekty:
+
+* `Example2` - zawierający elementy logiki biznesowej
+* `Example2.UI` - elementy interfejsu użytkownika
+* `Example2.Tests` - testy
+
+
+#### Zawartość przykładu:
+> Przykład zawiera jedynie elementy związane z interfejsem użytkownika wiec całość znajduje się w `Example2.UI`.
+
+
+* `Example2.UI`\Extender\KontrahentNewOgolneExtender.cs
+
+ Przykładowa klasa implementująca property Logo, które zostało umieszczone na dodatkowej zakładce
+* `Example2.UI`\UI\Kontrahent.KontrahentNewOgolne.pageform.xml
+
+ Definicja dodatkowej zakładki wyświetlającej logo Kontrahenta
\ No newline at end of file
diff --git a/src/Example3/Example3.Tests/Example3.Tests.csproj b/src/Example3/Example3.Tests/Example3.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example3/Example3.Tests/Example3.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example3/Example3.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example3/Example3.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example3/Example3.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example3/Example3.UI/Example3.UI.csproj b/src/Example3/Example3.UI/Example3.UI.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example3/Example3.UI/Example3.UI.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example3/Example3.UI/Extender/ZakladkaTowaryConfigExtender.cs b/src/Example3/Example3.UI/Extender/ZakladkaTowaryConfigExtender.cs
new file mode 100644
index 0000000..bf6ece8
--- /dev/null
+++ b/src/Example3/Example3.UI/Extender/ZakladkaTowaryConfigExtender.cs
@@ -0,0 +1,82 @@
+using System;
+using Soneta.Business;
+using Soneta.Config;
+using Samples.Example3.UI.Extender;
+
+[assembly: Worker(typeof(ZakladkaTowaryConfigExtender))]
+
+namespace Samples.Example3.UI.Extender
+{
+ ///
+ /// Klasa wspiera zapis i odczyt parametrów konfiguracyjnych dodatku Samples Example3
+ ///
+ public class ZakladkaTowaryConfigExtender
+ {
+ [Context]
+ public Session Session { get; set; }
+
+ public bool AktywneZakladkaTowary
+ {
+ get { return GetValue("AktywneZakladkaTowary", false); }
+ set { SetValue("AktywneZakladkaTowary", value, AttributeType._boolean); }
+ }
+
+ // Pobranie wartości parametru "AktywneZakladkaTowary"
+ public static bool IsAktywneZakladkaTowary(Session session)
+ {
+ return GetValue(session, "AktywneZakladkaTowary", false);
+ }
+
+ // Pobranie wartości parametrów konfiguracyjnych
+ private T GetValue(string name, T defaultValue)
+ {
+ return GetValue(Session, name, defaultValue);
+ }
+
+ // Zapisanie wartośći parametrów konfiguracyjnych
+ private void SetValue(string name, T value, AttributeType type)
+ {
+ SetValue(Session, name, value, type);
+ }
+
+ // Pobranie wartości parametrów konfiguracyjnych
+ private static T GetValue(Session session, string name, T defaultValue)
+ {
+ var cfgManager = new CfgManager(session);
+ var node = cfgManager.Root.FindSubNode("Samples", false);
+ if (node == null) return defaultValue;
+
+ var nodeLeaf = node.FindSubNode("Konfiguracja", false);
+ if (nodeLeaf == null) return defaultValue;
+
+ var attr = nodeLeaf.FindAttribute(name, false);
+ if (attr == null) return defaultValue;
+
+ if (attr.Value == null) return defaultValue;
+
+ return (T)attr.Value;
+ }
+
+ // Ustawianie wartości parametrów konfiguracyjnych
+ private static void SetValue(Session session, string name, T value, AttributeType type)
+ {
+ using (var t = session.Logout(true))
+ {
+ var cfgManager = new CfgManager(session);
+ var node = cfgManager.Root.FindSubNode("Samples", false) ??
+ cfgManager.Root.AddNode("Samples", CfgNodeType.Node);
+
+ var nodeLeaf = node.FindSubNode("Konfiguracja", false) ??
+ node.AddNode("Konfiguracja", CfgNodeType.Leaf);
+
+ var attr = nodeLeaf.FindAttribute(name, false);
+ if (attr == null)
+ nodeLeaf.AddAttribute(name, type, value);
+ else
+ attr.Value = value;
+
+ t.CommitUI();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git "a/src/Example3/Example3.UI/UI/Config.Zak\305\202adkaTowary.pageform.xml" "b/src/Example3/Example3.UI/UI/Config.Zak\305\202adkaTowary.pageform.xml"
new file mode 100644
index 0000000..2d80898
--- /dev/null
+++ "b/src/Example3/Example3.UI/UI/Config.Zak\305\202adkaTowary.pageform.xml"
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example3/Example3.UI/ViewInfo/Menu.cs b/src/Example3/Example3.UI/ViewInfo/Menu.cs
new file mode 100644
index 0000000..4760726
--- /dev/null
+++ b/src/Example3/Example3.UI/ViewInfo/Menu.cs
@@ -0,0 +1,20 @@
+
+using Soneta.Business.Licence;
+using Soneta.Business.UI;
+using Samples.Example3.UI.Extender;
+
+
+[assembly: FolderView("Samples",
+ Priority = 10,
+ Description = "Przykłady implementacji enova365",
+ BrickColor = FolderViewAttribute.BlueBrick,
+ Contexts = new object[] { LicencjeModułu.All }
+)]
+
+
+[assembly: FolderView("Samples/Zakladka towary",
+ Priority = 11,
+ Description = "Towary - zakladka",
+ TableName = "Towary",
+ ViewType = typeof(TowaryZakladkaViewInfo)
+)]
\ No newline at end of file
diff --git a/src/Example3/Example3.UI/ViewInfo/TowaryZakladkaViewInfo.cs b/src/Example3/Example3.UI/ViewInfo/TowaryZakladkaViewInfo.cs
new file mode 100644
index 0000000..83c4ccd
--- /dev/null
+++ b/src/Example3/Example3.UI/ViewInfo/TowaryZakladkaViewInfo.cs
@@ -0,0 +1,35 @@
+using Soneta.Business;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Samples.Example3.UI.Extender
+{
+ public class TowaryZakladkaViewInfo : ViewInfo
+ {
+ public TowaryZakladkaViewInfo()
+ {
+
+ }
+
+ ///
+ /// Metoda pozwalająca na sterowanie widocznościa zakładki.
+ ///
+ ///
+ ///
+ /// true - widoczność zakładki,
+ /// false - zakładka niewidoczna
+ ///
+ public static bool IsVisible(Context context)
+ {
+ bool result;
+ using (var session = context.Login.CreateSession(true, true))
+ {
+ result = ZakladkaTowaryConfigExtender.IsAktywneZakladkaTowary(session);
+ }
+ return result;
+ }
+ }
+}
diff --git a/src/Example3/Example3/Example3.csproj b/src/Example3/Example3/Example3.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example3/Example3/Example3.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example3/Readme.md b/src/Example3/Readme.md
new file mode 100644
index 0000000..94fc62b
--- /dev/null
+++ b/src/Example3/Readme.md
@@ -0,0 +1,38 @@
+### Example 3
+-----------------------------------------------------------------------------------------------------
+
+Przykad pokazuje moliwo podpicia wasnej zakadki konfiguracyjnej dla potrzeb wasnego dodatku.
+W przykadzie zastosowano mechanizm tworzenia ustawie konfiguracji bezporednio w kodzie programu,
+bez stosowania pliku *config.xml*.
+
+W wyniku zastosowania dodatku, w konfiguracji powinna pojawi si dodatkowa zakadka w sekcji o nazwie
+**Samples**.
+
+
+W skad przykadu wchodz trzy projekty:
+
+* `Example3` - zawierajcy elementy logiki biznesowej
+* `Example3.UI` - elementy interfejsu uytkownika
+* `Example3.Tests` - testy
+
+
+#### Zawarto przykadu:
+> Przykad zawiera jedynie elementy zwizane z interfejsem uytkownika wiec cao znajduje si w `Example3.UI`.
+
+
+
+* `Example3.UI`\Extender\ZakladkaTowaryConfigExtender.cs
+
+ Wsparcie dla ustawie
+
+* `Example3.UI`\UI\Config.ZakadkaTowary.pageform.xml
+
+ Definicja zakadki konfiguracyjnej
+
+* `Example3.UI`\ViewInfo\Menu.cs
+
+ Rejestracja listy dla View
+
+* `Example3.UI`\ViewInfo\TowaryZakladkaViewInfo.cs
+
+ Definicja ViewInfo z logik sterujc widocznoci
\ No newline at end of file
diff --git a/src/Example4/Example4.Tests/Example4.Tests.csproj b/src/Example4/Example4.Tests/Example4.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example4/Example4.Tests/Example4.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example4/Example4.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example4/Example4.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example4/Example4.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example4/Example4.UI/Example4.UI.csproj b/src/Example4/Example4.UI/Example4.UI.csproj
new file mode 100644
index 0000000..94bf74a
--- /dev/null
+++ b/src/Example4/Example4.UI/Example4.UI.csproj
@@ -0,0 +1,9 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Example4/Example4.UI/Menu.cs b/src/Example4/Example4.UI/Menu.cs
new file mode 100644
index 0000000..4b7849b
--- /dev/null
+++ b/src/Example4/Example4.UI/Menu.cs
@@ -0,0 +1,20 @@
+
+using Soneta.Business.Licence;
+using Soneta.Business.UI;
+using Samples.Example4;
+
+[assembly: FolderView("Samples",
+ Priority = 10,
+ Description = "Przykłady implementacji enova365",
+ BrickColor = FolderViewAttribute.BlueBrick,
+ Contexts = new object[] { LicencjeModułu.All }
+)]
+
+[assembly: FolderView("Samples/Kursy walut NBP",
+ Priority = 11,
+ Description = "Przykład kursów walut pobieranych z NBP online",
+ ObjectType = typeof(DzienneKursyWalutNbp),
+ ObjectPage = "DzienneKursyWalutNbp.Ogolne.pageform.xml",
+ ReadOnlySession = false,
+ ConfigSession = false
+)]
\ No newline at end of file
diff --git a/src/Example4/Example4.UI/UI/Config.CfgWalutyNbpExtender.pageform.xml b/src/Example4/Example4.UI/UI/Config.CfgWalutyNbpExtender.pageform.xml
new file mode 100644
index 0000000..4c5fe6c
--- /dev/null
+++ b/src/Example4/Example4.UI/UI/Config.CfgWalutyNbpExtender.pageform.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example4/Example4.UI/UI/DzienneKursyWalutNbp.Ogolne.pageform.xml b/src/Example4/Example4.UI/UI/DzienneKursyWalutNbp.Ogolne.pageform.xml
new file mode 100644
index 0000000..549801c
--- /dev/null
+++ b/src/Example4/Example4.UI/UI/DzienneKursyWalutNbp.Ogolne.pageform.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example4/Example4/DzienneKursyWalutNbp.Aktualizacja.cs b/src/Example4/Example4/DzienneKursyWalutNbp.Aktualizacja.cs
new file mode 100644
index 0000000..a4c1164
--- /dev/null
+++ b/src/Example4/Example4/DzienneKursyWalutNbp.Aktualizacja.cs
@@ -0,0 +1,159 @@
+using System;
+using System.IO;
+using System.Text;
+using System.Xml;
+using Soneta.Business;
+using Soneta.Business.UI;
+using Samples.Example4;
+using Soneta.Tools;
+
+namespace Samples.Example4 {
+
+ public partial class DzienneKursyWalutNbp {
+
+ #region Aktualizacja kursów
+
+ #region Aktualizacja online
+
+ public MessageBoxInformation Aktualizuj()
+ {
+ return new MessageBoxInformation(
+ "Aktualizowanie kursów walut w formie XML".Translate(),
+ "Czy aktualizować tabelę kursów w formie XML".Translate()
+ ) {
+ YesHandler = () => {
+ // Wczytujemy aktualne kursy
+ aktualizujonline(DateTime.Today);
+
+ // Wymuszamy odświeżenie listy
+ Context.Session.InvokeChanged();
+ return null;
+ }
+ };
+ }
+
+ private void aktualizujonline(DateTime date)
+ {
+ string f;
+ var bytes = loadData(date, out f);
+ using (var stream = new MemoryStream(bytes)) {
+ aktualizuj(stream);
+ }
+ }
+
+ private void aktualizuj(DateTime date)
+ {
+ string f;
+ var bytes = loadData(date, out f);
+ var reader = new StreamReader(new MemoryStream(bytes), Encoding.GetEncoding(1250));
+ var document = new XmlDocument();
+ document.Load(reader);
+ var element = document.DocumentElement;
+ if (element == null)
+ return;
+
+ var tabelaKursow = element.SelectSingleNode("//tabela_kursow[@typ='A']");
+
+ _kursyWalut.Clear();
+
+ if (tabelaKursow == null)
+ return;
+
+ var pozycje = tabelaKursow.SelectNodes("pozycja");
+ if (pozycje == null)
+ return;
+
+ foreach (XmlNode pozycja in pozycje)
+ {
+ if (pozycja == null)
+ continue;
+
+ var przelicznik = GetNodeValue(pozycja, "przelicznik");
+ var kursSredni = GetNodeValue(pozycja, "kurs_sredni");
+ var kodWaluty = GetNodeValue(pozycja, "kod_waluty");
+ var nazwaWaluty = GetNodeValue(pozycja, "nazwa_waluty");
+
+ _kursyWalut.Add(kodWaluty, new KursWalutyNbp {
+ Kod = kodWaluty,
+ Nazwa = nazwaWaluty,
+ Przelicznik = (przelicznik.IsNullOrEmpty() ? 0 : Convert.ToInt32(przelicznik)),
+ KursSredni = (kursSredni.IsNullOrEmpty() ? 0 : Convert.ToDouble(kursSredni))
+ });
+ }
+ }
+
+ #endregion
+
+ #region Aktualizacja z pliku
+
+ public MessageBoxInformation AktualizujZPliku() {
+ return new MessageBoxInformation(
+ "Aktualizowanie kursów walut w formie XML".Translate(),
+ "Czy aktualizować tabelę kursów w formie XML".Translate()
+ ) {
+ YesHandler = () => QueryContextInformation.Create(importFile)
+ };
+ }
+
+ private object importFile(NamedStream ns) {
+ using (var stream = new MemoryStream(ns.GetData())) {
+ // Wczytujemy aktualne kursy
+ aktualizuj(stream);
+ }
+ // Wymuszamy odświeżenie listy
+ Context.Session.InvokeChanged();
+ return "Importowanie danych został zakończony pomyślnie.";
+ }
+
+ #endregion
+
+ private static string GetNodeValue(XmlNode node, string valueName)
+ {
+ var result = String.Empty;
+ var valueNode = node.SelectSingleNode(valueName);
+ if (valueNode != null)
+ result = valueNode.InnerText;
+ return result;
+ }
+
+ private void aktualizuj(Stream stream) {
+ var reader = new StreamReader(stream, Encoding.GetEncoding(1250));
+ var document = new XmlDocument();
+ document.Load(reader);
+ var element = document.DocumentElement;
+ if (element == null)
+ return;
+
+ var tabelaKursow = element.SelectSingleNode("//tabela_kursow[@typ='A']");
+
+ _kursyWalut.Clear();
+
+ if (tabelaKursow == null)
+ return;
+
+ var pozycje = tabelaKursow.SelectNodes("pozycja");
+ if (pozycje == null)
+ return;
+
+ foreach (XmlNode pozycja in pozycje) {
+ if (pozycja == null)
+ continue;
+
+ var przelicznik = GetNodeValue(pozycja, "przelicznik");
+ var kursSredni = GetNodeValue(pozycja, "kurs_sredni");
+ var kodWaluty = GetNodeValue(pozycja, "kod_waluty");
+ var nazwaWaluty = GetNodeValue(pozycja, "nazwa_waluty");
+
+ _kursyWalut.Add(kodWaluty, new KursWalutyNbp {
+ Kod = kodWaluty,
+ Nazwa = nazwaWaluty,
+ Przelicznik = (przelicznik.IsNullOrEmpty() ? 0 : Convert.ToInt32(przelicznik)),
+ KursSredni = (kursSredni.IsNullOrEmpty() ? 0 : Convert.ToDouble(kursSredni))
+ });
+ }
+ }
+
+ #endregion Aktualizacja kursów
+ }
+
+}
diff --git a/src/Example4/Example4/DzienneKursyWalutNbp.Ogolne.cs b/src/Example4/Example4/DzienneKursyWalutNbp.Ogolne.cs
new file mode 100644
index 0000000..e52f978
--- /dev/null
+++ b/src/Example4/Example4/DzienneKursyWalutNbp.Ogolne.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using System.Linq;
+using Soneta.Business;
+using Samples.Example4;
+using Samples.Example4.Extender;
+
+namespace Samples.Example4
+{
+
+ public partial class DzienneKursyWalutNbp {
+ [Context(Required = true)]
+ public Context Context { get; set; }
+
+ [Context(Required = true)]
+ public Session Session { get; set; }
+
+ #region Property dla formularza
+
+ private SortedDictionary _kursyWalut;
+ public IEnumerable KursyWalut {
+ get {
+ if (_kursyWalut != null)
+ return _kursyWalut.Values.ToArray();
+
+ _kursyWalut = new SortedDictionary {
+ {
+ "USD", new KursWalutyNbp {
+ Kod = "USD",
+ Nazwa = "Dolar amerykański",
+ Przelicznik = 1,
+ KursSredni = 3.0589f
+ }
+ },
+ {
+ "CHF", new KursWalutyNbp {
+ Kod = "CHF",
+ Nazwa = "Frank szwajcarski",
+ Przelicznik = 1,
+ KursSredni = 3.4018f
+ }
+ }
+ };
+ return _kursyWalut.Values.ToArray();
+ }
+ }
+
+ #endregion Property dla formularza
+ }
+
+}
diff --git a/src/Example4/Example4/DzienneKursyWalutNbp.Pobranie.cs b/src/Example4/Example4/DzienneKursyWalutNbp.Pobranie.cs
new file mode 100644
index 0000000..74e433d
--- /dev/null
+++ b/src/Example4/Example4/DzienneKursyWalutNbp.Pobranie.cs
@@ -0,0 +1,77 @@
+using System;
+using System.IO;
+using System.Net;
+using Soneta.Business;
+using Soneta.Business.UI;
+using Samples.Example4.Extender;
+using Soneta.Tools;
+
+namespace Samples.Example4
+{
+
+ public partial class DzienneKursyWalutNbp {
+ #region Pobranie kursów w formie xml
+
+ public MessageBoxInformation PobierzXml() {
+ return new MessageBoxInformation(
+ "Pobranie kursow walut w formie XML".Translate(),
+ "Czy pobrać aktualną tabelę kursów w formie XML".Translate()
+ ) {
+ YesHandler = () => {
+ string file;
+ var bytes = loadData(DateTime.Today, out file);
+ return new NamedStream(file, bytes);
+ }
+ };
+ }
+
+ private byte[] loadData(DateTime date, out string file)
+ {
+ var lastDay = date;
+ switch (DateTime.Today.DayOfWeek) {
+ case DayOfWeek.Thursday:
+ lastDay = lastDay.AddDays(-1);
+ break;
+ case DayOfWeek.Saturday:
+ lastDay = lastDay.AddDays(-1);
+ break;
+ case DayOfWeek.Sunday:
+ lastDay = lastDay.AddDays(-2);
+ break;
+ }
+
+ var nbpUrl = CfgWalutyNbpExtender.GetUrlNbp(Session, "http://www.nbp.pl/kursy/xml/a034z");
+ nbpUrl += "{0}";
+ file = String.Format("{0}.xml", lastDay.ToString("yyMMdd"));
+ var url = String.Format(nbpUrl, file);
+
+ var request = (HttpWebRequest)WebRequest.Create(url);
+ byte[] bytes;
+ using (var webResponse = (HttpWebResponse)request.GetResponse()) {
+ using (var sr = webResponse.GetResponseStream()) {
+
+ bytes = new byte[(int)webResponse.ContentLength];
+ var pos = 0;
+
+ while (pos < bytes.Length) {
+ if (sr == null)
+ continue;
+
+ var bytesRead = sr.Read(bytes, pos, bytes.Length - pos);
+ if (bytesRead == 0) {
+ throw new IOException("Premature end of data");
+ }
+ pos += bytesRead;
+ }
+ if (sr != null)
+ sr.Close();
+ }
+ webResponse.Close();
+ }
+ return bytes;
+ }
+
+ #endregion Pobranie kursów w formie xml
+ }
+
+}
diff --git a/src/Example4/Example4/Example4.csproj b/src/Example4/Example4/Example4.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example4/Example4/Example4.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example4/Example4/Extender/CfgWalutyNbpExtender.cs b/src/Example4/Example4/Extender/CfgWalutyNbpExtender.cs
new file mode 100644
index 0000000..c62a70a
--- /dev/null
+++ b/src/Example4/Example4/Extender/CfgWalutyNbpExtender.cs
@@ -0,0 +1,88 @@
+
+using Soneta.Business;
+using Soneta.Config;
+using Samples.Example4.Extender;
+
+// Rejestracja extender'a użytego na interfejsie
+[assembly: Worker(typeof(CfgWalutyNbpExtender))]
+
+namespace Samples.Example4.Extender {
+ public class CfgWalutyNbpExtender
+ {
+ [Context]
+ public Session Session { get; set; }
+
+ #region Property formularza
+
+ public string UrlNbp {
+ get { return GetValue("UrlNbp", ""); }
+ set { SetValue("UrlNbp", value, AttributeType._string); }
+ }
+
+ public static string GetUrlNbp(Session session, string def)
+ {
+ return GetValue(session, "UrlNbp", def);
+ }
+
+ #endregion Property formularza
+
+ #region Metody pomocnicze
+
+ //Metoda odpowiada za ustawianie wartosci parametrów konfiguracji
+ private void SetValue(string name, T value, AttributeType type) {
+ SetValue(Session, name, value, type);
+ }
+
+ //Metoda odpowiada za pobieranie wartosci parametrów konfiguracji
+ private T GetValue(string name, T def) {
+ return GetValue(Session, name, def);
+ }
+
+ //Metoda odpowiada za ustawianie wartosci parametrów konfiguracji
+ private static void SetValue(Session session, string name, T value, AttributeType type) {
+ using (var t = session.Logout(true)) {
+ var cfgManager = new CfgManager(session);
+ //wyszukiwanie gałęzi głównej
+ var node1 = cfgManager.Root.FindSubNode("Samples", false) ??
+ cfgManager.Root.AddNode("Samples", CfgNodeType.Node);
+
+ //wyszukiwanie liścia
+ var node2 = node1.FindSubNode("Kursy Walut NBP", false) ??
+ node1.AddNode("Kursy Walut NBP", CfgNodeType.Leaf);
+
+ //wyszukiwanie wartosci atrybutu w liściu
+ var attr = node2.FindAttribute(name, false);
+ if (attr == null)
+ node2.AddAttribute(name, type, value);
+ else
+ attr.Value = value;
+
+ t.CommitUI();
+ }
+ }
+
+ //Metoda odpowiada za pobieranie wartosci parametrów konfiguracji
+ private static T GetValue(Session session, string name, T def) {
+ var cfgManager = new CfgManager(session);
+
+ var node1 = cfgManager.Root.FindSubNode("Samples", false);
+
+ //Jeśli nie znaleziono gałęzi, zwracamy wartosć domyślną
+ if (node1 == null) return def;
+
+ var node2 = node1.FindSubNode("Kursy Walut NBP", false);
+ if (node2 == null) return def;
+
+ var attr = node2.FindAttribute(name, false);
+ if (attr == null) return def;
+
+ if (attr.Value == null) return def;
+
+ return (T) attr.Value;
+ }
+
+ #endregion Metody pomocnicze
+ }
+
+
+}
diff --git a/src/Example4/Example4/KursWalutyNbp.cs b/src/Example4/Example4/KursWalutyNbp.cs
new file mode 100644
index 0000000..6ee3168
--- /dev/null
+++ b/src/Example4/Example4/KursWalutyNbp.cs
@@ -0,0 +1,8 @@
+namespace Samples.Example4 {
+ public class KursWalutyNbp {
+ public string Kod { get; set; }
+ public string Nazwa { get; set; }
+ public double KursSredni { get; set; }
+ public int Przelicznik { get; set; }
+ }
+}
diff --git a/src/Example4/Readme.md b/src/Example4/Readme.md
new file mode 100644
index 0000000..6da2e4c
--- /dev/null
+++ b/src/Example4/Readme.md
@@ -0,0 +1,50 @@
+### Example 4
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje implementacje własnej klasy, nie powiązanej z logiką enova365. Dla zaimplementowanej
+klasy została utworzona dedykowana definicja formularza. W przykładzie pokazano wykorzystanie *Command*
+oraz podpięcia do nich własnych metod.
+
+W wyniku zastosowania dodatku, powinna pojawić się dodatkowa grupa w menu głównym programu o nazwie
+*Soneta.Examples*, z opcją *"Kursy walut NBP"*, po wybraniu której pojawi się zaimplementowana lista.
+
+Na liście pokazane zostało użycie zaimplementowanych metod extender'a:
+* `Aktualizuj` - uzupełnia dane pobrane z serwera
+* `AktualizujZPliku` - która uzupełnia dane na liście na podstawie pliku XML.
+* `PobierzXml` - pokazuje możliwość ściągnięcia pliku xml, zawierającego
+dane przygotowane po stronie serwera.
+
+Adres url serwera można wprowadzić w konfiguracji *Narzedzia/Opcje/Samples/Ustawienia Kursy NBP*
+
+W skład przykładu wchodzą trzy projekty:
+
+* `Example4` - zawierający elementy logiki biznesowej
+* `Example4.UI` - interfejsu użytkownika
+* `Example4.Tests` - testy
+
+
+#### Zawartość przykładu:
+
+* `Example4`\KursWalutyNbp.cs
+
+ Klasa implemenująca pojedynczy wiersz wyświetlany na liście zdefiniowanej na zakładce.
+
+* `Example4`\DzienneKursyWalutNbp.*.cs
+
+ Klasa implementująca dane oraz metody
+
+* `Example4`\Extender\CfgWalutyNbpExtender.cs
+
+ Przykładowa klasa implementująca ustawienia konfiguracyjne
+
+* `Example4.UI`\UI\Config.CfgWalutyNbpExtender.pageform.xml
+
+ Definicja formularza własnej zakładki konfiguracyjnej
+
+* `Example4.UI`\UI\DzienneKursyWalutNbp.Ogolne.pageform.xml
+
+ Definicja page'a dla kursów
+
+* `Example4.UI`\Menu.cs
+
+ Rejestracja zakładki
\ No newline at end of file
diff --git a/src/Example5/Example5.Tests/Example5.Tests.csproj b/src/Example5/Example5.Tests/Example5.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example5/Example5.Tests/Example5.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example5/Example5.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example5/Example5.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example5/Example5.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example5/Example5.UI/Example5.UI.csproj b/src/Example5/Example5.UI/Example5.UI.csproj
new file mode 100644
index 0000000..0556b90
--- /dev/null
+++ b/src/Example5/Example5.UI/Example5.UI.csproj
@@ -0,0 +1,9 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Example5/Example5.UI/UI/ZmianaNazwTowarowParams.Ogolne.pageform.xml b/src/Example5/Example5.UI/UI/ZmianaNazwTowarowParams.Ogolne.pageform.xml
new file mode 100644
index 0000000..a4973c2
--- /dev/null
+++ b/src/Example5/Example5.UI/UI/ZmianaNazwTowarowParams.Ogolne.pageform.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example5/Example5/Example5.csproj b/src/Example5/Example5/Example5.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example5/Example5/Example5.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example5/Example5/Extender/ZmianaNazwTowarowWorker.cs b/src/Example5/Example5/Extender/ZmianaNazwTowarowWorker.cs
new file mode 100644
index 0000000..27e3bd6
--- /dev/null
+++ b/src/Example5/Example5/Extender/ZmianaNazwTowarowWorker.cs
@@ -0,0 +1,75 @@
+
+using System.Linq;
+using Soneta.Business;
+using Samples.Example5.Extender;
+using Soneta.Tools;
+using Soneta.Towary;
+
+
+[assembly: Worker(typeof(ZmianaNazwTowarowWorker), typeof(Towary))]
+
+namespace Samples.Example5.Extender {
+
+ public class ZmianaNazwTowarowWorker : ContextBase {
+
+ public ZmianaNazwTowarowWorker(Context context) : base(context) {
+ }
+
+ // Potrzebne dla akcji parametry
+ [Context]
+ public ZmianaNazwTowarowParams PrefixParams {
+ get;
+ set;
+ }
+
+ // Potrzebne dane na których zostanie wykonana akcja
+ [Context]
+ public Towar[] Towary {
+ get; set;
+ }
+
+ // Akcja jaka zostanie wykonana na danych w oparciu o ustawione parametry
+ [Action("Soneta Examples/Zmiana postfix-prefix", Mode = ActionMode.SingleSession | ActionMode.ConfirmSave | ActionMode.Progress)]
+ public void ZmianaNazw() {
+ using (var t = PrefixParams.Session.Logout(true)) {
+ foreach (var towar in Towary.Where(towar => PrefixParams.TypTowaru == towar.Typ)) {
+
+ if (!PrefixParams.DodajPrefix.IsNullOrEmpty() && !towar.Nazwa.StartsWith(PrefixParams.DodajPrefix)) {
+ towar.Nazwa = PrefixParams.DodajPrefix + towar.Nazwa;
+ }
+
+ if (!PrefixParams.DodajPostfix.IsNullOrEmpty() && !towar.Nazwa.StartsWith(PrefixParams.DodajPostfix)) {
+ towar.Nazwa += PrefixParams.DodajPostfix;
+ }
+
+ if (!PrefixParams.UsunPrefix.IsNullOrEmpty() && towar.Nazwa.StartsWith(PrefixParams.UsunPrefix)) {
+ towar.Nazwa = towar.Nazwa.Substring(PrefixParams.UsunPrefix.Length);
+ }
+
+ if (!PrefixParams.UsunPostfix.IsNullOrEmpty() && towar.Nazwa.EndsWith(PrefixParams.UsunPostfix)) {
+ towar.Nazwa = towar.Nazwa.Substring(0, towar.Nazwa.Length - PrefixParams.UsunPostfix.Length);
+ }
+
+ }
+ t.Commit();
+ }
+ }
+ }
+
+ public class ZmianaNazwTowarowParams : ContextBase {
+
+ public ZmianaNazwTowarowParams(Context context) : base(context) {
+ TypTowaru = TypTowaru.Towar;
+ }
+
+ public TypTowaru TypTowaru { get; set; }
+
+ public string DodajPrefix { get; set; }
+
+ public string DodajPostfix { get; set; }
+
+ public string UsunPrefix { get; set; }
+
+ public string UsunPostfix { get; set; }
+ }
+}
diff --git a/src/Example5/Readme.md b/src/Example5/Readme.md
new file mode 100644
index 0000000..d714372
--- /dev/null
+++ b/src/Example5/Readme.md
@@ -0,0 +1,15 @@
+### Example 5
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje możliwość definiowania pageform dla parametrów zarejestrowanego workera.
+
+W wyniku zastosowania dodatku, w menu czynności na liście towarów powinna pojawić się dodatkowa
+sekcja o nazwie *Soneta.Examples*, która zawiera akcje o nazwie *"Zmiana postfix/prefix"* zaimplementowaną
+w przykładzie.
+
+* `Example5`\Extender\ZmianaNazwTowarowWorker.cs
+
+ Przykładowa klasa worker'a implementująca czynności w opraciu o klasę parametrów z którą powiązany jest zarejestrowany page.
+* `Example5.UI`\UI\ZmianaNazwTowarowParams.Ogolne.pageform.xml
+
+ Pageform zarejestrowany dla parametrów metody worker'a
diff --git a/src/Example6/Example6.Tests/Example6.Tests.csproj b/src/Example6/Example6.Tests/Example6.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example6/Example6.Tests/Example6.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example6/Example6.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example6/Example6.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example6/Example6.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example6/Example6.UI/Example6.UI.csproj b/src/Example6/Example6.UI/Example6.UI.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example6/Example6.UI/Example6.UI.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example6/Example6.UI/Extender/ExampleWorker.cs b/src/Example6/Example6.UI/Extender/ExampleWorker.cs
new file mode 100644
index 0000000..c4407b8
--- /dev/null
+++ b/src/Example6/Example6.UI/Extender/ExampleWorker.cs
@@ -0,0 +1,88 @@
+
+using Soneta.Business;
+using Soneta.Business.UI;
+using Soneta.CRM;
+using Samples.Example6.Extender;
+using Soneta.Types;
+
+[assembly: Worker(typeof(ExampleWorker), typeof(Kontrahent))]
+
+
+namespace Samples.Example6.Extender {
+
+ public class ExampleWorker {
+
+ [Context]
+ public Kontrahent Kontrahent { get; set; }
+
+ [Action(@"Soneta.Examples/MessageBox YesNo", Mode = ActionMode.SingleSession, Priority = 90001)]
+ public MessageBoxInformation MsgYesNo()
+ {
+ return new MessageBoxInformation("Wybierz coś") {
+ Text = "To jest jakaś wyświetlana informacja",
+ YesHandler = () => Kontrahent,
+ NoHandler = () => "Wciśnięty NO"
+ };
+ }
+
+ [Action(@"Soneta.Examples/QueryContext1 ...", Mode = ActionMode.SingleSession, Priority = 90002)]
+ public QueryContextInformation QueryContextExample() {
+ return QueryContextInformation.Create(args => new MessageBoxInformation {
+ Text = "Dane zostały zmienione. Potwierdzasz zapis ?",
+ OKHandler = () => {
+ using (var trans = Kontrahent.Session.Logout(true)) {
+ Kontrahent.Adres.Telefon = args.NowyTelefon ?? "";
+ Kontrahent.Adres.Faks = args.NowyFax ?? "";
+ trans.CommitUI();
+ }
+ return null;
+ },
+ CancelHandler = () => null,
+ IsCancelVisible = true,
+ });
+ }
+
+ [Action(@"Soneta.Examples/QueryContext2 ...", Mode = ActionMode.SingleSession, Priority = 90003)]
+ public QueryContextInformation QueryContextExample2() {
+ return QueryContextInformation.Create(args => {
+ using (var trans = Kontrahent.Session.Logout(true)) {
+ Kontrahent.Adres.Telefon = args.NowyTelefon ?? "";
+ Kontrahent.Adres.Faks = args.NowyFax ?? "";
+ trans.CommitUI();
+ }
+ return null;
+ });
+ }
+
+ [Action(@"Soneta.Examples/QueryContext3 ...", Mode = ActionMode.SingleSession, Priority = 90004)]
+ public QueryContextInformation KontrahentQuery() {
+ var qci = new QueryContextInformation(Kontrahent) {
+ Caption = "Dodawanie osoby kontaktowej",
+ AcceptHandler = () => {
+ KontaktOsoba kontakt;
+ using (var trans = Kontrahent.Session.Logout(true)) {
+ kontakt = new KontaktOsoba();
+ Kontrahent.Module.KontaktyOsoby.AddRow(kontakt);
+ kontakt.Kontrahent = Kontrahent;
+ trans.CommitUI();
+ }
+ return kontakt;
+ }
+ };
+ return qci;
+ }
+
+ }
+
+ public class WParams : ContextBase {
+
+ public WParams(Context cx) : base(cx) {
+ }
+
+ [Caption("Nowy numer telefonu")]
+ public string NowyTelefon { get; set; }
+
+ [Caption("Nowy numer faksu")]
+ public string NowyFax { get; set; }
+ }
+}
diff --git a/src/Example6/Example6/Example6.csproj b/src/Example6/Example6/Example6.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example6/Example6/Example6.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example6/README.md b/src/Example6/README.md
new file mode 100644
index 0000000..71ce7cf
--- /dev/null
+++ b/src/Example6/README.md
@@ -0,0 +1,14 @@
+### Example 6
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje możliwość podpięcia workera dla typu Kontrahent z własnymi czynnościami.
+Zaimplementowane czynności wykorzystują różne typy zwracanych rezultatów mające wpływ na zachowanie interfejsu użytkownika.
+W przykładzie zastosowano rezultaty typu `MessageBoxInformation` i `QueryContextInformation`.
+Natomiast rezultat `NamedStream` pozwalający na zwrócenie pliku został zaprezentowany w przykładzie 4 .
+
+W wyniku zastosowania dodatku, w menu czynności na liście kontrahentów powinna pojawić się dodatkowa
+sekcja o nazwie Soneta.Examples, która zawiera 4 różne akcje zaimplementowane w przykładzie.
+
+* `Example6.UI`\Extender\ExampleWorker.cs
+
+ Przykładowa klasa extender'a implementująca czynności z zastosowaniem różnych rezultatów.
diff --git a/src/Example7/Example7.Config/Directory.Build.props b/src/Example7/Example7.Config/Directory.Build.props
new file mode 100644
index 0000000..a842560
--- /dev/null
+++ b/src/Example7/Example7.Config/Directory.Build.props
@@ -0,0 +1,7 @@
+
+
+
+ 1910.1.1
+ net46
+
+
diff --git a/src/Example7/Example7.Config/Example7.Config.csproj b/src/Example7/Example7.Config/Example7.Config.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example7/Example7.Config/Example7.Config.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example7/Example7.Config/global.json b/src/Example7/Example7.Config/global.json
new file mode 100644
index 0000000..8cfb040
--- /dev/null
+++ b/src/Example7/Example7.Config/global.json
@@ -0,0 +1,5 @@
+{
+ "msbuild-sdks": {
+ "Soneta.Sdk": "1.0.3"
+ }
+}
diff --git a/src/Example7/Example7.Tests/Example7.Tests.csproj b/src/Example7/Example7.Tests/Example7.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example7/Example7.Tests/Example7.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example7/Example7.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example7/Example7.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example7/Example7.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example7/Example7.UI/Example7.UI.csproj b/src/Example7/Example7.UI/Example7.UI.csproj
new file mode 100644
index 0000000..ddb6cf1
--- /dev/null
+++ b/src/Example7/Example7.UI/Example7.UI.csproj
@@ -0,0 +1,7 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
+
\ No newline at end of file
diff --git a/src/Example7/Example7.UI/Extender/DashboardExtender.cs b/src/Example7/Example7.UI/Extender/DashboardExtender.cs
new file mode 100644
index 0000000..3adc88a
--- /dev/null
+++ b/src/Example7/Example7.UI/Extender/DashboardExtender.cs
@@ -0,0 +1,93 @@
+
+using System;
+using System.Linq;
+using Soneta.Business;
+using Soneta.Business.App;
+using Soneta.Examples.Example7.Extender;
+using Soneta.Tools;
+
+
+[assembly: Worker(typeof(New_DashboardExtender))]
+
+
+namespace Soneta.Examples.Example7.Extender {
+
+ public class New_DashboardExtender
+ {
+ public int LiczbaDodatnia
+ {
+ get { return 12; }
+ }
+
+ public int LiczbaUjemna {
+ get { return -56; }
+ }
+
+ public int MaxObrot {
+ get { return (int)DaneObrot.Max(d => d.Obrót); }
+ }
+
+ public int MinObrot {
+ get { return (int)DaneObrot.Min(d => d.Obrót); }
+ }
+
+ public int MaxPopulacja {
+ get { return (int)DanePopulacja.Max(d => d.Populacja); }
+ }
+
+ public int MinPopulacja {
+ get { return (int)DanePopulacja.Min(d => d.Populacja); }
+ }
+
+ public Wiersz[] DaneObrot {
+ get {
+ return obroty();
+ }
+ }
+
+ public WierszPopulacja[] DanePopulacja {
+ get {
+ return populacja();
+ }
+ }
+
+ public class Wiersz {
+ public string Miasto { get; set; }
+ public string Towar { get; set; }
+ public decimal Obrót { get; set; }
+ public decimal Marża { get; set; }
+ }
+
+ public class WierszPopulacja {
+ public string Miasto { get; set; }
+ public double Populacja { get; set; }
+ }
+
+ private static Wiersz[] obroty() {
+ return new[] {
+ new Wiersz{ Miasto="Kraków", Towar="A", Obrót=123, Marża=10 },
+ new Wiersz{ Miasto="Kraków", Towar="B", Obrót=234, Marża=20 },
+ new Wiersz{ Miasto="Kraków", Towar="C", Obrót=345, Marża=30 },
+ new Wiersz{ Miasto="Kraków", Towar="D", Obrót=300, Marża=30 }
+ };
+ }
+
+ private static WierszPopulacja[] populacja() {
+ return new[] {
+ new WierszPopulacja{ Miasto="Kraków", Populacja=758 },
+ new WierszPopulacja{ Miasto="Lublin", Populacja=347 },
+ new WierszPopulacja{ Miasto="Warszawa", Populacja=1715 },
+ new WierszPopulacja{ Miasto="Poznań", Populacja=550 },
+ new WierszPopulacja{ Miasto="Gdańsk", Populacja=460 },
+ new WierszPopulacja{ Miasto="Szczecin", Populacja=408 },
+ new WierszPopulacja{ Miasto="Wrocław", Populacja=631 }
+ };
+ }
+
+ public string GoogleMapHtml
+ {
+ get { return String.Format("", "http://localhost/googlemap/mapa.html"); }
+ }
+
+ }
+}
diff --git a/src/Example7/Example7.UI/UI/DashBoard.ExampleGoogleMap.pageform.xml b/src/Example7/Example7.UI/UI/DashBoard.ExampleGoogleMap.pageform.xml
new file mode 100644
index 0000000..02241f0
--- /dev/null
+++ b/src/Example7/Example7.UI/UI/DashBoard.ExampleGoogleMap.pageform.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example7/Example7.UI/UI/DashBoard.ExampleObroty.pageform.xml b/src/Example7/Example7.UI/UI/DashBoard.ExampleObroty.pageform.xml
new file mode 100644
index 0000000..7df9223
--- /dev/null
+++ b/src/Example7/Example7.UI/UI/DashBoard.ExampleObroty.pageform.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example7/Example7.UI/UI/DashBoard.ExamplePopulacja.pageform.xml b/src/Example7/Example7.UI/UI/DashBoard.ExamplePopulacja.pageform.xml
new file mode 100644
index 0000000..9d4b46b
--- /dev/null
+++ b/src/Example7/Example7.UI/UI/DashBoard.ExamplePopulacja.pageform.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example7/Example7.UI/mapa.html b/src/Example7/Example7.UI/mapa.html
new file mode 100644
index 0000000..08a171a
--- /dev/null
+++ b/src/Example7/Example7.UI/mapa.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Example7/Example7/Example7.csproj b/src/Example7/Example7/Example7.csproj
new file mode 100644
index 0000000..01022cf
--- /dev/null
+++ b/src/Example7/Example7/Example7.csproj
@@ -0,0 +1,7 @@
+
+
+
+ $(SonetaTargetFramework)
+ AnyCPU;x64
+
+
\ No newline at end of file
diff --git a/src/Example7/Readme.md b/src/Example7/Readme.md
new file mode 100644
index 0000000..06c48ae
--- /dev/null
+++ b/src/Example7/Readme.md
@@ -0,0 +1,21 @@
+### Example 7
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje tworzenie elementu dashboard.
+
+Do uruchomienia przykładu wymagane jest posiadanie licencji na pulpity pracownika oraz pulpity kierownika. Należy zalogować się jako Pracownik. W wyniku zastosowania dodatku, w panelu użytkownika pojawią się dodatkowe elementy w dahshboard o nazwie
+Soneta.Examples.Obroty, Soneta.Examples.Populacja i Soneta.Examples.GoogleMap. Z uwagi na zastosowanie
+nowych elementów w pageform.xml przykład będzie działał od wersji 10.5.
+
+UWAGA !!!
+
+Aby przykład zadziałał prawidłowo w wersjach od 10.5, przed skompilowaniem dodatku należy dla plików
+Dashboard.*.xml ustawić atrybut Embedded Resource.
+
+Element o nazwie Soneta.Examples.GoogleMap wymaga przygotowania strony html w oparciu o GoogleMap API.
+Przykład takiej strony html znajduje się w projekcie (Example7\mapa.html). Aby wykorzystać przykład należy
+wygenerować niezbędny klucz dla GoogleMap API.
+
+* Extender\DashboardExetnder.cs
+
+ Przykładowa klasa extender'a implementująca dane widoczne na dashboard.
diff --git a/src/Example8/Example8.Tests/Example8.Tests.csproj b/src/Example8/Example8.Tests/Example8.Tests.csproj
new file mode 100644
index 0000000..01022cf
--- /dev/null
+++ b/src/Example8/Example8.Tests/Example8.Tests.csproj
@@ -0,0 +1,7 @@
+
+
+
+ $(SonetaTargetFramework)
+ AnyCPU;x64
+
+
\ No newline at end of file
diff --git a/src/Example8/Example8.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example8/Example8.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example8/Example8.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example8/Example8.UI/Example8.UI.csproj b/src/Example8/Example8.UI/Example8.UI.csproj
new file mode 100644
index 0000000..61d3ec9
--- /dev/null
+++ b/src/Example8/Example8.UI/Example8.UI.csproj
@@ -0,0 +1,10 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Example8/Example8.UI/UI/Notowania.Ogolne.pageform.xml b/src/Example8/Example8.UI/UI/Notowania.Ogolne.pageform.xml
new file mode 100644
index 0000000..d90e549
--- /dev/null
+++ b/src/Example8/Example8.UI/UI/Notowania.Ogolne.pageform.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example8/Example8.UI/ViewInfo/Menu.cs b/src/Example8/Example8.UI/ViewInfo/Menu.cs
new file mode 100644
index 0000000..faf78b0
--- /dev/null
+++ b/src/Example8/Example8.UI/ViewInfo/Menu.cs
@@ -0,0 +1,21 @@
+
+
+using Soneta.Business.UI;
+using Samples.Example8.Extender;
+using Soneta.Business.Licence;
+
+[assembly: FolderView("Samples",
+ Priority = 10,
+ Description = "Przykłady implementacji enova365",
+ BrickColor = FolderViewAttribute.BlueBrick,
+ Contexts = new object[] { LicencjeModułu.All }
+)]
+
+[assembly: FolderView("Samples/Notowania GPW",
+ Priority = 13,
+ Description = "Przykład pokazujący programistyczne możliwości kolorowania wierszy",
+ ObjectType = typeof(Notowania),
+ ObjectPage = "Notowania.Ogolne.pageform.xml",
+ ReadOnlySession = false,
+ ConfigSession = false
+)]
diff --git a/src/Example8/Example8/Example8.csproj b/src/Example8/Example8/Example8.csproj
new file mode 100644
index 0000000..ddb6cf1
--- /dev/null
+++ b/src/Example8/Example8/Example8.csproj
@@ -0,0 +1,7 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
+
\ No newline at end of file
diff --git a/src/Example8/Example8/Extender/Akcja.cs b/src/Example8/Example8/Extender/Akcja.cs
new file mode 100644
index 0000000..031aac0
--- /dev/null
+++ b/src/Example8/Example8/Extender/Akcja.cs
@@ -0,0 +1,31 @@
+using Soneta.Business;
+
+namespace Samples.Example8.Extender {
+ public class Akcja {
+ public string Nazwa { get; set; }
+ public double Kurs { get; set; }
+ public double Zmiana { get; set; }
+ public int LiczbaTransakcji { get; set; }
+
+ public DataAppearance GetAppearance() {
+ var appearance = new DataAppearance();
+
+ if (Zmiana > 0) {
+ appearance.SetForeColorFromName("Green");
+ }
+ else if (Zmiana < 0) {
+ appearance.SetForeColorFromName("Red");
+ }
+
+ return appearance;
+ }
+
+ public DataAppearance GetAppearanceNazwa() {
+ var appearance = new DataAppearance();
+ if (LiczbaTransakcji > 100) {
+ appearance.SetFontStyleFromName(DataAppearance.FontStyleNames.Bold);
+ }
+ return appearance;
+ }
+ }
+}
diff --git a/src/Example8/Example8/Extender/Notowania.cs b/src/Example8/Example8/Extender/Notowania.cs
new file mode 100644
index 0000000..be47238
--- /dev/null
+++ b/src/Example8/Example8/Extender/Notowania.cs
@@ -0,0 +1,54 @@
+using System.Collections.Generic;
+
+namespace Samples.Example8.Extender {
+
+ public class Notowania {
+ #region Property dla formularza
+
+ public IEnumerable AktualneNotowania {
+ get {
+ return new List() {
+ new Akcja() {
+ Nazwa = "ALIOR",
+ Kurs = 82.45f,
+ Zmiana = 1.35f,
+ LiczbaTransakcji = 275
+ },
+ new Akcja() {
+ Nazwa = "ERGIS",
+ Kurs = 4.75f,
+ Zmiana = 0f,
+ LiczbaTransakcji = 5
+ },
+ new Akcja() {
+ Nazwa = "ENEA",
+ Kurs = 16.25f,
+ Zmiana = -0.05f,
+ LiczbaTransakcji = 115
+ },
+ new Akcja() {
+ Nazwa = "GROCLIN",
+ Kurs = 10.98f,
+ Zmiana = 0.01f,
+ LiczbaTransakcji = 237
+ },
+ new Akcja() {
+ Nazwa = "INTEGERPL",
+ Kurs = 213f,
+ Zmiana = 0f,
+ LiczbaTransakcji = 20
+ },
+ new Akcja() {
+ Nazwa = "MENNICA",
+ Kurs = 14.5f,
+ Zmiana = 0.1f,
+ LiczbaTransakcji = 2
+ },
+ };
+ }
+ }
+
+ #endregion Property dla formularza
+ }
+
+}
diff --git a/src/Example8/Readme.md b/src/Example8/Readme.md
new file mode 100644
index 0000000..7e8065d
--- /dev/null
+++ b/src/Example8/Readme.md
@@ -0,0 +1,34 @@
+### Example 8
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje programistyczne możliwości kolorowania wierszy na liście.
+
+Aby system odpowiedno wyświetlił dany rekord, należy w odpowiedniej klasie (dotyczy to zarówno obiektów biznesowych jak i niesesyjnych)
+dodać metodę GetAppearance(). Metoda ta sprawi, że pokolorowany zostanie cały wiersz. Aby pokolorowana została tylko dana komórka, należy
+do metody GetAppearance dodać sufiks zawierający nazwę property np. GetAppearanceNazwa().
+
+Obiekt DataAppearance zwracany przez metodę GetAppearance() pozwala ustawić takie właściwości jak kolor tła oraz kolor i styl czcionki.
+
+W skład przykładu wchodzą trzy projekty:
+
+* `Example8` - zawierający elementy logiki biznesowej
+* `Example8.UI` - interfejsu użytkownika
+* `Example8.Tests` - testy
+
+
+#### Zawartość przykładu:
+
+* `Example8`\Extender\Akcja.cs
+
+ Przykładowa klasa implementująca metody odpowiedzialne za kolorowanie wiersza.
+* `Example8`\Extender\Notowania.cs
+
+ Przykładowe dane.
+
+* `Example8.UI`\UI\Notowania.Ogolne.pageform.xml
+
+ Definicja page'a dla Notowań
+
+* `Example8.UI`\ViewInfo\Menu.cs
+
+ Rejestracja View
\ No newline at end of file
diff --git a/src/Example9/Example9.Tests/Example9.Tests.csproj b/src/Example9/Example9.Tests/Example9.Tests.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example9/Example9.Tests/Example9.Tests.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example9/Example9.UI/EnsureSonetaTypesReferenceClass.cs b/src/Example9/Example9.UI/EnsureSonetaTypesReferenceClass.cs
new file mode 100644
index 0000000..41ada48
--- /dev/null
+++ b/src/Example9/Example9.UI/EnsureSonetaTypesReferenceClass.cs
@@ -0,0 +1,17 @@
+using Soneta.Types;
+
+namespace SonetaAddon
+{
+ public static class EnsureSonetaTypesReferenceClass
+ {
+ ///
+ /// Ważne ze względnu na wczytywanie bibliotek, które mają referencje do Soneta.Types
+ /// Tylko biblioteki z referencją do Soneta.Types są wczytywane podczas analizowania form.xml
+ /// Cały plik "EnsureSonetaTypesReferenceClass.cs" można usunąć, jeśli dodatek zawiera jawne odwołanie
+ /// do biblioteki Soneta.Types, w innym wypadku plik należy pozostawić
+ ///
+#pragma warning disable 414
+ private static readonly FromTo EnsureSonetaTypesReferenceVariable = new FromTo();
+#pragma warning restore 414
+ }
+}
\ No newline at end of file
diff --git a/src/Example9/Example9.UI/Example9.UI.csproj b/src/Example9/Example9.UI/Example9.UI.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example9/Example9.UI/Example9.UI.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example9/Example9.UI/Extender/DynamicFormExtender.cs b/src/Example9/Example9.UI/Extender/DynamicFormExtender.cs
new file mode 100644
index 0000000..e0ff614
--- /dev/null
+++ b/src/Example9/Example9.UI/Extender/DynamicFormExtender.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Samples.Example9.UI.Extender;
+using Soneta.Business;
+using Soneta.Business.UI;
+
+[assembly: Worker(typeof(DynamicFormExtender))]
+
+namespace Samples.Example9.UI.Extender
+{
+ class DynamicFormExtender
+ {
+
+ public string Field1 { get; set; }
+ public string Field2 { get; set; }
+ public string Field3 { get; set; }
+
+ public UIElement GetSource()
+ {
+ var stack = new StackContainer();
+ var group = new GroupContainer { CaptionHtml = "Tytuł grupy", LabelHeight = "10" };
+ var row = new RowContainer();
+ var rowCmd = new RowContainer();
+
+ var field1 = new FieldElement { CaptionHtml = "Pole 1", EditValue = "{Field1}", OuterWidth = "30" };
+ var field2 = new FieldElement { CaptionHtml = "Pole 2", EditValue = "{Field2}", OuterWidth = "30" };
+ var field3 = new FieldElement { CaptionHtml = "Pole 3", EditValue = "{Field3}", OuterWidth = "30" };
+ var command = new CommandElement { CaptionHtml = "Pokaż wartości", MethodName = "ShowFieldValue", Width = "20" };
+
+ row.Elements.Add(field1);
+ row.Elements.Add(field2);
+ row.Elements.Add(field3);
+ rowCmd.Elements.Add(command);
+
+ group.Elements.Add(row);
+ group.Elements.Add(rowCmd);
+ stack.Elements.Add(group);
+
+ return stack;
+
+ }
+
+ public MessageBoxInformation ShowFieldValue()
+ {
+ return new MessageBoxInformation("Aktualne wartości")
+ {
+ Text = String.Format("Pole1 = {0}, Pole2 = {1}, Pole3 = {2}", Field1, Field2, Field3)
+ };
+ }
+ }
+}
diff --git a/src/Example9/Example9.UI/Menu.cs b/src/Example9/Example9.UI/Menu.cs
new file mode 100644
index 0000000..2d32a41
--- /dev/null
+++ b/src/Example9/Example9.UI/Menu.cs
@@ -0,0 +1,21 @@
+
+using System;
+using Samples.Example9.UI.Extender;
+using Soneta.Business.Licence;
+using Soneta.Business.UI;
+
+[assembly: FolderView("Samples",
+ Priority = 10,
+ Description = "Przykłady implementacji enova365",
+ BrickColor = FolderViewAttribute.BlueBrick,
+ Contexts = new object[] { LicencjeModułu.All }
+)]
+
+[assembly: FolderView("Samples/Formularz dynamiczny",
+ Priority = 11,
+ Description = "Przykład pokazujący programistyczne możliwości dynamicznego tworzenia formularza",
+ ObjectType = typeof(DynamicFormExtender),
+ ObjectPage = "DynamicFormExtender.ogolne.pageform.xml",
+ ReadOnlySession = false,
+ ConfigSession = false
+)]
\ No newline at end of file
diff --git a/src/Example9/Example9.UI/UI/DynamicFormExtender.ogolne.pageform.xml b/src/Example9/Example9.UI/UI/DynamicFormExtender.ogolne.pageform.xml
new file mode 100644
index 0000000..1c3bafe
--- /dev/null
+++ b/src/Example9/Example9.UI/UI/DynamicFormExtender.ogolne.pageform.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Example9/Example9/Example9.csproj b/src/Example9/Example9/Example9.csproj
new file mode 100644
index 0000000..b421654
--- /dev/null
+++ b/src/Example9/Example9/Example9.csproj
@@ -0,0 +1,6 @@
+
+
+
+ $(SonetaTargetFramework)
+
+
\ No newline at end of file
diff --git a/src/Example9/README.md b/src/Example9/README.md
new file mode 100644
index 0000000..273cc27
--- /dev/null
+++ b/src/Example9/README.md
@@ -0,0 +1,21 @@
+### Example 9
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje implementacje własnej klasy, pozwalającej na dynamiczne uzupełnienie zawartości
+formularza. Dla zaimplementowanej klasy została utworzona dedykowana definicja formularza.
+W przykładzie pokazano wykorzystanie elementu *Include* zasilanego kontentem przez metodę zwracającą
+dynamiczną wartość formularza zależną od specyficznych warunków.
+
+W wyniku zastosowania dodatku, powinna pojawić się dodatkowa grupa w menu głównym programu o nazwie
+*Soneta.Examples*, z opcją *"Formularz dynamiczny"*, po wybraniu której pojawi się formularz utworzony
+za pośrednictwem kodu programu.
+
+* `Example9.UI`\Extender\DynamicFormExtender.cs
+
+ Przykładowan klasa implementująca dane oraz metody
+* `Example9.UI`\Extender\DynamicFormExtender.Ogolne.pageform.xml
+
+ Definicja zakładki powiązanej z klasą implementująca dane
+* `Example9.UI`\Menu
+
+ Rejestracja View
\ No newline at end of file
diff --git a/src/Punktacja/Punktacja/Punktacja.csproj b/src/Punktacja/Punktacja/Punktacja.csproj
index aaf2dcb..4d485c1 100644
--- a/src/Punktacja/Punktacja/Punktacja.csproj
+++ b/src/Punktacja/Punktacja/Punktacja.csproj
@@ -1,6 +1,12 @@
- net46
+ $(SonetaTargetFramework)
+
+ C:\Program Files (x86)\Common Files\Soneta\Assemblies\
+
+
+
+
\ No newline at end of file
diff --git a/src/Samples/Samples.sln b/src/Samples/Samples.sln
deleted file mode 100644
index afa1051..0000000
--- a/src/Samples/Samples.sln
+++ /dev/null
@@ -1,90 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.28803.352
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples", "Samples\Samples.csproj", "{D939A54E-F862-4B24-8CCF-1504134C12A8}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Tests", "tests\Samples.Tests\Samples.Tests.csproj", "{49A48ABE-D1FC-418B-A5EC-EEA05697A610}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{D48F2BCD-EE52-4313-A89C-315D7FF878CB}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".build", ".build", "{2F98833B-3F8B-41E1-BCA6-06DF03806103}"
- ProjectSection(SolutionItems) = preProject
- Directory.Build.props = Directory.Build.props
- global.json = global.json
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnovaDB", "EnovaDB\EnovaDB.csproj", "{4FC4954B-C8AF-4159-8B6E-24F11C605690}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Integration.Tests", "tests\Samples.Integration.Tests\Samples.Integration.Tests.csproj", "{A165F379-C215-49B4-99E1-2F1F3BDEDDB4}"
- ProjectSection(ProjectDependencies) = postProject
- {D939A54E-F862-4B24-8CCF-1504134C12A8} = {D939A54E-F862-4B24-8CCF-1504134C12A8}
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EnovaDB.Integration.Tests", "tests\EnovaDB.Tests\EnovaDB.Integration.Tests.csproj", "{2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}"
- ProjectSection(ProjectDependencies) = postProject
- {4FC4954B-C8AF-4159-8B6E-24F11C605690} = {4FC4954B-C8AF-4159-8B6E-24F11C605690}
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soneta.Szkolenie", "Soneta.Szkolenie\Soneta.Szkolenie.csproj", "{5110FB90-B5CA-48B9-B518-CB2764F4CA5F}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soneta.Szkolenie.UI", "Soneta.Szkolenie.UI\Soneta.Szkolenie.UI.csproj", "{9F525776-985A-4D51-8B92-E530B97D9545}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Soneta.Szkolenie.Tests", "tests\Soneta.Szkolenie.Tests\Soneta.Szkolenie.Tests.csproj", "{CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}"
- ProjectSection(ProjectDependencies) = postProject
- {5110FB90-B5CA-48B9-B518-CB2764F4CA5F} = {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {D939A54E-F862-4B24-8CCF-1504134C12A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D939A54E-F862-4B24-8CCF-1504134C12A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D939A54E-F862-4B24-8CCF-1504134C12A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D939A54E-F862-4B24-8CCF-1504134C12A8}.Release|Any CPU.Build.0 = Release|Any CPU
- {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {49A48ABE-D1FC-418B-A5EC-EEA05697A610}.Release|Any CPU.Build.0 = Release|Any CPU
- {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4FC4954B-C8AF-4159-8B6E-24F11C605690}.Release|Any CPU.Build.0 = Release|Any CPU
- {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A165F379-C215-49B4-99E1-2F1F3BDEDDB4}.Release|Any CPU.Build.0 = Release|Any CPU
- {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C}.Release|Any CPU.Build.0 = Release|Any CPU
- {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5110FB90-B5CA-48B9-B518-CB2764F4CA5F}.Release|Any CPU.Build.0 = Release|Any CPU
- {9F525776-985A-4D51-8B92-E530B97D9545}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9F525776-985A-4D51-8B92-E530B97D9545}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9F525776-985A-4D51-8B92-E530B97D9545}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9F525776-985A-4D51-8B92-E530B97D9545}.Release|Any CPU.Build.0 = Release|Any CPU
- {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {49A48ABE-D1FC-418B-A5EC-EEA05697A610} = {D48F2BCD-EE52-4313-A89C-315D7FF878CB}
- {A165F379-C215-49B4-99E1-2F1F3BDEDDB4} = {D48F2BCD-EE52-4313-A89C-315D7FF878CB}
- {2F8DAAEB-FC29-42E8-AC6D-26F7DCC8D05C} = {D48F2BCD-EE52-4313-A89C-315D7FF878CB}
- {CE036F3E-32C3-45B6-A7C3-2F01442CD5F7} = {D48F2BCD-EE52-4313-A89C-315D7FF878CB}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {CAFA3D20-F417-4EDD-88F6-F850D5CF3A51}
- EndGlobalSection
-EndGlobal
diff --git a/src/Samples/Samples/Example3/Readme.md b/src/Samples/Samples/Example3/Readme.md
new file mode 100644
index 0000000..f062033
--- /dev/null
+++ b/src/Samples/Samples/Example3/Readme.md
@@ -0,0 +1,23 @@
+### Example 3
+-----------------------------------------------------------------------------------------------------
+
+Przykład pokazuje możliwość podpięcia własnej zakładki konfiguracyjnej dla potrzeb własnego dodatku.
+W przykładzie zastosowano mechanizm tworzenia ustawień konfiguracji bezpośrednio w kodzie programu, bez stosowania pliku *config.xml*.
+
+* Extender\Menu.cs
+
+ Rejestracja listy dla View
+
+* UI\Config.ZakładkaTowary.pageform.xml
+
+ Definicja formularza ustawień w Narzędzia/Opcje...
+
+
+* Extender\ZakladkaTowaryConfigExtender.cs
+
+ Obsługa zapisu i odczytu ustawień
+
+
+* Extender\TowaryZakladkaViewInfo.cs
+
+ Implementacja View ograniczona do sterowania widocznością zakładki.
diff --git a/src/Samples/Samples/Samples.csproj b/src/Samples/Samples/Samples.csproj
index 9b548a1..5e66c15 100644
--- a/src/Samples/Samples/Samples.csproj
+++ b/src/Samples/Samples/Samples.csproj
@@ -3,4 +3,18 @@
$(SonetaTargetFramework)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Soneta.Szkolenie/Soneta.Szkolenie.UI/Soneta.Szkolenie.UI.csproj b/src/Soneta.Szkolenie/Soneta.Szkolenie.UI/Soneta.Szkolenie.UI.csproj
index cff10fb..ce9413b 100644
--- a/src/Soneta.Szkolenie/Soneta.Szkolenie.UI/Soneta.Szkolenie.UI.csproj
+++ b/src/Soneta.Szkolenie/Soneta.Szkolenie.UI/Soneta.Szkolenie.UI.csproj
@@ -6,4 +6,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/Soneta.Szkolenie/Soneta.Szkolenie/Soneta.Szkolenie.csproj b/src/Soneta.Szkolenie/Soneta.Szkolenie/Soneta.Szkolenie.csproj
index 7a7dbb7..e6b3e61 100644
--- a/src/Soneta.Szkolenie/Soneta.Szkolenie/Soneta.Szkolenie.csproj
+++ b/src/Soneta.Szkolenie/Soneta.Szkolenie/Soneta.Szkolenie.csproj
@@ -14,4 +14,7 @@
Szkolenie.business.xml
+
+
+
\ No newline at end of file