Merge pull request #4 from myrlen/develop

Made enabled into product member variable to reduce calls.
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java b/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
index 32576ed..f04545b 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/client/PortfolioManager.java
@@ -48,12 +48,13 @@
   List<Pattern> getAllPatterns();
 
   @RequestMapping(
-          value = "/patterns/{patternpackage}/charges/",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/patterns/{patternpackage}/charges/",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  List<ChargeDefinition> getAllDefaultChargeDefinitionsForPattern(@PathVariable("patternpackage") final String patternPackage);
+  List<ChargeDefinition> getAllDefaultChargeDefinitionsForPattern(
+      @PathVariable("patternpackage") final String patternPackage);
 
   @RequestMapping(
       value = "/products/",
@@ -61,98 +62,104 @@
       produces = MediaType.ALL_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  ProductPage getProducts(@RequestParam(value = "includeDisabled", required = false) final Boolean includeDisabled,
-                          @RequestParam(value = "term", required = false) final String term,
-                          @RequestParam(value = "pageIndex") final Integer pageIndex,
-                          @RequestParam(value = "size") final Integer size,
-                          @RequestParam(value = "sortColumn", required = false) @ValidSortColumn(value = {"lastModifiedOn", "identifier", "name"}) final String sortColumn,
-                          @RequestParam(value = "sortDirection", required = false) @ValidSortDirection final String sortDirection);
+  ProductPage getProducts(
+      @RequestParam(value = "includeDisabled", required = false) final Boolean includeDisabled,
+      @RequestParam(value = "term", required = false) final String term,
+      @RequestParam(value = "pageIndex") final Integer pageIndex,
+      @RequestParam(value = "size") final Integer size,
+      @RequestParam(value = "sortColumn", required = false) @ValidSortColumn(value = {"lastModifiedOn", "identifier", "name"}) final String sortColumn,
+      @RequestParam(value = "sortDirection", required = false) @ValidSortDirection final String sortDirection);
 
   @RequestMapping(
-          value = "/products",
-          method = RequestMethod.POST,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products",
+      method = RequestMethod.POST,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductAlreadyExistsException.class)
   void createProduct(final Product product);
 
   @RequestMapping(
-          value = "/products/{productidentifier}",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE)
+      value = "/products/{productidentifier}",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE)
   Product getProduct(@PathVariable("productidentifier") final String productIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}",
-          method = RequestMethod.PUT,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE)
+      value = "/products/{productidentifier}",
+      method = RequestMethod.PUT,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE)
   @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
-  void changeProduct(@PathVariable("productidentifier") final String productIdentifier,
-                     final Product product);
+  void changeProduct(
+      @PathVariable("productidentifier") final String productIdentifier,
+      final Product product);
 
   @RequestMapping(
-          value = "/products/{productidentifier}",
-          method = RequestMethod.DELETE,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}",
+      method = RequestMethod.DELETE,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
-  void deleteProduct(@PathVariable("productidentifier") final String productIdentifier);
+  void deleteProduct(
+      @PathVariable("productidentifier") final String productIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/incompleteaccountassignments",
-          method = RequestMethod.GET,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE)
-  Set<AccountAssignment> getIncompleteAccountAssignments(@PathVariable("productidentifier") final String productIdentifier);
+      value = "/products/{productidentifier}/incompleteaccountassignments",
+      method = RequestMethod.GET,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE)
+  Set<AccountAssignment> getIncompleteAccountAssignments(
+      @PathVariable("productidentifier") final String productIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/enabled",
-          method = RequestMethod.PUT,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE)
+      value = "/products/{productidentifier}/enabled",
+      method = RequestMethod.PUT,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE)
   @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductDefinitionIncomplete.class)
