therajanmaurya closed pull request #14: feat : list and search tellers
URL: https://github.com/apache/fineract-cn-mobile/pull/14
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java 
b/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
index 29c2de8..d8f1f46 100644
--- a/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
+++ b/app/src/commonTest/java/org/apache/fineract/FakeJsonName.java
@@ -19,4 +19,5 @@
     public static final String ROLES = "role.json";
     public static final String LEDGER_PAGE = "ledgerPage.json";
     public static final String ACCOUNT_PAGE = "accountsPage.json";
+    public static final String TELLER = "teller.json";
 }
diff --git 
a/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java 
b/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
index c510bc1..70ccafb 100644
--- a/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
+++ b/app/src/commonTest/java/org/apache/fineract/FakeRemoteDataSource.java
@@ -15,6 +15,7 @@
 import org.apache.fineract.data.models.loan.LoanAccountPage;
 import org.apache.fineract.data.models.payment.PlannedPaymentPage;
 import org.apache.fineract.data.models.rolesandpermission.Role;
+import org.apache.fineract.data.models.teller.Teller;
 
 import java.util.List;
 
@@ -89,4 +90,8 @@ public static AccountPage getAccountPage() {
         return testDataFactory.getObjectTypePojo(AccountPage.class, 
FakeJsonName.ACCOUNT_PAGE);
     }
 
+    public static List<Teller> getTeller() {
+        return testDataFactory.getListTypePojo(new TypeToken<List<Teller>>() {
+        }, FakeJsonName.TELLER);
+    }
 }
