This is an automated email from the ASF dual-hosted git repository.

rajanmaurya154 pushed a commit to branch development
in repository https://gitbox.apache.org/repos/asf/fineract-cn-mobile.git


The following commit(s) were added to refs/heads/development by this push:
     new cceb879  feat: list and search products
cceb879 is described below

commit cceb879db74ade5c110a611fd4c6b5b5866f7d1c
Author: Mohak <[email protected]>
AuthorDate: Fri Jul 27 12:12:29 2018 +0530

    feat: list and search products
---
 .../java/org/apache/fineract/FakeJsonName.java     |   2 +-
 .../org/apache/fineract/FakeRemoteDataSource.java  |  15 +-
 .../data/datamanager/api/DataManagerProduct.kt     |  30 ++++
 .../apache/fineract/data/models/product/Product.kt |  33 ++--
 .../fineract/data/models/product/ProductPage.kt    |   6 +-
 .../fineract/data/remote/BaseApiManager.java       |   7 +
 .../fineract/data/services/ProductService.kt       |  18 +++
 .../injection/component/ActivityComponent.java     |   4 +
 .../injection/component/ApplicationComponent.java  |   2 +
 .../apache/fineract/ui/adapters/ProductAdapter.kt  |  60 ++++++++
 .../ui/offline/CustomerPayloadFragment.java        |   5 +-
 .../fineract/ui/online/DashboardActivity.java      |   5 +
 .../customers/customerlist/CustomersFragment.java  |  24 +--
 .../customers/customerlist/CustomersPresenter.java |  43 +++---
 .../customerprofile/CustomerProfileActivity.java   |  15 +-
 .../apache/fineract/ui/product/ProductContract.kt  |  31 ++++
 .../apache/fineract/ui/product/ProductFragment.kt  | 170 +++++++++++++++++++++
 .../apache/fineract/ui/product/ProductPresenter.kt |  80 ++++++++++
 app/src/main/res/layout/fragment_product.xml       |  27 ++++
 app/src/main/res/layout/item_product.xml           |  69 +++++++++
 app/src/main/res/menu/menu_navigation_drawer.xml   |   6 +
 app/src/main/res/menu/menu_product_search.xml      |  12 ++
 app/src/main/res/values/strings.xml                |   2 +
 app/src/main/resources/productPage.json            | 119 +++++++++++++--
 24 files changed, 707 insertions(+), 78 deletions(-)

diff --git a/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java 
b/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
index 2e6951b..7667b38 100644
--- a/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
+++ b/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
@@ -22,4 +22,4 @@ public class FakeJsonName {
     public static final String TELLER = "teller.json";
     public static final String PRODUCT_PAGE = "productPage.json";
     public static final String PRODUCT_DEFINITION = "productDefinition.json";
-}
+}
\ No newline at end of file
diff --git 
a/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java 
b/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
index 3baa40a..4444f7e 100644
--- a/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
+++ b/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
@@ -82,6 +82,12 @@ public class FakeRemoteDataSource {
     public static PlannedPaymentPage getPlannedPaymentPage() {
         return testDataFactory.getObjectTypePojo(PlannedPaymentPage.class,
                 FakeJsonName.PLANNED_PAYMENT_PAGE);
+
+    }
+
+    public static ProductPage getProductPage() {
+        return testDataFactory.getObjectTypePojo(ProductPage.class,
+                FakeJsonName.PRODUCT_PAGE);
     }
 
     public static LedgerPage getLedgerPage() {
@@ -97,13 +103,8 @@ public class FakeRemoteDataSource {
         }, FakeJsonName.TELLER);
     }
 
-    public static ProductPage getProductPage() {
-        return testDataFactory.getObjectTypePojo(ProductPage.class,
-                FakeJsonName.PRODUCT_PAGE);
-    }
-
     public static List<ProductDefinition> getProductDefinition() {
-            return testDataFactory.getListTypePojo(new 
TypeToken<List<ProductDefinition>>() {
-            }, FakeJsonName.PRODUCT_DEFINITION);
+        return testDataFactory.getListTypePojo(new 
TypeToken<List<ProductDefinition>>() {
+        }, FakeJsonName.PRODUCT_DEFINITION);
     }
 }
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerProduct.kt
 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerProduct.kt