-  void enableProduct(@PathVariable("productidentifier") final String productIdentifier,
-                     final Boolean enabled);
+  void enableProduct(
+      @PathVariable("productidentifier") final String productIdentifier,
+      final Boolean enabled);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/enabled",
-          method = RequestMethod.GET,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE)
+      value = "/products/{productidentifier}/enabled",
+      method = RequestMethod.GET,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE)
   Boolean getProductEnabled(@PathVariable("productidentifier") final String productIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/tasks/",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/tasks/",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  List<TaskDefinition> getAllTaskDefinitionsForProduct(@PathVariable("productidentifier") final String productIdentifier);
+  List<TaskDefinition> getAllTaskDefinitionsForProduct(
+      @PathVariable("productidentifier") final String productIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/tasks/",
-          method = RequestMethod.POST,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/tasks/",
+      method = RequestMethod.POST,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = ProductInUseException.class)
   void createTaskDefinition(
-          @PathVariable("productidentifier") final String productIdentifier,
-          final TaskDefinition taskDefinition);
+      @PathVariable("productidentifier") final String productIdentifier,
+      final TaskDefinition taskDefinition);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/tasks/{taskidentifier}",
-          method = RequestMethod.GET,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/tasks/{taskidentifier}",
+      method = RequestMethod.GET,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   TaskDefinition getTaskDefinition(
-          @PathVariable("productidentifier") final String productIdentifier,
-          @PathVariable("taskidentifier") final String taskDefinitionIdentifier);
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("taskidentifier") final String taskDefinitionIdentifier);
 
   @RequestMapping(
       value = "/products/{productidentifier}/tasks/{taskidentifier}",
@@ -176,103 +183,109 @@
       @PathVariable("taskidentifier") final String taskDefinitionIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/charges/",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/charges/",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  List<ChargeDefinition> getAllChargeDefinitionsForProduct(@PathVariable("productidentifier") final String productIdentifier);
+  List<ChargeDefinition> getAllChargeDefinitionsForProduct(
+      @PathVariable("productidentifier") final String productIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/charges/",
-          method = RequestMethod.POST,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/charges/",
+      method = RequestMethod.POST,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   void createChargeDefinition(
-          @PathVariable("productidentifier") final String productIdentifier,
-          final ChargeDefinition taskDefinition);
+      @PathVariable("productidentifier") final String productIdentifier,
+      final ChargeDefinition taskDefinition);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
-          method = RequestMethod.GET,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
+      method = RequestMethod.GET,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   ChargeDefinition getChargeDefinition(
-          @PathVariable("productidentifier") final String productIdentifier,
-          @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier);
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
-          method = RequestMethod.PUT,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
+      method = RequestMethod.PUT,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = ChargeDefinitionIsReadOnly.class)
   void changeChargeDefinition(
-          @PathVariable("productidentifier") final String productIdentifier,
-          @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier,
-          final ChargeDefinition chargeDefinition);
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier,
+      final ChargeDefinition chargeDefinition);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
-          method = RequestMethod.DELETE,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/charges/{chargedefinitionidentifier}",
+      method = RequestMethod.DELETE,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = ChargeDefinitionIsReadOnly.class)
   void deleteChargeDefinition(
-          @PathVariable("productidentifier") final String productIdentifier,
-          @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier);
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("chargedefinitionidentifier") final String chargeDefinitionIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  CasePage getAllCasesForProduct(@PathVariable("productidentifier") final String productIdentifier,
-                                 @RequestParam(value = "includeClosed", required = false) final Boolean includeClosed,
-                                 @RequestParam("pageIndex") final Integer pageIndex,
-                                 @RequestParam("size") final Integer size);
+  CasePage getAllCasesForProduct(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @RequestParam(value = "includeClosed", required = false) final Boolean includeClosed,
+      @RequestParam("pageIndex") final Integer pageIndex,
+      @RequestParam("size") final Integer size);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/",
-          method = RequestMethod.POST,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/",
+      method = RequestMethod.POST,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = CaseAlreadyExistsException.class)
-  void createCase(@PathVariable("productidentifier") final String productIdentifier,
-                  final Case caseInstance);
+  void createCase(
+      @PathVariable("productidentifier") final String productIdentifier,
+      final Case caseInstance);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/{caseidentifier}",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE)
-  Case getCase(@PathVariable("productidentifier") final String productIdentifier,
-               @PathVariable("caseidentifier") final String caseIdentifier);
+      value = "/products/{productidentifier}/cases/{caseidentifier}",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE)
+  Case getCase(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/{caseidentifier}",
-          method = RequestMethod.PUT,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/{caseidentifier}",
+      method = RequestMethod.PUT,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  void changeCase(@PathVariable("productidentifier") final String productIdentifier,
-                  @PathVariable("caseidentifier") final String caseIdentifier,
-                  final Case caseInstance);
+  void changeCase(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      final Case caseInstance);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/{caseidentifier}/actions/",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/{caseidentifier}/actions/",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  Set<String> getActionsForCase(@PathVariable("productidentifier") final String productIdentifier,
-                                @PathVariable("caseidentifier") final String caseIdentifier);
+  Set<String> getActionsForCase(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier);
 
 
   @RequestMapping(
@@ -281,11 +294,12 @@
       produces = MediaType.ALL_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  List<CostComponent> getCostComponentsForAction(@PathVariable("productidentifier") final String productIdentifier,
-                                                 @PathVariable("caseidentifier") final String caseIdentifier,
-                                                 @PathVariable("actionidentifier") final String actionIdentifier,
-                                                 @RequestParam(value="touchingaccounts", required = false, defaultValue = "") final Set<String> forAccountDesignators,
-                                                 @RequestParam(value="forpaymentsize", required = false, defaultValue = "") final BigDecimal forPaymentSize);
+  List<CostComponent> getCostComponentsForAction(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @PathVariable("actionidentifier") final String actionIdentifier,
+      @RequestParam(value="touchingaccounts", required = false, defaultValue = "") final Set<String> forAccountDesignators,
+      @RequestParam(value="forpaymentsize", required = false, defaultValue = "") final BigDecimal forPaymentSize);
 
 
   @RequestMapping(
@@ -294,10 +308,11 @@
       produces = MediaType.ALL_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  List<CostComponent> getCostComponentsForAction(@PathVariable("productidentifier") final String productIdentifier,
-                                                 @PathVariable("caseidentifier") final String caseIdentifier,
-                                                 @PathVariable("actionidentifier") final String actionIdentifier,
-                                                 @RequestParam(value="touchingaccounts", required = false, defaultValue = "") final Set<String> forAccountDesignators);
+  List<CostComponent> getCostComponentsForAction(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @PathVariable("actionidentifier") final String actionIdentifier,
+      @RequestParam(value="touchingaccounts", required = false, defaultValue = "") final Set<String> forAccountDesignators);
 
 
   @RequestMapping(
@@ -306,41 +321,45 @@
       produces = MediaType.ALL_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  List<CostComponent> getCostComponentsForAction(@PathVariable("productidentifier") final String productIdentifier,
-                                                 @PathVariable("caseidentifier") final String caseIdentifier,
-                                                 @PathVariable("actionidentifier") final String actionIdentifier);
+  List<CostComponent> getCostComponentsForAction(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @PathVariable("actionidentifier") final String actionIdentifier);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/{caseidentifier}/commands/{actionidentifier}",
-          method = RequestMethod.POST,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/{caseidentifier}/commands/{actionidentifier}",
+      method = RequestMethod.POST,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = TaskOutstanding.class)
-  void executeCaseCommand(@PathVariable("productidentifier") final String productIdentifier,
-                          @PathVariable("caseidentifier") final String caseIdentifier,
-                          @PathVariable("actionidentifier") final String actionIdentifier,
-                          final Command command);
+  void executeCaseCommand(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @PathVariable("actionidentifier") final String actionIdentifier,
+      final Command command);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  List<TaskInstance> getAllTasksForCase(@PathVariable("productidentifier") final String productIdentifier,
-                                        @PathVariable("caseidentifier") final String caseIdentifier,
-                                        @RequestParam(value = "includeExecuted", required = false) final Boolean includeExecuted);
+  List<TaskInstance> getAllTasksForCase(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @RequestParam(value = "includeExecuted", required = false) final Boolean includeExecuted);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}",
-          method = RequestMethod.GET,
-          produces = MediaType.APPLICATION_JSON_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}",
+      method = RequestMethod.GET,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  TaskInstance getTaskForCase(@PathVariable("productidentifier") final String productIdentifier,
-                              @PathVariable("caseidentifier") final String caseIdentifier,
-                              @PathVariable("taskidentifier") final String taskIdentifier);
+  TaskInstance getTaskForCase(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @PathVariable("taskidentifier") final String taskIdentifier);
 
   @RequestMapping(
       value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}",
@@ -348,31 +367,34 @@
       produces = MediaType.ALL_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  void changeTaskForCase(@PathVariable("productidentifier") final String productIdentifier,
-                         @PathVariable("caseidentifier") final String caseIdentifier,
-                         @PathVariable("taskidentifier") final String taskIdentifier,
-                         final TaskInstance instance);
+  void changeTaskForCase(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @PathVariable("taskidentifier") final String taskIdentifier,
+      final TaskInstance instance);
 
   @RequestMapping(
-          value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}/executed",
-          method = RequestMethod.PUT,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/products/{productidentifier}/cases/{caseidentifier}/tasks/{taskidentifier}/executed",
+      method = RequestMethod.PUT,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
   @ThrowsException(status = HttpStatus.CONFLICT, exception = TaskExecutionBySameUserAsCaseCreation.class)
-  void markTaskExecution(@PathVariable("productidentifier") final String productIdentifier,
-                         @PathVariable("caseidentifier") final String caseIdentifier,
-                         @PathVariable("taskidentifier") final String taskIdentifier,
-                         final Boolean executed);
+  void markTaskExecution(
+      @PathVariable("productidentifier") final String productIdentifier,
+      @PathVariable("caseidentifier") final String caseIdentifier,
+      @PathVariable("taskidentifier") final String taskIdentifier,
+      final Boolean executed);
 
   @RequestMapping(
-          value = "/cases/",
-          method = RequestMethod.GET,
-          produces = MediaType.ALL_VALUE,
-          consumes = MediaType.APPLICATION_JSON_VALUE
+      value = "/cases/",
+      method = RequestMethod.GET,
+      produces = MediaType.ALL_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
   )
-  CasePage getAllCases(@RequestParam("pageIndex") final Integer pageIndex,
-                        @RequestParam("size") final Integer size);
+  CasePage getAllCases(
+      @RequestParam("pageIndex") final Integer pageIndex,
+      @RequestParam("size") final Integer size);
 
   //TODO: find a way to list cases by customer even though the portfolio contains products which may be associated with groups instead of customers.
 }
