瀏覽代碼

Add Customer module, with dao mapping

Dalibor Votruba 3 年之前
父節點
當前提交
d157ad5837

+ 194 - 40
@Documentation/QLiberace.simp

@@ -5,7 +5,7 @@
     <authors>Dalibor Votruba</authors>
     <description>SAAS based functional processing (automatic) backend with payments</description>
   </meta>
-  <counters models="3">
+  <counters models="4">
     <entity-names>
       <counter>
         <item-type stereotype="component" type-id="component" type="Component" />
@@ -13,13 +13,13 @@
       </counter>
       <counter>
         <item-type type-id="erd-entity" type="Entity" />
-        <value>8</value>
+        <value>11</value>
       </counter>
     </entity-names>
     <entity-ids>
       <counter>
         <item-type type-id="group" type="Group" />
-        <value>491</value>
+        <value>755</value>
       </counter>
       <counter>
         <item-type type-id="component" type="Component" />
@@ -43,11 +43,15 @@
       </counter>
       <counter>
         <item-type type-id="erd-entity" type="Entity" />
-        <value>9</value>
+        <value>12</value>
       </counter>
       <counter>
         <item-type type-id="erd-relationship" type="Relationship" />
-        <value>24</value>
+        <value>30</value>
+      </counter>
+      <counter>
+        <item-type type-id="universal-connector" type="Universal Connector" />
+        <value>4</value>
       </counter>
     </entity-ids>
     <diagrams>
@@ -61,17 +65,17 @@
       </counter>
       <counter>
         <type>SoftwareIdeasModeler.Core.Diagrams.Other.EntityRelationshipDiagram</type>
-        <value>1</value>
+        <value>2</value>
       </counter>
     </diagrams>
     <fields>
       <counter>
         <type>SoftwareIdeasModeler.Core.DiagramItems.Erd.ErdEntityAttribute</type>
-        <value>50</value>
+        <value>80</value>
       </counter>
       <counter>
         <type>SoftwareIdeasModeler.Core.DiagramItems.Erd.ErdEntityIndex</type>
-        <value>7</value>
+        <value>8</value>
       </counter>
     </fields>
   </counters>
@@ -174,8 +178,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="7546dafc2b0d406bb9cf489c5eeb4aff" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
-              <start-role id="umlar-b367650b-7fd0-43a4-bfd4-291c448770fc" name="" navigability="" association-type="association" visibility="private" property-ref="de0957d8d7ac42eab57e579c2cefbf47" />
-              <end-role id="umlar-c9e7644d-5ade-4df7-b923-5de4c231e015" name="" navigability="yes" association-type="association" visibility="private" property-ref="49ad3ceea0bb4157b557e21e2eb7c0b9" />
+              <start-role id="umlar-be1b0bb1-8f33-4eb5-932b-5a64bb1ffbd5" name="" navigability="" association-type="association" visibility="private" property-ref="de0957d8d7ac42eab57e579c2cefbf47" />
+              <end-role id="umlar-fa9da028-f9b0-4b51-9bdc-3781aee2e5de" name="" navigability="yes" association-type="association" visibility="private" property-ref="49ad3ceea0bb4157b557e21e2eb7c0b9" />
             </relation>
           </item>
           <item id="2626a7fd504946ccaa1eb090b6d27d0d" cid="CPT001" type="component" name="Base" change-tracking-state="added" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="09/15/2022 15:39:10" visibility="undefined">
@@ -352,8 +356,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="7546dafc2b0d406bb9cf489c5eeb4aff" derived="false">
-              <start-role id="umlar-8f5c10b5-2956-42f2-b344-c70bf1477336" name="" navigability="" association-type="association" visibility="private" property-ref="93016f98fae440bb88e27fe09172df66" />
-              <end-role id="umlar-cd9d0c01-2f8e-45f5-bedd-c532c1ee7c9d" name="" navigability="yes" association-type="association" visibility="private" property-ref="132ce45236e54d6da05ae53d64712729" />
+              <start-role id="umlar-ebae232b-cbbe-4026-bfa4-b0e31e631962" name="" navigability="" association-type="association" visibility="private" property-ref="93016f98fae440bb88e27fe09172df66" />
+              <end-role id="umlar-6da92844-e176-4d50-b6d9-cb69776ad7fa" 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">
@@ -365,8 +369,8 @@
             </stereotype-instances>
             <owned-items />
             <relation from="cb92b4b50dc847aebfdbd90ce365a1eb" to="2626a7fd504946ccaa1eb090b6d27d0d" derived="false">
-              <start-role id="umlar-6711df01-51c3-4c7a-bcf8-078fc9b1c209" name="" navigability="" association-type="association" visibility="private" property-ref="002883f71fbc4324bbd1efa19cdbd1a6" />
-              <end-role id="umlar-242389be-1950-41e7-85e3-b1ea15d9369d" name="" navigability="yes" association-type="association" visibility="private" property-ref="b531bae1520645b58761d8077cac7517" />
+              <start-role id="umlar-24de1d9f-f2f5-4512-a84f-70fcb3179455" name="" navigability="" association-type="association" visibility="private" property-ref="002883f71fbc4324bbd1efa19cdbd1a6" />
+              <end-role id="umlar-1db950d6-80b7-49dd-bbd5-c195a223cf1d" name="" navigability="yes" association-type="association" visibility="private" property-ref="b531bae1520645b58761d8077cac7517" />
             </relation>
           </item>
         </abstract-items>
