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