Fixed bug whereby a co-signer with empty credit information failed to be persisted.
diff --git a/api/src/test/java/io/mifos/Fixture.java b/api/src/test/java/io/mifos/Fixture.java
index dfc89fe..3608179 100644
--- a/api/src/test/java/io/mifos/Fixture.java
+++ b/api/src/test/java/io/mifos/Fixture.java
@@ -24,10 +24,7 @@
 
 import java.math.BigDecimal;
 import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Consumer;
 
 import static io.mifos.individuallending.api.v1.domain.product.AccountDesignators.*;
@@ -137,7 +134,12 @@
     cosignerCreditWorthinessSnapshot.setDebts(Collections.emptyList());
     cosignerCreditWorthinessSnapshot.setAssets(Collections.singletonList(new CreditWorthinessFactor("a house", fixScale(BigDecimal.valueOf(50000)))));
     cosignerCreditWorthinessSnapshot.setIncomeSources(Collections.singletonList(new CreditWorthinessFactor("retirement", fixScale(BigDecimal.valueOf(200)))));
-    ret.setCreditWorthinessSnapshots(Arrays.asList(customerCreditWorthinessSnapshot, cosignerCreditWorthinessSnapshot));
+
+    final List<CreditWorthinessSnapshot> creditWorthinessSnapshots = new ArrayList<>();
+    creditWorthinessSnapshots.add(customerCreditWorthinessSnapshot);
+    creditWorthinessSnapshots.add(cosignerCreditWorthinessSnapshot);
+
+    ret.setCreditWorthinessSnapshots(creditWorthinessSnapshots);
 
     return ret;
   }
diff --git a/component-test/src/main/java/io/mifos/portfolio/Fixture.java b/component-test/src/main/java/io/mifos/portfolio/Fixture.java
index e6b7bbf..4235516 100644
--- a/component-test/src/main/java/io/mifos/portfolio/Fixture.java
+++ b/component-test/src/main/java/io/mifos/portfolio/Fixture.java
@@ -24,10 +24,7 @@
 
 import java.math.BigDecimal;
 import java.time.temporal.ChronoUnit;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Consumer;
 
 import static io.mifos.individuallending.api.v1.domain.product.AccountDesignators.*;
@@ -143,7 +140,11 @@
     cosignerCreditWorthinessSnapshot.setAssets(Collections.singletonList(new CreditWorthinessFactor("a house", fixScale(BigDecimal.valueOf(50000)))));
     cosignerCreditWorthinessSnapshot.setIncomeSources(Collections.singletonList(new CreditWorthinessFactor("retirement", fixScale(BigDecimal.valueOf(200)))));
 
-    ret.setCreditWorthinessSnapshots(Arrays.asList(customerCreditWorthinessSnapshot, cosignerCreditWorthinessSnapshot));
+    final List<CreditWorthinessSnapshot> creditWorthinessSnapshots = new ArrayList<>();
+    creditWorthinessSnapshots.add(customerCreditWorthinessSnapshot);
+    creditWorthinessSnapshots.add(cosignerCreditWorthinessSnapshot);
+
+    ret.setCreditWorthinessSnapshots(creditWorthinessSnapshots);
 
     return ret;
   }
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestCases.java b/component-test/src/main/java/io/mifos/portfolio/TestCases.java
index 37e4619..1112a68 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestCases.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestCases.java
@@ -19,6 +19,7 @@
 import io.mifos.core.test.domain.TimeStampChecker;
 import io.mifos.individuallending.api.v1.domain.caseinstance.CaseParameters;
 import io.mifos.individuallending.api.v1.domain.caseinstance.CreditWorthinessFactor;
+import io.mifos.individuallending.api.v1.domain.caseinstance.CreditWorthinessSnapshot;
 import io.mifos.portfolio.api.v1.domain.AccountAssignment;
 import io.mifos.portfolio.api.v1.domain.Case;
 import io.mifos.portfolio.api.v1.domain.CasePage;
@@ -162,6 +163,25 @@
   }
 
   @Test
