Selaa lähdekoodia

finished workers, add executor. Not completed yet

Dalibor Votruba 3 vuotta sitten
vanhempi
commit
f56eea41b2
48 muutettua tiedostoa jossa 1198 lisäystä ja 340 poistoa
  1. 247 231
      @Documentation/QLiberace.simp
  2. 3 3
      Common/qdr.app.qlbrc.common/Entities/Base/QlbrcEntityTracked.cs
  3. 90 0
      Common/qdr.app.qlbrc.common/Executor/BaseParametricExecutor.cs
  4. 20 0
      Common/qdr.app.qlbrc.common/Executor/IParametricExecutorProvider.cs
  5. 18 0
      Common/qdr.app.qlbrc.common/Executor/ParameterExecutorValue.cs
  6. 5 0
      Common/qdr.app.qlbrc.common/Settings/ModuleSetting.cs
  7. 6 5
      Common/qdr.fnd.core.business/AbstractMultiRepositoryService.cs
  8. 3 2
      Common/qdr.fnd.core.business/AbstractRepositoryService.cs
  9. 8 8
      Common/qdr.fnd.core.business/AbstractService.cs
  10. 93 32
      Common/qdr.fnd.core.business/AbstractWorkerService.cs
  11. 23 0
      Common/qdr.fnd.core.business/Configuration/OptionsSetting.cs
  12. 1 0
      Common/qdr.fnd.core.business/Interface/IWorkerSettings.cs
  13. 22 0
      Common/qdr.fnd.core.business/RepoWorkerContext.cs
  14. 8 0
      Common/qdr.fnd.core.data/Paging.cs
  15. 1 1
      Common/qdr.fnd.core.nlog/Logger.cs
  16. 5 6
      Common/qdr.fnd.core.nlog/LoggerFactory.cs
  17. 0 10
      Common/qdr.fnd.core/Logging/ILogger.cs
  18. 1 1
      Common/qdr.fnd.core/Logging/IQLog.cs
  19. 10 0
      Common/qdr.fnd.core/Logging/IQLogger.cs
  20. 2 2
      Common/qdr.fnd.core/Thread/AbstractWorker.cs
  21. 1 1
      Common/qdr.fnd.core/Thread/ContinousWorker.cs
  22. 1 1
      Common/qdr.fnd.core/Thread/LoopWorker.cs
  23. 35 0
      Common/qdr.fnd.core/Value/Extensions/StringExt.cs
  24. 0 1
      Common/qdr.fnd.core/qdr.fnd.core.csproj
  25. 2 1
      Modules/qdr.app.qlbrc.base/Services/SettingsService.cs
  26. 2 1
      Modules/qdr.app.qlbrc.base/Services/TenantService.cs
  27. 2 1
      Modules/qdr.app.qlbrc.base/Services/UserService.cs
  28. 2 1
      Modules/qdr.app.qlbrc.customer/Services/CustomerService.cs
  29. 22 2
      Modules/qdr.app.qlbrc.processor/Constants.cs
  30. 32 5
      Modules/qdr.app.qlbrc.processor/Entities/BaseQueue.cs
  31. 1 1
      Modules/qdr.app.qlbrc.processor/Entities/FailedQueue.cs
  32. 14 0
      Modules/qdr.app.qlbrc.processor/Entities/ProcessingQueue.cs
  33. 16 0
      Modules/qdr.app.qlbrc.processor/Entities/QueueData.cs
  34. 2 2
      Modules/qdr.app.qlbrc.processor/Executor/ItemExecutor.cs
  35. 16 0
      Modules/qdr.app.qlbrc.processor/Repositories/BaseRepoQueue.cs
  36. 14 0
      Modules/qdr.app.qlbrc.processor/Repositories/RepoDoneQueue.cs
  37. 14 0
      Modules/qdr.app.qlbrc.processor/Repositories/RepoFailedQueue.cs
  38. 24 0
      Modules/qdr.app.qlbrc.processor/Repositories/RepoPendingQueue.cs
  39. 34 0
      Modules/qdr.app.qlbrc.processor/Repositories/RepoProcessingQueue.cs
  40. 29 0
      Modules/qdr.app.qlbrc.processor/Repositories/RepoQueueData.cs
  41. 62 0
      Modules/qdr.app.qlbrc.processor/Services/ProcessorWorkerService.cs
  42. 143 8
      Modules/qdr.app.qlbrc.processor/Settings/ProcessorSetting.cs
  43. 0 6
      Modules/qdr.app.qlbrc.processor/Workers/ComplexWorker.cs
  44. 90 6
      Modules/qdr.app.qlbrc.processor/Workers/ProcessingWorker.cs
  45. 59 0
      Modules/qdr.app.qlbrc.processor/Workers/QlbrcProcessorWorker.cs
  46. 13 0
      Modules/qdr.app.qlbrc.processor/Workers/WorkerSettings.cs
  47. 1 1
      Tests/qdr.app.qlbrc.base.Tests/Services/SettingsServiceTest.cs
  48. 1 1
      Tests/qdr.app.qlbrc.base.Tests/Services/TenantServiceTest.cs

+ 247 - 231
@Documentation/QLiberace.simp

@@ -183,7 +183,7 @@
     <fields>
       <counter>
         <type>SoftwareIdeasModeler.Core.DiagramItems.Erd.ErdEntityAttribute</type>
-        <value>245</value>
+        <value>247</value>
       </counter>
       <counter>
         <type>SoftwareIdeasModeler.Core.DiagramItems.Erd.ErdEntityIndex</type>
@@ -232,8 +232,8 @@
         <type id="datetime (MsSql.datetime)" name="datetime (MsSql.datetime)" />
         <type id="Class:7546dafc2b0d406bb9cf489c5eeb4aff" name="Customer" class-ref="7546dafc2b0d406bb9cf489c5eeb4aff" />
         <type id="Class:cb92b4b50dc847aebfdbd90ce365a1eb" name="Invoice" class-ref="cb92b4b50dc847aebfdbd90ce365a1eb" />
-        <type id="nvarchar (MsSql.nvarchar)" name="nvarchar (MsSql.nvarchar)" />
         <type id="Class:d0073f5bfa1e416a993d396a5c5f3719" name="CustomerService" class-ref="d0073f5bfa1e416a993d396a5c5f3719" />
+        <type id="nvarchar (MsSql.nvarchar)" name="nvarchar (MsSql.nvarchar)" />
         <type id="NULL" name="NULL" />
       </types>
     </custom-types>
@@ -804,21 +804,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="874b9f152e0b445dbcfeee89df6a5ea4" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
-              <start-role id="umlar-179d9b24-b3c6-471a-84b2-401ad9852df2" name="" navigability="" association-type="association" visibility="private" property-ref="7e127fd6ffb44997a6ed00e09680e29c" />
-              <end-role id="umlar-3c4e51b3-9855-4067-a2f9-7e60c9b69b76" name="" navigability="yes" association-type="association" visibility="private" property-ref="3ea00702610044d585111749ee746ce0" />
-            </relation>
-          </item>
-          <item id="802906c103994cfb8c5117077f30e22a" cid="REL003" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:43:31" from="7546dafc2b0d406bb9cf489c5eeb4aff" to="2626a7fd504946ccaa1eb090b6d27d0d" visibility="package">
-            <stereotypes>
-              <stereotype name="use" />
-            </stereotypes>
-            <stereotype-instances>
-              <stereotype id="802906c103994cfb8c5117077f30e22a_use_c" type="use" ref="" />
-            </stereotype-instances>
-            <owned-items />
-            <relation from="7546dafc2b0d406bb9cf489c5eeb4aff" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
-              <start-role id="umlar-47492656-9109-4b75-9736-a3b912c06bc4" name="" navigability="" association-type="association" visibility="private" property-ref="de0957d8d7ac42eab57e579c2cefbf47" />
-              <end-role id="umlar-452c5a66-3c13-4118-a1a3-054a9196ebb8" name="" navigability="yes" association-type="association" visibility="private" property-ref="49ad3ceea0bb4157b557e21e2eb7c0b9" />
+              <start-role id="umlar-b8afc572-a47d-4182-ac52-8b91593b4514" name="" navigability="" association-type="association" visibility="private" property-ref="7e127fd6ffb44997a6ed00e09680e29c" />
+              <end-role id="umlar-c52d6c5d-9db7-434e-8ecc-584379b01af2" name="" navigability="yes" association-type="association" visibility="private" property-ref="3ea00702610044d585111749ee746ce0" />
             </relation>
           </item>
           <item id="874b9f152e0b445dbcfeee89df6a5ea4" cid="CPT004" type="component" name="Processor" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:03:49" visibility="undefined">
@@ -886,6 +873,19 @@
             </stereotype-instances>
             <component />
           </item>
+          <item id="802906c103994cfb8c5117077f30e22a" cid="REL003" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:43:31" from="7546dafc2b0d406bb9cf489c5eeb4aff" to="2626a7fd504946ccaa1eb090b6d27d0d" visibility="package">
+            <stereotypes>
+              <stereotype name="use" />
+            </stereotypes>
+            <stereotype-instances>
+              <stereotype id="802906c103994cfb8c5117077f30e22a_use_c" type="use" ref="" />
+            </stereotype-instances>
+            <owned-items />
+            <relation from="7546dafc2b0d406bb9cf489c5eeb4aff" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
+              <start-role id="umlar-e2eb9e22-bb15-43b9-a2f3-d02e323b98e5" name="" navigability="" association-type="association" visibility="private" property-ref="de0957d8d7ac42eab57e579c2cefbf47" />
+              <end-role id="umlar-eb41fac4-842a-4844-85f1-ece588b7673f" name="" navigability="yes" association-type="association" visibility="private" property-ref="49ad3ceea0bb4157b557e21e2eb7c0b9" />
+            </relation>
+          </item>
           <item id="26f7ba623f254dd28b60add6ba05099c" cid="REL018" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:26:55" from="84ab40101b0b4e5caa621287dc10fd91" to="874b9f152e0b445dbcfeee89df6a5ea4" visibility="package">
             <stereotypes>
               <stereotype name="use" />
@@ -895,8 +895,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="84ab40101b0b4e5caa621287dc10fd91" to="874b9f152e0b445dbcfeee89df6a5ea4" derived="false">
-              <start-role id="umlar-8c28eb08-09d1-4453-b36c-e22a8dede33f" name="" navigability="" association-type="association" visibility="private" property-ref="4c0b5740d5454593b2f30e99077948f6" />
-              <end-role id="umlar-602ac0fc-e731-4c70-88ed-44e9d411cea8" name="" navigability="yes" association-type="association" visibility="private" property-ref="6d22af3498a54020b1085246698cc0a1" />
+              <start-role id="umlar-6f8a4b6d-1d34-4af1-bcff-4b8d92164a67" name="" navigability="" association-type="association" visibility="private" property-ref="4c0b5740d5454593b2f30e99077948f6" />
+              <end-role id="umlar-97418e7e-69a3-4485-b954-7c4c2893b95d" name="" navigability="yes" association-type="association" visibility="private" property-ref="6d22af3498a54020b1085246698cc0a1" />
             </relation>
           </item>
           <item id="84ab40101b0b4e5caa621287dc10fd91" cid="CPT005" type="component" name="Notification" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:09:07" visibility="undefined">
@@ -1026,6 +1026,19 @@
             </stereotype-instances>
             <component />
           </item>
+          <item id="7268ad1b0bd249218475144e6941ccdf" cid="REL001" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:42:51" from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" visibility="package">
+            <stereotypes>
+              <stereotype name="use" />
+            </stereotypes>
+            <stereotype-instances>
+              <stereotype id="7268ad1b0bd249218475144e6941ccdf_use_c" type="use" ref="" />
+            </stereotype-instances>
+            <owned-items />
+            <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" derived="false">
+              <start-role id="umlar-86c34510-4acf-4b8b-bf1d-9b0aceaea4d8" name="" navigability="" association-type="association" visibility="private" property-ref="93016f98fae440bb88e27fe09172df66" />
+              <end-role id="umlar-9903715c-8bc3-4609-a03c-74d00b52fdd7" name="" navigability="yes" association-type="association" visibility="private" property-ref="132ce45236e54d6da05ae53d64712729" />
+            </relation>
+          </item>
           <item id="7546dafc2b0d406bb9cf489c5eeb4aff" cid="CPT002" type="component" name="Customer" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:40:04" visibility="undefined">
             <stereotypes>
               <stereotype name="component" />
@@ -1085,19 +1098,6 @@
             </stereotype-instances>
             <component />
           </item>
-          <item id="7268ad1b0bd249218475144e6941ccdf" cid="REL001" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:42:51" from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" visibility="package">
-            <stereotypes>
-              <stereotype name="use" />
-            </stereotypes>
-            <stereotype-instances>
-              <stereotype id="7268ad1b0bd249218475144e6941ccdf_use_c" type="use" ref="" />
-            </stereotype-instances>
-            <owned-items />
-            <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" derived="false">
-              <start-role id="umlar-c3225e84-a51e-4a7d-87c1-fab4ec73c0f6" name="" navigability="" association-type="association" visibility="private" property-ref="93016f98fae440bb88e27fe09172df66" />
-              <end-role id="umlar-41bf4817-fea8-4890-bf00-bdd383ac104c" name="" navigability="yes" association-type="association" visibility="private" property-ref="132ce45236e54d6da05ae53d64712729" />
-            </relation>
-          </item>
           <item id="2037f7bd032e4fa3a1d8d99f1cd1ea27" cid="REL002" type="relationship" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:43:08" from="cb92b4b50dc847aebfdbd90ce365a1eb" to="2626a7fd504946ccaa1eb090b6d27d0d" visibility="package">
             <stereotypes>
               <stereotype name="use" />
@@ -1107,8 +1107,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
-              <start-role id="umlar-defd6f46-fdc7-4b8f-b600-f0234423e3d2" name="" navigability="" association-type="association" visibility="private" property-ref="002883f71fbc4324bbd1efa19cdbd1a6" />
-              <end-role id="umlar-f54f23fc-d218-42c0-b150-b3f06aaed634" name="" navigability="yes" association-type="association" visibility="private" property-ref="b531bae1520645b58761d8077cac7517" />
+              <start-role id="umlar-4a8b65c6-e903-479f-ba6b-fecefb2c0d91" name="" navigability="" association-type="association" visibility="private" property-ref="002883f71fbc4324bbd1efa19cdbd1a6" />
+              <end-role id="umlar-045508d3-92f9-46f6-b571-e06ad94bd34c" name="" navigability="yes" association-type="association" visibility="private" property-ref="b531bae1520645b58761d8077cac7517" />
             </relation>
           </item>
         </abstract-items>
@@ -1264,8 +1264,8 @@
           </item>
           <item id="c19c4449f012422dbba1ddec55021b44" cid="REL004" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:57:00" from="d3486fe91b1f476e8a3393099f04e99e" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="d3486fe91b1f476e8a3393099f04e99e" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-981b0bfd-5e93-4c22-a53a-8c81be735bf0" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-f98a9751-03cb-41bf-b3e8-aa3200644bb4" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-bbbda7d9-216a-4bf1-8616-4a711042a97f" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-7bf7c9f6-1749-468c-a24e-1de3dcfcc0ff" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="c34f0bc111894b608624e52c0815c07a" cid="REQ007" type="requirement" name="RQ_TECH_SPEC_FE_4" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:02:23">
@@ -1372,14 +1372,14 @@
           </item>
           <item id="ce75414afc48414db34ec56233570770" cid="REL005" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:58:04" from="05792695378d4e0fa3cdd3681474e8f6" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="05792695378d4e0fa3cdd3681474e8f6" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-1611e56a-79b7-4370-8a0c-05e5ab283980" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-6b200b58-66f0-4a56-a11e-4aa9398f09e1" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-079b95ec-83bf-4369-8b4b-94ede2d285f7" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-91166476-9a2b-4f6e-8e4d-f257d32d2881" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="57b3095ce64f4492bf2b9b93738232bf" cid="REL007" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:02:23" from="c34f0bc111894b608624e52c0815c07a" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="c34f0bc111894b608624e52c0815c07a" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-3a3f0d29-f0a4-454b-8f33-9514c24fe0bc" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-a38accce-a314-493c-a373-184d968286aa" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-94d9c5a5-4aee-470f-a86e-2d2a8e055db8" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-854ee18c-6cbe-4bab-8173-71a4176a7198" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="05792695378d4e0fa3cdd3681474e8f6" cid="REQ005" type="requirement" name="RQ_TECH_SPEC_FRAMEWORK_2" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:58:04">
@@ -1540,26 +1540,26 @@
           </item>
           <item id="b92a1d894874430fb846cd4ffebbe4e1" cid="REL014" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:09:33" from="f57cd7c78a5e483ebb3edb6a59957a97" to="c54c944000d84837bbb378cebd81a4e2" visibility="package">
             <relation from="f57cd7c78a5e483ebb3edb6a59957a97" to="c54c944000d84837bbb378cebd81a4e2" derived="false">