new file mode 100644
index 0000000..4f49f35
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/api/DataManagerProduct.kt
@@ -0,0 +1,30 @@
+package org.apache.fineract.data.datamanager.api
+
+import io.reactivex.Observable
+import io.reactivex.ObservableSource
+import io.reactivex.functions.Function
+import org.apache.fineract.data.local.PreferencesHelper
+import org.apache.fineract.data.remote.BaseApiManager
+import javax.inject.Inject
+import org.apache.fineract.FakeRemoteDataSource
+import org.apache.fineract.data.models.product.Product
+import org.apache.fineract.data.models.product.ProductPage
+import javax.inject.Singleton
+
+@Singleton
+class DataManagerProduct @Inject constructor(val baseManagerApi: 
BaseApiManager,
+                                             dataManagerAuth: DataManagerAuth,
+                                             val preferencesHelper: 
PreferencesHelper)
+    : FineractBaseDataManager(dataManagerAuth, preferencesHelper) {
+
+    fun fetchProductPage(): Observable<ProductPage> =
+            baseManagerApi.productService.fetchProductPage()
+                    .onErrorResumeNext(Function<Throwable, 
ObservableSource<ProductPage>>
+                    { Observable.just(FakeRemoteDataSource.getProductPage()) })
+
+    fun searchProduct(identifier: String): Observable<Product> =
+            baseManagerApi.productService.searchProduct(identifier)
+                    .onErrorResumeNext(Function<Throwable, 
ObservableSource<Product>>
+                    { 
Observable.just(FakeRemoteDataSource.getProductPage()!!.elements!![0]) })
+
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/product/Product.kt 
b/app/src/main/java/org/apache/fineract/data/models/product/Product.kt
index c6e9479..c1e6431 100644
--- a/app/src/main/java/org/apache/fineract/data/models/product/Product.kt
+++ b/app/src/main/java/org/apache/fineract/data/models/product/Product.kt
@@ -3,7 +3,6 @@ package org.apache.fineract.data.models.product
 import com.google.gson.annotations.SerializedName
 import org.apache.fineract.data.models.loan.AccountAssignment
 import org.apache.fineract.data.models.loan.TermRange
-
 import java.util.ArrayList
 
 /**
@@ -12,21 +11,21 @@ import java.util.ArrayList
  */
 
 data class Product (
-    @SerializedName("identifier")  var identifier: String? = null,
-    @SerializedName("name") var name: String? = null,
-    @SerializedName("termRange") var termRange: TermRange? = null,
-    @SerializedName("balanceRange") var balanceRange: BalanceRange? = null,
-    @SerializedName("interestRange") var interestRange: InterestRange? = null,
-    @SerializedName("interestBasis") var interestBasis: InterestBasis? = null,
-    @SerializedName("patternPackage") var patternPackage: String? = null,
-    @SerializedName("description") var description: String? = null,
-    @SerializedName("currencyCode") var currencyCode: String? = null,
-    @SerializedName("minorCurrencyUnitDigits") var minorCurrencyUnitDigits: 
Int = 0,
-    @SerializedName("accountAssignments") var accountAssignments: 
List<AccountAssignment> =
+    @SerializedName("identifier")  val identifier: String? = null,
+    @SerializedName("name") val name: String? = null,
+    @SerializedName("termRange") val termRange: TermRange? = null,
+    @SerializedName("balanceRange") val balanceRange: BalanceRange? = null,
+    @SerializedName("interestRange") val interestRange: InterestRange? = null,
+    @SerializedName("interestBasis") val interestBasis: InterestBasis? = null,
+    @SerializedName("patternPackage") val patternPackage: String? = null,
+    @SerializedName("description") val description: String? = null,
+    @SerializedName("currencyCode") val currencyCode: String? = null,
+    @SerializedName("minorCurrencyUnitDigits") val minorCurrencyUnitDigits: 
Int = 0,
+    @SerializedName("accountAssignments") val accountAssignments: 
List<AccountAssignment> =
             ArrayList(),
-    @SerializedName("parameters") var parameters: String? = null,
-    @SerializedName("createdOn") var createdOn: String? = null,
-    @SerializedName("createdBy") var createdBy: String? = null,
-    @SerializedName("lastModifiedOn") var lastModifiedOn: String? = null,
-    @SerializedName("lastModifiedBy") var lastModifiedBy: String? = null
+    @SerializedName("parameters") val parameters: String? = null,
+    @SerializedName("createdOn") val createdOn: String? = null,
+    @SerializedName("createdBy") val createdBy: String? = null,
+    @SerializedName("lastModifiedOn") val lastModifiedOn: String? = null,
+    @SerializedName("lastModifiedBy") val lastModifiedBy: String? = null
 )
diff --git 
a/app/src/main/java/org/apache/fineract/data/models/product/ProductPage.kt 
b/app/src/main/java/org/apache/fineract/data/models/product/ProductPage.kt
index b96190c..02d6520 100644
--- a/app/src/main/java/org/apache/fineract/data/models/product/ProductPage.kt
+++ b/app/src/main/java/org/apache/fineract/data/models/product/ProductPage.kt
@@ -8,7 +8,7 @@ import com.google.gson.annotations.SerializedName
  */
 
 data class ProductPage (
-        @SerializedName("elements") var elements: List<Product>? = null,
-        @SerializedName("totalPages") var totalPages: Int? = null,
-        @SerializedName("totalElements") var totalElements: Long? = null
+        @SerializedName("elements") val elements: List<Product>? = null,
+        @SerializedName("totalPages") val totalPages: Int? = null,
+        @SerializedName("totalElements") val totalElements: Long? = null
 )
diff --git 
a/app/src/main/java/org/apache/fineract/data/remote/BaseApiManager.java 
b/app/src/main/java/org/apache/fineract/data/remote/BaseApiManager.java
index 74616c4..742665b 100644
--- a/app/src/main/java/org/apache/fineract/data/remote/BaseApiManager.java
+++ b/app/src/main/java/org/apache/fineract/data/remote/BaseApiManager.java
@@ -9,6 +9,7 @@ import org.apache.fineract.data.services.CustomerService;
 import org.apache.fineract.data.services.DepositService;
 import org.apache.fineract.data.services.IndividualLendingService;
 import org.apache.fineract.data.services.LoanService;
+import org.apache.fineract.data.services.ProductService;
 import org.apache.fineract.data.services.RolesService;
 import org.apache.fineract.data.services.TellersService;
 
@@ -37,6 +38,7 @@ public class BaseApiManager {
     private static RolesService rolesService;
     private static AccountingService accountingService;
     private static TellersService tellerService;
+    private static ProductService productService;
 
     public BaseApiManager(Context context) {
         createService(context);
@@ -52,6 +54,7 @@ public class BaseApiManager {
         rolesService = createApi(RolesService.class);
         accountingService = createApi(AccountingService.class);
         tellerService = createApi(TellersService.class);
+        productService = createApi(ProductService.class);
     }
 
     private static void initAnonymous() {
@@ -128,4 +131,8 @@ public class BaseApiManager {
     public TellersService getTellerService() {
         return tellerService;
     }
+
+    public ProductService getProductService() {
+        return productService;
+    }
 }
diff --git 
a/app/src/main/java/org/apache/fineract/data/services/ProductService.kt 
b/app/src/main/java/org/apache/fineract/data/services/ProductService.kt
new file mode 100644
index 0000000..25e3bf9
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/data/services/ProductService.kt
@@ -0,0 +1,18 @@
+package org.apache.fineract.data.services
+
+import io.reactivex.Observable
+import org.apache.fineract.data.models.product.Product
+import org.apache.fineract.data.models.product.ProductPage
+import org.apache.fineract.data.remote.EndPoints
+import retrofit2.http.GET
+import retrofit2.http.Path
+
+
+interface ProductService {
+
+    @GET(EndPoints.API_PORTFOLIO_PATH + "/products")
+    fun fetchProductPage(): Observable<ProductPage>
+
+    @GET(EndPoints.API_PORTFOLIO_PATH + "/products/{productidentifier}")
+    fun searchProduct(@Path("productidentifier") identifier: String): 
Observable<Product>
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
 
b/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
index f77e955..dd07354 100644
--- 
a/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
+++ 
b/app/src/main/java/org/apache/fineract/injection/component/ActivityComponent.java
@@ -46,6 +46,7 @@ import 
org.apache.fineract.ui.online.review.AddLoanReviewFragment;
 import org.apache.fineract.ui.online.roles.roleslist.RolesFragment;
 import org.apache.fineract.ui.online.accounting.accounts.AccountsFragment;
 import org.apache.fineract.ui.online.teller.TellerFragment;
+import org.apache.fineract.ui.product.ProductFragment;
 
 import dagger.Subcomponent;
 
@@ -120,5 +121,8 @@ public interface ActivityComponent {
 
     void inject(TellerFragment tellerFragment);
 
+
     void inject(AddLoanReviewFragment addLoanReviewFragment);
+
+    void inject(ProductFragment productFragment);
 }
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
 
b/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
index 635cfe0..bafe406 100644
--- 
a/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
+++ 
b/app/src/main/java/org/apache/fineract/injection/component/ApplicationComponent.java
@@ -12,6 +12,7 @@ import 
org.apache.fineract.data.datamanager.api.DataManagerCustomer;
 import org.apache.fineract.data.datamanager.api.DataManagerDeposit;
 import org.apache.fineract.data.datamanager.api.DataManagerIndividualLending;
 import org.apache.fineract.data.datamanager.api.DataManagerLoans;
+import org.apache.fineract.data.datamanager.api.DataManagerProduct;
 import org.apache.fineract.data.datamanager.api.DataManagerRoles;
 import org.apache.fineract.data.datamanager.database.DbManagerCustomer;
 import org.apache.fineract.data.datamanager.DataManagerAccounting;
@@ -39,6 +40,7 @@ public interface ApplicationComponent {
     JobManager jobManager();
     DataManagerAuth dataManager();
     DataManagerCustomer dataManagerCustomer();
+    DataManagerProduct dataManagerProduct();
     DbManagerCustomer bbManagerCustomer();
     DatabaseHelperCustomer customerDatabaseHelper();
     DataManagerDeposit dataManagerDeposit();
diff --git 
a/app/src/main/java/org/apache/fineract/ui/adapters/ProductAdapter.kt 
b/app/src/main/java/org/apache/fineract/ui/adapters/ProductAdapter.kt
new file mode 100644
index 0000000..ac9b71b
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/adapters/ProductAdapter.kt
@@ -0,0 +1,60 @@
+package org.apache.fineract.ui.adapters
+
+import android.content.Context
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import kotlinx.android.synthetic.main.item_product.view.*
+import org.apache.fineract.R
+import org.apache.fineract.data.models.product.Product
+import org.apache.fineract.injection.ApplicationContext
+import org.apache.fineract.utils.DateUtils
+import javax.inject.Inject
+
+class ProductAdapter @Inject constructor(@ApplicationContext val context: 
Context)
+    : RecyclerView.Adapter<ProductAdapter.ViewHolder>() {
+
+    private var products: List<Product> = ArrayList()
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
ViewHolder {
+
+        val view = 
LayoutInflater.from(parent?.context).inflate(R.layout.item_product, parent, 
false)
+        return ViewHolder(view)
+    }
+
+    override fun getItemCount(): Int = products.size
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+
+        val product = products[position]
+
+        holder.tvProductIdentifier.text = product.identifier
+
+        val modifiedBy = context.getString(R.string.last_modified_by) + 
context.getString(
+                R.string.colon) + product.lastModifiedBy
+        holder.tvModifiedBy.text = modifiedBy
+
+        val lastModifiedOn = context.getString(R.string.last_modified_on) + 
context.getString(
+                R.string.colon) +
+                DateUtils.getDate(product.lastModifiedOn,
+                        DateUtils.INPUT_DATE_FORMAT, 
DateUtils.OUTPUT_DATE_FORMAT)
+
+        holder.tvModifiedOn.text = lastModifiedOn
+        holder.tvName.text = product.name
+    }
+
+    fun setProductsList(products: List<Product>) {
+        this.products = products
+        notifyDataSetChanged()
+    }
+
+    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+
+        val tvProductIdentifier: TextView = itemView.tv_product_identifier
+        val tvModifiedBy: TextView = itemView.tv_modified_by
+        val tvModifiedOn: TextView = itemView.tv_modified_on
+        val tvName: TextView = itemView.tv_name
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadFragment.java 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadFragment.java
index 7658094..64f0a39 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadFragment.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/offline/CustomerPayloadFragment.java
@@ -34,6 +34,7 @@ public class CustomerPayloadFragment extends 
FineractBaseFragment implements
         fragment.setArguments(args);
         return fragment;
     }
+
     @BindView(R.id.rv_customers)
     RecyclerView rvCustomers;
 
@@ -85,12 +86,12 @@ public class CustomerPayloadFragment extends 
FineractBaseFragment implements
 
     @Override
     public void showNoInternetConnection() {
-        
sweetUIErrorHandler.showSweetNoInternetUI(swipeRefreshLayout,layoutError);
+        sweetUIErrorHandler.showSweetNoInternetUI(swipeRefreshLayout, 
layoutError);
     }
 
     @Override
     public void showError(String message) {
         sweetUIErrorHandler.showSweetCustomErrorUI(message,
-                R.drawable.ic_error_black_24dp,swipeRefreshLayout,layoutError);
+                R.drawable.ic_error_black_24dp, swipeRefreshLayout, 
layoutError);
     }
 }
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java 
b/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
index 5ed6fd9..836c146 100644
--- a/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
+++ b/app/src/main/java/org/apache/fineract/ui/online/DashboardActivity.java
@@ -24,6 +24,7 @@ import 
org.apache.fineract.ui.online.dashboard.DashboardFragment;
 import org.apache.fineract.ui.online.launcher.LauncherActivity;
 import org.apache.fineract.ui.online.roles.roleslist.RolesFragment;
 import org.apache.fineract.ui.online.teller.TellerFragment;
+import org.apache.fineract.ui.product.ProductFragment;
 import org.apache.fineract.utils.MaterialDialog;
 
 import javax.inject.Inject;
@@ -113,6 +114,10 @@ public class DashboardActivity extends 
FineractBaseActivity implements
                 replaceFragment(CustomerPayloadFragment.newInstance(), true,
                         R.id.container);
                 break;
+            case R.id.item_product:
+                replaceFragment(ProductFragment.Companion.newInstance(), true,
+                        R.id.container);
+                break;
             case R.id.item_logout:
                 logout();
                 break;
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
index 54a97f8..dcde3ed 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersFragment.java
@@ -113,7 +113,7 @@ public class CustomersFragment extends FineractBaseFragment 
implements Customers
 
     @Override
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
container,
-            @Nullable Bundle savedInstanceState) {
+                             @Nullable Bundle savedInstanceState) {
         rootView = inflater.inflate(R.layout.fragment_customer_list, 
container, false);
         ((FineractBaseActivity) 
getActivity()).getActivityComponent().inject(this);
         ButterKnife.bind(this, rootView);
@@ -144,13 +144,13 @@ public class CustomersFragment extends 
FineractBaseFragment implements Customers
     @Override
     public void onRefresh() {
         customerPresenter.fetchCustomers(0, false);
-        sweetUIErrorHandler.hideSweetErrorLayoutUI(rvCustomers,layoutError);
+        sweetUIErrorHandler.hideSweetErrorLayoutUI(rvCustomers, layoutError);
     }
 
     @OnClick(R.id.btn_try_again)
     void onRetry() {
         customerPresenter.fetchCustomers(0, false);
-        sweetUIErrorHandler.hideSweetErrorLayoutUI(rvCustomers,layoutError);
+        sweetUIErrorHandler.hideSweetErrorLayoutUI(rvCustomers, layoutError);
     }
 
     @Override
@@ -164,7 +164,7 @@ public class CustomersFragment extends FineractBaseFragment 
implements Customers
         swipeRefreshLayout.setColorSchemeColors(getActivity()
                 .getResources().getIntArray(R.array.swipeRefreshColors));
         swipeRefreshLayout.setOnRefreshListener(this);
-        sweetUIErrorHandler = new SweetUIErrorHandler(getActivity(),rootView);
+        sweetUIErrorHandler = new SweetUIErrorHandler(getActivity(), rootView);
     }
 
     @OnClick(R.id.fab_add_customer)
@@ -193,7 +193,8 @@ public class CustomersFragment extends FineractBaseFragment 
implements Customers
     public void showEmptyCustomers(String message) {
         showRecyclerView(false);
         
sweetUIErrorHandler.showSweetCustomErrorUI(getString(R.string.customer),
-                
getString(Integer.parseInt(message)),R.drawable.ic_customer_black_24dp,rvCustomers,layoutError);
+                getString(Integer.parseInt(message)),
+                R.drawable.ic_customer_black_24dp, rvCustomers, layoutError);
     }
 
     @Override
@@ -231,18 +232,18 @@ public class CustomersFragment extends 
FineractBaseFragment implements Customers
     public void showNoInternetConnection() {
         showRecyclerView(false);
         showFineractNoInternetUI();
-        
sweetUIErrorHandler.showSweetNoInternetUI(swipeRefreshLayout,layoutError);
+        sweetUIErrorHandler.showSweetNoInternetUI(swipeRefreshLayout, 
layoutError);
     }
 
     @Override
     public void showError(String message) {
         if (customerAdapter.getItemCount() != 0) {
             sweetUIErrorHandler.showSweetCustomErrorUI(message,
-                    
R.drawable.ic_error_black_24dp,swipeRefreshLayout,layoutError);
+                    R.drawable.ic_error_black_24dp, swipeRefreshLayout, 
layoutError);
         } else {
             showRecyclerView(false);
             
sweetUIErrorHandler.showSweetCustomErrorUI(getString(R.string.customers),
-                    
R.drawable.ic_error_black_24dp,swipeRefreshLayout,layoutError);
+                    R.drawable.ic_error_black_24dp, swipeRefreshLayout, 
layoutError);
         }
     }
 
