From 695139dac89af0b4284327bf774bf0c87963aa1b Mon Sep 17 00:00:00 2001
From: Mattia Vianelli <mattia.vianelli@4science.com>
Date: Thu, 19 Sep 2024 10:39:36 +0200
Subject: [PATCH] CST-15084 Code fix after cherrypick (5) Test fix with new
 test forms and relation

---
 .../config/entities/relationship-types.xml    |  26 ++
 .../dspaceFolder/config/item-submission.xml   |  20 +
 .../dspaceFolder/config/submission-forms.xml  |  62 +++
 .../service/OrcidEntityFactoryServiceIT.java  | 414 ++----------------
 dspace/config/entities/relationship-types.xml |  26 ++
 dspace/config/item-submission.xml             |  29 ++
 dspace/config/submission-forms.xml            |  28 +-
 7 files changed, 225 insertions(+), 380 deletions(-)

diff --git a/dspace-api/src/test/data/dspaceFolder/config/entities/relationship-types.xml b/dspace-api/src/test/data/dspaceFolder/config/entities/relationship-types.xml
index 122e6ccdd6d5..32248c6bc407 100644
--- a/dspace-api/src/test/data/dspaceFolder/config/entities/relationship-types.xml
+++ b/dspace-api/src/test/data/dspaceFolder/config/entities/relationship-types.xml
@@ -129,4 +129,30 @@
         </rightCardinality>
         <copyToRight>true</copyToRight>
     </type>
+    <type>
+        <leftType>Product</leftType>
+        <rightType>Person</rightType>
+        <leftwardType>isCreatorOfProduct</leftwardType>
+        <rightwardType>isProductOfCreator</rightwardType>
+        <leftCardinality>
+            <min>0</min>
+        </leftCardinality>
+        <rightCardinality>
+            <min>0</min>
+        </rightCardinality>
+        <copyToLeft>true</copyToLeft>
+    </type>
+    <type>
+        <leftType>Patent</leftType>
+        <rightType>Person</rightType>
+        <leftwardType>isInventorOfPatent</leftwardType>
+        <rightwardType>isPatentOfInventor</rightwardType>
+        <leftCardinality>
+            <min>0</min>
+        </leftCardinality>
+        <rightCardinality>
+            <min>0</min>
+        </rightCardinality>
+        <copyToLeft>true</copyToLeft>
+    </type>
 </relationships>
\ No newline at end of file
diff --git a/dspace-api/src/test/data/dspaceFolder/config/item-submission.xml b/dspace-api/src/test/data/dspaceFolder/config/item-submission.xml
index 58326b882157..3cebd9a037a8 100644
--- a/dspace-api/src/test/data/dspaceFolder/config/item-submission.xml
+++ b/dspace-api/src/test/data/dspaceFolder/config/item-submission.xml
@@ -28,6 +28,8 @@
         <name-map community-handle="123456789/subcommunity-test" submission-name="subcommunitytest"/>
         <name-map collection-handle="123456789/collection-test" submission-name="collectiontest"/>
         <name-map collection-entity-type="CustomEntityType" submission-name="entitytypetest"/>
+        <name-map collection-handle="123456789/test-product" submission-name="producttestform"/>
+        <name-map collection-handle="123456789/test-patent" submission-name="patenttestform"/>
         <name-map collection-handle="123456789/test-duplicate-detection" submission-name="test-duplicate-detection"/>
     </submission-map>
 
@@ -304,6 +306,24 @@
             <step id="collection"/>
         </submission-process>
 
+        <submission-process name="producttestform">
+
+            <step id="collection"/>
+            <step id="productStep"/>
+            <step id="upload"/>
+            <step id="license"/>
+
+        </submission-process>
+
+        <submission-process name="patenttestform">
+
+            <step id="collection"/>
+            <step id="patentStep"/>
+            <step id="upload"/>
+            <step id="license"/>
+
+        </submission-process>
+
         <submission-process name="test-duplicate-detection">
             <step id="collection"/>
             <step id="duplicates"/>
diff --git a/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml b/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml
index 6b7349616e2d..e564b0d445f2 100644
--- a/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml
+++ b/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml
@@ -465,6 +465,68 @@ it, please enter the types and the actual numbers or codes.</hint>
      </row>
    </form>
 