-              <start-role id="umlar-0290769d-7ef6-4f7e-855e-cc4414904961" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-14b411ab-aedd-4be4-80f9-d465bfe00847" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-423e6c82-85d6-443b-8625-5f07aecf1202" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-c701658c-e514-4bc8-bcb1-1bb373203a4a" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="2ffa044974b44d11a13593ba0173375b" cid="REL010" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:05:39" from="b2345a523c6b4b969a3fc4b92c2a427e" to="f3f58833e12d41adbad092d5fa821ae6" visibility="package">
             <relation from="b2345a523c6b4b969a3fc4b92c2a427e" to="f3f58833e12d41adbad092d5fa821ae6" derived="false">
-              <start-role id="umlar-1435ca01-38b9-4f0c-a250-778dcfb93588" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-f33afca7-554d-44e0-8582-988d8fcad10f" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-0e7d2f8f-2a37-411a-bff0-74c62cdb957a" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-a18b7f87-7f86-41a7-9b9e-f29d6476e500" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="b8f1b1ee8380442a9b9806bcaabd60e1" cid="REL009" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:04:56" from="c776555b542842099176f5d00fbd63e4" to="f3f58833e12d41adbad092d5fa821ae6" visibility="package">
             <relation from="c776555b542842099176f5d00fbd63e4" to="f3f58833e12d41adbad092d5fa821ae6" derived="false">
-              <start-role id="umlar-6b5c0465-ec0d-4176-bdc5-d0311e5b59e0" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-1b024615-acc4-424f-969b-2139e63d0712" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-f4b7161f-40c0-4a80-8fbc-193f49d5c778" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-2aec7c25-21df-4844-8d5f-a9d216d9f92e" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="d31aa3cec9784517b6f38b38341c1799" cid="REL006" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:59:19" from="cc5e96719a7b4470b17001e1bc806b61" to="ba48530a7b5245a7b6efcf3d8e61f067" visibility="package">
             <relation from="cc5e96719a7b4470b17001e1bc806b61" to="ba48530a7b5245a7b6efcf3d8e61f067" derived="false">
-              <start-role id="umlar-d0d32a63-8f48-4e73-940b-0ad352b90b3b" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-d24f6ebd-f841-4da4-88a0-7c6f970f467c" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-0001072f-4ad5-4a14-a766-b2957377bec3" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-79164b1d-c08e-4b5c-8f1e-55b726537f82" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="d3486fe91b1f476e8a3393099f04e99e" cid="REQ004" type="requirement" name="RQ_TECH_SPEC_PLATFORM_1" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:57:00">
@@ -1662,8 +1662,8 @@
           </item>
           <item id="6236eeabf4f94d1984205fd7fcb75b72" cid="REL008" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:04:52" from="c42a187a572a4c2c80d005bf4ea52f65" to="f3f58833e12d41adbad092d5fa821ae6" visibility="package">
             <relation from="c42a187a572a4c2c80d005bf4ea52f65" to="f3f58833e12d41adbad092d5fa821ae6" derived="false">
-              <start-role id="umlar-84d77a61-d21b-4817-b604-34b2ed6b6138" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-fcb2a8ed-c7cc-402c-9178-815ea95d1331" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-696a6ae5-2c5b-4315-8509-6910309626c0" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-c75275b3-d397-4fdc-9c8d-6d64236f1cfe" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="b2345a523c6b4b969a3fc4b92c2a427e" cid="REQ009" type="requirement" name="RQ_SUP_SETTINGS" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:05:39">
@@ -1781,14 +1781,14 @@
           </item>
           <item id="613bacfba1584c98951c8961e3c0cc5e" cid="REL011" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:07:27" from="c54c944000d84837bbb378cebd81a4e2" to="0a48454de005413c92e4a5cce0d2982c" visibility="package">
             <relation from="c54c944000d84837bbb378cebd81a4e2" to="0a48454de005413c92e4a5cce0d2982c" derived="false">
-              <start-role id="umlar-191b4230-7dc9-4706-9390-8935d6dec056" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-090ba312-bca5-459d-b5ac-c1c19df167ad" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-d48e5394-9a61-4927-bb93-d93364a80038" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-f1962cfa-bf9e-4a70-8799-da33b014ad08" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="4db2cc42f34c4caa94683e00c470b9da" cid="REL013" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:08:33" from="7888a9de9bb14ac0a6fadd2418d0d7a6" to="c54c944000d84837bbb378cebd81a4e2" visibility="package">
             <relation from="7888a9de9bb14ac0a6fadd2418d0d7a6" to="c54c944000d84837bbb378cebd81a4e2" derived="false">
-              <start-role id="umlar-d763a053-816d-46a8-bf9d-d811b481cff7" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-02b77ff7-a32e-4f5b-8a52-c655263b4a8a" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-e7ad6a7e-5762-4095-9898-fc51424a1630" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-32228af5-36f3-486d-915d-60154cd74cd6" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
           <item id="f2c72e50f02843f08f5a7b84d1b0047f" cid="REQ012" type="requirement" name="RQ_CSTR_APP" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:07:51">
@@ -2016,8 +2016,8 @@
           </item>
           <item id="fbc97786a07c4aaa90c643ba77619c6e" cid="REL012" type="relationship" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 16:07:51" from="f2c72e50f02843f08f5a7b84d1b0047f" to="0a48454de005413c92e4a5cce0d2982c" visibility="package">
             <relation from="f2c72e50f02843f08f5a7b84d1b0047f" to="0a48454de005413c92e4a5cce0d2982c" derived="false">
-              <start-role id="umlar-1ac8ae18-eb46-42cb-ab45-ffb8480544d7" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-1b2b18f6-71fe-45be-b52a-c43c54f61a9a" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-57ac9deb-eb59-4288-8b46-5dfe7e6806d5" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-514389a4-6158-4bb8-9b94-96bddb68daf5" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
         </abstract-items>
@@ -2255,19 +2255,6 @@
                   </index>
                 </indexes>
               </item>
-              <item id="eed22cb50bf14a369a44386ecff2eddf" cid="REL_SETTING_SETTING_ID" type="erd-relationship" name="REL_SETTING_SETTING_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:46:59" from="1995ba399cb24729b4df7bbbc0c77b31" to="1995ba399cb24729b4df7bbbc0c77b31">
-                <stereotypes>
-                  <stereotype name="relation" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="eed22cb50bf14a369a44386ecff2eddf_relation_c" type="relation" ref="" />
-                </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="a08479372eb77415d9e7fc24b12fd0d42593" to-attribute="a43f81acbacea4b5eb1ab53c404241e92410" />
-                  </attribute-pairs>
-                </erd-relation>
-              </item>
               <item id="031a668b1d6a45e1907a612d85b43d24" cid="TBL_USER" type="erd-entity" name="User" style-class="Flat Green" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:15:45">
                 <stereotypes>
                   <stereotype name="table" />
@@ -2293,29 +2280,29 @@
                   </index>
                 </indexes>
               </item>
-              <item id="38364cd5ebf7433c827087a1d94c73ca" cid="REL_TENANTUSER_USER_ID" type="erd-relationship" name="REL_TENANTUSER_USER_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:28:44" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="031a668b1d6a45e1907a612d85b43d24">
+              <item id="eed22cb50bf14a369a44386ecff2eddf" cid="REL_SETTING_SETTING_ID" type="erd-relationship" name="REL_SETTING_SETTING_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:46:59" from="1995ba399cb24729b4df7bbbc0c77b31" to="1995ba399cb24729b4df7bbbc0c77b31">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="38364cd5ebf7433c827087a1d94c73ca_relation_c" type="relation" ref="" />
+                  <stereotype id="eed22cb50bf14a369a44386ecff2eddf_relation_c" type="relation" ref="" />
                 </stereotype-instances>
                 <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="a6e7eae435a0345fea29288220aa8aa1d623" to-attribute="a6dda4862ea794595834ccbbeacdb68a8699" />
+                    <attribute-pair from-attribute="a08479372eb77415d9e7fc24b12fd0d42593" to-attribute="a43f81acbacea4b5eb1ab53c404241e92410" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="ccc94b03e9f14adf85defc647f594921" cid="REL023" type="erd-relationship" name="REL_COUNTRY_CURRENCY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:28:10" from="84a3ecb6b97b4e9cbcf5d8255039f80c" to="cb80b20360f340559de7775b16dcf14f">
+              <item id="38364cd5ebf7433c827087a1d94c73ca" cid="REL_TENANTUSER_USER_ID" type="erd-relationship" name="REL_TENANTUSER_USER_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:28:44" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="031a668b1d6a45e1907a612d85b43d24">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="ccc94b03e9f14adf85defc647f594921_relation_c" type="relation" ref="" />
+                  <stereotype id="38364cd5ebf7433c827087a1d94c73ca_relation_c" type="relation" ref="" />
                 </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="ab59af341336049cab67540f6403cce1425" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
+                    <attribute-pair from-attribute="a6e7eae435a0345fea29288220aa8aa1d623" to-attribute="a6dda4862ea794595834ccbbeacdb68a8699" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
@@ -2332,32 +2319,31 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="06c92dd941704baf86d79ecead01e134" cid="REL_TENANTUSER_TENANT_ID" type="erd-relationship" name="REL_TENANTUSER_TENANT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:26:57" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="e50f79968a404d3fbb33f4a02fa3b572">
+              <item id="ccc94b03e9f14adf85defc647f594921" cid="REL023" type="erd-relationship" name="REL_COUNTRY_CURRENCY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:28:10" from="84a3ecb6b97b4e9cbcf5d8255039f80c" to="cb80b20360f340559de7775b16dcf14f">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="06c92dd941704baf86d79ecead01e134_relation_c" type="relation" ref="" />
+                  <stereotype id="ccc94b03e9f14adf85defc647f594921_relation_c" type="relation" ref="" />
                 </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="ab59b0b6bdd31441c89af642f0131a84b208" to-attribute="aeda82a68426646d3a6cfa276db9bd56f255" />
+                    <attribute-pair from-attribute="ab59af341336049cab67540f6403cce1425" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="979e2dd2651742e08af31f818c22bf4e" cid="ENT007" type="erd-entity" name="TenantCountry" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:13:26">
+              <item id="06c92dd941704baf86d79ecead01e134" cid="REL_TENANTUSER_TENANT_ID" type="erd-relationship" name="REL_TENANTUSER_TENANT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:26:57" from="f7ba98ff46b54ebd99e6e9d48d4aeee9" to="e50f79968a404d3fbb33f4a02fa3b572">
                 <stereotypes>
-                  <stereotype name="table" />
+                  <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="979e2dd2651742e08af31f818c22bf4e_table_c" type="table" ref="" />
+                  <stereotype id="06c92dd941704baf86d79ecead01e134_relation_c" type="relation" ref="" />
                 </stereotype-instances>
-                <entity description="" />
-                <attributes>
-                  <attribute uid="af9002db56cf14129b96aa8a533353459288" cid="EA037" name="TenantId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to tenant" default-value="" default-value-name="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
-                  <attribute uid="ac565ef6d613e4ce395193ba85470dd24288" cid="EA038" name="CountryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to country" default-value="" default-value-name="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
-                </attributes>
-                <indexes />
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="0..1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="ab59b0b6bdd31441c89af642f0131a84b208" to-attribute="aeda82a68426646d3a6cfa276db9bd56f255" />
+                  </attribute-pairs>
+                </erd-relation>
               </item>
               <item id="84a3ecb6b97b4e9cbcf5d8255039f80c" cid="ENT005" type="erd-entity" name="Country" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:12:36">
                 <stereotypes>
@@ -2385,6 +2371,20 @@
                   </index>
                 </indexes>
               </item>
+              <item id="979e2dd2651742e08af31f818c22bf4e" cid="ENT007" type="erd-entity" name="TenantCountry" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:13:26">
+                <stereotypes>
+                  <stereotype name="table" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="979e2dd2651742e08af31f818c22bf4e_table_c" type="table" ref="" />
+                </stereotype-instances>
+                <entity description="" />
+                <attributes>
+                  <attribute uid="af9002db56cf14129b96aa8a533353459288" cid="EA037" name="TenantId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to tenant" default-value="" default-value-name="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
+                  <attribute uid="ac565ef6d613e4ce395193ba85470dd24288" cid="EA038" name="CountryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to country" default-value="" default-value-name="" auto-increment="false" creation-date="11/05/2022 09:21:27" />
+                </attributes>
+                <indexes />
+              </item>
               <item id="a48a9211b03c407cbb288eded410b64a" cid="REL019" type="erd-relationship" name="REL_TENANTCOUNTRY_TENANT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:24:18" from="979e2dd2651742e08af31f818c22bf4e" to="e50f79968a404d3fbb33f4a02fa3b572">
                 <stereotypes>
                   <stereotype name="relation" />
@@ -2439,19 +2439,6 @@
                   </index>
                 </indexes>
               </item>
-              <item id="4c112af66ef746a3897a3e2a89b04793" cid="REL022" type="erd-relationship" name="REL_TENANTCURRENCY_CURRENCY__ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:26:21" from="1596d482602d4447b90d648ed5031bb4" to="cb80b20360f340559de7775b16dcf14f">
-                <stereotypes>
-                  <stereotype name="relation" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="4c112af66ef746a3897a3e2a89b04793_relation_c" type="relation" ref="" />
-                </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="a743bc958b32142279f0be7a53e28a40f887" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
-                  </attribute-pairs>
-                </erd-relation>
-              </item>
               <item id="cb80b20360f340559de7775b16dcf14f" cid="ENT006" type="erd-entity" name="Currency" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:12:59">
                 <stereotypes>
                   <stereotype name="table" />
@@ -2477,6 +2464,19 @@
                   </index>
                 </indexes>
               </item>
+              <item id="4c112af66ef746a3897a3e2a89b04793" cid="REL022" type="erd-relationship" name="REL_TENANTCURRENCY_CURRENCY__ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/05/2022 09:26:21" from="1596d482602d4447b90d648ed5031bb4" to="cb80b20360f340559de7775b16dcf14f">
+                <stereotypes>
+                  <stereotype name="relation" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="4c112af66ef746a3897a3e2a89b04793_relation_c" type="relation" ref="" />
+                </stereotype-instances>
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a743bc958b32142279f0be7a53e28a40f887" to-attribute="ab12dbe3ddb0e44da817555c631a0bcdd360" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
               <item id="f7ba98ff46b54ebd99e6e9d48d4aeee9" cid="TBL_TENANTUSER" type="erd-entity" name="TenantUser" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:22:55">
                 <stereotypes>
                   <stereotype name="table" />
@@ -2853,27 +2853,6 @@
               <version>1.0.0.1</version>
             </meta>
             <abstract-items>
-              <item id="e3828a85b81e4dab9faf7fc35422c4f9" cid="ENT017" type="erd-entity" name="Template" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 05:48:48">
-                <stereotypes>
-                  <stereotype name="table" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="e3828a85b81e4dab9faf7fc35422c4f9_table_c" type="table" ref="" />
-                </stereotype-instances>
-                <entity description="" />
-                <attributes>
-                  <attribute uid="a4b401b2d6fb249a68b6d657ea305cafe133" cid="EA082" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Template primary key" default-value="" default-value-name="" auto-increment="true" creation-date="11/07/2022 05:53:58" />
-                  <attribute uid="ad45fc7b3cb344392a07567b9c18ae712133" cid="EA083" name="TenantCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="false" description="Reference to tenant code that template belongs" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 05:53:58" />
-                  <attribute uid="a90018820b3224a61af3bacd975535958256" cid="EA105" name="Code" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="false" description="Template code. Main key to search." default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
-                  <attribute uid="a4315edfba5f14362beed8c223149955f256" cid="EA106" name="Description" type="nvarchar" type-id="MsSql.nvarchar" type-size="500" foreign-key="false" primary-key="false" nullable="true" description="Template description" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
-                  <attribute uid="aa713e64031cf4aa1b48f4f47443375bf256" cid="EA107" name="Type" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Template type (t4)" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
-                  <attribute uid="a36550b7482004518ab6f0020cbc58f50256" cid="EA108" name="Content" type="ntext" type-id="MsSql.ntext" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Template content" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
-                  <attribute uid="ae89dd81299ab44549f393ab8bd786e2c903" cid="EA109" name="Created" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record created timestamp" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:15:12" />
-                  <attribute uid="a08301ac8df4b472dab22b4c42b04237f903" cid="EA110" name="Modified" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record modified timestamp" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:15:12" />
-                  <attribute uid="a58eeeda01e9d4cd49098aa6996e8e053903" cid="EA111" name="Modifier" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="true" description="Record modifier signature" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:15:12" />
-                </attributes>
-                <indexes />
-              </item>
               <item id="diec4b218cb47746ceba64e207a912d06c1285" cid="ENT027" type="erd-entity" name="SentMessage" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 05:47:16">
                 <stereotypes>
                   <stereotype name="table" />