diff --git a/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java b/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java
index 0e7274d..84d7fa4 100644
--- a/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java
+++ b/api/src/main/java/io/mifos/portfolio/api/v1/domain/Product.java
@@ -68,6 +68,7 @@
   private String createdBy;
   private String lastModifiedOn;
   private String lastModifiedBy;
+  private boolean enabled;
 
   public Product() {
   }
@@ -200,6 +201,14 @@
     this.lastModifiedBy = lastModifiedBy;
   }
 
+  public boolean isEnabled() {
+    return enabled;
+  }
+
+  public void setEnabled(boolean enabled) {
+    this.enabled = enabled;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
@@ -227,22 +236,23 @@
   @Override
   public String toString() {
     return "Product{" +
-            "identifier='" + identifier + '\'' +
-            ", name='" + name + '\'' +
-            ", termRange=" + termRange +
-            ", balanceRange=" + balanceRange +
-            ", interestRange=" + interestRange +
-            ", interestBasis=" + interestBasis +
-            ", patternPackage='" + patternPackage + '\'' +
-            ", description='" + description + '\'' +
-            ", currencyCode='" + currencyCode + '\'' +
-            ", minorCurrencyUnitDigits=" + minorCurrencyUnitDigits +
-            ", accountAssignments=" + accountAssignments +
-            ", parameters='" + parameters + '\'' +
-            ", createdOn='" + createdOn + '\'' +
-            ", createdBy='" + createdBy + '\'' +
-            ", lastModifiedOn='" + lastModifiedOn + '\'' +
-            ", lastModifiedBy='" + lastModifiedBy + '\'' +
-            '}';
+        "identifier='" + identifier + '\'' +
+        ", name='" + name + '\'' +
+        ", termRange=" + termRange +
+        ", balanceRange=" + balanceRange +
+        ", interestRange=" + interestRange +
+        ", interestBasis=" + interestBasis +
+        ", patternPackage='" + patternPackage + '\'' +
+        ", description='" + description + '\'' +
+        ", currencyCode='" + currencyCode + '\'' +
+        ", minorCurrencyUnitDigits=" + minorCurrencyUnitDigits +
+        ", accountAssignments=" + accountAssignments +
+        ", parameters='" + parameters + '\'' +
+        ", createdOn='" + createdOn + '\'' +
+        ", createdBy='" + createdBy + '\'' +
+        ", lastModifiedOn='" + lastModifiedOn + '\'' +
+        ", lastModifiedBy='" + lastModifiedBy + '\'' +
+        ", enabled='" + enabled + '\'' +
+        '}';
   }
 }