diff --git 
a/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerTeller.kt 
b/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerTeller.kt
new file mode 100644
index 0000000..898ad3b
--- /dev/null
+++ 
b/app/src/main/java/org/apache/fineract/data/datamanager/DataManagerTeller.kt
@@ -0,0 +1,30 @@
+package org.apache.fineract.data.datamanager
+
+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.models.teller.Teller
+import org.apache.fineract.data.remote.BaseApiManager
+import javax.inject.Inject
+import org.apache.fineract.FakeRemoteDataSource
+import org.apache.fineract.data.datamanager.api.DataManagerAuth
+import org.apache.fineract.data.datamanager.api.FineractBaseDataManager
+import javax.inject.Singleton
+
+@Singleton
+class DataManagerTeller @Inject constructor(val baseManagerApi: BaseApiManager,
+                                            dataManagerAuth: DataManagerAuth,
+                                            val preferencesHelper: 
PreferencesHelper)
+    : FineractBaseDataManager(dataManagerAuth, preferencesHelper) {
+
+    fun getTellers(): Observable<List<Teller>> =
+            
baseManagerApi.tellerService.getTellerList(preferencesHelper.tenantIdentifier)
+                    .onErrorResumeNext(Function<Throwable, 
ObservableSource<List<Teller>>>
+                    { Observable.just(FakeRemoteDataSource.getTeller()) })
+
+    fun findTeller(tellerCode: String): Observable<Teller> = 
baseManagerApi.tellerService
+            .searchTeller(preferencesHelper.tenantIdentifier, tellerCode)
+            .onErrorResumeNext(Function<Throwable, ObservableSource<Teller>>
+            { Observable.just(FakeRemoteDataSource.getTeller()[0]) })
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/apache/fineract/data/models/teller/Teller.kt 
b/app/src/main/java/org/apache/fineract/data/models/teller/Teller.kt
new file mode 100644
index 0000000..61bb53e
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/data/models/teller/Teller.kt
@@ -0,0 +1,44 @@
+package org.apache.fineract.data.models.teller
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+import java.math.BigDecimal
+
+@Parcelize
+data class Teller(
+
+        @SerializedName("code") val code: String? = null,
+        @SerializedName("password") val password: String? = null,
+        @SerializedName("cashdrawLimit") val cashdrawLimit: BigDecimal? = null,
+        @SerializedName("tellerAccountIdentifier") val 
tellerAccountIdentifier: String? = null,
+        @SerializedName("vaultAccountIdentifier") val vaultAccountIdentifier: 
String? = null,
+        @SerializedName("chequesReceivableAccount") val 
chequesReceivableAccount: String? = null,
+        @SerializedName("cashOverShortAccount") val cashOverShortAccount: 
String? = null,
+        @SerializedName("denominationRequired") val denominationRequired: 
Boolean = false,
+        @SerializedName("assignedEmployee") val assignedEmployee: String? = 
null,
+        @SerializedName("state") val state: State? = null,
+        @SerializedName("createdBy") val createdBy: String? = null,
+        @SerializedName("createdOn") val createdOn: String? = null,
+        @SerializedName("lastModifiedBy") val lastModifiedBy: String? = null,
+        @SerializedName("lastModifiedOn") val lastModifiedOn: String? = null,
+        @SerializedName("lastOpenedBy") val lastOpenedBy: String? = null,
+        @SerializedName("lastOpenedOn") val lastOpenedOn: String? = null
+
+) : Parcelable {
+
+    enum class State {
+
+        @SerializedName("ACTIVE")
+        ACTIVE,
+
+        @SerializedName("CLOSED")
+        CLOSED,
+
+        @SerializedName("OPEN")
+        OPEN,
+
+        @SerializedName("PAUSED")
+        PAUSED
+    }
+}
\ No newline at end of file
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 0b8e0de..74616c4 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
@@ -10,6 +10,7 @@
 import org.apache.fineract.data.services.IndividualLendingService;
 import org.apache.fineract.data.services.LoanService;
 import org.apache.fineract.data.services.RolesService;
+import org.apache.fineract.data.services.TellersService;
 
 import okhttp3.OkHttpClient;
 import okhttp3.logging.HttpLoggingInterceptor;
@@ -35,6 +36,7 @@
     private static AnonymousService anonymousService;
     private static RolesService rolesService;
     private static AccountingService accountingService;
+    private static TellersService tellerService;
 
     public BaseApiManager(Context context) {
         createService(context);
@@ -49,6 +51,7 @@ private static void init() {
         individualLendingService = createApi(IndividualLendingService.class);
         rolesService = createApi(RolesService.class);
         accountingService = createApi(AccountingService.class);
+        tellerService = createApi(TellersService.class);
     }
 
     private static void initAnonymous() {
@@ -121,4 +124,8 @@ public RolesService getRolesAndPermissionsService() {
     public  AccountingService getAccountingService() {
         return accountingService;
     }
+
+    public TellersService getTellerService() {
+        return tellerService;
+    }
 }
diff --git a/app/src/main/java/org/apache/fineract/data/remote/EndPoints.java 
b/app/src/main/java/org/apache/fineract/data/remote/EndPoints.java
index 4bd9a21..0e29bd0 100644
--- a/app/src/main/java/org/apache/fineract/data/remote/EndPoints.java
+++ b/app/src/main/java/org/apache/fineract/data/remote/EndPoints.java
@@ -16,5 +16,6 @@
     public static final String API_DEPOSIT_PATH = "/api/deposit/v1";
     public static final String API_PORTFOLIO_PATH = "/api/portfolio/v1";
     public static final String API_ACCOUNTING_PATH = "/api/accounting/v1";
+    public static final String API_TELLER_PATH = "/api/teller/v1";
 
 }
diff --git 
a/app/src/main/java/org/apache/fineract/data/services/TellersService.kt 
b/app/src/main/java/org/apache/fineract/data/services/TellersService.kt
new file mode 100644
index 0000000..08b6213
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/data/services/TellersService.kt
@@ -0,0 +1,17 @@
+package org.apache.fineract.data.services
+
+import io.reactivex.Observable
+import org.apache.fineract.data.models.teller.Teller
+import org.apache.fineract.data.remote.EndPoints
+import retrofit2.http.GET
+import retrofit2.http.Path
+
+interface TellersService {
+
+    @GET(EndPoints.API_TELLER_PATH + "/offices/{officeIdentifier}/teller")
+    fun getTellerList(@Path("officeIdentifier") officeIdentifier: String): 
Observable<List<Teller>>
+
+    @GET(EndPoints.API_TELLER_PATH + 
"/offices/{officeIdentifier}/teller/{tellerCode}")
+    fun searchTeller(@Path("officeIdentifier") officeIdentifier: String,
+                     @Path("tellerCode") tellerCode: String): 
Observable<Teller>
+}
\ 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 09e014e..e3cecba 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
@@ -44,6 +44,7 @@
 import org.apache.fineract.ui.online.login.LoginActivity;
 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 dagger.Subcomponent;
 
@@ -115,4 +116,6 @@
     void inject(LedgerFragment ledgerFragment);
 
     void inject(AccountsFragment accountsFragment);
+
+    void inject(TellerFragment tellerFragment);
 }
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 c24b5a9..635cfe0 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
@@ -15,6 +15,7 @@
 import org.apache.fineract.data.datamanager.api.DataManagerRoles;
 import org.apache.fineract.data.datamanager.database.DbManagerCustomer;
 import org.apache.fineract.data.datamanager.DataManagerAccounting;
+import org.apache.fineract.data.datamanager.DataManagerTeller;
 import org.apache.fineract.data.local.PreferencesHelper;
 import org.apache.fineract.data.local.database.helpers.DatabaseHelperCustomer;
 import org.apache.fineract.data.remote.BaseApiManager;
@@ -46,6 +47,7 @@
     DataManagerAnonymous dataManagerAnonymous();
     DataManagerRoles dataManagerRolesAndPermissions();
     DataManagerAccounting dataManagerAccounting();
+    DataManagerTeller dataManagerTeller();
     BaseApiManager baseApiManager();
     PreferencesHelper preferencesHelper();
 
diff --git a/app/src/main/java/org/apache/fineract/ui/adapters/TellerAdapter.kt 
b/app/src/main/java/org/apache/fineract/ui/adapters/TellerAdapter.kt
new file mode 100644
index 0000000..7eb2015
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/adapters/TellerAdapter.kt
@@ -0,0 +1,67 @@
+package org.apache.fineract.ui.adapters
+
+
+import android.content.Context
+import android.support.v7.widget.AppCompatImageView
+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_teller.view.*
+import org.apache.fineract.R
+import org.apache.fineract.data.models.teller.Teller
+import org.apache.fineract.injection.ApplicationContext
+import org.apache.fineract.utils.DateUtils
+import org.apache.fineract.utils.StatusUtils
+import javax.inject.Inject
+
+class TellerAdapter @Inject constructor(@ApplicationContext val context: 
Context)
+    : RecyclerView.Adapter<TellerAdapter.ViewHolder>() {
+
+    var tellers: List<Teller> = ArrayList()
+
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): 
ViewHolder {
+        val view = 
LayoutInflater.from(parent?.context).inflate(R.layout.item_teller,
+                parent, false)
+        return ViewHolder(view)
+    }
+
+    override fun getItemCount(): Int = tellers.size
+
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+
+        val teller = tellers[position]
+
+        holder.tellerIdentifier.text = teller.tellerAccountIdentifier
+
+        val modifiedBy = context.getString(R.string.last_modified_by) + 
context.getString(
+                R.string.colon) + teller.lastModifiedBy
+        holder.tvModifiedBy.text = modifiedBy
+
+        val lastModifiedOn = context.getString(R.string.last_modified_on) + 
context.getString(
+                R.string.colon) +
+                DateUtils.getDate(teller.lastModifiedOn,
+                        DateUtils.INPUT_DATE_FORMAT, 
DateUtils.OUTPUT_DATE_FORMAT)
+
+        StatusUtils.setTellerStatus(teller.state, holder.statusIndicator, 
context)
+
+        holder.tvModifiedOn.text = lastModifiedOn
+        holder.withDrawLimit.text = tellers[position].cashdrawLimit.toString()
+    }
+
+    fun setTellerList(tellers: List<Teller>) {
+        this.tellers = tellers
+        notifyDataSetChanged()
+    }
+
+    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+
+        val tellerIdentifier: TextView = itemView.tv_teller_identifier
+        val tvModifiedBy: TextView = itemView.tv_modified_by
+        val tvModifiedOn: TextView = itemView.tv_modified_on
+        val withDrawLimit: TextView = itemView.tv_cashWithdraw_limit
+        val statusIndicator: AppCompatImageView = itemView.iv_status_indicator
+    }
+}
\ No newline at end of file
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 fe07f9d..c3c401e 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
@@ -23,6 +23,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.utils.MaterialDialog;
 
 import javax.inject.Inject;