@@ -2899,6 +2878,27 @@
                 </attributes>
                 <indexes />
               </item>
+              <item id="e3828a85b81e4dab9faf7fc35422c4f9" cid="ENT017" type="erd-entity" name="Template" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 05:48:48">
+                <stereotypes>
+                  <stereotype name="table" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="e3828a85b81e4dab9faf7fc35422c4f9_table_c" type="table" ref="" />
+                </stereotype-instances>
+                <entity description="" />
+                <attributes>
+                  <attribute uid="a4b401b2d6fb249a68b6d657ea305cafe133" cid="EA082" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Template primary key" default-value="" default-value-name="" auto-increment="true" creation-date="11/07/2022 05:53:58" />
+                  <attribute uid="ad45fc7b3cb344392a07567b9c18ae712133" cid="EA083" name="TenantCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="false" description="Reference to tenant code that template belongs" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 05:53:58" />
+                  <attribute uid="a90018820b3224a61af3bacd975535958256" cid="EA105" name="Code" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="false" description="Template code. Main key to search." default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
+                  <attribute uid="a4315edfba5f14362beed8c223149955f256" cid="EA106" name="Description" type="nvarchar" type-id="MsSql.nvarchar" type-size="500" foreign-key="false" primary-key="false" nullable="true" description="Template description" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
+                  <attribute uid="aa713e64031cf4aa1b48f4f47443375bf256" cid="EA107" name="Type" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Template type (t4)" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
+                  <attribute uid="a36550b7482004518ab6f0020cbc58f50256" cid="EA108" name="Content" type="ntext" type-id="MsSql.ntext" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Template content" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:14:06" />
+                  <attribute uid="ae89dd81299ab44549f393ab8bd786e2c903" cid="EA109" name="Created" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record created timestamp" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:15:12" />
+                  <attribute uid="a08301ac8df4b472dab22b4c42b04237f903" cid="EA110" name="Modified" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record modified timestamp" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:15:12" />
+                  <attribute uid="a58eeeda01e9d4cd49098aa6996e8e053903" cid="EA111" name="Modifier" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="true" description="Record modifier signature" default-value="" default-value-name="" auto-increment="false" creation-date="11/07/2022 06:15:12" />
+                </attributes>
+                <indexes />
+              </item>
               <item id="4543725efd8340b38d428f58e0277be9" cid="ENT018" type="erd-entity" name="MessageData" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 05:49:05">
                 <stereotypes>
                   <stereotype name="table" />
@@ -2918,6 +2918,13 @@
                 </attributes>
                 <indexes />
               </item>
+              <item id="b831317571014df9bb68c68ef4fd6bed" cid="REL037" type="erd-relationship" name="REL_PENDINGM_MESSAGEATTACHMENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 08:18:13" from="5e7fe86b6ebe45cd8c74f976766c0f5b" to="0072a4a831c1432ea145f94c46dc3fc1">
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a64859b62e51d4a4c815c52b81bbfb980211" to-attribute="a70e0ddc6a10c48bc94ac632c58290f27285" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
               <item id="d4f6574c5e094b18a3468cb20d94cf63" cid="REL033" type="erd-relationship" name="REL_MESSAGEATTACHMENT_MESSAGEATTACHMENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 06:01:33" from="0072a4a831c1432ea145f94c46dc3fc1" to="0072a4a831c1432ea145f94c46dc3fc1">
                 <stereotypes>
                   <stereotype name="relation" />
@@ -2931,13 +2938,6 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="b831317571014df9bb68c68ef4fd6bed" cid="REL037" type="erd-relationship" name="REL_PENDINGM_MESSAGEATTACHMENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 08:18:13" from="5e7fe86b6ebe45cd8c74f976766c0f5b" to="0072a4a831c1432ea145f94c46dc3fc1">
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="a64859b62e51d4a4c815c52b81bbfb980211" to-attribute="a70e0ddc6a10c48bc94ac632c58290f27285" />
-                  </attribute-pairs>
-                </erd-relation>
-              </item>
               <item id="524242499ba64b71bf6ad7a7997f2fbf" cid="REL066" type="erd-relationship" name="REL_FAILM_TEMPLATE_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:49:50" from="di183a33fee764488f98900f17a89993883707" to="e3828a85b81e4dab9faf7fc35422c4f9">
                 <stereotypes>
                   <stereotype name="relation" />
@@ -2951,16 +2951,16 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="326713af4d5e4ee781d1418d33f11f26" cid="REL035" type="erd-relationship" name="REL_RENDINGM_TEMPLATE_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 08:16:47" from="5e7fe86b6ebe45cd8c74f976766c0f5b" to="e3828a85b81e4dab9faf7fc35422c4f9">
+              <item id="03e217a092cc4bf5810435b06ab7788e" cid="REL069" type="erd-relationship" name="REL_FAILM_MESSAGEATTACHMENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:50:32" from="di183a33fee764488f98900f17a89993883707" to="0072a4a831c1432ea145f94c46dc3fc1">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="326713af4d5e4ee781d1418d33f11f26_relation_c" type="relation" ref="" />
+                  <stereotype id="03e217a092cc4bf5810435b06ab7788e_relation_c" type="relation" ref="" />
                 </stereotype-instances>
                 <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="ad91f8f25c29a4c419325e2371407b77a211" to-attribute="a4b401b2d6fb249a68b6d657ea305cafe133" />
+                    <attribute-pair from-attribute="a64859b62e51d4a4c815c52b81bbfb980211" to-attribute="a70e0ddc6a10c48bc94ac632c58290f27285" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
@@ -2990,16 +2990,16 @@
                 </attributes>
                 <indexes />
               </item>
-              <item id="03e217a092cc4bf5810435b06ab7788e" cid="REL069" type="erd-relationship" name="REL_FAILM_MESSAGEATTACHMENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:50:32" from="di183a33fee764488f98900f17a89993883707" to="0072a4a831c1432ea145f94c46dc3fc1">
+              <item id="326713af4d5e4ee781d1418d33f11f26" cid="REL035" type="erd-relationship" name="REL_RENDINGM_TEMPLATE_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 08:16:47" from="5e7fe86b6ebe45cd8c74f976766c0f5b" to="e3828a85b81e4dab9faf7fc35422c4f9">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="03e217a092cc4bf5810435b06ab7788e_relation_c" type="relation" ref="" />
+                  <stereotype id="326713af4d5e4ee781d1418d33f11f26_relation_c" type="relation" ref="" />
                 </stereotype-instances>
                 <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="a64859b62e51d4a4c815c52b81bbfb980211" to-attribute="a70e0ddc6a10c48bc94ac632c58290f27285" />
+                    <attribute-pair from-attribute="ad91f8f25c29a4c419325e2371407b77a211" to-attribute="a4b401b2d6fb249a68b6d657ea305cafe133" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
@@ -3021,29 +3021,29 @@
                 </attributes>
                 <indexes />
               </item>
-              <item id="8327054c53b940d8a552ba01b491269d" cid="REL065" type="erd-relationship" name="REL_FAILM_RECIPIENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:49:29" from="di183a33fee764488f98900f17a89993883707" to="c05781b8df36488a96d7bac1997b3bec">
+              <item id="f605dccc5f36404cb1743956890011ec" cid="REL067" type="erd-relationship" name="REL_FAILM_MESSAGEDATA_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:50:06" from="di183a33fee764488f98900f17a89993883707" to="4543725efd8340b38d428f58e0277be9">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="8327054c53b940d8a552ba01b491269d_relation_c" type="relation" ref="" />
+                  <stereotype id="f605dccc5f36404cb1743956890011ec_relation_c" type="relation" ref="" />
                 </stereotype-instances>
                 <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="a8682dcc09a7a4e5790b231d6238aa53e570" to-attribute="a5ada734fd06848df809dfb8f1ba55e45192" />
+                    <attribute-pair from-attribute="a4776f53499ec4245b23879f4afcb50e4211" to-attribute="ab319e15e96714219b67ec69abcc28699709" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="f605dccc5f36404cb1743956890011ec" cid="REL067" type="erd-relationship" name="REL_FAILM_MESSAGEDATA_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:50:06" from="di183a33fee764488f98900f17a89993883707" to="4543725efd8340b38d428f58e0277be9">
+              <item id="8327054c53b940d8a552ba01b491269d" cid="REL065" type="erd-relationship" name="REL_FAILM_RECIPIENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:49:29" from="di183a33fee764488f98900f17a89993883707" to="c05781b8df36488a96d7bac1997b3bec">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="f605dccc5f36404cb1743956890011ec_relation_c" type="relation" ref="" />
+                  <stereotype id="8327054c53b940d8a552ba01b491269d_relation_c" type="relation" ref="" />
                 </stereotype-instances>
                 <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="a4776f53499ec4245b23879f4afcb50e4211" to-attribute="ab319e15e96714219b67ec69abcc28699709" />
+                    <attribute-pair from-attribute="a8682dcc09a7a4e5790b231d6238aa53e570" to-attribute="a5ada734fd06848df809dfb8f1ba55e45192" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
@@ -3086,19 +3086,6 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="b89c0c4f0336459d876bf4ace3a630cb" cid="REL062" type="erd-relationship" name="REL_SENTM_TEMPLATE_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:46:45" from="diec4b218cb47746ceba64e207a912d06c1285" to="e3828a85b81e4dab9faf7fc35422c4f9">
-                <stereotypes>
-                  <stereotype name="relation" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="b89c0c4f0336459d876bf4ace3a630cb_relation_c" type="relation" ref="" />
-                </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="ad91f8f25c29a4c419325e2371407b77a211" to-attribute="a4b401b2d6fb249a68b6d657ea305cafe133" />
-                  </attribute-pairs>
-                </erd-relation>
-              </item>
               <item id="b1f9234a88054ba4a48fc3a871dc02bc" cid="REL064" type="erd-relationship" name="REL_SENTM_MESSAGEATTACHMENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:47:26" from="diec4b218cb47746ceba64e207a912d06c1285" to="0072a4a831c1432ea145f94c46dc3fc1">
                 <stereotypes>
                   <stereotype name="relation" />
@@ -3112,16 +3099,16 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="1d8fc1524cbc4062990a125ee00dceae" cid="REL036" type="erd-relationship" name="REL_PENDINGM_MESSAGEDATA_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 08:17:36" from="5e7fe86b6ebe45cd8c74f976766c0f5b" to="4543725efd8340b38d428f58e0277be9">
+              <item id="b89c0c4f0336459d876bf4ace3a630cb" cid="REL062" type="erd-relationship" name="REL_SENTM_TEMPLATE_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:46:45" from="diec4b218cb47746ceba64e207a912d06c1285" to="e3828a85b81e4dab9faf7fc35422c4f9">
                 <stereotypes>
                   <stereotype name="relation" />
                 </stereotypes>
                 <stereotype-instances>
-                  <stereotype id="1d8fc1524cbc4062990a125ee00dceae_relation_c" type="relation" ref="" />
+                  <stereotype id="b89c0c4f0336459d876bf4ace3a630cb_relation_c" type="relation" ref="" />
                 </stereotype-instances>
                 <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
                   <attribute-pairs>
-                    <attribute-pair from-attribute="a4776f53499ec4245b23879f4afcb50e4211" to-attribute="ab319e15e96714219b67ec69abcc28699709" />
+                    <attribute-pair from-attribute="ad91f8f25c29a4c419325e2371407b77a211" to-attribute="a4b401b2d6fb249a68b6d657ea305cafe133" />
                   </attribute-pairs>
                 </erd-relation>
               </item>
@@ -3145,6 +3132,19 @@
                 </attributes>
                 <indexes />
               </item>
+              <item id="1d8fc1524cbc4062990a125ee00dceae" cid="REL036" type="erd-relationship" name="REL_PENDINGM_MESSAGEDATA_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 08:17:36" from="5e7fe86b6ebe45cd8c74f976766c0f5b" to="4543725efd8340b38d428f58e0277be9">
+                <stereotypes>
+                  <stereotype name="relation" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="1d8fc1524cbc4062990a125ee00dceae_relation_c" type="relation" ref="" />
+                </stereotype-instances>
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a4776f53499ec4245b23879f4afcb50e4211" to-attribute="ab319e15e96714219b67ec69abcc28699709" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
               <item id="6a2e5cc6de7c4d0384efda392236b8e2" cid="REL034" type="erd-relationship" name="REL_PENDINGM_RECIPIENT_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 08:16:07" from="5e7fe86b6ebe45cd8c74f976766c0f5b" to="c05781b8df36488a96d7bac1997b3bec">
                 <stereotypes>
                   <stereotype name="relation" />
@@ -3158,6 +3158,19 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
+              <item id="8f9c7abb18b949ff9b3f13aa8b75b5ce" cid="REL063" type="erd-relationship" name="REL_SENTM_MESSAGEDATA_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:47:04" from="diec4b218cb47746ceba64e207a912d06c1285" to="4543725efd8340b38d428f58e0277be9">
+                <stereotypes>
+                  <stereotype name="relation" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="8f9c7abb18b949ff9b3f13aa8b75b5ce_relation_c" type="relation" ref="" />
+                </stereotype-instances>
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a4776f53499ec4245b23879f4afcb50e4211" to-attribute="ab319e15e96714219b67ec69abcc28699709" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
               <item id="5e7fe86b6ebe45cd8c74f976766c0f5b" cid="ENT013" type="erd-entity" name="PendingMessage" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/07/2022 05:47:16">
                 <stereotypes>
                   <stereotype name="table" />
@@ -3184,19 +3197,6 @@
                 </attributes>
                 <indexes />
               </item>
-              <item id="8f9c7abb18b949ff9b3f13aa8b75b5ce" cid="REL063" type="erd-relationship" name="REL_SENTM_MESSAGEDATA_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/09/2022 16:47:04" from="diec4b218cb47746ceba64e207a912d06c1285" to="4543725efd8340b38d428f58e0277be9">
-                <stereotypes>
-                  <stereotype name="relation" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="8f9c7abb18b949ff9b3f13aa8b75b5ce_relation_c" type="relation" ref="" />
-                </stereotype-instances>
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="a4776f53499ec4245b23879f4afcb50e4211" to-attribute="ab319e15e96714219b67ec69abcc28699709" />
-                  </attribute-pairs>
-                </erd-relation>
-              </item>
             </abstract-items>
             <layer id="83a4e4aefb704bb48f6dab87118e71d8" name="Default" visible="true" enabled="true" locked="false">
               <item id="5e7fe86b6ebe45cd8c74f976766c0f5b" iid="c6d0f021d805452b9e88072b060d461d" creation-date="11/07/2022 05:47:16" order-index="1" type="entity">
@@ -3384,7 +3384,7 @@
           </meta>
           <abstract-items />
           <sub-models />
-          <diagram type="entity-relationship" id="pe1c118897a6a4125bb6136c46c1c33e7_611331886" name="Processor" order-index="1" uid="" name-style="" auto-routed-paths="false" default-line-style="default" view-location="-103,374">
+          <diagram type="entity-relationship" id="pe1c118897a6a4125bb6136c46c1c33e7_611331886" name="Processor" order-index="1" uid="" auto-routed-paths="false" default-line-style="default" view-location="667,-118">
             <style>
               <background-color index="1" color="#FFFFFFFF" />
               <background-color index="2" color="#FFFFFFFF" />
@@ -3398,7 +3398,7 @@
               <creation-date>11/08/2022 05:20:32</creation-date>
               <change-date>11/08/2022 08:47:08</change-date>
               <revision-count>0</revision-count>
-              <version>1.0.0.0</version>
+              <version>1.0.0.1</version>
             </meta>
             <abstract-items>
               <item id="baadf4cdcea24736829d90875a341465" cid="REL054" type="erd-relationship" name="REL_QPENDING_STATUSHISTORY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 08:36:45" from="1186fa6c2b034ce885edbb8091b46505" to="b765908bd63249ed98fd4b67aaffb808">
@@ -3436,7 +3436,7 @@
                 </stereotype-instances>
                 <entity pk-constraint-name="ID_QUEUEDONE_ID" description="" />
                 <attributes>
-                  <attribute uid="a82230d98d8f2444da66784a543fe97cf880" cid="EA174" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Record identifier. Primary key" default-value="" default-value-name="" auto-increment="true" creation-date="11/08/2022 08:15:19" />
+                  <attribute uid="a82230d98d8f2444da66784a543fe97cf880" cid="EA174" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Record identifier. Primary key" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:15:19" />
                   <attribute uid="aedffb28a70b54824af70db83e90864fe766" cid="EA210" name="DataId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to data collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:33" />
                   <attribute uid="ab0ed4682a90049478990dc6e20df5d11766" cid="EA211" name="StatusHistoryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to status history collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:33" />
                   <attribute uid="aca0b03fda09d4763acac4c42d36f812d766" cid="EA212" name="TenantCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="false" description="Reference to tenant code that queue belongs" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:33" />
