Merge pull request #25 from myrle-krantz/develop

Increased allowed account identifier length to 34
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/domain/AccountAssignment.java b/api/src/main/java/io/mifos/portfolio/api/v1/domain/AccountAssignment.java
index 2eb61a1..3b8d866 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/domain/AccountAssignment.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/domain/AccountAssignment.java
@@ -28,9 +28,10 @@
 public final class AccountAssignment {
   @ValidIdentifier
   private String designator;
-  @ValidIdentifier(optional = true)
+  @ValidIdentifier(maxLength = 34, optional = true)
   private String accountIdentifier;
-  @ValidIdentifier(optional = true)
+  @SuppressWarnings("DefaultAnnotationParam")
+  @ValidIdentifier(maxLength = 32, optional = true)
   private String ledgerIdentifier;
 
   public AccountAssignment() {
diff --git a/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CreditWorthinessSnapshotTest.java b/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CreditWorthinessSnapshotTest.java
index 6bfa4df..f39774b 100644
--- a/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CreditWorthinessSnapshotTest.java
+++ b/api/src/test/java/io/mifos/individuallending/api/v1/domain/caseinstance/CreditWorthinessSnapshotTest.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2017 The Mifos Initiative.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package io.mifos.individuallending.api.v1.domain.caseinstance;
 
 import io.mifos.core.test.domain.ValidationTest;
diff --git a/api/src/test/java/io/mifos/portfolio/api/v1/domain/ProductTest.java b/api/src/test/java/io/mifos/portfolio/api/v1/domain/ProductTest.java
index 6502e0c..3ab8947 100644
--- a/api/src/test/java/io/mifos/portfolio/api/v1/domain/ProductTest.java
+++ b/api/src/test/java/io/mifos/portfolio/api/v1/domain/ProductTest.java
@@ -106,7 +106,7 @@
             .adjustment(product -> product.setDescription(StringUtils.repeat("x", 4097)))
             .valid(false));
     ret.add(new ValidationTestCase<Product>("tooLongAccountIdentifier")
-            .adjustment(product -> product.getAccountAssignments().add(new AccountAssignment("xyz", StringUtils.repeat("0", 33))))
+            .adjustment(product -> product.getAccountAssignments().add(new AccountAssignment("xyz", StringUtils.repeat("0", 35))))
             .valid(false));
     ret.add(new ValidationTestCase<Product>("duplicateAccountAssignment")
             .adjustment(product -> {
diff --git a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
index 6a253be..a10a100 100644
--- a/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
+++ b/service/src/main/java/io/mifos/individuallending/internal/service/IndividualLoanService.java
@@ -113,10 +113,10 @@
           final int minorCurrencyUnitDigits,
           final BigDecimal initialBalance,
           final @Nonnull List<ScheduledAction> scheduledActions) {
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction
             = chargeDefinitionService.getChargeDefinitionsMappedByChargeAction(productIdentifier);
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction
             = chargeDefinitionService.getChargeDefinitionsMappedByAccrueAction(productIdentifier);
 
     final ChargeDefinition acceptPaymentDefinition = getPaymentChargeDefinition();
@@ -255,8 +255,8 @@
   }
 
   private List<ScheduledCharge> getScheduledCharges(final List<ScheduledAction> scheduledActions,
-                                                    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
-                                                    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
+                                                    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
+                                                    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
                                                     final ChargeDefinition acceptPaymentDefinition) {
     return scheduledActions.stream()
             .flatMap(scheduledAction -> getChargeDefinitionStream(chargeDefinitionsMappedByChargeAction, chargeDefinitionsMappedByAccrueAction, acceptPaymentDefinition, scheduledAction)
@@ -265,18 +265,18 @@
   }
 
   private Stream<ChargeDefinition> getChargeDefinitionStream(
-          final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
-          final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
+          final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByChargeAction,
+          final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAccrueAction,
           final ChargeDefinition acceptPaymentDefinition,
           final ScheduledAction scheduledAction) {
-    List<ChargeDefinition> chargeMapping = chargeDefinitionsMappedByChargeAction.get(scheduledAction.action);
+    List<ChargeDefinition> chargeMapping = chargeDefinitionsMappedByChargeAction.get(scheduledAction.action.name());
     if ((chargeMapping == null) && (scheduledAction.action == Action.valueOf(acceptPaymentDefinition.getChargeAction())))
       chargeMapping = Collections.singletonList(acceptPaymentDefinition);
 
     if (chargeMapping == null)
       chargeMapping = Collections.emptyList();
 
-    List<ChargeDefinition> accrueMapping = chargeDefinitionsMappedByAccrueAction.get(scheduledAction.action);
+    List<ChargeDefinition> accrueMapping = chargeDefinitionsMappedByAccrueAction.get(scheduledAction.action.name());
     if ((accrueMapping == null) && (scheduledAction.action == Action.valueOf(acceptPaymentDefinition.getChargeAction())))
       accrueMapping = Collections.singletonList(acceptPaymentDefinition);
 
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java b/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java
index 6ba6642..0230368 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/service/ChargeDefinitionService.java
@@ -16,7 +16,6 @@
 package io.mifos.portfolio.service.internal.service;
 
 import io.mifos.portfolio.api.v1.domain.ChargeDefinition;
-import io.mifos.individuallending.api.v1.domain.workflow.Action;
 import io.mifos.portfolio.service.internal.mapper.ChargeDefinitionMapper;
 import io.mifos.portfolio.service.internal.repository.ChargeDefinitionRepository;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,25 +45,26 @@
             .collect(Collectors.toList());
   }
 
-  @Nonnull public Map<Action, List<ChargeDefinition>> getChargeDefinitionsMappedByChargeAction(
+  @Nonnull
+  public Map<String, List<ChargeDefinition>> getChargeDefinitionsMappedByChargeAction(
           final String productIdentifier)
   {
     final List<ChargeDefinition> chargeDefinitions = findAllEntities(productIdentifier);
 
     return chargeDefinitions.stream()
-            .collect(Collectors.groupingBy(x -> Action.valueOf(x.getChargeAction()),
+            .collect(Collectors.groupingBy(ChargeDefinition::getChargeAction,
                     Collectors.mapping(x -> x, Collectors.toList())));
   }
 
   @Nonnull
-  public Map<Action, List<ChargeDefinition>> getChargeDefinitionsMappedByAccrueAction(
+  public Map<String, List<ChargeDefinition>> getChargeDefinitionsMappedByAccrueAction(
           final String productIdentifier)
   {
     final List<ChargeDefinition> chargeDefinitions = findAllEntities(productIdentifier);
 
     return chargeDefinitions.stream()
             .filter(x -> x.getAccrueAction() != null)
-            .collect(Collectors.groupingBy(x -> Action.valueOf(x.getAccrueAction()),
+            .collect(Collectors.groupingBy(ChargeDefinition::getAccrueAction,
                     Collectors.mapping(x -> x, Collectors.toList())));
   }
 
diff --git a/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java b/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java
index d245306..ece7c71 100644
--- a/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java
+++ b/service/src/main/java/io/mifos/portfolio/service/rest/ProductRestController.java
@@ -203,7 +203,7 @@
 
     if (enabled) {
       if (!productService.areChargeDefinitionsCoveredByAccountAssignments(productIdentifier))
-        throw ServiceException.conflict("Product with identifier " + productIdentifier + " is not ready to be enabled.");
+        throw ServiceException.conflict("Product with identifier ''{0}'' is not ready to be enabled.", productIdentifier);
     }
 
     commandGateway.process(new ChangeEnablingOfProductCommand(productIdentifier, enabled));
diff --git a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
index 0c99de9..3ae5fc3 100644
--- a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
+++ b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -45,7 +45,7 @@
 CREATE TABLE bastet_p_acct_assigns (
   id BIGINT NOT NULL AUTO_INCREMENT,
   designator               VARCHAR(32)    NOT NULL,
-  identifier               VARCHAR(32)    NOT NULL,
+  identifier               VARCHAR(34)    NOT NULL,
   product_id               BIGINT         NOT NULL,
   thoth_type               VARCHAR(32)    NOT NULL,
   CONSTRAINT bastet_p_acct_assign_pk PRIMARY KEY (id),
@@ -102,7 +102,7 @@
 CREATE TABLE bastet_c_acct_assigns (
   id BIGINT NOT NULL AUTO_INCREMENT,
   designator               VARCHAR(32)    NOT NULL,
-  identifier               VARCHAR(32)    NOT NULL,
+  identifier               VARCHAR(34)    NOT NULL,
   case_id                  BIGINT         NOT NULL,
   CONSTRAINT bastet_c_acct_assign_pk PRIMARY KEY (id),
   CONSTRAINT bastet_c_acct_assign_uq UNIQUE (case_id, designator),
diff --git a/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java b/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java
index 500e594..59032e6 100644
--- a/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java
+++ b/service/src/test/java/io/mifos/individuallending/internal/service/IndividualLoanServiceTest.java
@@ -50,7 +50,7 @@
     private int minorCurrencyUnitDigits = 2;
     private CaseParameters caseParameters;
     private LocalDate initialDisbursementDate;
-    private Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction;
+    private Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction;
     private Set<String> expectedChargeIdentifiers = new HashSet<>(Arrays.asList(ChargeIdentifiers.INTEREST_ID, ChargeIdentifiers.PAYMENT_ID));
 
     TestCase(final String description) {
@@ -72,7 +72,7 @@
       return this;
     }
 
-    TestCase chargeDefinitionsMappedByAction(final Map<Action, List<ChargeDefinition>> newVal) {
+    TestCase chargeDefinitionsMappedByAction(final Map<String, List<ChargeDefinition>> newVal) {
       this.chargeDefinitionsMappedByAction = newVal;
       return this;
     }
@@ -111,8 +111,8 @@
 
     //I know: this is cheating in a unit test.  But I really didn't want to put this data together by hand.
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
-    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST, getInterestChargeDefinition(0.01, ChronoUnit.YEARS));
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
+    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST.name(), getInterestChargeDefinition(0.01, ChronoUnit.YEARS));
 
     return new TestCase("simpleCase")
             .minorCurrencyUnitDigits(2)
@@ -130,8 +130,8 @@
     caseParameters.setPaymentCycle(new PaymentCycle(ChronoUnit.MONTHS, 1, 0, null, null));
     caseParameters.setMaximumBalance(BigDecimal.valueOf(200000));
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
-    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST, getInterestChargeDefinition(0.10, ChronoUnit.YEARS));
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
+    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST.name(), getInterestChargeDefinition(0.10, ChronoUnit.YEARS));
 
     return new TestCase("yearLoanTestCase")
             .minorCurrencyUnitDigits(2)
@@ -148,11 +148,11 @@
     caseParameters.setPaymentCycle(new PaymentCycle(ChronoUnit.WEEKS, 1, 1, 0, 0));
     caseParameters.setMaximumBalance(BigDecimal.valueOf(2000));
 
-    final Map<Action, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
-    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST, getInterestChargeDefinition(0.05, ChronoUnit.YEARS));
+    final Map<String, List<ChargeDefinition>> chargeDefinitionsMappedByAction = new HashMap<>();
+    chargeDefinitionsMappedByAction.put(Action.APPLY_INTEREST.name(), getInterestChargeDefinition(0.05, ChronoUnit.YEARS));
 
     final List<ChargeDefinition> defaultLoanCharges = IndividualLendingPatternFactory.defaultIndividualLoanCharges();
-    defaultLoanCharges.forEach(x -> chargeDefinitionsMappedByAction.put(Action.valueOf(x.getChargeAction()), Collections.singletonList(x)));
+    defaultLoanCharges.forEach(x -> chargeDefinitionsMappedByAction.put(x.getChargeAction(), Collections.singletonList(x)));
 
     return new TestCase("chargeDefaultsCase")
             .minorCurrencyUnitDigits(2)