@@ -489,8 +493,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-0ac4316e-c9eb-4577-9391-88aa721acc9f" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-fb0410f9-fa42-462f-af68-e8414ef01445" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-89314ee0-1a89-4f15-8ba2-2ece182a7666" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-00361b63-2b0a-4228-bb9f-6091e5802f1d" 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">
@@ -597,14 +601,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-c9ce73dc-4d05-4240-ac29-76a96f965dcb" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-7ab05c3a-1ad9-48a9-ab4e-01bc7bb4c866" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-3a34e906-0006-4d19-8f44-90b97dfcb349" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-fb8a3288-453a-42e8-a072-ea269769e30f" 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-7f7509c2-8321-4a22-a285-02905818f3e5" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-fe31b6f2-47cd-44d4-a53f-4d18a5b599bb" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-e5da83ae-734a-4dd3-b854-ef9ab38ac04c" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-d60d4e92-816b-44af-adde-669e79b67f10" 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">
@@ -765,26 +769,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-84895bbb-3239-4dc5-8050-df6f2a58c2c8" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-2381cd1a-99e5-4bd0-b909-4e1a6b981c30" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-d098c652-c746-482a-b050-b83e10dc6e1e" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-647aa4b7-9ba4-4bf3-832f-74fcfa76ea36" 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-5eb9f44a-970f-4518-89bc-0672c4f94aa8" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-3f35c3fe-556c-457d-90a5-71e5d4e3dd12" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-016d97e4-abb9-4c51-9efc-5f5667935922" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-39ad0647-4303-44a7-83d6-4d3831ff8cfb" 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-84fe1aa8-440f-4b5c-a0be-69cfdc0afc7c" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-d3854884-af4d-4b56-9892-aed81ef41c0a" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-9ed07bd5-0f35-4155-b92e-948f8f2257fa" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-134abca3-fa83-43bb-a0b5-547adf2a2aa6" 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-051139d1-5cc4-4890-bec9-497e0f16dd53" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-36e13935-774d-4aa0-9462-ac46c2fdf986" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-1d343ee4-d549-4bf8-b327-2f4ffa3567d8" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-0824b62b-2073-4ddc-9e9b-c24af1cdc7f1" 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">
@@ -887,8 +891,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-63161223-20c6-4f34-9b09-ba8d7e1b60e3" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-a920ddc3-557a-4e54-b393-e2f9d0bc2b76" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-9e0fa10f-cce1-4b92-a6bb-b1088a374a10" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-312fb99e-acbb-400e-9b5d-1bb496d3d3b1" 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">
@@ -1006,14 +1010,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-fa4abb17-1716-4355-930a-602197537280" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-ad0e650f-e6ef-40a5-968e-abe5e5112b6b" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-4c432289-6306-4801-98e1-f19a63571092" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-78cb4594-a0c3-470e-97c9-443bce6ecb78" 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-5847bae8-1f9d-44da-9e70-68af5abf8a3a" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-4cae0cf6-27e9-4e83-b57e-9546b1aa13d8" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-58bb9f96-e632-424d-98cd-9cc13b50dc3a" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-93658a74-1811-4f2f-b822-14899670c7c5" 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">
@@ -1241,8 +1245,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-26f42be0-6073-43a4-949f-3efe901aff3f" name="" navigability="" association-type="association" visibility="private" />
-              <end-role id="umlar-29f40263-b2ad-4e2a-9873-e9670f03f8ab" name="" navigability="" association-type="composition" visibility="private" />
+              <start-role id="umlar-0991008f-ec42-491f-bfe4-3c6e02e9ac15" name="" navigability="" association-type="association" visibility="private" />
+              <end-role id="umlar-a5bdf015-d5f1-4138-86fc-2f425250ad16" name="" navigability="" association-type="composition" visibility="private" />
             </relation>
           </item>
         </abstract-items>
@@ -1417,7 +1421,7 @@
           </meta>
           <abstract-items />
           <sub-models />
-          <diagram type="entity-relationship" id="p2d80210b075e4f5d8725460fac0df0c9_518455272" name="Base" order-index="0" uid="" name-style="" auto-routed-paths="false" default-line-style="default" view-location="212,477">
+          <diagram type="entity-relationship" id="p2d80210b075e4f5d8725460fac0df0c9_518455272" name="Base" order-index="0" uid="" name-style="" auto-routed-paths="false" default-line-style="default" view-location="26,-176">
             <style>
               <background-color index="1" color="#FFFFFFFF" />
               <background-color index="2" color="#FFFFFFFF" />
@@ -1493,17 +1497,18 @@
                   </attribute-pairs>
                 </erd-relation>
               </item>
-              <item id="031a668b1d6a45e1907a612d85b43d24" cid="TBL_USER" type="erd-entity" name="User" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:15:45">
+              <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" />
                 </stereotypes>
                 <stereotype-instances>
                   <stereotype id="031a668b1d6a45e1907a612d85b43d24_table_c" type="table" ref="" />
                 </stereotype-instances>
+                <style class="Flat Green" />
                 <entity pk-constraint-name="PK_USER_ID" description="" />
                 <attributes>
                   <attribute uid="a6dda4862ea794595834ccbbeacdb68a8699" cid="USER_ID" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="User primary key" default-value="" auto-increment="true" creation-date="11/04/2022 06:20:45" />
-                  <attribute uid="a7561c31027e444b7b5d5c9bc65164f69709" cid="USER_LOGINNAME" name="LoginName" type="nvarchar" type-id="MsSql.nvarchar" type-size="200" foreign-key="false" primary-key="false" nullable="false" description="User login name name. Key search value" default-value="" auto-increment="false" creation-date="11/04/2022 06:20:59" />
+                  <attribute uid="a7561c31027e444b7b5d5c9bc65164f69709" cid="USER_LOGINNAME" name="LoginName" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="false" description="User login name name. Key search value" default-value="" auto-increment="false" creation-date="11/04/2022 06:20:59" />
                   <attribute uid="ae5fba9294f7446efa852c3a3acb23d81709" cid="USER_ISLOCKED" name="IsLocked" type="bit" type-id="MsSql.bit" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Flag if user access locked (not accessable)" default-value="0" auto-increment="false" creation-date="11/04/2022 06:21:10" />
                   <attribute uid="adb8d22041c0b471180808deb4edf6067709" cid="USER_CREATED" 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()" auto-increment="false" creation-date="11/04/2022 06:21:21" />
                   <attribute uid="a2997dfb25d574d0dae75321885c29407709" cid="USER_MODIFIED" name="Modified" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record modified timestamp" default-value="" auto-increment="false" creation-date="11/04/2022 06:21:33" />
@@ -1636,13 +1641,14 @@
                 </attributes>
                 <indexes />
               </item>
-              <item id="e50f79968a404d3fbb33f4a02fa3b572" cid="TBL_TENANT" type="erd-entity" name="Tenant" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:00:06">
+              <item id="e50f79968a404d3fbb33f4a02fa3b572" cid="TBL_TENANT" type="erd-entity" name="Tenant" style-class="Flat Green" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/04/2022 06:00:06">
                 <stereotypes>
                   <stereotype name="table" />
                 </stereotypes>
                 <stereotype-instances>
                   <stereotype id="e50f79968a404d3fbb33f4a02fa3b572_table_c" type="table" ref="" />
                 </stereotype-instances>
+                <style class="Flat Green" />
                 <entity pk-constraint-name="PK_TENANT_ID" description="" />
                 <attributes>
                   <attribute uid="aeda82a68426646d3a6cfa276db9bd56f255" cid="TENANT_ID" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Tenant primary key" default-value="" auto-increment="true" creation-date="11/04/2022 06:04:02" />
@@ -1898,6 +1904,154 @@
             </layer>
           </diagram>
         </model>