@@ -276,7 +277,7 @@ public class CustomersFragment extends FineractBaseFragment 
implements Customers
 
             @Override
             public boolean onQueryTextChange(String newText) {
-                if(TextUtils.isEmpty(newText)){
+                if (TextUtils.isEmpty(newText)) {
                     customerAdapter.setCustomers(customers);
                 }
 
@@ -306,8 +307,9 @@ public class CustomersFragment extends FineractBaseFragment 
implements Customers
     private void findCustomer(String query) {
 
         if (rgSearch.getCheckedRadioButtonId() == -1) {
-            
Toaster.show(swipeRefreshLayout,getString(R.string.error_finding_customer_options),
 Toaster.SHORT);
-        }else if (rbOnline.isChecked()) {
+            Toaster.show(swipeRefreshLayout, 
getString(R.string.error_finding_customer_options),
+                    Toaster.SHORT);
+        } else if (rbOnline.isChecked()) {
             customerPresenter.searchCustomerOnline(query);
         }
     }
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
index c49c7a3..5466c7f 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerlist/CustomersPresenter.java
@@ -23,7 +23,7 @@ import io.reactivex.schedulers.Schedulers;
 
 /**
  * @author Rajan Maurya
- *         On 20/06/17.
+ * On 20/06/17.
  */
 @ConfigPersistent
 public class CustomersPresenter extends BasePresenter<CustomersContract.View>
@@ -37,7 +37,7 @@ public class CustomersPresenter extends 
BasePresenter<CustomersContract.View>
 
     @Inject
     public CustomersPresenter(@ApplicationContext Context context,
-            DbManagerCustomer dataManager) {
+                              DbManagerCustomer dataManager) {
         super(context);
         dataManagerCustomer = dataManager;
         compositeDisposable = new CompositeDisposable();
@@ -118,24 +118,25 @@ public class CustomersPresenter extends 
BasePresenter<CustomersContract.View>
         getMvpView().showProgressbar();
         compositeDisposable.add(
                 dataManagerCustomer.fetchCustomer(query)
-                .subscribeOn(Schedulers.io())
-                .observeOn(AndroidSchedulers.mainThread())
-                .subscribeWith(new DisposableObserver<Customer>(){
-                    @Override
-                    public void onNext(Customer value) {
-                        getMvpView().hideProgressbar();
-                        getMvpView().searchCustomerList(value);
-                    }
-
-                    @Override
-                    public void onError(Throwable e) {
-                        
showExceptionError(e,context.getString(R.string.error_finding_customer));
-                    }
-
-                    @Override
-                    public void onComplete() {
-
-                    }
-                }));
+                        .subscribeOn(Schedulers.io())
+                        .observeOn(AndroidSchedulers.mainThread())
+                        .subscribeWith(new DisposableObserver<Customer>() {
+                            @Override
+                            public void onNext(Customer value) {
+                                getMvpView().hideProgressbar();
+                                getMvpView().searchCustomerList(value);
+                            }
+
+                            @Override
+                            public void onError(Throwable e) {
+                                showExceptionError(e,
+                                        
context.getString(R.string.error_finding_customer));
+                            }
+
+                            @Override
+                            public void onComplete() {
+
+                            }
+                        }));
     }
 }
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/CustomerProfileActivity.java
 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/CustomerProfileActivity.java