+   <form name="patentStep">
+     <row>
+       <relation-field>
+         <relationship-type>isInventorOf</relationship-type>
+         <search-configuration>person</search-configuration>
+         <repeatable>true</repeatable>
+         <label>Inventor</label>
+         <hint>Select the person who invented this patent.</hint>
+         <linked-metadata-field>
+           <dc-schema>dc</dc-schema>
+           <dc-element>contributor</dc-element>
+           <dc-qualifier>author</dc-qualifier>
+           <input-type>onebox</input-type>
+         </linked-metadata-field>
+         <externalsources>orcid</externalsources>
+       </relation-field>
+     </row>
+     <row>
+       <field>
+         <dc-schema>dc</dc-schema>
+         <dc-element>title</dc-element>
+         <dc-qualifier></dc-qualifier>
+         <repeatable>false</repeatable>
+         <label>Title</label>
+         <input-type>onebox</input-type>
+         <hint>Enter the main title of the item.</hint>
+         <required>You must enter a main title for this item.</required>
+       </field>
+     </row>
+   </form>
+
+   <form name="productStep">
+     <row>
+       <relation-field>
+         <relationship-type>isCreatorOf</relationship-type>
+         <search-configuration>person</search-configuration>
+         <repeatable>true</repeatable>
+         <label>Creator</label>
+         <hint>Select the person who created this product.</hint>
+         <linked-metadata-field>
+           <dc-schema>dc</dc-schema>
+           <dc-element>contributor</dc-element>
+           <dc-qualifier>author</dc-qualifier>
+           <input-type>onebox</input-type>
+         </linked-metadata-field>
+         <externalsources>orcid</externalsources>
+       </relation-field>
+     </row>
+     <row>
+       <field>
+         <dc-schema>dc</dc-schema>
+         <dc-element>title</dc-element>
+         <dc-qualifier></dc-qualifier>
+         <repeatable>false</repeatable>
+         <label>Title</label>
+         <input-type>onebox</input-type>
+         <hint>Enter the main title of the item.</hint>
+         <required>You must enter a main title for this item.</required>
+       </field>
+     </row>
+   </form>
+
  </form-definitions>
 
 