+        <model id="pf57f34439eda4ac6afd78999af5cbf01_478287017" name="Customer" namespace="" order-index="3" expanded="true">
+          <meta>
+            <authors>
+              <author> </author>
+            </authors>
+            <description />
+            <creation-date>11/06/2022 04:31:12</creation-date>
+            <change-date>01/01/0001 00:00:00</change-date>
+            <revision-count>0</revision-count>
+            <version />
+          </meta>
+          <abstract-items />
+          <sub-models />
+          <diagram type="entity-relationship" id="p5a74a7511e1f4e77b1be5b12283df6eb_762285763" name="Customer" order-index="1" uid="" name-style="" auto-routed-paths="false" default-line-style="default" view-location="0,-10">
+            <style>
+              <background-color index="1" color="#FFFFFFFF" />
+              <background-color index="2" color="#FFFFFFFF" />
+              <background-type type="solid" />
+            </style>
+            <meta>
+              <authors>
+                <author />
+              </authors>
+              <description />
+              <creation-date>11/06/2022 04:32:13</creation-date>
+              <change-date>11/06/2022 05:34:48</change-date>
+              <revision-count>0</revision-count>
+              <version>1.0.0.0</version>
+            </meta>
+            <abstract-items>
+              <item id="6037f78c46de439abe802ae4987eae0a" cid="ENT010" type="erd-entity" name="Contact" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/06/2022 04:33:28">
+                <stereotypes>
+                  <stereotype name="table" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="6037f78c46de439abe802ae4987eae0a_table_c" type="table" ref="" />
+                </stereotype-instances>
+                <entity pk-constraint-name="PK_CONTACT_ID" description="" />
+                <attributes>
+                  <attribute uid="a98d18fea9d1a42b994184da158fc0950524" cid="EA063" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Contact primary key" default-value="" auto-increment="true" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a4307f98d59024d239c75a7b0b51b82b5206" cid="EA078" 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 contact belongs" default-value="" auto-increment="false" creation-date="11/06/2022 05:15:11" />
+                  <attribute uid="a7d91a9dcefc7413693b670bc1bade5b0933" cid="EA076" name="CustomerId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to customer that contact belongs" default-value="" auto-increment="false" creation-date="11/06/2022 05:02:32" />
+                  <attribute uid="ad7823ef420c14959941255703455b00c922" cid="EA075" name="Type" type="int" type-id="MsSql.int" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)" default-value="0" auto-increment="false" creation-date="11/06/2022 04:59:28" />
+                  <attribute uid="a7f6c82b81e3643de950e2ad14b1843df524" cid="EA065" name="Caption" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="false" description="Contact heading caption." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a941ad6e8b3244400b3f191a62e8b88b1524" cid="EA066" name="Address" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="false" description="Main address value. If phone, email, sms stores email address or telephone number." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a064b94013c3c46fdb547215fb77e3ed2524" cid="EA067" name="Address1" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="true" description="Secondary address value." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a7df60cf2857946e9957c0adc8104966f524" cid="EA068" name="City" type="nvarchar" type-id="MsSql.nvarchar" type-size="50" foreign-key="false" primary-key="false" nullable="true" description="Contact city." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="ad2e1266766e04710bff1b321e8b0eb88524" cid="EA069" name="ZIP" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="true" description="Contact ZIP code." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a25b21cc445814c56a26958245c40002c524" cid="EA070" name="CountryCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="5" foreign-key="false" primary-key="false" nullable="true" description="Contact country code." default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a0656c09ec92a442197683462c76ae580525" cid="EA071" name="IsPreffered" type="bit" type-id="MsSql.bit" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Flag if Contact is preffered." default-value="0" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a2a2d4b79ba1641c4a768434190f5367b525" cid="EA072" 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()" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="ab06e1cd4c24d47d9993c7db7f5e9245a525" cid="EA073" name="Modified" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record modified timestamp" default-value="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                  <attribute uid="a124b70a289be40c492ca810315cec7c4525" cid="EA074" 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="" auto-increment="false" creation-date="11/06/2022 04:58:50" />
+                </attributes>
+                <indexes />
+              </item>
+              <item id="eabde8039f1144d4ac8b37265634e7c0" cid="ENT011" type="erd-entity" name="CustomerUser" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/06/2022 04:47:49">
+                <entity description="" />
+                <attributes>
+                  <attribute uid="ae89f1fdaae12492fa306402501c3c612976" cid="EA061" name="CustomerId" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="true" primary-key="false" nullable="false" description="Reference to customer" default-value="" auto-increment="false" creation-date="11/06/2022 04:49:58" />
+                  <attribute uid="aaeb17bfca2fb4947829584b65b4e6b10887" cid="EA079" name="UserLoginName" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="true" primary-key="false" nullable="false" description="Reference to user" default-value="" auto-increment="false" creation-date="11/06/2022 05:16:01" />
+                </attributes>
+                <indexes />
+              </item>
+              <item id="edcd669d18f241ff8e95e71af2974e19" cid="REL028" type="erd-relationship" name="REL_CONTACT_CUSTOMER_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/06/2022 05:02:37" from="6037f78c46de439abe802ae4987eae0a" to="f26e0b8a31254bdcbd487daf3b8eabbe">
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="a7d91a9dcefc7413693b670bc1bade5b0933" to-attribute="a74daa4a768ac415a847eca4c642554a1556" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
+              <item id="8b63817a9750491bb98314f94a40c98b" cid="REL025" type="erd-relationship" name="REL_CUSTOMETUSER_CUSTOMER_ID" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/06/2022 04:50:07" from="eabde8039f1144d4ac8b37265634e7c0" to="f26e0b8a31254bdcbd487daf3b8eabbe">
+                <stereotypes>
+                  <stereotype name="relation" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="8b63817a9750491bb98314f94a40c98b_relation_c" type="relation" ref="" />
+                </stereotype-instances>
+                <erd-relation type="Identifying" multiplicity-from="1" multiplicity-to="1">
+                  <attribute-pairs>
+                    <attribute-pair from-attribute="ae89f1fdaae12492fa306402501c3c612976" to-attribute="a74daa4a768ac415a847eca4c642554a1556" />
+                  </attribute-pairs>
+                </erd-relation>
+              </item>
+              <item id="f26e0b8a31254bdcbd487daf3b8eabbe" cid="ENT009" type="erd-entity" name="Customer" creator="CDoZfQE0eoPT0twKUywpA1ytAerZlrAks6wQJtSziyhd5T57" creation-date="11/06/2022 04:33:13">
+                <stereotypes>
+                  <stereotype name="table" />
+                </stereotypes>
+                <stereotype-instances>
+                  <stereotype id="f26e0b8a31254bdcbd487daf3b8eabbe_table_c" type="table" ref="" />
+                </stereotype-instances>
+                <entity pk-constraint-name="PK_CUSTOMER_ID" description="" />
+                <attributes>
+                  <attribute uid="a74daa4a768ac415a847eca4c642554a1556" cid="EA050" name="Id" type="bigint" type-id="MsSql.bigint" type-size="" foreign-key="false" primary-key="true" nullable="false" description="Setting primary key" default-value="" auto-increment="true" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="a0e7ddd70f6f9496486d48fef69eaa83b615" cid="EA077" 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 customer belongs" default-value="" auto-increment="false" creation-date="11/06/2022 05:14:22" />
+                  <attribute uid="a7537f36bf7aa4826bfe26c963469c068563" cid="EA052" name="Code" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="false" description="Customer code. Main key to search." default-value="" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="abb8e025bee0347d7b48472a75eb7a88d563" cid="EA053" name="Name" type="nvarchar" type-id="MsSql.nvarchar" type-size="100" foreign-key="false" primary-key="false" nullable="false" description="Customer head name. For identification usage." default-value="" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="ae237383d83484f54ac671a6ef15a0983563" cid="EA054" name="TaxNumber" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="true" description="Customer tax number (business identifier)" default-value="" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="abafd0cde2a4f43e59644a0dbcd4128ec563" cid="EA055" name="VatNumber" type="nvarchar" type-id="MsSql.nvarchar" type-size="20" foreign-key="false" primary-key="false" nullable="true" description="Customer VAT number (VAT identification)" default-value="" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="a4ac887cd788e445aa6e0ee729606fbc5563" cid="EA056" name="VatIncluded" type="bit" type-id="MsSql.bit" type-size="" foreign-key="false" primary-key="false" nullable="false" description="Flag if VAT calculation is allowed" default-value="1" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="a067a7adf464043cbb09f1cf23cf6848e564" cid="EA057" name="TaxCountryCode" type="nvarchar" type-id="MsSql.nvarchar" type-size="5" foreign-key="false" primary-key="false" nullable="false" description="Tax country region code" default-value="" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="a0fe76048ae3d4d31a5410406d6e3aced564" cid="EA058" 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()" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="a1a514732fe0a41299acea54e01e2ab89564" cid="EA059" name="Modified" type="datetime" type-id="MsSql.datetime" type-size="" foreign-key="false" primary-key="false" nullable="true" description="Record modified timestamp" default-value="" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                  <attribute uid="a0cdaf51863f6460b88cea00e3d9d6ac1564" cid="EA060" 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="" auto-increment="false" creation-date="11/06/2022 04:45:20" />
+                </attributes>
+                <indexes>
+                  <index uid="ixf46aa2e3dbf545b78fdcb3f618ee4c1557" cid="ERI007" name="IDX_CUSTOMER_CODE" is-unique="true">
+                    <index-attributes>
+                      <index-attribute ref="a7537f36bf7aa4826bfe26c963469c068563" sort="Asc" />
+                    </index-attributes>
+                  </index>
+                </indexes>
+              </item>
+            </abstract-items>
+            <layer id="bc0cf88f894f471e9735c36fae37d2f4" name="Default" visible="true" enabled="true" locked="false">
+              <item id="f26e0b8a31254bdcbd487daf3b8eabbe" iid="92beb9d8d43b41cfa0df0276c05b94c0" creation-date="11/06/2022 04:33:13" order-index="0" type="entity">
+                <layout ax="187" ay="272" awidth="329" aheight="303" x="187" y="272" width="329" height="303" rotation-center="-94.5,-71.5" />
+                <erd-entity show-nullability="true" />
+              </item>
+              <item id="6037f78c46de439abe802ae4987eae0a" iid="34eacc91783a4559ba5cb017cefd6a8b" creation-date="11/06/2022 04:33:28" order-index="1" type="entity">
+                <layout ax="820" ay="414" awidth="294" aheight="323" x="820" y="414" width="294" height="323" rotation-center="-77,-81.5" />
+                <erd-entity show-nullability="true" />
+              </item>
+              <item id="eabde8039f1144d4ac8b37265634e7c0" iid="381b944fe16d43139a6ec64b0dfc3845" creation-date="11/06/2022 04:47:49" order-index="3" type="entity">
+                <layout ax="618" ay="737" awidth="140" aheight="160" x="618" y="737" width="140" height="160" />
+                <erd-entity show-nullability="true" />
+              </item>
+              <item id="8b63817a9750491bb98314f94a40c98b" iid="c58a71edec7f46c9987a1933ec0bd54c" creation-date="11/06/2022 04:50:07" order-index="4" type="relation">
+                <layout start-role-position="25,15" end-role-position="25,-15" line-style="oblique" lock-start-point="true" lock-end-point="true" lock-to-fields="true" auto-path="" x1="618" y1="786" x2="516" y2="330" start-border-pos="0.9234375" end-border-pos="0.298267326732673" start-local-pos="49" end-local-pos="58" name-position="0,20">
+                  <points>
+                    <point x="618" y="786" />
+                    <point x="516" y="330" />
+                  </points>
+                </layout>
+                <relation from="eabde8039f1144d4ac8b37265634e7c0" from-iid="381b944fe16d43139a6ec64b0dfc3845" from-field="ae89f1fdaae12492fa306402501c3c612976" to="f26e0b8a31254bdcbd487daf3b8eabbe" to-iid="92beb9d8d43b41cfa0df0276c05b94c0" to-field="a74daa4a768ac415a847eca4c642554a1556" />
+              </item>
+              <item id="edcd669d18f241ff8e95e71af2974e19" iid="3017b653184d4554ac5d6c4bec901cf8" creation-date="11/06/2022 05:02:37" order-index="7" type="relation">
+                <layout start-role-position="25,15" end-role-position="25,-15" line-style="oblique" lock-to-fields="true" auto-path="" x1="820" y1="510" x2="516" y2="330" start-border-pos="0.92530959752322" end-border-pos="0.298267326732673" start-local-pos="96" end-local-pos="58" name-position="0,20">
+                  <points>
+                    <point x="820" y="510" />
+                    <point x="516" y="330" />
+                  </points>
+                </layout>
+                <relation from="6037f78c46de439abe802ae4987eae0a" from-iid="34eacc91783a4559ba5cb017cefd6a8b" from-field="a7d91a9dcefc7413693b670bc1bade5b0933" to="f26e0b8a31254bdcbd487daf3b8eabbe" to-iid="92beb9d8d43b41cfa0df0276c05b94c0" to-field="a74daa4a768ac415a847eca4c642554a1556" />
+              </item>
+            </layer>
+          </diagram>
+        </model>
       </sub-models>
     </model>
   </models>