index 7bed36d..d424430 100644
--- 
a/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/CustomerProfileActivity.java
+++ 
b/app/src/main/java/org/apache/fineract/ui/online/customers/customerprofile/CustomerProfileActivity.java
@@ -17,6 +17,7 @@ import android.view.MenuItem;
 import android.widget.ImageView;
 
 import com.github.therajanmaurya.sweeterror.SweetUIErrorHandler;
+
 import org.apache.fineract.R;
 import org.apache.fineract.ui.base.FineractBaseActivity;
 import org.apache.fineract.ui.base.Toaster;
@@ -35,7 +36,7 @@ import butterknife.ButterKnife;
 
 /**
  * @author Rajan Maurya
- *         On 06/08/17.
+ * On 06/08/17.
  */
 public class CustomerProfileActivity extends FineractBaseActivity
         implements CustomerProfileContract.View, RefreshProfileImage {
@@ -150,7 +151,7 @@ public class CustomerProfileActivity extends 
FineractBaseActivity
 
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] 
permissions,
-            @NonNull int[] grantResults) {
+                                           @NonNull int[] grantResults) {
         switch (requestCode) {
             case ConstantKeys.PERMISSIONS_REQUEST_CAMERA: {
                 if (grantResults.length > 0
@@ -167,15 +168,17 @@ public class CustomerProfileActivity extends 
FineractBaseActivity
     @Override
     public void refreshUI() {
         loadCustomerPortrait();
-        
sweetUIErrorHandler.hideSweetErrorLayoutUI(ivCustomerProfile,errorView);
+        sweetUIErrorHandler.hideSweetErrorLayoutUI(ivCustomerProfile, 
errorView);
     }
 
     @Override
-    public void showNoInternetConnection() 
{sweetUIErrorHandler.showSweetNoInternetUI(ivCustomerProfile,errorView);
+    public void showNoInternetConnection() {
+        sweetUIErrorHandler.showSweetNoInternetUI(ivCustomerProfile, 
errorView);
     }
 
     @Override
-    public void showError(String message) 
{sweetUIErrorHandler.showSweetCustomErrorUI(message,
-            R.drawable.ic_error_black_24dp,ivCustomerProfile,errorView);
+    public void showError(String message) {
+        sweetUIErrorHandler.showSweetCustomErrorUI(message,
+                R.drawable.ic_error_black_24dp, ivCustomerProfile, errorView);
     }
 }
diff --git 
a/app/src/main/java/org/apache/fineract/ui/product/ProductContract.kt 
b/app/src/main/java/org/apache/fineract/ui/product/ProductContract.kt
new file mode 100644
index 0000000..01bb87b
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/product/ProductContract.kt
@@ -0,0 +1,31 @@
+package org.apache.fineract.ui.product
+
+import org.apache.fineract.data.models.product.Product
+import org.apache.fineract.ui.base.MvpView
+
+interface ProductContract {
+
+    interface View : MvpView {
+
+        fun showUserInterface()
+
+        fun showProduct(products: List<Product>)
+
+        fun showEmptyProduct()
+
+        fun showRecyclerView(status: Boolean)
+
+        fun showProgressbar()
+
+        fun hideProgressbar()
+
+        fun searchedProduct(product: Product)
+    }
+
+    interface Presenter {
+
+        fun getProductsPage()
+
+        fun searchProduct(identifier: String)
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/apache/fineract/ui/product/ProductFragment.kt 
b/app/src/main/java/org/apache/fineract/ui/product/ProductFragment.kt
new file mode 100644
index 0000000..d891470
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/product/ProductFragment.kt
@@ -0,0 +1,170 @@
+package org.apache.fineract.ui.product
+
+import android.app.SearchManager
+import android.content.Context
+import android.os.Bundle
+import android.support.v4.widget.SwipeRefreshLayout
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.SearchView
+import android.text.TextUtils
+import android.view.*
+import kotlinx.android.synthetic.main.fragment_product.*
+import kotlinx.android.synthetic.main.layout_exception_handler.*
+import org.apache.fineract.R
+import org.apache.fineract.data.models.product.Product
+import org.apache.fineract.ui.adapters.ProductAdapter
+import org.apache.fineract.ui.base.FineractBaseActivity
+import org.apache.fineract.ui.base.FineractBaseFragment
+import java.util.*
+import javax.inject.Inject
+
+
+class ProductFragment : FineractBaseFragment(), ProductContract.View,
+        SwipeRefreshLayout.OnRefreshListener {
+
+    @Inject
+    lateinit var productPresenter: ProductPresenter
+
+    @Inject
+    lateinit var productAdapter: ProductAdapter
+
+    lateinit var productList: List<Product>
+
+    companion object {
+        fun newInstance() = ProductFragment().apply {
+            val args = Bundle()
+            arguments = args
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setHasOptionsMenu(true)
+        productList = ArrayList()
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                              savedInstanceState: Bundle?): View? {
+        // Inflate the layout for this fragment
+        val rootView = inflater.inflate(R.layout.fragment_product, container, 
false)
+        (activity as FineractBaseActivity).activityComponent.inject(this)
+        productPresenter.attachView(this)
+        initializeFineractUIErrorHandler(activity, rootView)
+        return rootView
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        showUserInterface()
+
+        btn_try_again.setOnClickListener {
+            layoutError.visibility = View.GONE
+            productPresenter.getProductsPage()
+        }
+
+        productPresenter.getProductsPage()
+    }
+
+    override fun showUserInterface() {
+
+        setToolbarTitle(getString(R.string.products))
+        val layoutManager = LinearLayoutManager(activity)
+        layoutManager.orientation = LinearLayoutManager.VERTICAL
+        rvProduct.layoutManager = layoutManager
+        rvProduct.setHasFixedSize(true)
+        rvProduct.adapter = productAdapter
+
+        swipeContainer.setColorSchemeColors(*activity!!
+                .resources.getIntArray(R.array.swipeRefreshColors))
+        swipeContainer.setOnRefreshListener(this)
+
+    }
+
+    override fun onRefresh() {
+        productPresenter.getProductsPage()
+    }
+
+    override fun showProduct(products: List<Product>) {
+        showRecyclerView(true)
+        this.productList = products
+        productAdapter.setProductsList(products)
+    }
+
+
+    override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
+        super.onCreateOptionsMenu(menu, inflater)
+        inflater?.inflate(R.menu.menu_product_search, menu)
+        setUpSearchInterface(menu)
+    }
+
+    private fun setUpSearchInterface(menu: Menu?) {
+
+        val searchManager = activity?.getSystemService(Context.SEARCH_SERVICE) 
as? SearchManager
+        val searchView = menu?.findItem(R.id.product_search)?.actionView as? 
SearchView
+
+        
searchView?.setSearchableInfo(searchManager?.getSearchableInfo(activity?.componentName))
+
+        searchView?.setOnQueryTextListener(object : 
SearchView.OnQueryTextListener {
+            override fun onQueryTextSubmit(query: String): Boolean {
+                productPresenter.searchProduct(query)
+                return false
+            }
+
+            override fun onQueryTextChange(newText: String): Boolean {
+                if (TextUtils.isEmpty(newText)) {
+                    showRecyclerView(true)
+                    productAdapter.setProductsList(productList)
+                }
+
+                return false
+            }
+        })
+
+    }
+
+    override fun showEmptyProduct() {
+        showRecyclerView(false)
+        showFineractEmptyUI(getString(R.string.products), 
getString(R.string.products),
+                R.drawable.ic_person_outline_black_24dp)
+    }
+
+    override fun showRecyclerView(status: Boolean) {
+        if (status) {
+            rvProduct.visibility = View.VISIBLE
+            layoutError.visibility = View.GONE
+        } else {
+            rvProduct.visibility = View.GONE
+            layoutError.visibility = View.VISIBLE
+        }
+    }
+
+    override fun showProgressbar() {
+        swipeContainer.isRefreshing = true
+    }
+
+    override fun hideProgressbar() {
+        swipeContainer.isRefreshing = false
+    }
+
+    override fun searchedProduct(product: Product) {
+        showRecyclerView(true)
+        productAdapter.setProductsList(Collections.singletonList(product))
+    }
+
+    override fun showNoInternetConnection() {
+        showRecyclerView(false)
+        showNoInternetConnection()
+    }
+
+    override fun showError(message: String) {
+        showRecyclerView(false)
+        showFineractErrorUI(getString(R.string.products))
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        productPresenter.detachView()
+    }
+
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/product/ProductPresenter.kt 
b/app/src/main/java/org/apache/fineract/ui/product/ProductPresenter.kt
new file mode 100644
index 0000000..37dd949
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/product/ProductPresenter.kt
@@ -0,0 +1,80 @@
+package org.apache.fineract.ui.product
+
+import android.content.Context
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.CompositeDisposable
+import io.reactivex.observers.DisposableObserver
+import io.reactivex.schedulers.Schedulers
+import org.apache.fineract.R
+import org.apache.fineract.data.datamanager.api.DataManagerProduct
+import org.apache.fineract.data.models.product.Product
+import org.apache.fineract.data.models.product.ProductPage
+import org.apache.fineract.injection.ApplicationContext
+import org.apache.fineract.ui.base.BasePresenter
+import javax.inject.Inject
+
+class ProductPresenter @Inject constructor(@ApplicationContext context: 
Context,
+                                           val dataManagerProduct: 
DataManagerProduct)
+    : BasePresenter<ProductContract.View>(context), ProductContract.Presenter {
+
+    val compositeDisposable = CompositeDisposable()
+
+    override fun getProductsPage() {
+        checkViewAttached()
+        mvpView.showProgressbar()
+
+        compositeDisposable.add(dataManagerProduct.fetchProductPage()
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(object : DisposableObserver<ProductPage>() {
+                    override fun onComplete() {
+
+                    }
+
+                    override fun onNext(productPage: ProductPage) {
+
+                        mvpView.hideProgressbar()
+
+                        if (productPage.elements != null) {
+                            if (productPage.elements.isEmpty()) {
+                                mvpView.showEmptyProduct()
+                            } else {
+                                mvpView.showProduct(productPage.elements)
+                            }
+                        }
+
+                    }
+
+                    override fun onError(e: Throwable) {
+                        mvpView.hideProgressbar()
+                        showExceptionError(e, 
context.getString(R.string.error_fetching_products))
+                    }
+                })
+        )
+    }
+
+    override fun searchProduct(identifier: String) {
+        checkViewAttached()
+        mvpView.showProgressbar()
+
+        compositeDisposable.add(dataManagerProduct.searchProduct(identifier)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(object : DisposableObserver<Product>() {
+                    override fun onComplete() {
+
+                    }
+
+                    override fun onNext(product: Product) {
+                        mvpView.hideProgressbar()
+                        mvpView.searchedProduct(product)
+                    }
+
+                    override fun onError(e: Throwable) {
+                        mvpView.hideProgressbar()
+                        showExceptionError(e, 
context.getString(R.string.products))
+                    }
+                })
+        )
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_product.xml 
b/app/src/main/res/layout/fragment_product.xml
new file mode 100644
index 0000000..59fa9de
--- /dev/null
+++ b/app/src/main/res/layout/fragment_product.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white">
+
+    <android.support.v4.widget.SwipeRefreshLayout
+        android:id="@+id/swipeContainer"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/rvProduct"
+            android:layout_width="wrap_content"
+            android:layout_height="0dp"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="@dimen/layout_padding_30dp"
+            android:layout_weight="1" />
+    </android.support.v4.widget.SwipeRefreshLayout>
+
+    <include
+        android:id="@+id/layoutError"
+        layout="@layout/layout_exception_handler"
+        android:visibility="gone" />
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_product.xml 
b/app/src/main/res/layout/item_product.xml
new file mode 100644
index 0000000..3075f3b
--- /dev/null
+++ b/app/src/main/res/layout/item_product.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:id="@+id/ll_loan_accounts"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:clickable="true"
+    android:foreground="?android:attr/selectableItemBackground"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:id="@+id/ll_product"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:orientation="vertical"
+            android:padding="@dimen/layout_padding_24dp">
+
+            <TextView
+                android:id="@+id/tv_product_identifier"
+                style="@style/Base.TextAppearance.AppCompat.Medium"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:textColor="@color/black"
+                tools:text="Product Identifier" />
+
+            <TextView
+                android:id="@+id/tv_modified_by"
+                style="@style/Base.TextAppearance.AppCompat.Small"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:ellipsize="end"
+                android:lines="1"
+                tools:text="Last modified by: rajan" />
+
+            <TextView
+                android:id="@+id/tv_modified_on"
+                style="@style/Base.TextAppearance.AppCompat.Small"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                tools:text="Last modified on: 10 July 2018" />
+
+        </LinearLayout>
+
+        <TextView
+            android:id="@+id/tv_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginEnd="@dimen/layout_padding_24dp"
+            android:layout_marginRight="@dimen/layout_padding_24dp"
+            android:textSize="@dimen/text_medium"
+            tools:text="Name" />
+
+    </LinearLayout>
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.2dp"
+        android:background="#E7DFDF" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_navigation_drawer.xml 
b/app/src/main/res/menu/menu_navigation_drawer.xml
index 6b9b605..6c1f261 100644
--- a/app/src/main/res/menu/menu_navigation_drawer.xml
+++ b/app/src/main/res/menu/menu_navigation_drawer.xml
@@ -46,6 +46,12 @@
             android:id="@+id/item_teller"
             android:title="@string/teller"/>
 
+        <item
+            android:checked="true"
+            android:icon="@drawable/ic_customer_black_24dp"
+            android:id="@+id/item_product"
+            android:title="@string/products"/>
+
     </group>
 
     <group
diff --git a/app/src/main/res/menu/menu_product_search.xml 
b/app/src/main/res/menu/menu_product_search.xml
new file mode 100644
index 0000000..b1b75de
--- /dev/null
+++ b/app/src/main/res/menu/menu_product_search.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:app="http://schemas.android.com/apk/res-auto";
+      xmlns:android="http://schemas.android.com/apk/res/android";>
+
+    <item
+        android:id="@+id/product_search"
+        android:icon="@drawable/ic_search_black_24dp"
+        android:title="@string/search_product"
+        app:showAsAction="always"
+        app:actionViewClass="android.support.v7.widget.SearchView"/>
+
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index 92ef199..e0c98c9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -182,6 +182,7 @@
     <string name="search_customer">Search customer</string>
     <string name="online">Online</string>
     <string name="offline">Offline</string>
+    <string name="search_product">Search product</string>
     <string name="select_product">Select product</string>
     <string name="no_beneficiary">No beneficiaries</string>
     <string name="activities_created_by_on">%1$s, %2$s</string>
@@ -279,6 +280,7 @@
     <string name="error_fetching_ledger">Error fetching ledger</string>
     <string name="error_fetching_accounts">Error fetching accounts</string>
     <string name="error_fetching_teller">Error fetching teller</string>
+    <string name="error_fetching_products">Error fetching products</string>
     <string name="error_sorry_not_able_to_load">Sorry we weren\'t able to 
load</string>
     <string name="error_fetching_customer_details">Failed to fetch customer 
details</string>
     <string name="error_fetching_deposit_product">Failed to fetch deposit 
product</string>
diff --git a/app/src/main/resources/productPage.json 
b/app/src/main/resources/productPage.json
index 00f806e..6010b89 100644
--- a/app/src/main/resources/productPage.json
+++ b/app/src/main/resources/productPage.json
@@ -1,25 +1,124 @@
 {
   "elements": [
     {
-      "identifier": "identifier",
-      "name": "name",
+      "identifier": "identifier1",
+      "name": "name1",
       "termRange": {
-        "temporalUnit": "temporalUnit",
-        "maximum": 2
+        "temporalUnit": "WEEKS",
+        "maximum": 45
       },
       "balanceRange": {
-        "minimum": 1000,
-        "maximum": 15000
+        "minimum": 0,
+        "maximum": 1000
       },
       "interestRange": {
-        "minimum": 3,
-        "maximum": 7.5
+        "minimum": 0,
+        "maximum": 1000
       },
       "interestBasis": "CURRENT_BALANCE",
       "patternPackage": "patternPackage",
       "description": "description",
       "currencyCode": "currencyCode",
-      "minorCurrencyUnitDigits": 2,
+      "minorCurrencyUnitDigits": 0,
+      "accountAssignments": [
+        {
+          "designator": "designator",
+          "accountIdentifier": "accountIdentifier",
+          "ledgerIdentifier": "ledgerIdentifier"
+        }
+      ],
+      "parameters": "parameters",
+      "createdOn": "createdOn",
+      "createdBy": "createdBy",
+      "lastModifiedOn": "lastModifiedOn",
+      "lastModifiedBy": "lastModifiedBy"
+    },
+    {
+      "identifier": "identifier2",
+      "name": "name2",
+      "termRange": {
+        "temporalUnit": "WEEKS",
+        "maximum": 45
+      },
+      "balanceRange": {
+        "minimum": 0,
+        "maximum": 1000
+      },
+      "interestRange": {
+        "minimum": 0,
+        "maximum": 1000
+      },
+      "interestBasis": "CURRENT_BALANCE",
+      "patternPackage": "patternPackage",
+      "description": "description",
+      "currencyCode": "currencyCode",
+      "minorCurrencyUnitDigits": 0,
+      "accountAssignments": [
+        {
+          "designator": "designator",
+          "accountIdentifier": "accountIdentifier",
+          "ledgerIdentifier": "ledgerIdentifier"
+        }
+      ],
+      "parameters": "parameters",
+      "createdOn": "createdOn",
+      "createdBy": "createdBy",
+      "lastModifiedOn": "lastModifiedOn",
+      "lastModifiedBy": "lastModifiedBy"
+    },
+    {
+      "identifier": "identifier3",
+      "name": "name3",
+      "termRange": {
+        "temporalUnit": "WEEKS",
+        "maximum": 45
+      },
+      "balanceRange": {
+        "minimum": 0,
+        "maximum": 1000
+      },
+      "interestRange": {
+        "minimum": 0,
+        "maximum": 1000
+      },
+      "interestBasis": "CURRENT_BALANCE",
+      "patternPackage": "patternPackage",
+      "description": "description",
+      "currencyCode": "currencyCode",
+      "minorCurrencyUnitDigits": 0,
+      "accountAssignments": [
+        {
+          "designator": "designator",
+          "accountIdentifier": "accountIdentifier",
+          "ledgerIdentifier": "ledgerIdentifier"
+        }
+      ],
+      "parameters": "parameters",
+      "createdOn": "createdOn",
+      "createdBy": "createdBy",
+      "lastModifiedOn": "lastModifiedOn",
+      "lastModifiedBy": "lastModifiedBy"
+    },
+    {
+      "identifier": "identifier4",
+      "name": "name4",
+      "termRange": {
+        "temporalUnit": "WEEKS",
+        "maximum": 45
+      },
+      "balanceRange": {
+        "minimum": 0,
+        "maximum": 1000
+      },
+      "interestRange": {
+        "minimum": 0,
+        "maximum": 1000
+      },
+      "interestBasis": "CURRENT_BALANCE",
+      "patternPackage": "patternPackage",
+      "description": "description",
+      "currencyCode": "currencyCode",
+      "minorCurrencyUnitDigits": 0,
       "accountAssignments": [
         {
           "designator": "designator",
@@ -35,5 +134,5 @@
     }
   ],
   "totalPages": 1,
-  "totalElements": 1
+  "totalElements": 4
 }
\ No newline at end of file

Reply via email to