@@ -120,6 +121,9 @@ public boolean onNavigationItemSelected(@NonNull MenuItem 
item) {
                 break;
             case R.id.item_accounts:
                 replaceFragment(AccountsFragment.Companion.newInstance(), 
true, R.id.container);
+            case R.id.item_teller:
+                replaceFragment(TellerFragment.Companion.newInstance(), true, 
R.id.container);
+                break;
         }
 
         drawerLayout.closeDrawer(Gravity.START);
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/teller/TellerContract.kt 
b/app/src/main/java/org/apache/fineract/ui/online/teller/TellerContract.kt
new file mode 100644
index 0000000..58d3821
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/online/teller/TellerContract.kt
@@ -0,0 +1,29 @@
+package org.apache.fineract.ui.online.teller
+
+import org.apache.fineract.data.models.teller.Teller
+import org.apache.fineract.ui.base.MvpView
+
+interface TellerContract {
+
+    interface View : MvpView {
+
+        fun showUserInterface()
+
+        fun showTellers(tellers: List<Teller>)
+
+        fun showEmptyTellers()
+
+        fun showRecyclerView(status: Boolean)
+
+        fun showProgressbar()
+
+        fun hideProgressbar()
+
+        fun searchedTeller(teller: Teller)
+    }
+
+    interface Presenter {
+
+        fun fetchTellers()
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/teller/TellerFragment.kt 
b/app/src/main/java/org/apache/fineract/ui/online/teller/TellerFragment.kt
new file mode 100644
index 0000000..a5799f6
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/online/teller/TellerFragment.kt
@@ -0,0 +1,167 @@
+package org.apache.fineract.ui.online.teller
+
+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_teller.*
+import kotlinx.android.synthetic.main.layout_exception_handler.*
+import org.apache.fineract.R
+import org.apache.fineract.data.models.teller.Teller
+import org.apache.fineract.ui.adapters.TellerAdapter
+import org.apache.fineract.ui.base.FineractBaseActivity
+import org.apache.fineract.ui.base.FineractBaseFragment
+import java.util.*
+import javax.inject.Inject
+
+
+class TellerFragment : FineractBaseFragment(), TellerContract.View, 
SwipeRefreshLayout.OnRefreshListener {
+
+    @Inject
+    lateinit var tellPresenter: TellerPresenter
+
+    @Inject
+    lateinit var tellerAdapter: TellerAdapter
+
+    lateinit var tellerList: List<Teller>
+
+    companion object {
+        fun newInstance(): TellerFragment = TellerFragment().apply {
+            val args = Bundle()
+            this.arguments = args
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setHasOptionsMenu(true)
+        tellerList = ArrayList()
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                              savedInstanceState: Bundle?): View? {
+
+        val rootView = inflater.inflate(R.layout.fragment_teller, container, 
false)
+
+        (activity as FineractBaseActivity).activityComponent.inject(this)
+        tellPresenter.attachView(this)
+        initializeFineractUIErrorHandler(activity, rootView)
+
+        return rootView
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        showUserInterface()
+        tellPresenter.fetchTellers()
+
+        btn_try_again.setOnClickListener {
+            layoutError.visibility = View.GONE
+            tellPresenter.fetchTellers()
+        }
+    }
+
+    override fun showUserInterface() {
+
+        setToolbarTitle(getString(R.string.teller))
+        val llManager = LinearLayoutManager(activity)
+        llManager.orientation = LinearLayoutManager.VERTICAL
+        rvTellers.layoutManager = llManager
+        rvTellers.setHasFixedSize(true)
+        rvTellers.adapter = tellerAdapter
+
+        swipeContainer.setColorSchemeColors(*activity!!
+                .resources.getIntArray(R.array.swipeRefreshColors))
+        swipeContainer.setOnRefreshListener(this)
+    }
+
+    override fun showTellers(tellers: List<Teller>) {
+        showRecyclerView(true)
+        tellerList = tellers
+        tellerAdapter.setTellerList(tellers)
+    }
+
+    override fun onRefresh() {
+        tellPresenter.fetchTellers()
+    }
+
+    override fun showEmptyTellers() {
+        showRecyclerView(false)
+        showFineractEmptyUI(getString(R.string.teller), 
getString(R.string.teller),
+                R.drawable.ic_person_outline_black_24dp)
+    }
+
+    override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
+        super.onCreateOptionsMenu(menu, inflater)
+        inflater?.inflate(R.menu.menu_teller_search, menu)
+        setUpSearchInterface(menu)
+    }
+
+    private fun setUpSearchInterface(menu: Menu?) {
+
+        val searchManager = activity?.getSystemService(Context.SEARCH_SERVICE) 
as? SearchManager
+        val searchView = menu?.findItem(R.id.teller_search)?.actionView as? 
SearchView
+
+        
searchView?.setSearchableInfo(searchManager?.getSearchableInfo(activity?.componentName))
+
+        searchView?.setOnQueryTextListener(object : 
SearchView.OnQueryTextListener {
+            override fun onQueryTextSubmit(query: String): Boolean {
+                tellPresenter.searchTeller(query)
+                return false
+            }
+
+            override fun onQueryTextChange(newText: String): Boolean {
+                if (TextUtils.isEmpty(newText)) {
+                    showRecyclerView(true)
+                    tellerAdapter.setTellerList(tellerList)
+                }
+
+                return false
+            }
+        })
+
+    }
+
+    override fun searchedTeller(teller: Teller) {
+        showRecyclerView(true)
+        tellerAdapter.setTellerList(Collections.singletonList(teller))
+    }
+
+    override fun showRecyclerView(status: Boolean) {
+        if (status) {
+            rvTellers.visibility = View.VISIBLE
+            layoutError.visibility = View.GONE
+        } else {
+            rvTellers.visibility = View.GONE
+            layoutError.visibility = View.VISIBLE
+        }
+    }
+
+    override fun showProgressbar() {
+        swipeContainer.isRefreshing = true
+    }
+
+    override fun hideProgressbar() {
+        swipeContainer.isRefreshing = false
+    }
+
+    override fun showError(message: String) {
+        showRecyclerView(false)
+        showFineractErrorUI(getString(R.string.teller))
+    }
+
+    override fun showNoInternetConnection() {
+        showRecyclerView(false)
+        showFineractNoInternetUI()
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        tellPresenter.detachView()
+    }
+}
diff --git 
a/app/src/main/java/org/apache/fineract/ui/online/teller/TellerPresenter.kt 
b/app/src/main/java/org/apache/fineract/ui/online/teller/TellerPresenter.kt
new file mode 100644
index 0000000..ab2de29
--- /dev/null
+++ b/app/src/main/java/org/apache/fineract/ui/online/teller/TellerPresenter.kt
@@ -0,0 +1,80 @@
+package org.apache.fineract.ui.online.teller
+
+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.DataManagerTeller
+import org.apache.fineract.data.models.teller.Teller
+import org.apache.fineract.injection.ApplicationContext
+import org.apache.fineract.ui.base.BasePresenter
+import javax.inject.Inject
+
+class TellerPresenter @Inject constructor(@ApplicationContext context: Context,
+                                          private val dataManagerTeller: 
DataManagerTeller) :
+        BasePresenter<TellerContract.View>(context), TellerContract.Presenter {
+
+    val compositeDisposable = CompositeDisposable()
+
+    override fun fetchTellers() {
+
+        checkViewAttached()
+        mvpView.showProgressbar()
+
+        compositeDisposable.add(dataManagerTeller.getTellers()
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(object : DisposableObserver<List<Teller>>() {
+                    override fun onComplete() {
+
+                    }
+
+                    override fun onNext(tellerList: List<Teller>) {
+                        mvpView.hideProgressbar()
+
+                        if (!tellerList.isEmpty()) {
+                            mvpView.showTellers(tellerList)
+                        } else {
+                            mvpView.showEmptyTellers()
+                        }
+                    }
+
+                    override fun onError(throwable: Throwable) {
+                        mvpView.hideProgressbar()
+                        showExceptionError(throwable,
+                                
context.getString(R.string.error_fetching_teller))
+                    }
+                }))
+    }
+
+    fun searchTeller(query: String) {
+
+        checkViewAttached()
+        mvpView.showProgressbar()
+
+        compositeDisposable.add(dataManagerTeller.findTeller(query)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribeWith(object : DisposableObserver<Teller>() {
+                    override fun onComplete() {
+
+                    }
+
+                    override fun onNext(teller: Teller) {
+                        mvpView.hideProgressbar()
+                        mvpView.searchedTeller(teller)
+
+                    }
+
+                    override fun onError(throwable: Throwable) {
+                        mvpView.hideProgressbar()
+                        showExceptionError(throwable,
+                                
context.getString(R.string.error_fetching_teller))
+                    }
+                }))
+    }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/apache/fineract/utils/StatusUtils.java 
b/app/src/main/java/org/apache/fineract/utils/StatusUtils.java
index 4795aa9..374b508 100644
--- a/app/src/main/java/org/apache/fineract/utils/StatusUtils.java
+++ b/app/src/main/java/org/apache/fineract/utils/StatusUtils.java
@@ -13,10 +13,11 @@
 import org.apache.fineract.data.models.customer.Customer;
 import org.apache.fineract.data.models.deposit.DepositAccount;
 import org.apache.fineract.data.models.loan.LoanAccount;
+import org.apache.fineract.data.models.teller.Teller;
 
 /**
  * @author Rajan Maurya
- *         On 05/08/17.
+ * On 05/08/17.
  */
 public class StatusUtils {
 
@@ -42,6 +43,28 @@ public static void setCustomerStatus(Customer.State state, 
AppCompatImageView im
         }
     }
 
+    public static void setTellerStatus(Teller.State state, AppCompatImageView 
imageView,
+            Context context) {
+        switch (state) {
+            case ACTIVE:
+                imageView.setColorFilter(
+                        ContextCompat.getColor(context, 
R.color.deposit_green));
+                break;
+            case CLOSED:
+                imageView.setColorFilter(
+                        ContextCompat.getColor(context, R.color.red_dark));
+                break;
+            case OPEN:
+                imageView.setColorFilter(
+                        ContextCompat.getColor(context, R.color.blue));
+                break;
+            case PAUSED:
+                imageView.setColorFilter(
+                        ContextCompat.getColor(context, R.color.light_yellow));
+                break;
+        }
+    }
+
     public static void setCustomerStatusIcon(Customer.State state, ImageView 
imageView,
             Context context) {
         switch (state) {
diff --git a/app/src/main/res/layout/fragment_teller.xml 
b/app/src/main/res/layout/fragment_teller.xml
new file mode 100644
index 0000000..cc01983
--- /dev/null
+++ b/app/src/main/res/layout/fragment_teller.xml
@@ -0,0 +1,24 @@
+<?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.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/rvTellers"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+    </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_teller.xml 
b/app/src/main/res/layout/item_teller.xml
new file mode 100644
index 0000000..38bacab
--- /dev/null
+++ b/app/src/main/res/layout/item_teller.xml
@@ -0,0 +1,76 @@
+<?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_teller"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <android.support.v7.widget.AppCompatImageView
+            android:id="@+id/iv_status_indicator"
+            android:layout_width="@dimen/side_bar_width"
+            android:layout_height="match_parent"
+            android:layout_marginBottom="@dimen/default_margin"
+            android:layout_marginTop="@dimen/default_margin"
+            app:srcCompat="@drawable/round_corner" />
+
+        <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_teller_identifier"
+                style="@style/Base.TextAppearance.AppCompat.Medium"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:textColor="@color/black"
+                tools:text="Teller 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_cashWithdraw_limit"
+            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="Withdraw Limit" />
+
+    </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 086432f..d32c652 100644
--- a/app/src/main/res/menu/menu_navigation_drawer.xml
+++ b/app/src/main/res/menu/menu_navigation_drawer.xml
@@ -40,6 +40,11 @@
             android:icon="@drawable/ic_customer_black_24dp"
             android:id="@+id/item_accounts"
             android:title="@string/accounts"/>
+        <item
+            android:checked="true"
+            android:icon="@drawable/ic_customer_black_24dp"
+            android:id="@+id/item_teller"
+            android:title="@string/teller"/>
 
     </group>
 
diff --git a/app/src/main/res/menu/menu_teller_search.xml 
b/app/src/main/res/menu/menu_teller_search.xml
new file mode 100644
index 0000000..751de05
--- /dev/null
+++ b/app/src/main/res/menu/menu_teller_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/teller_search"
+        android:icon="@drawable/ic_search_black_24dp"
+        android:title="@string/teller_search"
+        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 737d1ae..034ec59 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -174,6 +174,7 @@
     <string name="no_deposit_account">No deposit account</string>
     <string name="identification_search">Search identification card</string>
     <string name="ledger_search">Ledger Search</string>
+    <string name="teller_search">Search teller</string>
     <string name="loan_last_modified_by">%1$s %2$s</string>
     <string name="loan_created_by">%1$s %2$s</string>
     <string name="search_beneficiary">Search beneficiary</string>
@@ -182,6 +183,7 @@
     <string name="activities_created_by_on">%1$s, %2$s</string>
     <string name="logout">Logout</string>
     <string name="manage_roles">Manage roles</string>
+    <string name="teller">Tellers</string>
     <string name="try_again">Try Again</string>
     <string name="retry">Retry</string>
     <string name="oh_no">Oh no!</string>
@@ -270,6 +272,7 @@
     <string name="error_fetching_roles">Error fetching roles</string>
     <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_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/teller.json 
b/app/src/main/resources/teller.json
new file mode 100644
index 0000000..2083e44
--- /dev/null
+++ b/app/src/main/resources/teller.json
@@ -0,0 +1,74 @@
+[
+  {
+    "code": "code1",
+    "password": "password1",
+    "cashdrawLimit": 1000,
+    "tellerAccountIdentifier": "tellerAccountIdentifier1",
+    "vaultAccountIdentifier": "vaultAccountIdentifier",
+    "chequesReceivableAccount": "chequesReceivableAccount",
+    "cashOverShortAccount": "cashOverShortAccount",
+    "denominationRequired": false,
+    "assignedEmployee": "assignedEmployee",
+    "state": "ACTIVE",
+    "createdBy": "createdBy",
+    "createdOn": "createdOn",
+    "lastModifiedBy": "lastModifiedBy",
+    "lastModifiedOn": "lastModifiedOn",
+    "lastOpenedBy": "lastOpenedBy",
+    "lastOpenedOn": "lastOpenedOn"
+  },
+  {
+    "code": "code2",
+    "password": "password2",
+    "cashdrawLimit": 1500,
+    "tellerAccountIdentifier": "tellerAccountIdentifier2",
+    "vaultAccountIdentifier": "vaultAccountIdentifier",
+    "chequesReceivableAccount": "chequesReceivableAccount",
+    "cashOverShortAccount": "cashOverShortAccount",
+    "denominationRequired": false,
+    "assignedEmployee": "assignedEmployee",
+    "state": "CLOSED",
+    "createdBy": "createdBy",
+    "createdOn": "createdOn",
+    "lastModifiedBy": "lastModifiedBy",
+    "lastModifiedOn": "lastModifiedOn",
+    "lastOpenedBy": "lastOpenedBy",
+    "lastOpenedOn": "lastOpenedOn"
+  },
+  {
+    "code": "code3",
+    "password": "password3",
+    "cashdrawLimit": 2000,
+    "tellerAccountIdentifier": "tellerAccountIdentifier3",
+    "vaultAccountIdentifier": "vaultAccountIdentifier",
+    "chequesReceivableAccount": "chequesReceivableAccount",
+    "cashOverShortAccount": "cashOverShortAccount",
+    "denominationRequired": false,
+    "assignedEmployee": "assignedEmployee",
+    "state": "PAUSED",
+    "createdBy": "createdBy",
+    "createdOn": "createdOn",
+    "lastModifiedBy": "lastModifiedBy",
+    "lastModifiedOn": "lastModifiedOn",
+    "lastOpenedBy": "lastOpenedBy",
+    "lastOpenedOn": "lastOpenedOn"
+  },
+  {
+    "code": "code4",
+    "password": "password4",
+    "cashdrawLimit": 2500,
+    "tellerAccountIdentifier": "tellerAccountIdentifier4",
+    "vaultAccountIdentifier": "vaultAccountIdentifier",
+    "chequesReceivableAccount": "chequesReceivableAccount",
+    "cashOverShortAccount": "cashOverShortAccount",
+    "denominationRequired": false,
+    "assignedEmployee": "assignedEmployee",
+    "state": "OPEN",
+    "createdBy": "createdBy",
+    "createdOn": "createdOn",
+    "lastModifiedBy": "lastModifiedBy",
+    "lastModifiedOn": "lastModifiedOn",
+    "lastOpenedBy": "lastOpenedBy",
+    "lastOpenedOn": "lastOpenedOn"
+  }
+]


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to