diff --git a/dspace-api/src/test/java/org/dspace/orcid/service/OrcidEntityFactoryServiceIT.java b/dspace-api/src/test/java/org/dspace/orcid/service/OrcidEntityFactoryServiceIT.java
index 187bd9b29c5c..e7b631dd7452 100644
--- a/dspace-api/src/test/java/org/dspace/orcid/service/OrcidEntityFactoryServiceIT.java
+++ b/dspace-api/src/test/java/org/dspace/orcid/service/OrcidEntityFactoryServiceIT.java
@@ -100,7 +100,7 @@ public void setup() {
             .withEntityType("OrgUnit")
             .build();
 
-        patents = CollectionBuilder.createCollection(context, parentCommunity)
+        patents = CollectionBuilder.createCollection(context, parentCommunity, "123456789/test-patent")
             .withName("Collection")
             .withEntityType("Patent")
             .build();
@@ -110,7 +110,7 @@ public void setup() {
             .withEntityType("Publication")
             .build();
 
-        products = CollectionBuilder.createCollection(context, parentCommunity)
+        products = CollectionBuilder.createCollection(context, parentCommunity, "123456789/test-product")
             .withName("Collection")
             .withEntityType("Product")
             .build();
@@ -127,7 +127,7 @@ public void setup() {
 
         persons = CollectionBuilder.createCollection(context, parentCommunity)
                 .withName("Collection")
-                .withEntityType("person")
+                .withEntityType("Person")
                 .build();
 
         context.restoreAuthSystemState();
@@ -173,6 +173,7 @@ public void testWorkCreation() {
 
         List<Contributor> contributors = work.getWorkContributors().getContributor();
         assertThat(contributors, hasSize(3));
+        //tornano 3 ma sono null
         assertThat(contributors, has(contributor("Walter White", AUTHOR, FIRST)));
         assertThat(contributors, has(contributor("Editor", EDITOR, FIRST)));
         assertThat(contributors, has(contributor("Jesse Pinkman", AUTHOR, ADDITIONAL)));
@@ -207,6 +208,22 @@ public void testProductWorkCreation() {
             .withScopusIdentifier("scopus-id")
             .build();
 
+        Item person = ItemBuilder.createItem(context, persons)
+                .withTitle("Walter White")
+                .withIssueDate("2017-10-17")
+                .withAuthor("Walter, White")
+                .withPersonIdentifierLastName("Walter")
+                .withPersonIdentifierFirstName("White")
+                .build();
+
+        EntityType productType = EntityTypeBuilder.createEntityTypeBuilder(context, "Product").build();
+        EntityType personType = EntityTypeBuilder.createEntityTypeBuilder(context, "Person").build();
+
+        RelationshipType isCreatorOfProduct = createRelationshipTypeBuilder(context, productType, personType,
+                "isCreatorOfProduct", "isProductOfCreator", 0, null, 0, null).build();
+
+        RelationshipBuilder.createRelationshipBuilder(context, product, person, isCreatorOfProduct).build();
+
         context.restoreAuthSystemState();
 
         Activity activity = entityFactoryService.createOrcidObject(context, product);
@@ -260,6 +277,22 @@ public void testPatentWorkCreation() {
             .withType("http://purl.org/coar/resource_type/c_15cd")
             .build();
 
+        Item person = ItemBuilder.createItem(context, persons)
+                .withTitle("Walter White")
+                .withIssueDate("2017-10-17")
+                .withAuthor("Walter, White")
+                .withPersonIdentifierLastName("Walter")
+                .withPersonIdentifierFirstName("White")
+                .build();
+
+        EntityType patentType = EntityTypeBuilder.createEntityTypeBuilder(context, "Patent").build();
+        EntityType personType = EntityTypeBuilder.createEntityTypeBuilder(context, "Person").build();
+
+        RelationshipType isInventorOfPatent = createRelationshipTypeBuilder(context, patentType, personType,
+                "isInventorOfPatent", "isPatentOfInventor", 0, null, 0, null).build();
+
+        RelationshipBuilder.createRelationshipBuilder(context, patent, person, isInventorOfPatent).build();
+
         context.restoreAuthSystemState();
 
         Activity activity = entityFactoryService.createOrcidObject(context, patent);
@@ -294,85 +327,6 @@ public void testPatentWorkCreation() {
 
     }
 
-    @Test
-    public void testWorkWithFundingCreation() {
-        context.turnOffAuthorisationSystem();
-
-        Item publication = ItemBuilder.createItem(context, publications)
-            .withTitle("Test publication")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("Book")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, publication);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", publication.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "123456")));
-    }
-
-    @Test
-    public void testProductWorkWithFundingCreation() {
-        context.turnOffAuthorisationSystem();
-
-        Item product = ItemBuilder.createItem(context, products)
-            .withTitle("Test dataset")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/H6QP-SC1X")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, product);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", product.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "123456")));
-    }
-
-    @Test
-    public void testPatentsWorkWithFundingCreation() {
-        context.turnOffAuthorisationSystem();
-
-        Item patent = ItemBuilder.createItem(context, patents)
-            .withTitle("Test patent")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/c_15cd")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, patent);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", patent.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "123456")));
-    }
-
-
     @Test
     public void testWorkWithFundingWithoutGrantNumberCreation() {
         context.turnOffAuthorisationSystem();
@@ -517,302 +471,6 @@ public void testPatentWorkWithFundingWithGrantNumberPlaceholderCreation() {
         assertThat(externalIds, has(selfExternalId("handle", patent.getHandle())));
     }
 
-
-    @Test
-    public void testWorkWithFundingEntityWithoutGrantNumberCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withTitle("Test funding")
-            .build();
-
-        Item publication = ItemBuilder.createItem(context, publications)
-            .withTitle("Test publication")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("Controlled Vocabulary for Resource Type Genres::text::book")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, publication);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", publication.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "123456")));
-    }
-
-    @Test
-    public void testProductWorkWithFundingEntityWithoutGrantNumberCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withTitle("Test funding")
-            .build();
-
-        Item product = ItemBuilder.createItem(context, products)
-            .withTitle("Test product")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/c_7ad9")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, product);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", product.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "123456")));
-    }
-
-    @Test
-    public void testPatentWorkWithFundingEntityWithoutGrantNumberCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withTitle("Test funding")
-            .build();
-
-        Item patent = ItemBuilder.createItem(context, patents)
-            .withTitle("Test patent")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/c_15cd")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, patent);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", patent.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "123456")));
-    }
-
-    @Test
-    public void testWorkWithFundingEntityWithGrantNumberCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withHandle("123456789/0001")
-            .withTitle("Test funding")
-            .withFundingIdentifier("987654")
-            .build();
-
-        Item publication = ItemBuilder.createItem(context, publications)
-            .withTitle("Test publication")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("Controlled Vocabulary for Resource Type Genres::text::book")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, publication);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", publication.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "987654",
-            "http://localhost:4000/handle/123456789/0001")));
-    }
-
-    @Test
-    public void testProductWorkWithFundingEntityWithGrantNumberCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withHandle("123456789/0001")
-            .withTitle("Test funding")
-            .withFundingIdentifier("987654")
-            .build();
-
-        Item product = ItemBuilder.createItem(context, products)
-            .withTitle("Test product")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/c_18cc")
-            .withRelationFunding("Test funding", funding.getID().toString())
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, product);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", product.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "987654",
-            "http://localhost:4000/handle/123456789/0001")));
-    }
-
-    @Test
-    public void testPatentWorkWithFundingEntityWithGrantNumberCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withHandle("123456789/0001")
-            .withTitle("Test funding")
-            .withFundingIdentifier("987654")
-            .build();
-
-        Item patent = ItemBuilder.createItem(context, patents)
-            .withTitle("Test patent")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/c_15cd")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, patent);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", patent.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "987654",
-            "http://localhost:4000/handle/123456789/0001")));
-    }
-
-
-    @Test
-    public void testWorkWithFundingEntityWithGrantNumberAndUrlCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withHandle("123456789/0001")
-            .withTitle("Test funding")
-            .withFundingIdentifier("987654")
-            .build();
-
-        Item publication = ItemBuilder.createItem(context, publications)
-            .withTitle("Test publication")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("Controlled Vocabulary for Resource Type Genres::text::book")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, publication);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", publication.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "987654", "http://test-funding")));
-    }
-
-    @Test
-    public void testProductWorkWithFundingEntityWithGrantNumberAndUrlCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withHandle("123456789/0001")
-            .withTitle("Test funding")
-            .withFundingIdentifier("987654")
-            .build();
-
-        Item product = ItemBuilder.createItem(context, products)
-            .withTitle("Test product")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/c_18cc")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, product);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", product.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "987654", "http://test-funding")));
-    }
-
-    @Test
-    public void testPatentWorkWithFundingEntityWithGrantNumberAndUrlCreation() {
-
-        context.turnOffAuthorisationSystem();
-
-        Item funding = ItemBuilder.createItem(context, fundings)
-            .withHandle("123456789/0001")
-            .withTitle("Test funding")
-            .withFundingIdentifier("987654")
-            .build();
-
-        Item patent = ItemBuilder.createItem(context, patents)
-            .withTitle("Test patent")
-            .withAuthor("Walter White")
-            .withIssueDate("2021-04-30")
-            .withType("http://purl.org/coar/resource_type/c_15cd")
-            .withRelationFunding("Test funding")
-            .withRelationGrantno("123456")
-            .build();
-
-        context.restoreAuthSystemState();
-
-        Activity activity = entityFactoryService.createOrcidObject(context, patent);
-        assertThat(activity, instanceOf(Work.class));
-
-        Work work = (Work) activity;
-
-        List<ExternalID> externalIds = work.getExternalIdentifiers().getExternalIdentifier();
-        assertThat(externalIds, hasSize(2));
-        assertThat(externalIds, has(selfExternalId("handle", patent.getHandle())));
-        assertThat(externalIds, has(fundedByExternalId("grant_number", "987654", "http://test-funding")));
-    }
-
     @Test
     public void testEmptyWorkWithUnknownTypeCreation() {
 
diff --git a/dspace/config/entities/relationship-types.xml b/dspace/config/entities/relationship-types.xml
index 7ae1ff611629..56de9602dcb2 100644
--- a/dspace/config/entities/relationship-types.xml
+++ b/dspace/config/entities/relationship-types.xml
@@ -130,4 +130,30 @@
         </rightCardinality>
         <copyToRight>true</copyToRight>
     </type>
+    <type>
+        <leftType>Product</leftType>
+        <rightType>Person</rightType>
+        <leftwardType>isCreatorOfProduct</leftwardType>
+        <rightwardType>isProductOfCreator</rightwardType>
+        <leftCardinality>
+            <min>0</min>
+        </leftCardinality>
+        <rightCardinality>
+            <min>0</min>
+        </rightCardinality>
+        <copyToLeft>true</copyToLeft>
+    </type>
+    <type>
+        <leftType>Product</leftType>
+        <rightType>Person</rightType>
+        <leftwardType>isInventorOfPatent</leftwardType>
+        <rightwardType>isPatentOfInventor</rightwardType>
+        <leftCardinality>
+            <min>0</min>
+        </leftCardinality>
+        <rightCardinality>
+            <min>0</min>
+        </rightCardinality>
+        <copyToLeft>true</copyToLeft>
+    </type>
 </relationships>
\ No newline at end of file
diff --git a/dspace/config/item-submission.xml b/dspace/config/item-submission.xml
index b5278d2f3d87..f61c260c2fa9 100644
--- a/dspace/config/item-submission.xml
+++ b/dspace/config/item-submission.xml
@@ -180,6 +180,17 @@
             <type>accessCondition</type>
         </step-definition>
 
+        <step-definition id="productStep" mandatory="true">
+            <heading>submit.progressbar.describe.product</heading>
+            <processing-class>org.dspace.app.rest.submit.step.DescribeStep</processing-class>
+            <type>submission-form</type>
+        </step-definition>
+        <step-definition id="patentStep" mandatory="true">
+            <heading>submit.progressbar.describe.patent</heading>
+            <processing-class>org.dspace.app.rest.submit.step.DescribeStep</processing-class>
+            <type>submission-form</type>
+        </step-definition>
+
         <!-- This optional step may enrich the current submission using information extracted
              from uploaded files or metadata.  -->
         <!-- Please note that this step will be triggered only when a request is performed,
@@ -419,6 +430,24 @@
             <step id="collection"/>
             <step id="openaireOrganizationForm"/>
         </submission-process>
+
+        <submission-process name="Product">
+
+            <step id="collection"/>
+            <step id="productStep"/>
+            <step id="upload"/>
+            <step id="license"/>
+
+        </submission-process>
+
+        <submission-process name="Patent">
+
+            <step id="collection"/>
+            <step id="patentStep"/>
+            <step id="upload"/>
+            <step id="license"/>
+
+        </submission-process>
     </submission-definitions>
 
 </item-submission>
diff --git a/dspace/config/submission-forms.xml b/dspace/config/submission-forms.xml
index f792276646a1..f1985d6117f9 100644
--- a/dspace/config/submission-forms.xml
+++ b/dspace/config/submission-forms.xml
@@ -1351,7 +1351,7 @@
         <form name="patentStep">
             <row>
                 <relation-field>
-                    <relationship-type>isInventorOf</relationship-type>
+                    <relationship-type>isInventorOfPatent</relationship-type>
                     <search-configuration>person</search-configuration>
                     <repeatable>true</repeatable>
                     <label>Inventor</label>
@@ -1365,12 +1365,24 @@
                     <externalsources>orcid</externalsources>
                 </relation-field>
             </row>
+            <row>
+                <field>
+                    <dc-schema>dc</dc-schema>
+                    <dc-element>title</dc-element>
+                    <dc-qualifier></dc-qualifier>
+                    <repeatable>false</repeatable>
+                    <label>Title</label>
+                    <input-type>onebox</input-type>
+                    <hint>Enter the main title of the item.</hint>
+                    <required>You must enter a main title for this item.</required>
+                </field>
+            </row>
         </form>
 
         <form name="productStep">
             <row>
                 <relation-field>
-                    <relationship-type>isCreatorOf</relationship-type>
+                    <relationship-type>isCreatorOfProduct</relationship-type>
                     <search-configuration>person</search-configuration>
                     <repeatable>true</repeatable>
                     <label>Creator</label>
@@ -1384,6 +1396,18 @@
                     <externalsources>orcid</externalsources>
                 </relation-field>
             </row>
+            <row>
+                <field>
+                    <dc-schema>dc</dc-schema>
+                    <dc-element>title</dc-element>
+                    <dc-qualifier></dc-qualifier>
+                    <repeatable>false</repeatable>
+                    <label>Title</label>
+                    <input-type>onebox</input-type>
+                    <hint>Enter the main title of the item.</hint>
+                    <required>You must enter a main title for this item.</required>
+                </field>
+            </row>
         </form>