@@ -3468,6 +3468,35 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
+              <item id="ce304959c0f14de896f808363c2b20f0" cid="REL052" type="erd-relationship" name="REL_STATUSHISTORY_STATUSHISTORY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:33:22" from="b765908bd63249ed98fd4b67aaffb808" to="b765908bd63249ed98fd4b67aaffb808">
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a2077f43978cb42c39a412aa2b831da2b399" to-attribute="ac5647322066d4c8183f23cc7e844cf74395" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
+              <item id="457b363c986e438795a41f1d41a698f1" cid="ENT023" type="erd-entity" name="QueueFailed" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:22:59">
+                <entity pk-constraint-name="ID_QUEUEFAILED_ID" description="" />
+                <attributes>
+                  <attribute uid="ae7890dece3ce4af4af5198a59867913e481" cid="EA175" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Record identifier. Primary key" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:15:27" />
+                  <attribute uid="af516ce71d9c745e59606792d0ce364ff38" cid="EA198" name="DataId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to data collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="a3ed1729f040d4f6292c662be0265480c38" cid="EA199" name="StatusHistoryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to status history collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="a3e58b8932607466087ee6c351c1c309038" cid="EA200" name="TenantCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="false" description="Reference to tenant code that queue belongs" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="ae6ff0f1204f5468c9c03721a733d74dc38" cid="EA201" name="Owner" type="nvarchar" type-id="MsSql.nvarchar" type-size="50" foreign-key="false" primary-key="false" nullable="false" description="Owner (abstract) key identifier. Usually entity code" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="a5785cf3b882b44a3ad482e24a6f2a82d383" cid="EA245" name="Priority" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Priority to process task. Higher value defines lower priority" default-value="100" default-value-name="" auto-increment="false" creation-date="01/09/2023 11:31:05" />
+                  <attribute uid="a221edf3ae9f44b60a5e4b63e8e38ef3f389" cid="EA246" name="Provider" type="nvarchar" type-id="MsSql.nvarchar" type-size="500" foreign-key="false" primary-key="false" nullable="false" description="Provider to process task" default-value="" default-value-name="" auto-increment="false" creation-date="01/09/2023 11:31:05" />
+                  <attribute uid="acd106be90b514e00b2e84a2f26df737438" cid="EA202" name="AffinityWorker" type="nvarchar" type-id="MsSql.nvarchar" type-size="64" foreign-key="false" primary-key="false" nullable="false" description="Owner worker identifier who processing task" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="a233e82f08879435c865aaacdf163f54b38" cid="EA203" name="Status" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record status (Pending-0,Assigned-1,Working-2,Success-3,Failed-4,Expired-5,Deleted-6,Disabled-7)" default-value="0" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="a968b799009624c189780b1d7fa142f4d591" cid="EA226" name="Attempt" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Attempt counter to process task" default-value="0" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:52:57" />
+                  <attribute uid="af1f0227fc93344ebb9f704453bdf1c4e38" cid="EA204" name="StartFrom" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record processing from datetime" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="ae079f98e806941388bfde50116b2bdf638" cid="EA205" name="StartTo" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record processing to datetime. If overflow then record is expired." default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="ac0f24590c7bd4922a3b3c8cd6c86203c38" cid="EA206" name="Started" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record started processing at" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="a36d10a611d4b44018cde243907a8e39238" cid="EA207" name="Finished" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record finished at" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="ae68020eaa0c746ddafd2d5ab906235fa39" cid="EA208" name="LastStatusChanged" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Last status change timestamp" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                  <attribute uid="a5df478ad1596417aa948f15b61b1b6d939" cid="EA209" name="Created" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record created timestamp" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
+                </attributes>
+                <indexes />
+              </item>
               <item id="df4ed254302249d69a4c0ed1131d09cc" cid="ENT021" type="erd-entity" name="QueueProcessing" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:22:17">
                 <stereotypes>
                   <stereotype name="table" />
@@ -3477,7 +3506,7 @@
                 </stereotype-instances>
                 <entity pk-constraint-name="ID_QUEUEPROCESSING_ID" description="" />
                 <attributes>
-                  <attribute uid="a85eab25a15bf443ca9d7d72d2be1bf9c464" cid="EA173" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Record identifier. Primary key" default-value="" default-value-name="" auto-increment="true" creation-date="11/08/2022 08:15:13" />
+                  <attribute uid="a85eab25a15bf443ca9d7d72d2be1bf9c464" cid="EA173" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Record identifier. Primary key" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:15:13" />
                   <attribute uid="a7be97a141faa470a9dda9f7de8720f4d62" cid="EA186" name="DataId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to data collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:41:32" />
                   <attribute uid="a7a00dd817c9c4cdcb7bdfefb05443cf562" cid="EA187" name="StatusHistoryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to status history collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:41:32" />
                   <attribute uid="a1b66de9956284271b515e1266895ab9762" cid="EA188" name="TenantCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="false" description="Reference to tenant code that queue belongs" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:41:32" />
@@ -3496,39 +3525,6 @@
                 </attributes>
                 <indexes />
               </item>
-              <item id="457b363c986e438795a41f1d41a698f1" cid="ENT023" type="erd-entity" name="QueueFailed" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:22:59">
-                <stereotypes>
-                  <stereotype name="table" />
-                </stereotypes>
-                <stereotype-instances>
-                  <stereotype id="457b363c986e438795a41f1d41a698f1_table_c" type="table" ref="" />
-                </stereotype-instances>
-                <entity pk-constraint-name="ID_QUEUEFAILED_ID" description="" />
-                <attributes>
-                  <attribute uid="ae7890dece3ce4af4af5198a59867913e481" cid="EA175" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Record identifier. Primary key" default-value="" default-value-name="" auto-increment="true" creation-date="11/08/2022 08:15:27" />
-                  <attribute uid="af516ce71d9c745e59606792d0ce364ff38" cid="EA198" name="DataId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to data collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="a3ed1729f040d4f6292c662be0265480c38" cid="EA199" name="StatusHistoryId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to status history collection" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="a3e58b8932607466087ee6c351c1c309038" cid="EA200" name="TenantCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="false" description="Reference to tenant code that queue belongs" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="ae6ff0f1204f5468c9c03721a733d74dc38" cid="EA201" name="Owner" type="nvarchar" type-id="MsSql.nvarchar" type-size="50" foreign-key="false" primary-key="false" nullable="false" description="Owner (abstract) key identifier. Usually entity code" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="acd106be90b514e00b2e84a2f26df737438" cid="EA202" name="AffinityWorker" type="nvarchar" type-id="MsSql.nvarchar" type-size="64" foreign-key="false" primary-key="false" nullable="false" description="Owner worker identifier who processing task" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="a233e82f08879435c865aaacdf163f54b38" cid="EA203" name="Status" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record status (Pending-0,Assigned-1,Working-2,Success-3,Failed-4,Expired-5,Deleted-6,Disabled-7)" default-value="0" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="a968b799009624c189780b1d7fa142f4d591" cid="EA226" name="Attempt" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Attempt counter to process task" default-value="0" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:52:57" />
-                  <attribute uid="af1f0227fc93344ebb9f704453bdf1c4e38" cid="EA204" name="StartFrom" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record processing from datetime" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="ae079f98e806941388bfde50116b2bdf638" cid="EA205" name="StartTo" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record processing to datetime. If overflow then record is expired." default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="ac0f24590c7bd4922a3b3c8cd6c86203c38" cid="EA206" name="Started" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record started processing at" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="a36d10a611d4b44018cde243907a8e39238" cid="EA207" name="Finished" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record finished at" default-value="" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="ae68020eaa0c746ddafd2d5ab906235fa39" cid="EA208" name="LastStatusChanged" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Last status change timestamp" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                  <attribute uid="a5df478ad1596417aa948f15b61b1b6d939" cid="EA209" name="Created" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Record created timestamp" default-value="getdate()" default-value-name="" auto-increment="false" creation-date="11/08/2022 08:44:24" />
-                </attributes>
-                <indexes />
-              </item>
-              <item id="ce304959c0f14de896f808363c2b20f0" cid="REL052" type="erd-relationship" name="REL_STATUSHISTORY_STATUSHISTORY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:33:22" from="b765908bd63249ed98fd4b67aaffb808" to="b765908bd63249ed98fd4b67aaffb808">
-                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
-                  <attribute-pairs>
-                    <attribute-pair from-attribute="a2077f43978cb42c39a412aa2b831da2b399" to-attribute="ac5647322066d4c8183f23cc7e844cf74395" />
-                  </attribute-pairs>
-                </erd-relation>
-              </item>
               <item id="9a7395ec0c17456db7ef4b014d6926d5" cid="REL060" type="erd-relationship" name="REL_QDONE_STATUSHISTORY_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 08:47:08" from="d3d616beebc24f36b6938945ae4354c4" to="b765908bd63249ed98fd4b67aaffb808">
                 <stereotypes>
                   <stereotype name="relation" />
@@ -3749,18 +3745,18 @@
                 <relation from="df4ed254302249d69a4c0ed1131d09cc" from-iid="418d0aa581c545cd81f9f0fe79d1e4fb" from-field="a7a00dd817c9c4cdcb7bdfefb05443cf562" to="b765908bd63249ed98fd4b67aaffb808" to-iid="5b1c442bf5e94c6087e35b73f4616120" to-field="ac5647322066d4c8183f23cc7e844cf74395" />
               </item>
               <item id="24978a7816954c8b9b404b7f4eb78dd4" iid="a496c8177b5547c99181c57b2dad60be" creation-date="11/08/2022 08:45:53" order-index="12" type="relation">
-                <layout start-role-position="25,15" end-role-position="25,-15" line-style="oblique" lock-to-fields="true" auto-path="" x1="1126" y1="626" x2="1323" y2="348" start-border-pos="0.941816816816817" end-border-pos="0.319976076555024" start-local-pos="77" end-local-pos="58" name-position="0,20">
+                <layout start-role-position="25,15" end-role-position="25,-15" line-style="oblique" lock-to-fields="true" auto-path="" x1="1126" y1="608" x2="1323" y2="348" start-border-pos="0.95533033033033" end-border-pos="0.319976076555024" start-local-pos="59" end-local-pos="58" name-position="0,20">
                   <points>
-                    <point x="1126" y="626" />
+                    <point x="1126" y="608" />
                     <point x="1323" y="348" />
                   </points>
                 </layout>
                 <relation from="457b363c986e438795a41f1d41a698f1" from-iid="a5c5e513910642c5b0efb24fd9fc2b38" from-field="af516ce71d9c745e59606792d0ce364ff38" to="bfe30d52b9874c9e889784357be31a14" to-iid="f6b988b16681472aabb064336c52e34a" to-field="a92ed274860e44bc5befe31a3ea2aed7b908" />
               </item>
               <item id="f3b285db7dad4fbd9515f21df0e12282" iid="dcb349adc6f041298abbc5620dd1fb95" creation-date="11/08/2022 08:46:16" order-index="13" type="relation">
-                <layout start-role-position="25,15" end-role-position="25,-15" line-style="oblique" lock-to-fields="true" auto-path="" x1="1126" y1="646" x2="410" y2="700" start-border-pos="0.927552552552553" end-border-pos="0.319976076555024" start-local-pos="97" end-local-pos="58" name-position="0,20">
+                <layout start-role-position="25,15" end-role-position="25,-15" line-style="oblique" lock-to-fields="true" auto-path="" x1="1126" y1="627" x2="410" y2="700" start-border-pos="0.941066066066066" end-border-pos="0.319976076555024" start-local-pos="78" end-local-pos="58" name-position="0,20">
                   <points>
-                    <point x="1126" y="646" />
+                    <point x="1126" y="627" />
                     <point x="410" y="700" />
                   </points>
                 </layout>
@@ -4181,17 +4177,17 @@
                     </meta>
                     <abstract-items>
                       <item id="e43d3fe1f6eb4864bda6105388cd01ad" cid="GNR006" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:23:10" from="46d6acea9ee94f478d35fd94222823d1" to="9d3c3e4449654a8eb8937c600d6387cb" visibility="package" />
-                      <item id="2b78dae590774ba29408b5a7421772f8" cid="GNR005" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:22:55" from="9d3c3e4449654a8eb8937c600d6387cb" to="3a66f5b07fb94e5798d0bb4c5c194a2e" visibility="package" />
                       <item id="a450326c9e38432b906d894d13d94161" cid="ELEM003" type="template-parameter" name="TRepository1" owner="44a36b903018464184f14b39c3b5c834" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:13:10">
                         <template-parameter />
                       </item>
+                      <item id="2b78dae590774ba29408b5a7421772f8" cid="GNR005" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:22:55" from="9d3c3e4449654a8eb8937c600d6387cb" to="3a66f5b07fb94e5798d0bb4c5c194a2e" visibility="package" />
                       <item id="065ff00536924b68a0e40e5a3c5285de" cid="ELEM026" type="template-parameter" name="TRepository" owner="d377c2fa19bc467cbe34ff3f15c549a3" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:24:51">
                         <template-parameter />
                       </item>
-                      <item id="45e6b0d9085a485f9ba8b04f83099e60" cid="GNR007" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:23:18" from="44a36b903018464184f14b39c3b5c834" to="9d3c3e4449654a8eb8937c600d6387cb" visibility="package" />
                       <item id="1dccc832d02c4ce7b8aa6ed5f20e0a3e" cid="ELEM002" type="template-parameter" name="TRepository" owner="46d6acea9ee94f478d35fd94222823d1" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/06/2022 16:53:43">
                         <template-parameter />
                       </item>
+                      <item id="45e6b0d9085a485f9ba8b04f83099e60" cid="GNR007" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:23:18" from="44a36b903018464184f14b39c3b5c834" to="9d3c3e4449654a8eb8937c600d6387cb" visibility="package" />
                       <item id="d377c2fa19bc467cbe34ff3f15c549a3" cid="C013" type="class" name="AbstractWorkerService" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:23:58" visibility="undefined">
                         <stereotypes>
                           <stereotype name="class" />
@@ -4227,10 +4223,10 @@
                       <item id="d19fe1a5d2d94d40a6103951d1d6ded2" cid="ELEM028" type="template-parameter" owner="d377c2fa19bc467cbe34ff3f15c549a3" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:24:51">
                         <template-parameter />
                       </item>
-                      <item id="71691530fb544e2898935b1493808140" cid="GNR008" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:24:58" from="d377c2fa19bc467cbe34ff3f15c549a3" to="46d6acea9ee94f478d35fd94222823d1" visibility="package" />
                       <item id="03c425c9d95a4dabb6a0127890768487" cid="ELEM009" type="template-parameter" name="TRepository4" owner="44a36b903018464184f14b39c3b5c834" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/08/2022 05:13:10">
                         <template-parameter />
                       </item>
+                      <item id="71691530fb544e2898935b1493808140" cid="GNR008" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:24:58" from="d377c2fa19bc467cbe34ff3f15c549a3" to="46d6acea9ee94f478d35fd94222823d1" visibility="package" />
                       <item id="9d3c3e4449654a8eb8937c600d6387cb" cid="C011" type="class" name="AbstractService" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:22:05" visibility="undefined">
                         <stereotypes>
                           <stereotype name="class" />
@@ -4497,7 +4493,7 @@
                 </model>
               </sub-models>
             </model>
-            <model id="pb07e49cdd83a4142817ba7a0206211b1_743854101" name="Processor" namespace="" order-index="4">
+            <model id="pb07e49cdd83a4142817ba7a0206211b1_743854101" name="Processor" namespace="" order-index="4" expanded="true">
               <meta>
                 <authors>
                   <author> </author>
@@ -4510,7 +4506,7 @@
               </meta>
               <abstract-items />
               <sub-models />
-              <diagram type="uml-object" id="p97c4945e834b4a848bc53117c7bc552b_806997528" name="Workers" order-index="1" uid="" auto-routed-paths="false" default-line-style="default" show-frame="false" view-location="0,10">
+              <diagram type="uml-object" id="p97c4945e834b4a848bc53117c7bc552b_806997528" name="Workers" order-index="1" expanded="true" uid="" name-style="" auto-routed-paths="false" default-line-style="default" show-frame="false" view-location="0,10">
                 <style>
                   <background-color index="1" color="#FFFFFFFF" />
                   <background-color index="2" color="#FFFFFFFF" />
@@ -4541,7 +4537,11 @@
                           <styles />
                           <content>
                             <paragraph>
-                              <style />
+                              <style numbering-type="None">
+                                <numbering name="" multi-level="false">
+                                  <numbering-level type="None" level="0" format="{0}." />
+                                </numbering>
+                              </style>
                               <p>
                                 <t>Processing </t>
                               </p>