+ 23 - 0
Common/qdr.app.qlbrc.common/Entities/Base/DaoMapper/TrackedTenantDm.cs

@@ -0,0 +1,23 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace Quadarax.Application.QLiberace.Common.Entities.Base.DaoMapper
+{
+    public abstract class TrackedTenantDm<TEntity>: TrackedDm<TEntity> where TEntity : QlbrcEntityTenantCode
+    {
+        public override void Map(ModelBuilder builder)
+        {
+
+            if (builder == null) throw new ArgumentNullException(nameof(builder));
+
+            base.Map(builder);
+            builder.Entity<TEntity>(entity =>
+                {
+                    entity.Property(e => e.TenantCode).IsRequired()
+                        .HasMaxLength(20)
+                        .HasComment("Reference to tenant code that entity belongs");
+
+                }
+            );
+        }
+    }
+}

+ 7 - 0
Common/qdr.app.qlbrc.common/Entities/Base/ITenantCode.cs

@@ -0,0 +1,7 @@
+namespace Quadarax.Application.QLiberace.Common.Entities.Base
+{
+    public interface ITenantCode
+    {
+        string TenantCode { get; }
+    }
+}

+ 14 - 0
Common/qdr.app.qlbrc.common/Entities/Base/QlbrcEntityTenantCode.cs