+  public void shouldCreateCosignerWithoutDetails() throws InterruptedException {
+    final Product product = createAndEnableProduct();
+
+    final CaseParameters caseParameters = Fixture.createAdjustedCaseParameters(x -> {
+      final CreditWorthinessSnapshot bob = new CreditWorthinessSnapshot("bob");
+      bob.setDebts(Collections.emptyList());
+      bob.setAssets(Collections.emptyList());
+      bob.setIncomeSources(Collections.emptyList());
+      x.getCreditWorthinessSnapshots().add(bob);
+    });
+    final String caseParametersAsString = new Gson().toJson(caseParameters);
+    final Case caseInstance = createAdjustedCase(product.getIdentifier(), x -> x.setParameters(caseParametersAsString));
+
+    final Case caseAsSaved = portfolioManager.getCase(product.getIdentifier(), caseInstance.getIdentifier());
+
+    Assert.assertEquals(caseInstance, caseAsSaved);
+  }
+
+  @Test
   public void shouldThrowWhenProductNotActivated() throws InterruptedException {
     final Product product = createProduct();
 
diff --git a/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java b/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
index 6de6fc9..6be2ef8 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/mapper/CaseParametersMapper.java
@@ -24,6 +24,7 @@
 import io.mifos.portfolio.api.v1.domain.PaymentCycle;
 import io.mifos.portfolio.api.v1.domain.TermRange;
 
+import java.math.BigDecimal;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -59,19 +60,42 @@
           final List<CreditWorthinessSnapshot> creditWorthinessSnapshots,
           final CaseParametersEntity caseParametersEntity) {
     return Stream.iterate(0, i -> i+1).limit(creditWorthinessSnapshots.size())
-            .flatMap(i -> {
-      final String customerId = creditWorthinessSnapshots.get(i).getForCustomer();
-      return Stream.concat(Stream.concat(
-              mapSnapshotPartToFactors(customerId, i,
-                      CreditWorthinessFactorType.ASSET, creditWorthinessSnapshots.get(i).getAssets(),
-                      caseParametersEntity),
-              mapSnapshotPartToFactors(customerId, i,
-                      CreditWorthinessFactorType.INCOME_SOURCE, creditWorthinessSnapshots.get(i).getIncomeSources(),
-                      caseParametersEntity)),
-              mapSnapshotPartToFactors(customerId, i,
-                      CreditWorthinessFactorType.DEBT, creditWorthinessSnapshots.get(i).getDebts(),
-                      caseParametersEntity));
-    }).collect(Collectors.toSet());
+            .flatMap(i -> mapSnapshotToFactors(
+                    creditWorthinessSnapshots.get(i), i, caseParametersEntity)).collect(Collectors.toSet());
+  }
+
+  private static Stream<? extends CaseCreditWorthinessFactorEntity> mapSnapshotToFactors(
+          final CreditWorthinessSnapshot creditWorthinessSnapshot,
+          final int i,
+          final CaseParametersEntity caseParametersEntity) {
+    final String customerId = creditWorthinessSnapshot.getForCustomer();
+    return Stream.concat(Stream.concat(Stream.concat(
+            mapSnapshotPartToFactors(customerId, i,
+                    CreditWorthinessFactorType.ASSET, creditWorthinessSnapshot.getAssets(),
+                    caseParametersEntity),
+            mapSnapshotPartToFactors(customerId, i,
+                    CreditWorthinessFactorType.INCOME_SOURCE, creditWorthinessSnapshot.getIncomeSources(),
+                    caseParametersEntity)),
+            mapSnapshotPartToFactors(customerId, i,
+                    CreditWorthinessFactorType.DEBT, creditWorthinessSnapshot.getDebts(),
+                    caseParametersEntity)),
+            createPlaceHolder(customerId, i, caseParametersEntity)
+    );
+  }
+
+  private static Stream<CaseCreditWorthinessFactorEntity> createPlaceHolder(
+          final String customerIdentifier,
+          final int positionInCustomers,
+          final CaseParametersEntity caseParametersEntity) {
+    final CaseCreditWorthinessFactorEntity placeHolder = new CaseCreditWorthinessFactorEntity();
+    placeHolder.setFactorType(CreditWorthinessFactorType.PLACE_HOLDER);
+    placeHolder.setCustomerIdentifier(customerIdentifier);
+    placeHolder.setPositionInCustomers(positionInCustomers);
+    placeHolder.setPositionInFactor(0);
+    placeHolder.setCaseId(caseParametersEntity);
+    placeHolder.setAmount(BigDecimal.ZERO);
+    placeHolder.setDescription("placeholder");
+    return Stream.of(placeHolder);
   }
 
   private static Stream<CaseCreditWorthinessFactorEntity> mapSnapshotPartToFactors(
diff --git a/service/src/main/java/io/mifos/individuallending/internal/repository/CreditWorthinessFactorType.java b/service/src/main/java/io/mifos/individuallending/internal/repository/CreditWorthinessFactorType.java
index f07689c..0e75198 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/repository/CreditWorthinessFactorType.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/repository/CreditWorthinessFactorType.java
@@ -19,5 +19,5 @@
  * @author Myrle Krantz
  */
 public enum CreditWorthinessFactorType {
-  INCOME_SOURCE, ASSET, DEBT
+  INCOME_SOURCE, ASSET, DEBT, PLACE_HOLDER
 }