diff --git a/component-test/src/main/java/io/mifos/portfolio/TestProducts.java b/component-test/src/main/java/io/mifos/portfolio/TestProducts.java
index 876d07a..cb52a9d 100644
--- a/component-test/src/main/java/io/mifos/portfolio/TestProducts.java
+++ b/component-test/src/main/java/io/mifos/portfolio/TestProducts.java
@@ -50,6 +50,7 @@
     final Product productAsSaved = portfolioManager.getProduct(product.getIdentifier());
 
     Assert.assertEquals(product, productAsSaved);
+    Assert.assertFalse(productAsSaved.isEnabled());
 
     Assert.assertFalse(portfolioManager.getProductEnabled(product.getIdentifier()));
 
@@ -76,6 +77,9 @@
     portfolioManager.enableProduct(product.getIdentifier(), true);
     Assert.assertTrue(this.eventRecorder.wait(EventConstants.PUT_PRODUCT_ENABLE, product.getIdentifier()));
 
+    final Product productAfterEnable = portfolioManager.getProduct(product.getIdentifier());
+
+    Assert.assertTrue(productAfterEnable.isEnabled());
     Assert.assertTrue(portfolioManager.getProductEnabled(product.getIdentifier()));
 
     {
@@ -300,6 +304,13 @@
     portfolioManager.deleteProduct("habberdash");
   }
 
