Merge pull request #44 from myrle-krantz/develop

Cannot create readonly charge definitions.
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestChargeDefinitions.java b/component-test/src/main/java/io/mifos/portfolio/TestChargeDefinitions.java
index f65e8a6..6673c26 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestChargeDefinitions.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestChargeDefinitions.java
@@ -128,12 +128,30 @@
 
     portfolioManager.createChargeDefinition(product.getIdentifier(), chargeDefinition);
     Assert.assertTrue(this.eventRecorder.wait(EventConstants.POST_CHARGE_DEFINITION,
-            new ChargeDefinitionEvent(product.getIdentifier(), chargeDefinition.getIdentifier())));
+        new ChargeDefinitionEvent(product.getIdentifier(), chargeDefinition.getIdentifier())));
 
     final ChargeDefinition chargeDefinitionAsCreated = portfolioManager.getChargeDefinition(product.getIdentifier(), chargeDefinition.getIdentifier());
     Assert.assertEquals(chargeDefinition, chargeDefinitionAsCreated);
   }
 
+  @Test(expected = IllegalArgumentException.class)
+  public void shouldNotCreateReadOnlyChargeDefinition() throws InterruptedException {
+    final Product product = createProduct();
+
+    final ChargeDefinition chargeDefinition = new ChargeDefinition();
+    chargeDefinition.setIdentifier("rando123456");
+    chargeDefinition.setName("ditto12356");
+    chargeDefinition.setFromAccountDesignator("1234-4321");
+    chargeDefinition.setToAccountDesignator("4321-1234");
+    chargeDefinition.setAmount(BigDecimal.ONE.setScale(4, BigDecimal.ROUND_UNNECESSARY));
+    chargeDefinition.setChargeMethod(ChargeDefinition.ChargeMethod.FIXED);
+    chargeDefinition.setChargeAction(Action.OPEN.name());
+    chargeDefinition.setDescription("who cares what the description is?");
+    chargeDefinition.setReadOnly(true);
+
+    portfolioManager.createChargeDefinition(product.getIdentifier(), chargeDefinition);
+  }
+
 
   @Test
   public void shouldChangeInterestChargeDefinition() throws InterruptedException {
diff --git a/service/src/main/java/io/mifos/portfolio/service/rest/ChargeDefinitionRestController.java b/service/src/main/java/io/mifos/portfolio/service/rest/ChargeDefinitionRestController.java
index 9e74ff2..df91bb3 100644
--- a/service/src/main/java/io/mifos/portfolio/service/rest/ChargeDefinitionRestController.java
+++ b/service/src/main/java/io/mifos/portfolio/service/rest/ChargeDefinitionRestController.java
@@ -125,6 +125,9 @@
   {
     checkChargeExistsInProductAndIsNotReadOnly(productIdentifier, chargeDefinitionIdentifier);
 
+    if (instance.isReadOnly())
+      throw ServiceException.badRequest("Created charges cannot be read only.");
+
     if (!chargeDefinitionIdentifier.equals(instance.getIdentifier()))
       throw ServiceException.badRequest("Instance identifiers may not be changed.");
 
@@ -159,7 +162,8 @@
         .isReadOnly();
 
     if (readOnly)
-      throw ServiceException.conflict("Charge definition is read only ''{0}''", chargeDefinitionIdentifier);
+      throw ServiceException.conflict("Charge definition is read only ''{0}.{1}''",
+          productIdentifier, chargeDefinitionIdentifier);
   }
 
   private void checkProductExists(final String productIdentifier) {