@@ -0,0 +1,14 @@
+using System.Runtime.CompilerServices;
+
+#if DEBUG
+[assembly: InternalsVisibleTo("qdr.app.qlbrc.base.Tests")]
+[assembly: InternalsVisibleTo("qdr.app.qlbrc.common.Tests")]
+#endif
+
+namespace Quadarax.Application.QLiberace.Common.Entities.Base
+{
+    public abstract class QlbrcEntityTenantCode : QlbrcEntityTracked, ITenantCode
+    {
+        public string TenantCode { get; set; } = null!;
+    }
+}

+ 12 - 0
Modules/qdr.app.qlbrc.base/Constants.cs

@@ -24,6 +24,18 @@
                 public const string TblCurrency = "Currency";
 
             }
+
+            public class Customer
+            {
+                public const string Name = "Customer";
+                public const string Code = "customer";
+                public const string Schema = "customer";
+
+                public const string TblContact = "Contact";
+                public const string TblCustomer = "Customer";
+                public const string TblCustomerUser = "CustomerUser";
+
+            }
         }
     }
 }

+ 1 - 1
Modules/qdr.app.qlbrc.base/Entities/Currency.cs

@@ -10,7 +10,7 @@ namespace Quadarax.Application.QLiberace.Base.Entities
         public string Sign { get; set; } = null!;
 
         public virtual ICollection<TenantCurrency> Tenants { get; set; }
-        public virtual ICollection<Country> Countries { get; set; }
+        public virtual ICollection<Country> Countries { get; set; } = null!;
 
 
         public Currency()

+ 1 - 1
Modules/qdr.app.qlbrc.base/Entities/DaoMapper/UserDm.cs

@@ -25,7 +25,7 @@ namespace Quadarax.Application.QLiberace.Base.Entities.DaoMapper
                         .HasComment("Flag if user access locked (not accessible)");
 
                     entity.Property(e => e.LoginName).IsRequired()
-                        .HasMaxLength(200)
+                        .HasMaxLength(100)
                         .HasComment("User login name name. Key search value");
 
 

+ 3 - 3
Modules/qdr.app.qlbrc.base/Entities/Tenant.cs

@@ -15,9 +15,9 @@ namespace Quadarax.Application.QLiberace.Base.Entities
         public DateTime? LastAccess { get; set; }
         public bool IsLocked { get; set; }
 