@@ -4581,7 +4581,11 @@
                           <styles />
                           <content>
                             <paragraph>
-                              <style />
+                              <style numbering-type="None">
+                                <numbering name="" multi-level="false">
+                                  <numbering-level type="None" level="0" format="{0}." />
+                                </numbering>
+                              </style>
                               <p>
                                 <t>Executes </t>
                               </p>
@@ -4615,8 +4619,8 @@
                       <stereotype id="00b50fb61c9e483f8ebfe983b59431f5_holds_c" type="holds" ref="" />
                     </stereotype-instances>
                   </item>
-                  <item id="22e1fbb433fb482b952d4a8f0bca33ca" cid="GNR014" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:38:14" from="c4696775bd4e4f9598ebc727b45f61de" to="d377c2fa19bc467cbe34ff3f15c549a3" visibility="package" />
                   <item id="f3480c4b3be44b868533cadc5482ecf7" cid="GNR010" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:26:42" from="f21f229a93cf43959ff951a632606fb4" to="d377c2fa19bc467cbe34ff3f15c549a3" visibility="package" />
+                  <item id="22e1fbb433fb482b952d4a8f0bca33ca" cid="GNR014" type="generalization" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:38:14" from="c4696775bd4e4f9598ebc727b45f61de" to="d377c2fa19bc467cbe34ff3f15c549a3" visibility="package" />
                   <item id="8f2fdc4eac3347c6aef041212c87450f" cid="CNT002" type="containment" name="Executings" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:36:39" from="cc386eb15db74f10b73070cf12b705c3" to="c4696775bd4e4f9598ebc727b45f61de">
                     <stereotypes>
                       <stereotype name="holds" />
@@ -4625,14 +4629,6 @@
                       <stereotype id="8f2fdc4eac3347c6aef041212c87450f_holds_c" type="holds" ref="" />
                     </stereotype-instances>
                   </item>
-                  <item id="561f132758b34694baf9ea6c8981d7e2" cid="CNT005" type="containment" name="Retentions" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:37:04" from="77b9473d5f6e4f7cb2d1f69a09b8f7b5" to="c4696775bd4e4f9598ebc727b45f61de">
-                    <stereotypes>
-                      <stereotype name="holds" />
-                    </stereotypes>
-                    <stereotype-instances>
-                      <stereotype id="561f132758b34694baf9ea6c8981d7e2_holds_c" type="holds" ref="" />
-                    </stereotype-instances>
-                  </item>
                   <item id="c4696775bd4e4f9598ebc727b45f61de" cid="C016" type="class" name="ComplexWorker" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:36:04" visibility="public">
                     <documentations>
                       <doc id="f097e817988349f9b69e6c44df3e6c19">
@@ -4647,7 +4643,11 @@
                           <styles />
                           <content>
                             <paragraph>
-                              <style />
+                              <style numbering-type="None">
+                                <numbering name="" multi-level="false">
+                                  <numbering-level type="None" level="0" format="{0}." />
+                                </numbering>
+                              </style>
                               <p>
                                 <t>Holds </t>
                               </p>
@@ -4688,6 +4688,14 @@
                       <source-code language="ActionScript" />
                     </source-codes>
                   </item>
+                  <item id="561f132758b34694baf9ea6c8981d7e2" cid="CNT005" type="containment" name="Retentions" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:37:04" from="77b9473d5f6e4f7cb2d1f69a09b8f7b5" to="c4696775bd4e4f9598ebc727b45f61de">
+                    <stereotypes>
+                      <stereotype name="holds" />
+                    </stereotypes>
+                    <stereotype-instances>
+                      <stereotype id="561f132758b34694baf9ea6c8981d7e2_holds_c" type="holds" ref="" />
+                    </stereotype-instances>
+                  </item>
                   <item id="77b9473d5f6e4f7cb2d1f69a09b8f7b5" cid="C010" type="class" name="RetentionWorker" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="12/07/2022 05:20:39" visibility="package">
                     <documentations>
                       <doc id="831adba3e8d74ed08bb958b9b122fad3">
@@ -4702,7 +4710,11 @@
                           <styles />
                           <content>
                             <paragraph>
-                              <style />
+                              <style numbering-type="None">
+                                <numbering name="" multi-level="false">
+                                  <numbering-level type="None" level="0" format="{0}." />
+                                </numbering>
+                              </style>
                               <p>
                                 <t>Flagging </t>
                               </p>
@@ -4750,7 +4762,11 @@
                           <styles />
                           <content>
                             <paragraph>
-                              <style />
+                              <style numbering-type="None">
+                                <numbering name="" multi-level="false">
+                                  <numbering-level type="None" level="0" format="{0}." />
+                                </numbering>
+                              </style>
                               <p>
                                 <t>Physically </t>
                               </p>

+ 3 - 3
Common/qdr.app.qlbrc.common/Entities/Base/QlbrcEntityTracked.cs

@@ -10,9 +10,9 @@ namespace Quadarax.Application.QLiberace.Common.Entities.Base
 {
     public abstract class QlbrcEntityTracked : QlbrcEntity, ITracked
     {
-        public DateTime Created { get; internal set; }
-        public DateTime? Modified { get; internal set;}
-        public string? Modifier { get; internal set;}
+        public DateTime Created { get; protected set; }
+        public DateTime? Modified { get; protected set;}
+        public string? Modifier { get; protected set;}
 
 
     }

+ 90 - 0
Common/qdr.app.qlbrc.common/Executor/BaseParametricExecutor.cs

@@ -0,0 +1,90 @@
+using Quadarax.Foundation.Core.Logging;
+using Quadarax.Foundation.Core.Value.Extensions;
+// ReSharper disable once InconsistentNaming
+
+namespace Quadarax.Application.QLiberace.Common.Executor
+{
+    public abstract class BaseParametricExecutor : IParametricExecutorProvider
+    {
+        protected IQLog? Log { get; }
+        public TimeSpan Timeout { get; private set; }
+        public DateTime? Started { get; private set; } = null!;
+        public DateTime? Finished { get; private set; } = null!;
+
+        private const string EXECPV_TIMEOUT = "timeout";
+
+
+        protected BaseParametricExecutor(TimeSpan defaultTimeout,IQLogger? logger = null)
+        {
+            Log = logger?.GetLogger(GetType());
+            Timeout = defaultTimeout;
+            
+
+            ends here
+        }
+
+
+        public bool Execute(IEnumerable<IParametricExecutorValue> values)
+        {
+            
+                if (values == null) throw new ArgumentNullException(nameof(values));
+                var parametricExecutorValues = values as IParametricExecutorValue[] ?? values.ToArray();
+                foreach (var value in parametricExecutorValues)
+                    SetupValue(value);
+
+                var iid = Guid.NewGuid();
+                var result = false;
+                Started = DateTime.Now;
+                Log?.Log(LogSeverityEnum.Debug, $"({iid.ToBase32String()}) Executor type '{GetType().Name}' started with {parametricExecutorValues.Length} parameters. ");
+
+                try
+                {
+                    var task = Task.Run(() => OnExecute(iid));
+                    if (task.Wait(Timeout))
+                        return task.Result;
+
+
+                }
+                catch (Exception e)
+                {
+                    Log?.Log(LogSeverityEnum.Error,
+                        $"({iid.ToBase32String()}) Error executing provider '{GetType().Name}'.", e);
+                    throw;
+                }
+                
+                Finished = DateTime.Now;
+                Log?.Log(LogSeverityEnum.Debug, $"({iid.ToBase32String()}) Executor type '{GetType().Name}' finished in duration {(Finished - Started).Value.ToReadableString()}. ");
+                return result;
+        }
+
+        protected abstract bool OnExecute(Guid iid);
+
+        private void SetupValue(IParametricExecutorValue value)
+        {
+            try
+            {
+                OnSetupValue(value.Code, value.Value.ToType(value.TypeQualifiedName));
+            }
+            catch (Exception e)
+            {
+                Log?.Log(LogSeverityEnum.Error, $"Error during parsing executor '{GetType().Name}' value for Code = '{value.Code}'; Type = '{value.TypeQualifiedName}'; Value='{value.Value}'.", e);
+                throw;
+            }
+        }
+
+
+        protected virtual void OnSetupValue(string code, object? value)
+        {
+            switch (code.ToLower())
+            {
+                case EXECPV_TIMEOUT:
+                    if (value!=null)
+                        Timeout = (TimeSpan)value;
+                    break;
+                default:
+                    throw new InvalidOperationException($"Unhandled parameter '{code}' setup.");
+            }
+        }
+
+    }
+}

+ 20 - 0
Common/qdr.app.qlbrc.common/Executor/IParametricExecutorProvider.cs

@@ -0,0 +1,20 @@
+
+namespace Quadarax.Application.QLiberace.Common.Executor
+{
+    public interface IParametricExecutorProvider
+    {
+        TimeSpan Timeout { get; }
+
+        DateTime? Started { get; }
+        DateTime? Finished { get; }
+
+        bool Execute(IEnumerable<IParametricExecutorValue> values);
+    }
+
+    public interface IParametricExecutorValue
+    {
+        string Code { get;}
+        string TypeQualifiedName { get; }
+        string Value { get; }
+    }
+}

+ 18 - 0
Common/qdr.app.qlbrc.common/Executor/ParameterExecutorValue.cs

@@ -0,0 +1,18 @@
+namespace Quadarax.Application.QLiberace.Common.Executor
+{
+    public sealed class ParameterExecutorValue : IParametricExecutorValue
+    {
+        public string Code { get; }
+        public string TypeQualifiedName { get;}
+        public string Value { get; }
+
+        public ParameterExecutorValue(string code, string typeQualifiedName, string value)
+        {
+            if (string.IsNullOrEmpty(code)) throw new ArgumentNullException(nameof(code));
+            Code = code;
+            if (string.IsNullOrEmpty(typeQualifiedName)) throw new ArgumentNullException(nameof(typeQualifiedName));
+            TypeQualifiedName = typeQualifiedName;
+            Value = value;
+        }
+    }
+}

+ 5 - 0
Common/qdr.app.qlbrc.common/Settings/ModuleSetting.cs

@@ -34,5 +34,10 @@ namespace Quadarax.Application.QLiberace.Common.Settings
         }
 
 
+        public virtual void SetDefaults()
+        {
+
+        }
+
     }
 }

+ 6 - 5
Common/qdr.fnd.core.business/AbstractMultiRepositoryService.cs

@@ -1,7 +1,8 @@
 using System;
 using Microsoft.Extensions.Logging;