+  @Test(expected = IllegalArgumentException.class)
+  public void shouldFailToCreateProductDirectlyAsEnabled() throws InterruptedException {
+    final Product product = Fixture.createAdjustedProduct(x -> {});
+    product.setEnabled(true);
+    portfolioManager.createProduct(product);
+  }
+
   @Test
   public void shouldDeleteProduct() throws InterruptedException {
     final Product product = createAndEnableProduct();
diff --git a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java
index 4e470b3..fa9977a 100644
--- a/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java
+++ b/service/src/main/java/io/mifos/portfolio/service/internal/mapper/ProductMapper.java
@@ -57,6 +57,7 @@
     product.setCreatedOn(DateConverter.toIsoString(productEntity.getCreatedOn()));
     product.setLastModifiedBy(productEntity.getLastModifiedBy());
     product.setLastModifiedOn(DateConverter.toIsoString(productEntity.getLastModifiedOn()));
+    product.setEnabled(productEntity.getEnabled());
 
     return product;
   }
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 ece7c71..27cad2f 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
@@ -109,7 +109,10 @@
       throw ServiceException.badRequest("CreatedOn must be 'null' upon initial creation.");
 
     if (instance.getLastModifiedOn() != null)
-      throw ServiceException.badRequest("LastModifiedOn must 'null' be upon initial creation.");
+      throw ServiceException.badRequest("LastModifiedOn must be 'null' be upon initial creation.");
+
+    if (instance.isEnabled())
+      throw ServiceException.badRequest("Enabled must be 'false' be upon initial creation.");
 
     this.commandGateway.process(new CreateProductCommand(instance));
     return new ResponseEntity<>(HttpStatus.ACCEPTED);
@@ -146,6 +149,9 @@
     if (caseService.existsByProductIdentifier(productIdentifier))
       throw ServiceException.conflict("Cases exist for product with the identifier '" + productIdentifier + "'. Product cannot be changed.");
 
+    if (instance.isEnabled())
+      throw ServiceException.badRequest("Enabled must be 'false' be during editing.");
+
     commandGateway.process(new ChangeProductCommand(instance));
 
     return ResponseEntity.accepted().build();