-        public virtual ICollection<TenantUser> Users { get; set; }
-        public virtual ICollection<TenantCountry> Countries { get; set; }
-        public virtual ICollection<TenantCurrency> Currencies { get; set; }
+        public virtual ICollection<TenantUser> Users { get; set; } = null!;
+        public virtual ICollection<TenantCountry> Countries { get; set; } = null!;
+        public virtual ICollection<TenantCurrency> Currencies { get; set; } = null!;
 
         public Tenant()
         {

+ 48 - 0
Modules/qdr.app.qlbrc.customer/Entities/Contact.cs

@@ -0,0 +1,48 @@
+using Quadarax.Application.QLiberace.Common.Entities.Base;
+
+namespace Quadarax.Application.QLiberace.Customer.Entities
+{
+    public class Contact : QlbrcEntityTenantCode
+    {
+        /// <summary>
+        /// Reference to customer that contact belongs
+        /// </summary>
+        public long CustomerId { get; set; }
+        /// <summary>
+        /// Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)
+        /// </summary>
+        public int Type { get; set; }
+        /// <summary>
+        /// Contact heading caption.
+        /// </summary>
+        public string Caption { get; set; } = null!;
+        /// <summary>
+        /// Main address value. If phone, email, sms stores email address or telephone number.
+        /// </summary>
+        public string Address { get; set; } = null!;
+        /// <summary>
+        /// Secondary address value.
+        /// </summary>
+        public string? Address1 { get; set; }
+        /// <summary>
+        /// Contact city.
+        /// </summary>
+        public string? City { get; set; }
+        /// <summary>
+        /// Contact ZIP code.
+        /// </summary>
+        public string? Zip { get; set; }
+        /// <summary>
+        /// Contact country code.
+        /// </summary>
+        public string? CountryCode { get; set; }
+        /// <summary>
+        /// Flag if Contact is preffered.
+        /// </summary>
+        public bool IsPreffered { get; set; }
+
+        public virtual Customer Customer { get; set; } = null!;
+
+
+    }
+}

+ 42 - 0
Modules/qdr.app.qlbrc.customer/Entities/Customer.cs

@@ -0,0 +1,42 @@
+using Quadarax.Application.QLiberace.Common.Entities.Base;
+
+namespace Quadarax.Application.QLiberace.Customer.Entities
+{
+    public class Customer : QlbrcEntityTenantCode
+    {
+
+        /// <summary>
+        /// Customer code. Main key to search.
+        /// </summary>
+        public string Code { get; set; } = null!;
+        /// <summary>
+        /// Customer head name. For identification usage.
+        /// </summary>
+        public string Name { get; set; } = null!;
+        /// <summary>
+        /// Customer tax number (business identifier)
+        /// </summary>
+        public string? TaxNumber { get; set; }
+        /// <summary>
+        /// Customer VAT number (VAT identification)
+        /// </summary>
+        public string? VatNumber { get; set; }
+        /// <summary>
+        /// Flag if VAT calculation is allowed
+        /// </summary>
+        public bool? VatIncluded { get; set; }
+        /// <summary>
+        /// Tax country region code
+        /// </summary>
+        public string TaxCountryCode { get; set; } = null!;
+
+
+        public virtual ICollection<Contact> Contacts { get; set; } = null!;
+
+        public Customer()
+        {
+            Contacts = new List<Contact>();
+        }
+
+    }
+}

+ 13 - 0
Modules/qdr.app.qlbrc.customer/Entities/CustomerUser.cs

@@ -0,0 +1,13 @@
+using Quadarax.Application.QLiberace.Common.Entities.Base;
+
+namespace Quadarax.Application.QLiberace.Customer.Entities
+{
+    public class CustomerUser: QlbrcEntityKeyless
+    {
+        public string UserLoginName { get; set; } = null!;
+
+        public long CustomerId { get; set; }
+
+        public Customer Customer { get; set; } = null!;
+    }
+}

+ 68 - 0
Modules/qdr.app.qlbrc.customer/Entities/DaoMapper/ContactDm.cs

@@ -0,0 +1,68 @@
+using Microsoft.EntityFrameworkCore;
+using Quadarax.Application.QLiberace.Base;
+using Quadarax.Application.QLiberace.Common.Entities.Base.DaoMapper;
+
+namespace Quadarax.Application.QLiberace.Customer.Entities.DaoMapper
+{
+    public class ContactDm : TrackedDm<Contact>
+    {
+        public override void Map(ModelBuilder builder)
+        {
+
+            if (builder == null) throw new ArgumentNullException(nameof(builder));
+
+            base.Map(builder);
+            builder.Entity<Contact>(entity =>
+                {
+                    entity.ToTable(Constants.Modules.Customer.TblContact, Constants.Modules.Customer.Schema);
+
+                     entity.Property(e => e.Address).IsRequired()
+                    .HasMaxLength(100)
+                    .HasComment("Main address value. If phone, email, sms stores email address or telephone number.");
+
+                entity.Property(e => e.Address1)
+                    .HasMaxLength(100)
+                    .HasComment("Secondary address value.");
+
+                entity.Property(e => e.Caption).IsRequired()
+                    .HasMaxLength(100)
+                    .HasComment("Contact heading caption.");
+
+                entity.Property(e => e.City)
+                    .HasMaxLength(50)
+                    .HasComment("Contact city.");
+
+                entity.Property(e => e.CountryCode)
+                    .HasMaxLength(5)
+                    .HasComment("Contact country code.");
+
+                
+                entity.Property(e => e.CustomerId).IsRequired()
+                    .HasComment("Reference to customer that contact belongs");
+
+                entity.Property(e => e.IsPreffered).IsRequired()
+                    .HasDefaultValueSql("0")
+                    .HasComment("Flag if Contact is preffered.");
+
+                
+                entity.Property(e => e.Type).IsRequired()
+                    .HasDefaultValueSql("0")
+                    .HasComment("Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)");
+
+                entity.Property(e => e.Zip)
+                    .HasMaxLength(20)
+                    .HasColumnName("ZIP")
+                    .HasComment("Contact ZIP code.");
+
+                    
+                    // relationships
+                    entity.HasOne(d => d.Customer)
+                        .WithMany(p => p.Contacts)
+                        .HasForeignKey(d => d.CustomerId)
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .HasConstraintName("REL_CONTACT_CUSTOMER_ID");
+                }
+            );
+        }
+    }
+}

+ 52 - 0
Modules/qdr.app.qlbrc.customer/Entities/DaoMapper/CustomerDm.cs

@@ -0,0 +1,52 @@
+using Quadarax.Application.QLiberace.Common.Entities.Base.DaoMapper;
+using Microsoft.EntityFrameworkCore;
+using Quadarax.Application.QLiberace.Base;
+
+namespace Quadarax.Application.QLiberace.Customer.Entities.DaoMapper
+{
+    public class CustomerDm: TrackedTenantDm<Customer>
+    {
+        public override void Map(ModelBuilder builder)
+        {
+
+            if (builder == null) throw new ArgumentNullException(nameof(builder));
+
+            base.Map(builder);
+            builder.Entity<Customer>(entity =>
+                {
+                    entity.ToTable(Constants.Modules.Customer.TblCustomer, Constants.Modules.Customer.Schema);
+
+                    // indexes
+                    entity.HasIndex(e => e.Code, "IDX_CUSTOMER_CODE")
+                        .IsUnique();
+
+                    // columns
+                    entity.Property(e => e.Code).IsRequired()
+                        .HasMaxLength(20)
+                        .HasComment("Customer code. Main key to search.");
+
+                    entity.Property(e => e.Name).IsRequired()
+                        .HasMaxLength(100)
+                        .HasComment("Customer head name. For identification usage.");
+
+                    entity.Property(e => e.TaxCountryCode).IsRequired()
+                        .HasMaxLength(5)
+                        .HasComment("Tax country region code");
+
+                    entity.Property(e => e.TaxNumber)
+                        .HasMaxLength(20)
+                        .HasComment("Customer tax number (business identifier)");
+                    
+                    entity.Property(e => e.VatIncluded).IsRequired()
+                        .HasDefaultValueSql("((1))")
+                        .HasComment("Flag if VAT calculation is allowed");
+
+                    entity.Property(e => e.VatNumber)
+                        .HasMaxLength(20)
+                        .HasComment("Customer VAT number (VAT identification)");
+
+                }
+            );
+        }
+    }
+}

+ 44 - 0
Modules/qdr.app.qlbrc.customer/Entities/DaoMapper/CustomerUserDm.cs

@@ -0,0 +1,44 @@
+using Quadarax.Application.QLiberace.Common.Entities.Base.DaoMapper;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore;
+using Quadarax.Application.QLiberace.Base;
+
+namespace Quadarax.Application.QLiberace.Customer.Entities.DaoMapper
+{
+    internal class CustomerUserDm : KeylessDm<CustomerUser>
+    {
+        public override void Map(ModelBuilder builder)
+        {
+
+            if (builder == null) throw new ArgumentNullException(nameof(builder));
+
+            base.Map(builder);
+            builder.Entity<CustomerUser>(entity =>
+                {
+                    entity.ToTable(Constants.Modules.Customer.TblCustomerUser, Constants.Modules.Customer.Schema);
+                    entity.HasKey(tu => new { tu.CustomerId, tu.UserLoginName });
+
+                    entity.Property(e => e.CustomerId).IsRequired()
+                        .HasComment("Reference to customer");
+
+                    entity.Property(e => e.UserLoginName).IsRequired()
+                        .HasMaxLength(100)
+                        .HasComment("Reference to user");
+
+                    // relationships
+                    entity.HasOne(d => d.Customer)
+                        .WithMany()
+                        .HasForeignKey(d => d.CustomerId)
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .HasConstraintName("REL_CUSTOMETUSER_CUSTOMER_ID");
+
+
+                }
+            );
+        }
+    }
+}

+ 61 - 0
Modules/qdr.app.qlbrc.customer/QlbrcDbContextCustomer.cs

@@ -0,0 +1,61 @@
+using System.Diagnostics;
+using Microsoft.EntityFrameworkCore;
+using Quadarax.Application.QLiberace.Base;
+using Quadarax.Application.QLiberace.Common.Attributes;
+using Quadarax.Application.QLiberace.Common.Configuration;
+using Quadarax.Application.QLiberace.Customer.Entities;
+using Quadarax.Application.QLiberace.Customer.Entities.DaoMapper;
+using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Reflection;
+
+namespace Quadarax.Application.QLiberace.Customer
+{
+    [DbContextModuleAssignment(Constants.Modules.Customer.Code)]
+    public class QlbrcDbContextCustomer : DataDomain
+    {
+         #region *** Mapped entities ***
+        public DbSet<Contact> Contacts { get; set; } = null!;
+        public DbSet<Entities.Customer> Customers { get; set; } = null!;
+        public DbSet<CustomerUser> CustomerUsers { get; set; } = null!;
+        
+        #endregion
+        
+        #region *** Constructors ***
+        public QlbrcDbContextCustomer() : base(new DbContextOptions<QlbrcDbContext>())
+        {
+        }
+        public QlbrcDbContextCustomer(DbContextOptions options) : base(options)
+        {
+        }
+        #endregion
+
+
+        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+        {
+            optionsBuilder.UseSqlServer(GetConnectionString()).LogTo(message => Debug.WriteLine("EFSQL>>" + message));;
+        }
+
+        protected string GetConnectionString()
+        {
+            var attr = AttributeQuery<DbContextModuleAssignmentAttribute>.Get(typeof(QlbrcDbContext));
+            if (attr == null)
+                throw new InvalidOperationException($"No connection string defined for DbContext {this.GetType().Name} or DbContextModuleAssignment is missing.");
+
+            return OlbrcConfiguration.Get(attr.ModuleCode).ConnectionString;
+        }
+
+       
+        #region *** Schema ***
+
+        protected override void OnModelCreating(ModelBuilder modelBuilder)
+        {
+            new CustomerDm().Map(modelBuilder);
+            new ContactDm().Map(modelBuilder);
+            new CustomerUserDm().Map(modelBuilder);
+
+            base.OnModelCreating(modelBuilder);
+        }
+
+        #endregion
+    }
+}

+ 17 - 0
Modules/qdr.app.qlbrc.customer/qdr.app.qlbrc.customer.csproj

@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+    <RootNamespace>Quadarax.Application.QLiberace.Customer</RootNamespace>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\common\qdr.app.qlbrc.common\qdr.app.qlbrc.common.csproj" />
+    <ProjectReference Include="..\..\Common\qdr.fnd.core.business\qdr.fnd.core.business.csproj" />
+    <ProjectReference Include="..\..\Common\qdr.fnd.core.data\qdr.fnd.core.data.csproj" />
+    <ProjectReference Include="..\qdr.app.qlbrc.base\qdr.app.qlbrc.base.csproj" />
+  </ItemGroup>
+
+</Project>

+ 67 - 0
Workbench/Entity/Contact.cs

@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+
+namespace Workbench.Entity
+{
+    public partial class Contact
+    {
+        /// <summary>
+        /// Contact primary key
+        /// </summary>
+        public long Id { get; set; }
+        /// <summary>
+        /// Reference to tenant code that contact belongs
+        /// </summary>
+        public string TenantCode { get; set; } = null!;
+        /// <summary>
+        /// Reference to customer that contact belongs
+        /// </summary>
+        public long CustomerId { get; set; }
+        /// <summary>
+        /// Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)
+        /// </summary>
+        public int Type { get; set; }
+        /// <summary>
+        /// Contact heading caption.
+        /// </summary>
+        public string Caption { get; set; } = null!;
+        /// <summary>
+        /// Main address value. If phone, email, sms stores email address or telephone number.
+        /// </summary>
+        public string Address { get; set; } = null!;
+        /// <summary>
+        /// Secondary address value.
+        /// </summary>
+        public string? Address1 { get; set; }
+        /// <summary>
+        /// Contact city.
+        /// </summary>
+        public string? City { get; set; }
+        /// <summary>
+        /// Contact ZIP code.
+        /// </summary>
+        public string? Zip { get; set; }
+        /// <summary>
+        /// Contact country code.
+        /// </summary>
+        public string? CountryCode { get; set; }
+        /// <summary>
+        /// Flag if Contact is preffered.
+        /// </summary>
+        public bool IsPreffered { get; set; }
+        /// <summary>
+        /// Record created timestamp
+        /// </summary>
+        public DateTime Created { get; set; }
+        /// <summary>
+        /// Record modified timestamp
+        /// </summary>
+        public DateTime? Modified { get; set; }
+        /// <summary>
+        /// Record modifier signature
+        /// </summary>
+        public string? Modifier { get; set; }
+
+        public virtual Customer Customer { get; set; } = null!;
+    }
+}

+ 60 - 0
Workbench/Entity/Customer.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+
+namespace Workbench.Entity
+{
+    public partial class Customer
+    {
+        public Customer()
+        {
+            Contacts = new HashSet<Contact>();
+        }
+
+        /// <summary>
+        /// Setting primary key
+        /// </summary>
+        public long Id { get; set; }
+        /// <summary>
+        /// Reference to tenant code that customer belongs
+        /// </summary>
+        public string TenantCode { get; set; } = null!;
+        /// <summary>
+        /// Customer code. Main key to search.
+        /// </summary>
+        public string Code { get; set; } = null!;
+        /// <summary>
+        /// Customer head name. For identification usage.
+        /// </summary>
+        public string Name { get; set; } = null!;
+        /// <summary>
+        /// Customer tax number (business identifier)
+        /// </summary>
+        public string? TaxNumber { get; set; }
+        /// <summary>
+        /// Customer VAT number (VAT identification)
+        /// </summary>
+        public string? VatNumber { get; set; }
+        /// <summary>
+        /// Flag if VAT calculation is allowed
+        /// </summary>
+        public bool? VatIncluded { get; set; }
+        /// <summary>
+        /// Tax country region code
+        /// </summary>
+        public string TaxCountryCode { get; set; } = null!;
+        /// <summary>
+        /// Record created timestamp
+        /// </summary>
+        public DateTime Created { get; set; }
+        /// <summary>
+        /// Record modified timestamp
+        /// </summary>
+        public DateTime? Modified { get; set; }
+        /// <summary>
+        /// Record modifier signature
+        /// </summary>
+        public string? Modifier { get; set; }
+
+        public virtual ICollection<Contact> Contacts { get; set; }
+    }
+}

+ 19 - 0
Workbench/Entity/CustomerUser.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace Workbench.Entity
+{
+    public partial class CustomerUser
+    {
+        /// <summary>
+        /// Reference to customer
+        /// </summary>
+        public long CustomerId { get; set; }
+        /// <summary>
+        /// Reference to user
+        /// </summary>
+        public string UserLoginName { get; set; } = null!;
+
+        public virtual Customer Customer { get; set; } = null!;
+    }
+}

+ 136 - 1
Workbench/Entity/QLiberaceContext.cs

@@ -16,8 +16,11 @@ namespace Workbench.Entity
         {
         }
 
+        public virtual DbSet<Contact> Contacts { get; set; } = null!;
         public virtual DbSet<Country> Countries { get; set; } = null!;
         public virtual DbSet<Currency> Currencies { get; set; } = null!;
+        public virtual DbSet<Customer> Customers { get; set; } = null!;
+        public virtual DbSet<CustomerUser> CustomerUsers { get; set; } = null!;
         public virtual DbSet<Setting> Settings { get; set; } = null!;
         public virtual DbSet<Tenant> Tenants { get; set; } = null!;
         public virtual DbSet<TenantCountry> TenantCountries { get; set; } = null!;
@@ -36,6 +39,67 @@ namespace Workbench.Entity
 
         protected override void OnModelCreating(ModelBuilder modelBuilder)
         {
+            modelBuilder.Entity<Contact>(entity =>
+            {
+                entity.ToTable("Contact", "Customer");
+
+                entity.Property(e => e.Id).HasComment("Contact primary key");
+
+                entity.Property(e => e.Address)
+                    .HasMaxLength(100)
+                    .HasComment("Main address value. If phone, email, sms stores email address or telephone number.");
+
+                entity.Property(e => e.Address1)
+                    .HasMaxLength(100)
+                    .HasComment("Secondary address value.");
+
+                entity.Property(e => e.Caption)
+                    .HasMaxLength(100)
+                    .HasComment("Contact heading caption.");
+
+                entity.Property(e => e.City)
+                    .HasMaxLength(50)
+                    .HasComment("Contact city.");
+
+                entity.Property(e => e.CountryCode)
+                    .HasMaxLength(5)
+                    .HasComment("Contact country code.");
+
+                entity.Property(e => e.Created)
+                    .HasColumnType("datetime")
+                    .HasDefaultValueSql("(getdate())")
+                    .HasComment("Record created timestamp");
+
+                entity.Property(e => e.CustomerId).HasComment("Reference to customer that contact belongs");
+
+                entity.Property(e => e.IsPreffered).HasComment("Flag if Contact is preffered.");
+
+                entity.Property(e => e.Modified)
+                    .HasColumnType("datetime")
+                    .HasComment("Record modified timestamp");
+
+                entity.Property(e => e.Modifier)
+                    .HasMaxLength(100)
+                    .HasComment("Record modifier signature");
+
+                entity.Property(e => e.TenantCode)
+                    .HasMaxLength(20)
+                    .HasComment("Reference to tenant code that contact belongs");
+
+                entity.Property(e => e.Type).HasComment("Contact type (0-Email, 1-Address, 2-Phone, 3-SMS)");
+
+                entity.Property(e => e.Zip)
+                    .HasMaxLength(20)
+                    .HasColumnName("ZIP")
+                    .HasComment("Contact ZIP code.");
+
+                entity.HasOne(d => d.Customer)
+                    .WithMany(p => p.Contacts)
+                    .HasForeignKey(d => d.CustomerId)
+                    .OnDelete(DeleteBehavior.ClientSetNull)
+                    .HasConstraintName("REL_CONTACT_CUSTOMER_ID");
+            });
+
             modelBuilder.Entity<Country>(entity =>
             {
                 entity.ToTable("Country", "base");
@@ -114,6 +178,77 @@ namespace Workbench.Entity
                     .HasComment("Currency sign chars");
             });
 
+            modelBuilder.Entity<Customer>(entity =>
+            {
+                entity.ToTable("Customer", "Customer");
+
+                entity.HasIndex(e => e.Code, "IDX_CUSTOMER_CODE")
+                    .IsUnique();
+
+                entity.Property(e => e.Id).HasComment("Setting primary key");
+
+                entity.Property(e => e.Code)
+                    .HasMaxLength(20)
+                    .HasComment("Customer code. Main key to search.");
+
+                entity.Property(e => e.Created)
+                    .HasColumnType("datetime")
+                    .HasDefaultValueSql("(getdate())")
+                    .HasComment("Record created timestamp");
+
+                entity.Property(e => e.Modified)
+                    .HasColumnType("datetime")
+                    .HasComment("Record modified timestamp");
+
+                entity.Property(e => e.Modifier)
+                    .HasMaxLength(100)
+                    .HasComment("Record modifier signature");
+
+                entity.Property(e => e.Name)
+                    .HasMaxLength(100)
+                    .HasComment("Customer head name. For identification usage.");
+
+                entity.Property(e => e.TaxCountryCode)
+                    .HasMaxLength(5)
+                    .HasComment("Tax country region code");
+
+                entity.Property(e => e.TaxNumber)
+                    .HasMaxLength(20)
+                    .HasComment("Customer tax number (business identifier)");
+
+                entity.Property(e => e.TenantCode)
+                    .HasMaxLength(20)
+                    .HasComment("Reference to tenant code that customer belongs");
+
+                entity.Property(e => e.VatIncluded)
+                    .IsRequired()
+                    .HasDefaultValueSql("((1))")
+                    .HasComment("Flag if VAT calculation is allowed");
+
+                entity.Property(e => e.VatNumber)
+                    .HasMaxLength(20)
+                    .HasComment("Customer VAT number (VAT identification)");
+            });
+
+            modelBuilder.Entity<CustomerUser>(entity =>
+            {
+                entity.HasNoKey();
+
+                entity.ToTable("CustomerUser", "Customer");
+
+                entity.Property(e => e.CustomerId).HasComment("Reference to customer");
+
+                entity.Property(e => e.UserLoginName)
+                    .HasMaxLength(100)
+                    .HasComment("Reference to user");
+
+                entity.HasOne(d => d.Customer)
+                    .WithMany()
+                    .HasForeignKey(d => d.CustomerId)
+                    .OnDelete(DeleteBehavior.ClientSetNull)
+                    .HasConstraintName("REL_CUSTOMETUSER_CUSTOMER_ID");
+            });
+
             modelBuilder.Entity<Setting>(entity =>
             {
                 entity.ToTable("Setting", "base");
@@ -297,7 +432,7 @@ namespace Workbench.Entity
                 entity.Property(e => e.IsLocked).HasComment("Flag if user access locked (not accessable)");
 
                 entity.Property(e => e.LoginName)
-                    .HasMaxLength(200)
+                    .HasMaxLength(100)
                     .HasComment("User login name name. Key search value");
 
                 entity.Property(e => e.Modified)

+ 8 - 1
qdr.app.qlbrc.sln

@@ -37,7 +37,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "qdr.app.qlbrc.base.Tests",
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "qdr.fnd.core.test", "Common\qdr.fnd.core.test\qdr.fnd.core.test.csproj", "{0D88D15B-DC73-43F2-8661-ECAAF8EEB173}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Workbench", "Workbench\Workbench.csproj", "{26FEFB38-30C1-49A0-8454-4F9622E98920}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Workbench", "Workbench\Workbench.csproj", "{26FEFB38-30C1-49A0-8454-4F9622E98920}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "qdr.app.qlbrc.customer", "Modules\qdr.app.qlbrc.customer\qdr.app.qlbrc.customer.csproj", "{71741095-9F36-4CC5-9B58-B1183DF92A04}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -101,6 +103,10 @@ Global
 		{26FEFB38-30C1-49A0-8454-4F9622E98920}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{26FEFB38-30C1-49A0-8454-4F9622E98920}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{26FEFB38-30C1-49A0-8454-4F9622E98920}.Release|Any CPU.Build.0 = Release|Any CPU
+		{71741095-9F36-4CC5-9B58-B1183DF92A04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{71741095-9F36-4CC5-9B58-B1183DF92A04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{71741095-9F36-4CC5-9B58-B1183DF92A04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{71741095-9F36-4CC5-9B58-B1183DF92A04}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -120,6 +126,7 @@ Global
 		{653F7A49-07B8-4AE5-80FC-E559F38718CF} = {D8C71782-99B7-49FA-BF63-F40D8232B8DE}
 		{3F99AB71-EB24-47D4-BBB6-755ED785D0FE} = {D8C71782-99B7-49FA-BF63-F40D8232B8DE}
 		{0D88D15B-DC73-43F2-8661-ECAAF8EEB173} = {F528683A-B908-440C-9D94-F4675A3F760E}
+		{71741095-9F36-4CC5-9B58-B1183DF92A04} = {24170366-2A73-4C1E-86D6-DA3C987D304E}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {AB5693A0-BE22-4D85-997A-EC8F74FE9B10}