-using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.Data.Interface.Repository;
+using Quadarax.Foundation.Core.Logging;
 
 namespace Quadarax.Foundation.Core.Business
 {
@@ -12,7 +13,7 @@ namespace Quadarax.Foundation.Core.Business
         protected TRepository1 Repository1 { get; }
         protected TRepository2 Repository2 { get; }
 
-        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2,IContext currentContext, ILoggerFactory logger) : base(currentContext, logger)
+        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2,IContext currentContext, IQLogger logger) : base(currentContext, logger)
         {
             Repository1 = repository1 ?? throw new ArgumentNullException(nameof(repository1));
             Repository2 = repository2 ?? throw new ArgumentNullException(nameof(repository2));
@@ -29,7 +30,7 @@ namespace Quadarax.Foundation.Core.Business
         protected TRepository2 Repository2 { get; }
         protected TRepository3 Repository3 { get; }
 
-        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2, TRepository3 repository3,IContext currentContext, ILoggerFactory logger) : base(currentContext, logger)
+        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2, TRepository3 repository3,IContext currentContext, IQLogger logger) : base(currentContext, logger)
         {
             Repository1 = repository1 ?? throw new ArgumentNullException(nameof(repository1));
             Repository2 = repository2 ?? throw new ArgumentNullException(nameof(repository2));
@@ -48,7 +49,7 @@ namespace Quadarax.Foundation.Core.Business
         protected TRepository3 Repository3 { get; }
         protected TRepository4 Repository4 { get; }
 
-        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2, TRepository3 repository3,TRepository4 repository4, IContext currentContext, ILoggerFactory logger) : base(currentContext, logger)
+        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2, TRepository3 repository3,TRepository4 repository4, IContext currentContext, IQLogger logger) : base(currentContext, logger)
         {
             Repository1 = repository1 ?? throw new ArgumentNullException(nameof(repository1));
             Repository2 = repository2 ?? throw new ArgumentNullException(nameof(repository2));
@@ -71,7 +72,7 @@ namespace Quadarax.Foundation.Core.Business
         protected TRepository4 Repository4 { get; }
         protected TRepository5 Repository5 { get; }
 
-        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2, TRepository3 repository3,TRepository4 repository4,TRepository5 repository5,IContext currentContext, ILoggerFactory logger) : base(currentContext, logger)
+        protected AbstractMultiRepositoryService(TRepository1 repository1, TRepository2 repository2, TRepository3 repository3,TRepository4 repository4,TRepository5 repository5,IContext currentContext, IQLogger logger) : base(currentContext, logger)
         {
             Repository1 = repository1 ?? throw new ArgumentNullException(nameof(repository1));
             Repository2 = repository2 ?? throw new ArgumentNullException(nameof(repository2));

+ 3 - 2
Common/qdr.fnd.core.business/AbstractRepositoryService.cs

@@ -2,8 +2,9 @@
 using System.Security.Principal;
 using Microsoft.Extensions.Logging;
 using NLog;
-using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.Data.Interface.Repository;
+using Quadarax.Foundation.Core.Logging;
 
 namespace Quadarax.Foundation.Core.Business
 {
@@ -11,7 +12,7 @@ namespace Quadarax.Foundation.Core.Business
     {
         protected TRepository Repository { get; }
 
-        protected AbstractRepositoryService(TRepository repository,IContext currentContext, ILoggerFactory logger) : base(currentContext, logger)
+        protected AbstractRepositoryService(TRepository repository,IContext currentContext, IQLogger logger) : base(currentContext, logger)
         {
             Repository = repository ?? throw new ArgumentNullException(nameof(repository));
         }

+ 8 - 8
Common/qdr.fnd.core.business/AbstractService.cs

@@ -5,36 +5,36 @@ using Quadarax.Foundation.Core.Business.Interface;
 using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.Data.Interface.Entity;
 using Quadarax.Foundation.Core.Data.Interface.Entity.Dto;
+using Quadarax.Foundation.Core.Logging;
 
 namespace Quadarax.Foundation.Core.Business
 {
     public abstract class AbstractService : IService
     {
         #region *** Properties ***
-        protected ILogger<AbstractService> Log { get; }
+        protected IQLog Log { get; }
         protected IContext CurrentContext { get; }
-
-        protected ILoggerFactory LoggerFactory { get; }
+        protected IQLogger Logger { get; }
 
         public ServiceStateEnum State { get; protected set; }
         #endregion
 
         #region *** Constructors ***
-        protected AbstractService(IContext currentContext, ILoggerFactory logger)
+        protected AbstractService(IContext currentContext, IQLogger logger)
         {
             State = ServiceStateEnum.Initializing;
             CurrentContext = currentContext ?? throw new ArgumentNullException(nameof(currentContext));
             if (logger == null)throw new ArgumentNullException(nameof(logger));
-            
-            Log = logger.CreateLogger<AbstractService>();
-            LoggerFactory = logger;
+
+            Logger = logger;
+            Log = logger.GetLogger(GetType());
 
                 //if (currentContext == null)
             //{
             //    var genericIdentity = new GenericIdentity("genericIdentity");
             //    currentContext = new GenericPrincipal(genericIdentity, new string[] {});
             //}
-            Log.LogTrace($"Service '{GetType().Name}' [Hash:{GetHashCode()}] initialized.");
+            Log.Log(LogSeverityEnum.Trace, $"Service '{GetType().Name}' [Hash:{GetHashCode()}] initialized.");
 
             State = ServiceStateEnum.Online;
         }

+ 93 - 32
Common/qdr.fnd.core.business/AbstractWorkerService.cs

@@ -1,36 +1,34 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using Microsoft.Extensions.Logging;
 using Quadarax.Foundation.Core.Business.Enums;
 using Quadarax.Foundation.Core.Business.Interface;
 using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.Data.Interface.Repository;
+using Quadarax.Foundation.Core.Logging;
 using Quadarax.Foundation.Core.Thread;
-using ILogger = Quadarax.Foundation.Core.Logging.ILogger;
 
 namespace Quadarax.Foundation.Core.Business
 {
-    public abstract class AbstractWorkerService<TWorker, TRepository> : AbstractRepositoryService<TRepository> 
+    public abstract class AbstractWorkerService<TRepository> : AbstractRepositoryService<TRepository> 
         where TRepository: IRepository
-        where TWorker : AbstractWorker, new()
     {
 
         #region *** Private fields ***
-        private IList<Tuple<WorkerStatusInfo,TWorker>> _workers = new List<Tuple<WorkerStatusInfo,TWorker>>();
-        private IWorkerSettings _wrkSettings;
+        private IList<Tuple<WorkerStatusInfo, AbstractWorker>> _workers = new List<Tuple<WorkerStatusInfo,AbstractWorker>>();
+        private IList<WorkerDescriptor> _descriptors = new List<WorkerDescriptor>();
         private object _lockTransient = null;
         #endregion
 
         #region *** Properties ***
-        protected abstract string Name { get; }
         #endregion
 
 
         #region *** Constructors ***
-        protected AbstractWorkerService(IWorkerSettings workerSettings, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(repository, currentContext, logger)
+        protected AbstractWorkerService(TRepository repository, IContext currentContext, IQLogger logger) : base(repository, currentContext, logger)
         {
             State = ServiceStateEnum.Initializing;
-            _wrkSettings = workerSettings ?? throw new ArgumentNullException(nameof(workerSettings));
             InitInternal();
         }
         #endregion
@@ -42,16 +40,20 @@ namespace Quadarax.Foundation.Core.Business
             {
                 _lockTransient = new object();
 
-                for(var a=0;a<_wrkSettings.WorkerCount;a++)
+                ResetDescriptorsOrdinal();
+
+                foreach (var desc in _descriptors)
                 {
-                    var wrk = (TWorker)Activator.CreateInstance(typeof(TWorker),$"{Name}#{a}", new RepoWorkerContext(Repository), (ILogger)LoggerFactory.CreateLogger(this.GetType()));
-                    var info = new WorkerStatusInfo(wrk?.Name);
-                    _workers.Add(new Tuple<WorkerStatusInfo, TWorker>(info, wrk));
-                    wrk?.Start();
-                    info.SetStart();
-                    info.SetIterations(wrk.CurrentThreadId, wrk.IterationCount);
+                    for(var a=0;a<desc.WorkerSettings.WorkerCount;a++)
+                    {
+                        var wrk = BuildWorker(desc);
+                        var info = new WorkerStatusInfo(wrk?.Name);
+                        _workers.Add(new Tuple<WorkerStatusInfo, AbstractWorker>(info, wrk));
+                        wrk?.Start();
+                        info.SetStart();
+                        info.SetIterations(wrk.CurrentThreadId, wrk.IterationCount);
+                    }
                 }
-
                 _lockTransient = null;
                 State = ServiceStateEnum.Online;
             }
@@ -78,20 +80,83 @@ namespace Quadarax.Foundation.Core.Business
 
 
         #region *** Private Operations ***
+
+        protected void RegisterWorker<TWorker>(IWorkerSettings settings) where TWorker : AbstractWorker
+        {
+            if (settings == null) throw new ArgumentNullException(nameof(settings));
+
+            State = ServiceStateEnum.Initializing;
+
+            lock (_lockTransient)
+            {
+                _lockTransient = new object();
+
+                _descriptors.Add(new WorkerDescriptor(typeof(TWorker),settings));
+                Log.Log(LogSeverityEnum.Debug, $"Worker type '{typeof(TWorker).Name}' was registered.");
+
+                _lockTransient = null;
+            }
+        }
         private void InitInternal()
         {
+            _workers.Clear();
+            OnBuildWorkers();
+        }
+
+        private void ResetDescriptorsOrdinal()
+        {
+            foreach (var desc in _descriptors)
+                desc.ResetOrdinal();
         }
+
+        protected AbstractWorker BuildWorker(WorkerDescriptor descriptor)
+        {
+            var worker = (AbstractWorker)Activator.CreateInstance(descriptor.WorkerType,descriptor.CurrentWorkerName,
+                descriptor.WorkerSettings, Logger);
+            descriptor.IncrementOrdinal();
+            return worker;
+        }
+
+        protected abstract void OnBuildWorkers();
+
         #endregion
 
         #region *** Nested Classes ***
 
-        private class RepoWorkerContext : IWorkerContext
+        protected class WorkerDescriptor
         {
-            public TRepository Repository { get; }
+            public Type WorkerType { get; }
+            public IWorkerSettings WorkerSettings { get; }
+
+            public int CurrentOrdinalNumber { get; set; }
+
+            public string CurrentWorkerName
+            {
+                get
+                {
+                    var prefix = string.IsNullOrEmpty(WorkerSettings.WorkerNamePrefix)
+                        ? "Worker"
+                        : WorkerSettings.WorkerNamePrefix;
+
+                    return prefix + "#" + CurrentOrdinalNumber;
+                }
+            }
+
+            public WorkerDescriptor(Type workerType, IWorkerSettings settings)
+            {
+                WorkerType = workerType ?? throw new ArgumentNullException(nameof(workerType));
+                WorkerSettings = settings ?? throw new ArgumentNullException(nameof(settings));
+                ResetOrdinal();
+            }
+
+            public void IncrementOrdinal()
+            {
+                CurrentOrdinalNumber++;
+            }
 
-            public RepoWorkerContext(TRepository repository)
+            public void ResetOrdinal()
             {
-                Repository = repository ?? throw new ArgumentNullException(nameof(repository));
+                CurrentOrdinalNumber = 0;
             }
         }
 
@@ -100,55 +165,51 @@ namespace Quadarax.Foundation.Core.Business
 
 
 
-    public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1> : AbstractWorkerService<TWorker, TRepository>
+    public abstract class AbstractWorkerService<TRepository, TRepository1> : AbstractWorkerService<TRepository>
         where TRepository : IRepository
         where TRepository1 : IRepository
-        where TWorker : AbstractWorker, new()
     {
         protected TRepository1 Repository1 { get; }
-        protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings, repository, currentContext, logger)
+        protected AbstractWorkerService(TRepository1 repository1, TRepository repository, IContext currentContext, IQLogger logger) : base(repository, currentContext, logger)
         {
             Repository1 = repository1 ?? throw new ArgumentNullException(nameof(repository1));
         }
     }
 
-    public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2> : AbstractWorkerService<TWorker, TRepository, TRepository1>
+    public abstract class AbstractWorkerService<TRepository, TRepository1, TRepository2> : AbstractWorkerService<TRepository, TRepository1>
         where TRepository : IRepository
         where TRepository1 : IRepository
         where TRepository2 : IRepository
-        where TWorker : AbstractWorker, new()
     {
         protected TRepository2 Repository2 { get; }
-        protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings,repository1, repository, currentContext, logger)
+        protected AbstractWorkerService(TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, IQLogger logger) : base(repository1, repository, currentContext, logger)
         {
             Repository2 = repository2 ?? throw new ArgumentNullException(nameof(repository2));
         }
     }
 
-    public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2, TRepository3> : AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2>
+    public abstract class AbstractWorkerService<TRepository, TRepository1, TRepository2, TRepository3> : AbstractWorkerService<TRepository, TRepository1, TRepository2>
         where TRepository : IRepository
         where TRepository1 : IRepository
         where TRepository2 : IRepository
         where TRepository3 : IRepository
-        where TWorker : AbstractWorker, new()
     {
         protected TRepository3 Repository3 { get; }
-        protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository3 repository3, TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings, repository2, repository1, repository, currentContext, logger)
+        protected AbstractWorkerService(TRepository3 repository3, TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, IQLogger logger) : base(repository2, repository1, repository, currentContext, logger)
         {
             Repository3 = repository3 ?? throw new ArgumentNullException(nameof(repository3));
         }
     }
 
-    public abstract class AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2, TRepository3, TRepository4> : AbstractWorkerService<TWorker, TRepository, TRepository1, TRepository2, TRepository3>
+    public abstract class AbstractWorkerService<TRepository, TRepository1, TRepository2, TRepository3, TRepository4> : AbstractWorkerService<TRepository, TRepository1, TRepository2, TRepository3>
         where TRepository : IRepository
         where TRepository1 : IRepository
         where TRepository2 : IRepository
         where TRepository3 : IRepository
         where TRepository4 : IRepository
-        where TWorker : AbstractWorker, new()
     {
         protected TRepository4 Repository4 { get; }
-        protected AbstractWorkerService(IWorkerSettings workerSettings,TRepository4 repository4, TRepository3 repository3, TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, ILoggerFactory logger) : base(workerSettings,repository3,repository2,repository1, repository, currentContext, logger)
+       protected AbstractWorkerService(TRepository4 repository4, TRepository3 repository3, TRepository2 repository2, TRepository1 repository1, TRepository repository, IContext currentContext, IQLogger logger) : base(repository3,repository2,repository1, repository, currentContext, logger)
         {
             Repository4 = repository4 ?? throw new ArgumentNullException(nameof(repository4));
         }

+ 23 - 0
Common/qdr.fnd.core.business/Configuration/OptionsSetting.cs

@@ -0,0 +1,23 @@
+namespace Quadarax.Foundation.Core.Business.Configuration
+{
+    public class OptionsSetting
+    {
+        #region *** Properties ***
+        public string InstanceId { get; internal set; }
+        public string InstanceDescription { get; internal set; }
+        #endregion
+
+        #region *** Constructors ***
+        public OptionsSetting()
+        {
+        }
+        public OptionsSetting(string instanceId, string instanceDescription)
+        {
+            InstanceId = instanceId;
+            InstanceDescription = instanceDescription;
+        }
+
+        #endregion
+
+    }
+}

+ 1 - 0
Common/qdr.fnd.core.business/Interface/IWorkerSettings.cs

@@ -8,5 +8,6 @@ namespace Quadarax.Foundation.Core.Business.Interface
         TimeSpan IterationTimeout { get; }
         TimeSpan StartDelay { get; }
         int WorkerCount { get; }
+        string WorkerNamePrefix { get; }
     }
 }

+ 22 - 0
Common/qdr.fnd.core.business/RepoWorkerContext.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Linq;
+using Quadarax.Foundation.Core.Data.Interface.Repository;
+using Quadarax.Foundation.Core.Thread;
+
+namespace Quadarax.Foundation.Core.Business
+{
+    public class RepoWorkerContext : IWorkerContext
+    {
+        public IRepository[] Repositories { get; }
+
+        public RepoWorkerContext(params IRepository[] repositories)
+        {
+            Repositories = repositories ?? throw new ArgumentNullException(nameof(repositories));
+        }
+
+        public TRepository GetRepository<TRepository>() where TRepository : class, IRepository
+        {
+            return Repositories.FirstOrDefault(x => x is TRepository) as TRepository;
+        }
+    }
+}

+ 8 - 0
Common/qdr.fnd.core.data/Paging.cs

@@ -29,6 +29,14 @@ namespace Quadarax.Foundation.Core.Data
             PageSize = pageSize;
         }
 
+        public Paging(int takeCount)
+        {
+            IsDisabled = takeCount == 0;
+
+            Page = 1;
+            PageSize = takeCount;
+        }
+
         public Paging()
         {
             IsDisabled = true;

+ 1 - 1
Common/qdr.fnd.core.nlog/Logger.cs

@@ -4,7 +4,7 @@ using Quadarax.Foundation.Core.Logging;
 
 namespace Quadarax.Foundation.Core.NLog
 {
-    public class Logger : ILog
+    public class Logger : IQLog
     {
 
         private global::NLog.ILogger _logger;

+ 5 - 6
Common/qdr.fnd.core.nlog/LoggerFactory.cs

@@ -4,12 +4,11 @@ using NLog;
 using NLog.Config;
 using Quadarax.Foundation.Core.Logging;
 using Quadarax.Foundation.Core.Object;
-using ILogger = Quadarax.Foundation.Core.Logging.ILogger;
 using LogLevel = Microsoft.Extensions.Logging.LogLevel;
 
 namespace Quadarax.Foundation.Core.NLog
 {
-    public class LoggerFactory : Singleton<ILogger, LoggerFactory>, ILogger
+    public class LoggerFactory : Singleton<IQLogger, LoggerFactory>, IQLogger
     {
 
         public static string ConfigurationFileName { get; set; }
@@ -25,21 +24,21 @@ namespace Quadarax.Foundation.Core.NLog
             }
         }
 
-        public ILog GetLogger(string loggerName)
+        public IQLog GetLogger(string loggerName)
         {
             return Instance.GetLogger(loggerName);
         }
 
-        public ILog GetLogger(Type loggerForType)
+        public IQLog GetLogger(Type loggerForType)
         {
             return Instance.GetLogger(loggerForType);
         }
 
-        ILog ILogger.GetLogger(string loggerName)
+        IQLog IQLogger.GetLogger(string loggerName)
         {
             return new Logger(loggerName);
         }
-        ILog ILogger.GetLogger(Type loggerForType)
+        IQLog IQLogger.GetLogger(Type loggerForType)
         {
             return new Logger(loggerForType);
         }

+ 0 - 10
Common/qdr.fnd.core/Logging/ILogger.cs

@@ -1,10 +0,0 @@
-using System;
-
-namespace Quadarax.Foundation.Core.Logging
-{
-    public interface ILogger : Microsoft.Extensions.Logging.ILogger
-    {
-        ILog GetLogger(string loggerName);
-        ILog GetLogger(Type loggerForType);
-    }
-}

+ 1 - 1
Common/qdr.fnd.core/Logging/ILog.cs → Common/qdr.fnd.core/Logging/IQLog.cs

@@ -2,7 +2,7 @@
 
 namespace Quadarax.Foundation.Core.Logging
 {
-    public interface ILog
+    public interface IQLog
     {
         void Log(LogSeverityEnum severity, int code, string message);
         void Log(LogSeverityEnum severity, string message);

+ 10 - 0
Common/qdr.fnd.core/Logging/IQLogger.cs

@@ -0,0 +1,10 @@
+using System;
+
+namespace Quadarax.Foundation.Core.Logging
+{
+    public interface IQLogger
+    {
+        IQLog GetLogger(string loggerName);
+        IQLog GetLogger(Type loggerForType);
+    }
+}

+ 2 - 2
Common/qdr.fnd.core/Thread/AbstractWorker.cs

@@ -13,7 +13,7 @@ namespace Quadarax.Foundation.Core.Thread
 
         #region *** Private fields ***
         private Task _thread;
-        private ILog _log;
+        private IQLog _log;
         private TimeSpan _delay;
         private CancellationTokenSource _cancel;
         #endregion
@@ -41,7 +41,7 @@ namespace Quadarax.Foundation.Core.Thread
         {
 
         }
-        protected AbstractWorker(string workerName, IWorkerContext context, ILogger logger = null)
+        protected AbstractWorker(string workerName, IWorkerContext context, IQLogger logger = null)
         {
             if (string.IsNullOrEmpty(workerName))
                 throw new ArgumentNullException(nameof(workerName));

+ 1 - 1
Common/qdr.fnd.core/Thread/ContinousWorker.cs

@@ -18,7 +18,7 @@ namespace Quadarax.Foundation.Core.Thread
         {
             _body = body;
         }
-        public ContinousWorker(string workerName, ILogger logger = null) : base(workerName,null, logger)
+        public ContinousWorker(string workerName, IQLogger logger = null) : base(workerName,null, logger)
         {
         }
         #endregion

+ 1 - 1
Common/qdr.fnd.core/Thread/LoopWorker.cs

@@ -28,7 +28,7 @@ namespace Quadarax.Foundation.Core.Thread
         {
 
         }
-        public LoopWorker(string workerName, IWorkerContext context, ILogger logger = null) : base(workerName, context, logger)
+        public LoopWorker(string workerName, IWorkerContext context, IQLogger logger = null) : base(workerName, context, logger)
         {
         }
         #endregion

+ 35 - 0
Common/qdr.fnd.core/Value/Extensions/StringExt.cs

@@ -1,7 +1,11 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel;
+using System.Globalization;
 using System.IO;
 using System.Linq;
+using Quadarax.Foundation.Core.Reflection;
+using Quadarax.Foundation.Core.Reflection.Extensions;
 
 namespace Quadarax.Foundation.Core.Value.Extensions
 {
@@ -143,5 +147,36 @@ namespace Quadarax.Foundation.Core.Value.Extensions
                 .Where(c => !Char.IsWhiteSpace(c))
                 .ToArray());
         }
+
+        public static T ToType<T>(this string input)
+        {
+            return (T)ToType(input, typeof(T));
+        }
+
+        public static object ToType(this string input, Type destinationType)
+        {
+            if (destinationType == null) throw new ArgumentNullException(nameof(destinationType));
+            if (string.IsNullOrEmpty(input)) return null;
+
+            var type = Nullable.GetUnderlyingType(destinationType) ?? destinationType;
+            return Convert.ChangeType(input, type);
+
+        }
+
+        public static object ToType(this string input, string typeQualifiedName)
+        {
+            if (string.IsNullOrEmpty(typeQualifiedName)) throw new ArgumentNullException(nameof(typeQualifiedName));
+            if (string.IsNullOrEmpty(input)) return null;
+
+            var destinationType = TypeUtils.GetRemoteType(typeQualifiedName);
+            if (destinationType == null)
+                throw new InvalidCastException($"Cannot load type from qualified name '{typeQualifiedName}'.");
+
+            var type = Nullable.GetUnderlyingType(destinationType) ?? destinationType;
+
+            return Convert.ChangeType(input, type);
+
+        }
+            
     }
 }

+ 0 - 1
Common/qdr.fnd.core/qdr.fnd.core.csproj

@@ -15,7 +15,6 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
     <PackageReference Include="System.IO.Abstractions" Version="17.2.3" />
   </ItemGroup>
 

+ 2 - 1
Modules/qdr.app.qlbrc.base/Services/SettingsService.cs

@@ -10,6 +10,7 @@ using Quadarax.Foundation.Core.Data;
 using Quadarax.Foundation.Core.Data.Interface;
 using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.Data.Interface.Entity.Dto;
+using Quadarax.Foundation.Core.Logging;
 using Quadarax.Foundation.Core.Reflection;
 
 namespace Quadarax.Application.QLiberace.Base.Services
@@ -17,7 +18,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
     public class SettingsService : AbstractRepositoryService<RepoSetting>
     {
         #region *** Constructor ***
-        public SettingsService(RepoSetting repository, IContext currentContext, ILoggerFactory logger) : base(repository, currentContext, logger)
+        public SettingsService(RepoSetting repository, IContext currentContext, IQLogger logger) : base(repository, currentContext, logger)
         {
             //TODO: add enable (field) functionality in GetSettings, GetSettingsValue, GetSettingsValues, GetSettingValueAsString
             //TODO: add method to enable/disable/status setting value

+ 2 - 1
Modules/qdr.app.qlbrc.base/Services/TenantService.cs

@@ -10,6 +10,7 @@ using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.Data.Interface.Entity.Dto;
 using Quadarax.Application.QLiberace.Common;
 using Quadarax.Application.QLiberace.Common.Domain;
+using Quadarax.Foundation.Core.Logging;
 using Quadarax.Foundation.Core.Value;
 
 namespace Quadarax.Application.QLiberace.Base.Services
@@ -17,7 +18,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
     public class TenantService : AbstractRepositoryService<RepoTenant>
     {
         #region *** Constructor ***
-        public TenantService(RepoTenant repository, IContext currentContext, ILoggerFactory logger) : base(repository, currentContext, logger)
+        public TenantService(RepoTenant repository, IContext currentContext, IQLogger logger) : base(repository, currentContext, logger)
         {
         }
         #endregion

+ 2 - 1
Modules/qdr.app.qlbrc.base/Services/UserService.cs

@@ -8,6 +8,7 @@ using Quadarax.Application.QLiberace.Common;
 using Quadarax.Application.QLiberace.Base.Dtos.Validators;
 using Quadarax.Application.QLiberace.Base.Entities;
 using Quadarax.Application.QLiberace.Base.Mapper;
+using Quadarax.Foundation.Core.Logging;
 using Quadarax.Foundation.Core.Value;
 
 namespace Quadarax.Application.QLiberace.Base.Services
@@ -15,7 +16,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
     public class UserService: AbstractRepositoryService<RepoUser>
     {
         #region *** Constructor ***
-        public UserService(RepoUser repository, IContext currentContext, ILoggerFactory logger) : base(repository, currentContext, logger)
+        public UserService(RepoUser repository, IContext currentContext, IQLogger logger) : base(repository, currentContext, logger)
         {
         }
         #endregion

+ 2 - 1
Modules/qdr.app.qlbrc.customer/Services/CustomerService.cs

@@ -14,6 +14,7 @@ using Quadarax.Foundation.Core.Business;
 using Quadarax.Foundation.Core.Data.Interface.Domain;
 using Quadarax.Foundation.Core.Data.Interface.Entity.Dto;
 using Quadarax.Foundation.Core.Exceptions;
+using Quadarax.Foundation.Core.Logging;
 using Quadarax.Foundation.Core.Value;
 
 namespace Quadarax.Application.QLiberace.Customer.Services
@@ -21,7 +22,7 @@ namespace Quadarax.Application.QLiberace.Customer.Services
     public class CustomerService : AbstractMultiRepositoryService<RepoCustomer,RepoContact, RepoUser, RepoCountry>
     {
         #region *** Constructor ***
-        public CustomerService(RepoCustomer repository1, RepoContact repository2, RepoUser repository3, RepoCountry repository4, IContext currentContext, ILoggerFactory logger) : base(repository1, repository2, repository3, repository4, currentContext, logger)
+        public CustomerService(RepoCustomer repository1, RepoContact repository2, RepoUser repository3, RepoCountry repository4, IContext currentContext, IQLogger logger) : base(repository1, repository2, repository3, repository4, currentContext, logger)
         {
         }
         #endregion

+ 22 - 2
Modules/qdr.app.qlbrc.processor/Constants.cs

@@ -6,11 +6,31 @@
         {
             public class Processor
             {
-                public const string PrefixComplex = "cpx";
+
+                public const int ProcessorServiceCount = 1;
+
                 public const string PrefixProcessing = "prc";
-                public const string PrefixExecuting = "exe";
                 public const string PrefixGarbage = "grb";
                 public const string PrefixRetention = "ret";
+
+
+                public const int ProcessingThreads = 2;
+                public const string ProcessingInterval = "00:01:00";
+                public const string ProcessingTimeout = "00:00:30";
+                public const string ProcessingDelay = "00:00:00";
+
+
+                public const int RetentionThreads = 2;
+                public const string RetentionInterval = "00:05:00";
+                public const string RetentionTimeout = "00:00:30";
+                public const string RetentionDelay = "00:00:00";
+
+
+                public const int GarbageThreads = 2;
+                public const string GarbageInterval = "00:15:00";
+                public const string GarbageTimeout = "00:00:30";
+                public const string GarbageDelay = "00:00:00";
+
             }
         }
     }

+ 32 - 5
Modules/qdr.app.qlbrc.processor/Entities/BaseQueue.cs

@@ -3,12 +3,8 @@ using Quadarax.Application.QLiberace.Processor.Enums;
 
 namespace Quadarax.Application.QLiberace.Processor.Entities
 {
-    public abstract class BaseQueue :  QlbrcEntity, ITenantCode
+    public abstract class BaseQueue :  QlbrcEntityTenantCode
     {
-        /// <summary>
-        /// Reference to tenant code that queue belongs
-        /// </summary>
-        public string TenantCode { get; set; }
         /// <summary>
         /// Reference to data collection
         /// </summary>
@@ -25,6 +21,17 @@ namespace Quadarax.Application.QLiberace.Processor.Entities
         /// Owner worker identifier who processing task
         /// </summary>
         public string AffinityWorker { get; set; } = null!;
+
+        /// <summary>
+        /// Defines item priority (default = 100). Higher value represents lower priority. Priority is used to ordering gathering data.
+        /// </summary>
+        public int Priority { get; set; }
+        
+        /// <summary>
+        /// Defines Fully qualified name of provider class to execute item.
+        /// </summary>
+        public string Provider { get; set; } = null!;
+
         /// <summary>
         /// Record status <seealso cref="QueueStatusEnum"/>
         /// </summary>
@@ -50,5 +57,25 @@ namespace Quadarax.Application.QLiberace.Processor.Entities
         //public virtual StatusHistory RootStatusHistory { get; set; } = null!;
 
 
+
+        public virtual void CloneFrom(BaseQueue source)
+        {
+            Id = source.Id;
+            DataId = source.DataId;
+            StatusHistoryId = source.StatusHistoryId;
+            Owner = source.Owner;
+            AffinityWorker = source.AffinityWorker;
+            Status = source.Status;
+            StartFrom = source.StartFrom;
+            StartTo = source.StartTo;
+            LastStatusChanged = source.LastStatusChanged;
+            Created = source.Created;
+            Modified = source.Modified;
+            Modifier = source.Modifier;
+            TenantCode = source.TenantCode;
+            Priority = source.Priority;
+            Provider = source.Provider;
+        }
+
     }
 }

+ 1 - 1
Modules/qdr.app.qlbrc.processor/Entities/FailedQueue.cs

@@ -1,6 +1,6 @@
 namespace Quadarax.Application.QLiberace.Processor.Entities
 {
-    internal class FailedQueue : BaseQueue
+    public class FailedQueue : BaseQueue
     {
     }
 }

+ 14 - 0
Modules/qdr.app.qlbrc.processor/Entities/ProcessingQueue.cs

@@ -10,5 +10,19 @@
         /// Record finished at
         /// </summary>
         public DateTime? Finished { get; set; }
+
+        /// <summary>
+        /// Defines how many attempts to process left. If zero than failed.
+        /// </summary>
+        public int AttemptLeft { get; set; }
+
+        public override void CloneFrom(BaseQueue source)
+        {
+            base.CloneFrom(source);
+            var processing = (ProcessingQueue)source;
+            Started = processing.Started;
+            Finished = processing.Finished;
+            AttemptLeft = processing.AttemptLeft;
+        }
     }
 }

+ 16 - 0
Modules/qdr.app.qlbrc.processor/Entities/QueueData.cs

@@ -0,0 +1,16 @@
+using Quadarax.Application.QLiberace.Common.Entities.Base;
+
+namespace Quadarax.Application.QLiberace.Processor.Entities
+{
+    public class QueueData : QlbrcEntity
+    {
+        public int ParentId { get; set; }
+        public string Code { get; set; } = null!;
+
+        public int SequenceNo { get; set; }
+
+        public string ValueTypeQualified { get; set; } = null!;
+
+        public string? Value { get; set; }
+    }
+}

+ 2 - 2
Modules/qdr.app.qlbrc.processor/Workers/ExecutingWorker.cs → Modules/qdr.app.qlbrc.processor/Executor/ItemExecutor.cs

@@ -4,9 +4,9 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace Quadarax.Application.QLiberace.Processor.Workers
+namespace Quadarax.Application.QLiberace.Processor.Executor
 {
-    internal class ExecutingWorker
+    internal class ItemExecutor
     {
     }
 }

+ 16 - 0
Modules/qdr.app.qlbrc.processor/Repositories/BaseRepoQueue.cs

@@ -0,0 +1,16 @@
+using Quadarax.Application.QLiberace.Common.Domain;
+using Quadarax.Application.QLiberace.Common.Repositories;
+using Quadarax.Application.QLiberace.Processor.Entities;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+
+namespace Quadarax.Application.QLiberace.Processor.Repositories
+{
+    public abstract class BaseRepoQueue<TEntity> : QlbrcTenantCodeTrackedRepository<TEntity> where TEntity : BaseQueue, new()
+    {
+        protected BaseRepoQueue(IUnitOfWork<IDataDomain> unitOfWork, QlbrcContext operationContext) : base(unitOfWork, operationContext)
+        {
+        }
+
+    }
+}

+ 14 - 0
Modules/qdr.app.qlbrc.processor/Repositories/RepoDoneQueue.cs

@@ -0,0 +1,14 @@
+using Quadarax.Application.QLiberace.Common.Domain;
+using Quadarax.Application.QLiberace.Processor.Entities;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+
+namespace Quadarax.Application.QLiberace.Processor.Repositories
+{
+    public class RepoDoneQueue : BaseRepoQueue<DoneQueue>
+    {
+        public RepoDoneQueue(IUnitOfWork<IDataDomain> unitOfWork, QlbrcContext operationContext) : base(unitOfWork, operationContext)
+        {
+        }
+    }
+}

+ 14 - 0
Modules/qdr.app.qlbrc.processor/Repositories/RepoFailedQueue.cs

@@ -0,0 +1,14 @@
+using Quadarax.Application.QLiberace.Processor.Entities;
+using Quadarax.Application.QLiberace.Common.Domain;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+
+namespace Quadarax.Application.QLiberace.Processor.Repositories
+{
+    public class RepoFailedQueue : BaseRepoQueue<FailedQueue>
+    {
+        public RepoFailedQueue(IUnitOfWork<IDataDomain> unitOfWork, QlbrcContext operationContext) : base(unitOfWork, operationContext)
+        {
+        }
+    }
+}

+ 24 - 0
Modules/qdr.app.qlbrc.processor/Repositories/RepoPendingQueue.cs

@@ -0,0 +1,24 @@
+using Quadarax.Application.QLiberace.Processor.Entities;
+using Quadarax.Application.QLiberace.Common.Domain;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Application.QLiberace.Processor.Enums;
+using Quadarax.Foundation.Core.Data;
+
+namespace Quadarax.Application.QLiberace.Processor.Repositories
+{
+    public class RepoPendingQueue : BaseRepoQueue<PendingQueue>
+    {
+        public RepoPendingQueue(IUnitOfWork<IDataDomain> unitOfWork, QlbrcContext operationContext) : base(unitOfWork, operationContext)
+        {
+        }
+
+        public IQueryable<PendingQueue> GetPending(int takeCount)
+        {
+            var now = DateTime.Now;
+            return Query(new Paging(takeCount)).Where(x =>
+                x.Status == QueueStatusEnum.Pending && string.IsNullOrEmpty(x.AffinityWorker) && x.StartFrom <= now && x.StartTo >= now).
+                OrderBy(x=>x.Priority).ThenBy(x=>x.Created);
+        }
+    }
+}

+ 34 - 0
Modules/qdr.app.qlbrc.processor/Repositories/RepoProcessingQueue.cs

@@ -0,0 +1,34 @@
+using Quadarax.Application.QLiberace.Processor.Entities;
+using Quadarax.Application.QLiberace.Common.Domain;
+using Quadarax.Application.QLiberace.Processor.Enums;
+using Quadarax.Foundation.Core.Data;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Foundation.Core.Value.Extensions;
+
+namespace Quadarax.Application.QLiberace.Processor.Repositories
+{
+    public class RepoProcessingQueue : BaseRepoQueue<ProcessingQueue>
+    {
+        public RepoProcessingQueue(IUnitOfWork<IDataDomain> unitOfWork, QlbrcContext operationContext) : base(unitOfWork, operationContext)
+        {
+        }
+
+
+        public IQueryable<ProcessingQueue> GetAssignedOrWorking(string workerPwin, int takeCount)
+        {
+            return Query(new Paging(takeCount)).Where(x =>
+                x.Status.In(QueueStatusEnum.Assigned, QueueStatusEnum.Working) && x.AffinityWorker == workerPwin).
+            OrderBy(x=>x.Priority).ThenBy(x=>x.Created);
+        }
+
+        public ProcessingQueue NewFromPending(PendingQueue pending)
+        {
+            var processing = New();
+            processing.CloneFrom(pending);
+            Set(processing);
+            //Context.Commit();
+            return processing;
+        }
+    }
+}

+ 29 - 0
Modules/qdr.app.qlbrc.processor/Repositories/RepoQueueData.cs

@@ -0,0 +1,29 @@
+using Quadarax.Application.QLiberace.Common.Repositories;
+using Quadarax.Application.QLiberace.Common.Domain;
+using Quadarax.Application.QLiberace.Processor.Entities;
+using Quadarax.Foundation.Core.Data;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+
+namespace Quadarax.Application.QLiberace.Processor.Repositories
+{
+    public class RepoQueueData : QlbrcRepository<QueueData>
+    {
+        public RepoQueueData(IUnitOfWork<IDataDomain> unitOfWork, QlbrcContext operationContext) : base(unitOfWork, operationContext)
+        {
+        }
+
+        public void New(int parentId)
+        {
+            var data = New();
+            data.ParentId = parentId;
+        }
+
+        public IQueryable<QueueData> GetQueueData(int parentId)
+        {
+            return Query(Paging.NoPaging()).Where(x => x.ParentId == parentId).OrderBy(x => x.SequenceNo);
+        }
+
+
+    }
+}

+ 62 - 0
Modules/qdr.app.qlbrc.processor/Services/ProcessorWorkerService.cs

@@ -0,0 +1,62 @@
+using Quadarax.Application.QLiberace.Base.Services;
+using Quadarax.Application.QLiberace.Processor.Repositories;
+using Quadarax.Application.QLiberace.Processor.Settings;
+using Quadarax.Application.QLiberace.Processor.Workers;
+using Quadarax.Foundation.Core.Business;
+using Quadarax.Foundation.Core.Data.Interface.Domain;
+using Quadarax.Foundation.Core.Logging;
+
+
+namespace Quadarax.Application.QLiberace.Processor.Services
+{
+    public class ProcessorWorkerService : AbstractWorkerService<RepoPendingQueue, RepoProcessingQueue, RepoDoneQueue, RepoFailedQueue>
+    {
+      
+
+        #region *** Properties ***
+        
+        #endregion
+
+        #region *** Private fields ***
+        private SettingsService _srvSettings;
+        #endregion
+
+        #region *** Constructor ***
+        public ProcessorWorkerService(SettingsService srvSettings, RepoFailedQueue repository3, RepoDoneQueue repository2, RepoProcessingQueue repository1, RepoPendingQueue repository, IContext currentContext, IQLogger logger) : base(repository3, repository2, repository1, repository, currentContext, logger)
+        {
+            _srvSettings = srvSettings ?? throw new ArgumentNullException(nameof(srvSettings));
+        }
+        #endregion
+
+        #region *** Public operations ***
+        #endregion
+        #region *** Private operations ***
+        protected override void OnBuildWorkers()
+        {
+
+            var exists = _srvSettings.ExistsSettings(Base.Constants.Modules.Processor.Code);
+            if (!exists.IsSuccess)
+                throw exists.ToAggregateException();
+            if (!exists.Value)
+            {
+                var newSettings = new ProcessorSetting();
+                newSettings.SetDefaults();
+                Log.Log(LogSeverityEnum.Warn, $"Settings for module '{Base.Constants.Modules.Processor.Code}' was set to default!");
+                _srvSettings.CreateSettings<ProcessorSetting>(newSettings);
+            }
+
+            var settings = _srvSettings.GetSettings<ProcessorSetting>(Base.Constants.Modules.Processor.Code);
+            if (!settings.IsSuccess)
+                throw settings.ToAggregateException();
+
+
+            RegisterWorker<ProcessingWorker>(settings.Value.GetProcessingWorkerSettings());
+            // TODO: Uncomment when ready
+            //RegisterWorker<RetentionWorker>(settings.Value.GetRetentionWorkerSettings());
+            //RegisterWorker<GarbageWorker>(settings.Value.GetGarbageWorkerSettings());
+
+        }
+        #endregion
+
+    }
+}

+ 143 - 8
Modules/qdr.app.qlbrc.processor/Settings/ProcessorSetting.cs

@@ -1,6 +1,9 @@
-using Quadarax.Application.QLiberace.Common.Attributes;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Quadarax.Application.QLiberace.Common.Attributes;
 using Quadarax.Application.QLiberace.Common.Settings;
+using Quadarax.Application.QLiberace.Processor.Services;
 using Quadarax.Application.QLiberace.Processor.Workers;
+using Quadarax.Foundation.Core.Business.Interface;
 
 namespace Quadarax.Application.QLiberace.Processor.Settings
 {
@@ -8,24 +11,156 @@ namespace Quadarax.Application.QLiberace.Processor.Settings
     public class ProcessorSetting : ModuleSetting
     {
         /// <summary>
-        /// Defines number of <see cref="ComplexWorker"/> working parallel
+        /// Defines number of <see cref="ProcessorWorkerService"/> working parallel
         /// </summary>
         public int Workers { get; set; }
         /// <summary>
-        /// Defines number of <see cref="ExecutingWorker"/> working under one instance of <see cref="ComplexWorker"/>
+        /// Defines number of <see cref="ProcessingWorker"/> working under one instance of <see cref="ProcessorWorkerService"/>
         /// </summary>
-        public int ExecutingThreadsPerWorker { get; set; }
+        public int ProcessingThreadsPerWorker { get; set; }
+
         /// <summary>
-        /// Defines number of <see cref="ProcessingWorker"/> working under one instance of <see cref="ComplexWorker"/>
+        /// Default processing worker PWI (Process Worker Identifier)
         /// </summary>
-        public int ProcessingThreadsPerWorker { get; set; }
+        public string ProcessingWorkerPwi { get; set; } = null!;
+
+        /// <summary>
+        /// Defines processing worker iteration interval (between two steps)
+        /// </summary>
+        public TimeSpan ProcessingWorkerInterval { get; set; }
+
         /// <summary>
-        /// Defines number of <see cref="GarbageWorker"/> working under one instance of <see cref="ComplexWorker"/>
+        /// Defines processing worker iteration timeout (maximal iteration duration)
+        /// </summary>
+        public TimeSpan ProcessingWorkerTimeout { get; set; }
+
+        /// <summary>
+        /// Defines processing worker start delay two instances of worker (for fine tuning synchronization)
+        /// </summary>
+        public TimeSpan ProcessingWorkerDelay { get; set; }
+
+        /// <summary>
+        /// Defines number of <see cref="GarbageWorker"/> working under one instance of <see cref="ProcessorWorkerService"/>
         /// </summary>
         public int GarbageThreadsPerWorker { get; set; }
+
+        /// <summary>
+        /// Default garbage worker PWI (Process Worker Identifier)
+        /// </summary>
+        public string GarbageWorkerPwi { get; set; } = null!;
+
+
+        /// <summary>
+        /// Defines garbage worker iteration interval (between two steps)
+        /// </summary>
+        public TimeSpan GarbageWorkerInterval { get; set; }
+
+        /// <summary>
+        /// Defines garbage worker iteration timeout (maximal iteration duration)
+        /// </summary>
+        public TimeSpan GarbageWorkerTimeout { get; set; }
+
+        /// <summary>
+        /// Defines garbage worker start delay two instances of worker (for fine tuning synchronization)
+        /// </summary>
+        public TimeSpan GarbageWorkerDelay { get; set; }
+
+
         /// <summary>
-        /// Defines number of <see cref="RetentionWorker"/> working under one instance of <see cref="ComplexWorker"/>
+        /// Defines number of <see cref="RetentionWorker"/> working under one instance of <see cref="ProcessorWorkerService"/>
         /// </summary>
         public int RetentionThreadsPerWorker { get; set; }
+
+        /// <summary>
+        /// Default retention worker PWI (Process Worker Identifier)
+        /// </summary>
+        public string RetentionWorkerPwi { get; set; } = null!;
+
+
+        /// <summary>
+        /// Defines retention worker iteration interval (between two steps)
+        /// </summary>
+        public TimeSpan RetentionWorkerInterval { get; set; }
+
+        /// <summary>
+        /// Defines retention worker iteration timeout (maximal iteration duration)
+        /// </summary>
+        public TimeSpan RetentionWorkerTimeout { get; set; }
+
+        /// <summary>
+        /// Defines retention worker start delay between two instances of worker (for fine tuning synchronization)
+        /// </summary>
+        public TimeSpan RetentionWorkerDelay { get; set; }
+
+
+        #region *** Operations ***
+
+        public IWorkerSettings GetProcessingWorkerSettings()
+        {
+            return new WorkerSettings()
+            {
+                Interval = ProcessingWorkerInterval,
+                IterationTimeout = ProcessingWorkerTimeout,
+                StartDelay = ProcessingWorkerDelay,
+                WorkerCount = ProcessingThreadsPerWorker,
+                WorkerNamePrefix = ProcessingWorkerPwi
+            };
+        }
+
+        public IWorkerSettings GetGarbageWorkerSettings()
+        {
+            return new WorkerSettings()
+            {
+                Interval = GarbageWorkerInterval,
+                IterationTimeout = GarbageWorkerTimeout,
+                StartDelay = GarbageWorkerDelay,
+                WorkerCount = GarbageThreadsPerWorker,
+                WorkerNamePrefix = GarbageWorkerPwi
+            };
+        }
+
+        public IWorkerSettings GetRetentionWorkerSettings()
+        {
+            return new WorkerSettings()
+            {
+                Interval = RetentionWorkerInterval,
+                IterationTimeout = RetentionWorkerTimeout,
+                StartDelay = RetentionWorkerDelay,
+                WorkerCount = RetentionThreadsPerWorker,
+                WorkerNamePrefix = RetentionWorkerPwi
+            };
+        }
+
+        public override void SetDefaults()
+        {
+            Workers = Constants.Modules.Processor.ProcessorServiceCount;
+            ProcessingThreadsPerWorker = Constants.Modules.Processor.ProcessingThreads;
+            ProcessingWorkerPwi = Constants.Modules.Processor.PrefixProcessing;
+            ProcessingWorkerInterval = TimeSpan.Parse(Constants.Modules.Processor.ProcessingInterval);
+            ProcessingWorkerTimeout= TimeSpan.Parse(Constants.Modules.Processor.ProcessingTimeout);
+            ProcessingWorkerDelay = TimeSpan.Parse(Constants.Modules.Processor.ProcessingDelay);
+
+            GarbageThreadsPerWorker= Constants.Modules.Processor.GarbageThreads;
+            GarbageWorkerPwi = Constants.Modules.Processor.PrefixGarbage;
+            GarbageWorkerInterval= TimeSpan.Parse(Constants.Modules.Processor.GarbageInterval);
+            GarbageWorkerTimeout = TimeSpan.Parse(Constants.Modules.Processor.GarbageTimeout);
+            GarbageWorkerDelay= TimeSpan.Parse(Constants.Modules.Processor.GarbageDelay);
+
+            RetentionThreadsPerWorker = Constants.Modules.Processor.RetentionThreads;
+            RetentionWorkerPwi = Constants.Modules.Processor.PrefixRetention;
+            RetentionWorkerInterval = TimeSpan.Parse(Constants.Modules.Processor.RetentionInterval);
+            RetentionWorkerTimeout= TimeSpan.Parse(Constants.Modules.Processor.RetentionTimeout);
+            RetentionWorkerDelay= TimeSpan.Parse(Constants.Modules.Processor.RetentionDelay);
+
+        }
+        #endregion
+
+        #region *** Private operations ***
+
+        #endregion
+
+        #region *** Nested classes ***
+
+        #endregion
     }
 }

+ 0 - 6
Modules/qdr.app.qlbrc.processor/Workers/ComplexWorker.cs

@@ -1,6 +0,0 @@
-namespace Quadarax.Application.QLiberace.Processor.Workers
-{
-    public class ComplexWorker
-    {
-    }
-}

+ 90 - 6
Modules/qdr.app.qlbrc.processor/Workers/ProcessingWorker.cs

@@ -1,12 +1,96 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using Quadarax.Application.QLiberace.Base.Services;
+using Quadarax.Application.QLiberace.Processor.Entities;
+using Quadarax.Application.QLiberace.Processor.Enums;
+using Quadarax.Application.QLiberace.Processor.Repositories;
+using Quadarax.Application.QLiberace.Processor.Settings;
+using Quadarax.Foundation.Core.Business;
+using Quadarax.Foundation.Core.Logging;
+using Quadarax.Foundation.Core.Thread;
 
 namespace Quadarax.Application.QLiberace.Processor.Workers
 {
-    internal class ProcessingWorker
+    internal class ProcessingWorker : QlbrcProcessorWorker
     {
+        #region *** Private fields ***
+        // TODO: may be shift to ProcessorSetting
+        private const int CN_ITEMS_PER_CYCLE = 1;
+        #endregion
+
+
+        #region *** Properties ***
+        #endregion
+
+
+        #region *** Constructor ***
+        public ProcessingWorker(IWorkerContext context, SettingsService? srvSettings, IQLogger logger) : base(context, srvSettings, srvSettings?.GetSettings<ProcessorSetting>(Base.Constants.Modules.Processor.Code)?.Value?.ProcessingWorkerPwi!, logger)
+        {
+        }
+        #endregion
+
+
+        #region *** Private Operations ***
+
+        protected override Task DoIteration(IWorkerContext context)
+        {
+            var ctx = (RepoWorkerContext)context;
+            // Get worker name
+            var workerName = GetName(Settings.ProcessingWorkerPwi);
+
+            var repoProcessing = ctx.GetRepository<RepoProcessingQueue>();
+
+            // 1. Continue to work on already processing entries in ProcessQ (paused, tryout failed)
+            // 2. If still available packet, lock pending entries in PendingQ
+            // 3. Move locked entries to ProcessQ
+            var processings = FetchFromQueue(ctx.GetRepository<RepoPendingQueue>(), ctx.GetRepository<RepoProcessingQueue>());
+
+            foreach (var processing in processings)
+            {
+                processing.Started = DateTime.Now;
+                processing.AffinityWorker = workerName;
+                processing.Status = QueueStatusEnum.Working;
+                repoProcessing.Set(processing);
+
+
+
+
+            }
+            // 4. Start to process
+            // 5. Decrement attempt
+            // 6. Move processed entries to DoneQ or FailedQ
+
+        }
+
+
+        private IEnumerable<ProcessingQueue> FetchFromQueue(RepoPendingQueue repoPending, RepoProcessingQueue repoProcessing)
+        {
+            if (repoPending == null) throw new ArgumentNullException(nameof(repoPending));
+            if (repoProcessing == null) throw new ArgumentNullException(nameof(repoProcessing));
+
+            // Get worker name
+            var workerName = GetName(Settings.ProcessingWorkerPwi);
+
+            // Get from pending queue
+            var pendings = repoPending.GetPending(CN_ITEMS_PER_CYCLE).ToArray();
+            // Assign pending
+            foreach (var pending in pendings)
+            {
+                // Set Assigned
+                pending.Status = QueueStatusEnum.Assigned;
+                pending.AffinityWorker = workerName;
+                // Create processing entry from pending entry
+                var processing = repoProcessing.NewFromPending(pending);
+                // Delete pending (mark it)
+                pending.Status = QueueStatusEnum.Deleted;
+                repoPending.Set(pending);
+            }
+            
+            // Try to load forgot items from previous start
+            var processings = repoProcessing.GetAssignedOrWorking(workerName, CN_ITEMS_PER_CYCLE).ToArray();
+            return processings;
+
+        }
+
+        #endregion
+
     }
 }

+ 59 - 0
Modules/qdr.app.qlbrc.processor/Workers/QlbrcProcessorWorker.cs

@@ -0,0 +1,59 @@
+using Quadarax.Foundation.Core.Thread;
+using Quadarax.Application.QLiberace.Base.Services;
+using Quadarax.Application.QLiberace.Processor.Settings;
+using Quadarax.Foundation.Core.Logging;
+using Microsoft.Extensions.Logging;
+
+namespace Quadarax.Application.QLiberace.Processor.Workers
+{
+    internal abstract class QlbrcProcessorWorker : LoopWorker
+    {
+        #region *** Private fields ***
+        protected SettingsService _srvService;
+        protected static int _workerOrdinalCounter = 0;
+        #endregion
+
+
+        #region *** Properties ***
+        protected ProcessorSetting? Settings => GetSettings();
+        #endregion
+
+
+        #region *** Constructor ***
+
+        protected QlbrcProcessorWorker(IWorkerContext context, SettingsService? srvSettings, string workerName, IQLogger logger) : base(workerName, context, logger)
+        {
+            _srvService = srvSettings ?? throw new ArgumentNullException(nameof(srvSettings));
+        }
+        #endregion
+
+        #region *** Protected Operations ***
+        protected string GetName(string workerPrefix)
+        {
+            if (string.IsNullOrEmpty(workerPrefix))
+                workerPrefix = "Worker";
+
+            var result =  $"{workerPrefix}#{_workerOrdinalCounter}";
+            Interlocked.Increment(ref _workerOrdinalCounter);
+            return result;
+        }
+        #endregion
+
+
+        #region *** Private Operations ***
+
+        private ProcessorSetting? GetSettings()
+        {
+            var moduleCode = Base.Constants.Modules.Processor.Code;
+            var result = _srvService.GetSettings<ProcessorSetting>(moduleCode);
+            if (!result.IsSuccess){
+                Log(LogSeverityEnum.Error, $"Cannot obtain settings for module '{moduleCode}'!",
+                    result.ToAggregateException());
+                return null;
+            }
+
+            return result.Value;
+        }
+        #endregion
+    }
+}

+ 13 - 0
Modules/qdr.app.qlbrc.processor/Workers/WorkerSettings.cs

@@ -0,0 +1,13 @@
+using Quadarax.Foundation.Core.Business.Interface;
+
+namespace Quadarax.Application.QLiberace.Processor.Workers
+{
+    internal class WorkerSettings : IWorkerSettings
+    {
+        public TimeSpan Interval { get; set; }
+        public TimeSpan IterationTimeout { get; set; }
+        public TimeSpan StartDelay { get; set; }
+        public int WorkerCount { get; set; }
+        public string WorkerNamePrefix { get; set; } = null!;
+    }
+}

+ 1 - 1
Tests/qdr.app.qlbrc.base.Tests/Services/SettingsServiceTest.cs

@@ -24,7 +24,7 @@ namespace Quadarax.Application.QLiberace.Base.Tests.Services
 
         protected override SettingsService GetService()
         {
-            return new SettingsService(GetRepository(), new ContextFake(), new LoggerFactoryFake());
+            return new SettingsService(GetRepository(), new ContextFake(), null);
         }
 
 

+ 1 - 1
Tests/qdr.app.qlbrc.base.Tests/Services/TenantServiceTest.cs

@@ -25,7 +25,7 @@ namespace Quadarax.Application.QLiberace.Base.Tests.Services
 
         protected override TenantService GetService()
         {
-            return new TenantService(GetRepository(), new ContextFake(), new LoggerFactoryFake());
+            return new TenantService(GetRepository(), new ContextFake(), null);
         }
 
         [Test]