diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt index 2fe636f90f2..e5428503132 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt @@ -47,10 +47,14 @@ import com.mifos.repositories.DataTableRepository import com.mifos.repositories.DataTableRepositoryImp import com.mifos.repositories.DocumentListRepository import com.mifos.repositories.DocumentListRepositoryImp +import com.mifos.repositories.GenerateCollectionSheetRepository +import com.mifos.repositories.GenerateCollectionSheetRepositoryImp import com.mifos.repositories.GroupDetailsRepository import com.mifos.repositories.GroupDetailsRepositoryImp import com.mifos.repositories.GroupListRepository import com.mifos.repositories.GroupListRepositoryImp +import com.mifos.repositories.GroupLoanAccountRepository +import com.mifos.repositories.GroupLoanAccountRepositoryImp import com.mifos.repositories.GroupsListRepository import com.mifos.repositories.GroupsListRepositoryImp import com.mifos.repositories.IndividualCollectionSheetDetailsRepository @@ -67,6 +71,10 @@ import com.mifos.repositories.LoanChargeRepository import com.mifos.repositories.LoanChargeRepositoryImp import com.mifos.repositories.LoanRepaymentRepository import com.mifos.repositories.LoanRepaymentRepositoryImp +import com.mifos.repositories.LoanRepaymentScheduleRepository +import com.mifos.repositories.LoanRepaymentScheduleRepositoryImp +import com.mifos.repositories.LoanTransactionsRepository +import com.mifos.repositories.LoanTransactionsRepositoryImp import com.mifos.repositories.LoginRepository import com.mifos.repositories.LoginRepositoryImp import com.mifos.repositories.NewIndividualCollectionSheetRepository @@ -77,6 +85,10 @@ import com.mifos.repositories.PathTrackingRepository import com.mifos.repositories.PathTrackingRepositoryImp import com.mifos.repositories.PinPointClientRepository import com.mifos.repositories.PinPointClientRepositoryImp +import com.mifos.repositories.ReportCategoryRepository +import com.mifos.repositories.ReportCategoryRepositoryImp +import com.mifos.repositories.ReportDetailRepository +import com.mifos.repositories.ReportDetailRepositoryImp import com.mifos.repositories.SavingsAccountRepository import com.mifos.repositories.SavingsAccountRepositoryImp import com.mifos.repositories.SavingsAccountSummaryRepository @@ -292,4 +304,37 @@ class RepositoryModule { ): DataTableListRepository { return DataTableListRepositoryImp(dataManagerLoan, dataManager, dataManagerClient) } + + @Provides + fun providesGenerateCollectionSheetRepository( + dataManager: DataManager, + collectionDataManager: DataManagerCollectionSheet + ): GenerateCollectionSheetRepository { + return GenerateCollectionSheetRepositoryImp(dataManager, collectionDataManager) + } + + @Provides + fun providesGroupLoanAccountRepository(dataManager: DataManager): GroupLoanAccountRepository { + return GroupLoanAccountRepositoryImp(dataManager) + } + + @Provides + fun providesReportDetailRepository(dataManager: DataManagerRunReport): ReportDetailRepository { + return ReportDetailRepositoryImp(dataManager) + } + + @Provides + fun providesReportCategoryRepository(dataManager: DataManagerRunReport): ReportCategoryRepository { + return ReportCategoryRepositoryImp(dataManager) + } + + @Provides + fun providesLoanRepaymentScheduleRepository(dataManager: DataManager): LoanRepaymentScheduleRepository { + return LoanRepaymentScheduleRepositoryImp(dataManager) + } + + @Provides + fun providesLoanTransactionsRepository(dataManager: DataManager): LoanTransactionsRepository { + return LoanTransactionsRepositoryImp(dataManager) + } } \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetFragment.kt index cba92817d4f..ff87af588de 100755 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetFragment.kt @@ -17,6 +17,7 @@ import android.widget.LinearLayout import android.widget.Spinner import android.widget.TableRow import android.widget.TextView +import androidx.lifecycle.ViewModelProvider import com.mifos.api.model.BulkRepaymentTransactions import com.mifos.api.model.ClientsAttendance import com.mifos.mifosxdroid.R @@ -34,19 +35,20 @@ import com.mifos.objects.group.CenterWithAssociations import com.mifos.objects.group.Group import com.mifos.objects.organisation.Office import com.mifos.objects.organisation.Staff +import com.mifos.states.GenerateCollectionSheetUiState import com.mifos.utils.Constants import com.mifos.utils.DatePickerConstrainType import com.mifos.utils.FragmentConstants import com.mifos.utils.getDatePickerDialog import com.mifos.utils.getTodayFormatted +import com.mifos.viewmodels.GenerateCollectionSheetViewModel import dagger.hilt.android.AndroidEntryPoint import java.text.SimpleDateFormat import java.time.Instant import java.util.Locale -import javax.inject.Inject @AndroidEntryPoint -class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionSheetMvpView, +class GenerateCollectionSheetFragment : MifosBaseFragment(), View.OnClickListener { private lateinit var binding: FragmentGenerateCollectionSheetBinding @@ -56,8 +58,8 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS private val TAG_TYPE_PRODUCTIVE = 111 private val TAG_TYPE_COLLECTION = 222 - @Inject - lateinit var presenter: GenerateCollectionSheetPresenter + private lateinit var viewModel: GenerateCollectionSheetViewModel + private var officeNameIdHashMap = HashMap() private var staffNameIdHashMap = HashMap() private var centerNameIdHashMap = HashMap() @@ -77,7 +79,7 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS private var selectedRepaymentDate: Instant = Instant.now() private val datePickerDialog by lazy { getDatePickerDialog(selectedRepaymentDate, DatePickerConstrainType.ONLY_FUTURE_DAYS) { - val formattedDate = SimpleDateFormat("dd MM yyyy", Locale.getDefault()).format(it) + val formattedDate = SimpleDateFormat("dd MMMM yyyy", Locale.getDefault()).format(it) selectedRepaymentDate = Instant.ofEpochMilli(it) binding.meetingDateFieldContainer.editText?.setText(formattedDate) } @@ -97,8 +99,59 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS savedInstanceState: Bundle? ): View { binding = FragmentGenerateCollectionSheetBinding.inflate(inflater, container, false) - presenter.attachView(this) + viewModel = ViewModelProvider(this)[GenerateCollectionSheetViewModel::class.java] setUpUi() + + viewModel.generateCollectionSheetUiState.observe(viewLifecycleOwner) { + when (it) { + is GenerateCollectionSheetUiState.OnCenterLoadSuccess -> { + showProgressbar(false) + onCenterLoadSuccess(it.centerDetails) + } + + is GenerateCollectionSheetUiState.ShowCentersInOffice -> { + showProgressbar(false) + showCentersInOffice(it.centers) + } + + is GenerateCollectionSheetUiState.ShowCollection -> { + showProgressbar(false) + showCollection(it.collectionSheetResponse) + } + + is GenerateCollectionSheetUiState.ShowError -> { + showProgressbar(false) + showError(it.message) + } + + is GenerateCollectionSheetUiState.ShowGroupByCenter -> { + showProgressbar(false) + showGroupByCenter(it.centerWithAssociations) + } + + is GenerateCollectionSheetUiState.ShowGroupsInOffice -> { + showProgressbar(false) + showGroupsInOffice(it.groups) + } + + is GenerateCollectionSheetUiState.ShowOffices -> { + showProgressbar(false) + showOffices(it.offices) + } + + is GenerateCollectionSheetUiState.ShowProductive -> { + showProgressbar(false) + showProductive(it.collectionSheetResponse) + } + + is GenerateCollectionSheetUiState.ShowProgressbar -> showProgressbar(true) + is GenerateCollectionSheetUiState.ShowStaffInOffice -> { + showProgressbar(false) + showStaffInOffice(it.staffs, it.officeId) + } + } + } + return binding.root } @@ -108,11 +161,11 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS } private fun inflateOfficeSpinner() { - presenter.loadOffices() + viewModel.loadOffices() } private fun inflateStaffSpinner(officeId: Int) { - presenter.loadStaffInOffice(officeId) + viewModel.loadStaffInOffice(officeId) } private fun inflateCenterSpinner(officeId: Int, staffId: Int) { @@ -123,7 +176,7 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS if (staffId >= 0) { params[STAFF_ID] = staffId.toString() } - presenter.loadCentersInOffice(officeId, params) + viewModel.loadCentersInOffice(officeId, params) } @@ -142,18 +195,18 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS params[ORDER_BY] = ORDER_BY_FIELD_NAME params[SORT_ORDER] = ASCENDING if (staffId >= 0) params[STAFF_ID] = staffId.toString() - presenter.loadGroupsInOffice(officeId, params) + viewModel.loadGroupsInOffice(officeId, params) } private fun inflateGroupSpinner(centerId: Int) { - presenter.loadGroupByCenter(centerId) + viewModel.loadGroupByCenter(centerId) } - override fun showOffices(offices: List) { + private fun showOffices(offices: List) { /* Activity is null - Fragment has been detached; no need to do anything. */ if (activity == null) return officeNameIdHashMap = - presenter.createOfficeNameIdMap(offices, officeNames as MutableList) + viewModel.createOfficeNameIdMap(offices, officeNames as MutableList) binding.officeField.setSimpleItems(officeNames.toTypedArray()) binding.officeField.setOnItemClickListener { _, _, i, _ -> officeId = officeNameIdHashMap[officeNames[i]]!! @@ -167,9 +220,9 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS } } - override fun showStaffInOffice(staffs: List, officeId: Int) { + private fun showStaffInOffice(staffs: List, officeId: Int) { this.officeId = officeId - staffNameIdHashMap = presenter.createStaffIdMap(staffs, staffNames as MutableList) + staffNameIdHashMap = viewModel.createStaffIdMap(staffs, staffNames as MutableList) binding.staffField.setSimpleItems(staffNames.toTypedArray()) binding.staffField.setOnItemClickListener { _, _, i, _ -> staffId = staffNameIdHashMap[staffNames[i]]!! @@ -183,9 +236,9 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS staffId = -1 //Reset staff id } - override fun showCentersInOffice(centers: List
) { + private fun showCentersInOffice(centers: List
) { centerNameIdHashMap = - presenter.createCenterIdMap(centers, centerNames as MutableList) + viewModel.createCenterIdMap(centers, centerNames as MutableList) binding.centerField.setSimpleItems(centerNames.toTypedArray()) binding.centerField.setOnItemClickListener { _, _, i, _ -> centerId = centerNameIdHashMap[centerNames[i]]!! @@ -225,7 +278,7 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS val requestPayload = CollectionSheetRequestPayload() requestPayload.transactionDate = binding.meetingDateFieldContainer.editText?.text.toString() requestPayload.calendarId = calendarId - presenter.loadCollectionSheet(groupId, requestPayload) + viewModel.loadCollectionSheet(groupId, requestPayload) } private fun fetchProductiveCollectionSheet() { @@ -233,17 +286,17 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS val requestPayload = CollectionSheetRequestPayload() requestPayload.transactionDate = binding.meetingDateFieldContainer.editText?.text.toString() requestPayload.calendarId = calendarId - productiveCenterId?.let { presenter.loadProductiveCollectionSheet(it, requestPayload) } + productiveCenterId?.let { viewModel.loadProductiveCollectionSheet(it, requestPayload) } } private fun fetchCenterDetails() { - presenter.loadCenterDetails( + viewModel.loadCenterDetails( Constants.DATE_FORMAT_LONG, Constants.LOCALE_EN, binding.meetingDateFieldContainer.editText?.text.toString(), officeId, staffId ) } - override fun onCenterLoadSuccess(centerDetails: List) { + private fun onCenterLoadSuccess(centerDetails: List) { if (centerDetails.isEmpty()) { Toaster.show(binding.root, getString(R.string.no_collectionsheet_found)) return @@ -255,11 +308,11 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS fetchProductiveCollectionSheet() } - override fun showProductive(sheet: CollectionSheetResponse) { + private fun showProductive(sheet: CollectionSheetResponse) { inflateProductiveCollectionTable(sheet) } - override fun showCollection(sheet: CollectionSheetResponse) { + private fun showCollection(sheet: CollectionSheetResponse) { inflateCollectionTable(sheet) } @@ -272,12 +325,12 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS //A List to be used to inflate Attendance Spinners val attendanceTypes = ArrayList() attendanceTypeOptions.clear() - attendanceTypeOptions = presenter.filterAttendanceTypes( + attendanceTypeOptions = viewModel.filterAttendanceTypes( collectionSheetResponse ?.attendanceTypeOptions, attendanceTypes ) additionalPaymentTypeMap.clear() - additionalPaymentTypeMap = presenter.filterPaymentTypes( + additionalPaymentTypeMap = viewModel.filterPaymentTypes( collectionSheetResponse ?.paymentTypeOptions, paymentTypes as MutableList ) @@ -459,7 +512,7 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS //A List to be used to inflate Attendance Spinners val attendanceTypes = ArrayList() attendanceTypeOptions.clear() - attendanceTypeOptions = presenter.filterAttendanceTypes( + attendanceTypeOptions = viewModel.filterAttendanceTypes( collectionSheetResponse ?.attendanceTypeOptions, attendanceTypes ) @@ -584,7 +637,7 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS } //Payload with all the items is ready. Now, hit the endpoint and submit it. - productiveCenterId?.let { presenter.submitProductiveSheet(it, payload) } + productiveCenterId?.let { viewModel.submitProductiveSheet(it, payload) } } private fun submitCollectionSheet() { @@ -663,7 +716,7 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS } //Payload with all the items is ready. Now, hit the endpoint and submit it. - presenter.submitCollectionSheet(groupId, payload) + viewModel.submitCollectionSheet(groupId, payload) } private fun concatIdWithName(name: String, id: Int): String { @@ -680,13 +733,13 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS } } - override fun showGroupsInOffice(groups: List) { - groupNameIdHashMap = presenter.createGroupIdMap(groups, groupNames as MutableList) + private fun showGroupsInOffice(groups: List) { + groupNameIdHashMap = viewModel.createGroupIdMap(groups, groupNames as MutableList) binding.groupField.setSimpleItems(groupNames.toTypedArray()) } - override fun showGroupByCenter(centerWithAssociations: CenterWithAssociations) { - groupNameIdHashMap = presenter.createGroupIdMap( + private fun showGroupByCenter(centerWithAssociations: CenterWithAssociations) { + groupNameIdHashMap = viewModel.createGroupIdMap( centerWithAssociations.groupMembers, groupNames as MutableList ) binding.groupField.setSimpleItems(groupNames.toTypedArray()) @@ -698,20 +751,15 @@ class GenerateCollectionSheetFragment : MifosBaseFragment(), GenerateCollectionS } } - override fun showError(s: String?) { + private fun showError(s: String?) { Toaster.show(binding.root, s) } - override fun showProgressbar(b: Boolean) { + private fun showProgressbar(b: Boolean) { if (b) { showMifosProgressDialog() } else { hideMifosProgressDialog() } } - - override fun onDestroyView() { - super.onDestroyView() - presenter.detachView() - } } \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetMvpView.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetMvpView.kt deleted file mode 100644 index d3e6a2e49fe..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetMvpView.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.mifos.mifosxdroid.online.generatecollectionsheet - -import com.mifos.mifosxdroid.base.MvpView -import com.mifos.objects.collectionsheet.CenterDetail -import com.mifos.objects.collectionsheet.CollectionSheetResponse -import com.mifos.objects.group.Center -import com.mifos.objects.group.CenterWithAssociations -import com.mifos.objects.group.Group -import com.mifos.objects.organisation.Office -import com.mifos.objects.organisation.Staff - -/** - * Created by Rajan Maurya on 06/06/16. - */ -interface GenerateCollectionSheetMvpView : MvpView { - fun showOffices(offices: List) - fun showStaffInOffice(staffs: List, officeId: Int) - fun showCentersInOffice(centers: List
) - fun showGroupsInOffice(groups: List) - fun showGroupByCenter(centerWithAssociations: CenterWithAssociations) - fun showError(s: String?) - fun onCenterLoadSuccess(centerDetails: List) - fun showProductive(sheet: CollectionSheetResponse) - fun showCollection(sheet: CollectionSheetResponse) -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountFragment.kt index 2286f91f132..9de677c70d1 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountFragment.kt @@ -13,6 +13,7 @@ import android.widget.AdapterView.OnItemSelectedListener import android.widget.ArrayAdapter import android.widget.Toast import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.navArgs import com.mifos.mifosxdroid.R import com.mifos.mifosxdroid.core.ProgressableDialogFragment @@ -26,10 +27,11 @@ import com.mifos.objects.templates.loans.GroupLoanTemplate import com.mifos.objects.templates.loans.RepaymentFrequencyDaysOfWeekTypeOptions import com.mifos.objects.templates.loans.RepaymentFrequencyNthDayTypeOptions import com.mifos.services.data.GroupLoanPayload +import com.mifos.states.GroupLoanAccountUiState import com.mifos.utils.DateHelper import com.mifos.utils.FragmentConstants +import com.mifos.viewmodels.GroupLoanAccountViewModel import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject /** * Created by nellyk on 1/22/2016. @@ -39,15 +41,15 @@ import javax.inject.Inject */ @AndroidEntryPoint class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListener, - GroupLoanAccountMvpView, OnItemSelectedListener { + OnItemSelectedListener { private lateinit var binding: FragmentAddLoanBinding private val arg: GroupLoanAccountFragmentArgs by navArgs() - @Inject - lateinit var mGroupLoanAccountPresenter: GroupLoanAccountPresenter - var submissionDate: String? = null - var disbursementDate: String? = null + private lateinit var viewModel: GroupLoanAccountViewModel + + private var submissionDate: String? = null + private var disbursementDate: String? = null private val mListener: OnDialogFragmentInteractionListener? = null private var mfDatePicker: DialogFragment? = null private var productId: Int? = 0 @@ -69,8 +71,8 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene private val linkAccountId: Int? = null // Boolean values to act as flags for date selection - var isdisbursementDate = false - var issubmittedDate = false + private var isdisbursementDate = false + private var issubmittedDate = false private val amortizationType: MutableList = ArrayList() private val interestCalculationPeriodType: MutableList = ArrayList() private val transactionProcessingStrategy: MutableList = ArrayList() @@ -96,8 +98,9 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene private var fundOptionsAdapter: ArrayAdapter? = null private var mGroupLoanTemplate: GroupLoanTemplate? = null private var mLoanProducts: List? = null - var mRepaymentFrequencyNthDayTypeOptions: List? = null - var mRepaymentFrequencyDaysOfWeekTypeOptions: List? = + private var mRepaymentFrequencyNthDayTypeOptions: List? = + null + private var mRepaymentFrequencyDaysOfWeekTypeOptions: List? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -114,7 +117,7 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene // Inflate the layout for this fragment activity?.actionBar?.setDisplayHomeAsUpEnabled(true) binding = FragmentAddLoanBinding.inflate(inflater, container, false) - mGroupLoanAccountPresenter.attachView(this) + viewModel = ViewModelProvider(this)[GroupLoanAccountViewModel::class.java] //Linking Options not yet implemented for Groups but the layout file is shared. //So, hiding the widgets @@ -131,6 +134,32 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene disbursementDate = DateHelper.getDateAsStringUsedForCollectionSheetPayload(disbursementDate) .replace("-", " ") + viewModel.groupLoanAccountUiState.observe(viewLifecycleOwner) { + when (it) { + is GroupLoanAccountUiState.ShowAllLoans -> { + showProgressbar(false) + showAllLoans(it.productLoans) + } + + is GroupLoanAccountUiState.ShowFetchingError -> { + showProgressbar(false) + showFetchingError(it.message) + } + + is GroupLoanAccountUiState.ShowGroupLoanTemplate -> { + showProgressbar(false) + showGroupLoanTemplate(it.groupLoanTemplate) + } + + is GroupLoanAccountUiState.ShowGroupLoansAccountCreatedSuccessfully -> { + showProgressbar(false) + showGroupLoansAccountCreatedSuccessfully(it.loans) + } + + is GroupLoanAccountUiState.ShowProgressbar -> showProgressbar(true) + } + } + return binding.root } @@ -286,15 +315,15 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene } private fun inflateLoansProductSpinner() { - mGroupLoanAccountPresenter.loadAllLoans() + viewModel.loadAllLoans() } private fun inflateLoanPurposeSpinner() { - productId?.let { mGroupLoanAccountPresenter.loadGroupLoansAccountTemplate(groupId, it) } + productId?.let { viewModel.loadGroupLoansAccountTemplate(groupId, it) } } private fun initiateLoanCreation(loansPayload: GroupLoanPayload) { - mGroupLoanAccountPresenter.createGroupLoanAccount(loansPayload) + viewModel.createGroupLoanAccount(loansPayload) } private fun inflateSubmissionDate() { @@ -325,22 +354,22 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene ) } - override fun showAllLoans(productLoans: List?) { - mLoanProducts = loans as List - mGroupLoanAccountPresenter - .filterLoanProducts(loans).let { mListLoanProductsNames.addAll(it) } + private fun showAllLoans(productLoans: List) { + mLoanProducts = productLoans + viewModel + .filterLoanProducts(productLoans).let { mListLoanProductsNames.addAll(it) } loanProductAdapter?.notifyDataSetChanged() } - override fun showGroupLoanTemplate(groupLoanTemplate: GroupLoanTemplate?) { + private fun showGroupLoanTemplate(groupLoanTemplate: GroupLoanTemplate?) { mGroupLoanTemplate = groupLoanTemplate amortizationType.clear() - amortizationType.addAll(mGroupLoanAccountPresenter.filterAmortizations(groupLoanTemplate?.amortizationTypeOptions)) + amortizationType.addAll(viewModel.filterAmortizations(groupLoanTemplate?.amortizationTypeOptions)) amortizationTypeAdapter?.notifyDataSetChanged() interestCalculationPeriodType.clear() if (groupLoanTemplate != null) { interestCalculationPeriodType.addAll( - mGroupLoanAccountPresenter.filterInterestCalculationPeriods( + viewModel.filterInterestCalculationPeriods( groupLoanTemplate.interestCalculationPeriodTypeOptions ) ) @@ -348,33 +377,33 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene interestCalculationPeriodTypeAdapter?.notifyDataSetChanged() transactionProcessingStrategy.clear() transactionProcessingStrategy.addAll( - mGroupLoanAccountPresenter.filterTransactionProcessingStrategies( + viewModel.filterTransactionProcessingStrategies( groupLoanTemplate?.transactionProcessingStrategyOptions ) ) transactionProcessingStrategyAdapter?.notifyDataSetChanged() termFrequencyType.clear() termFrequencyType.addAll( - mGroupLoanAccountPresenter.filterTermFrequencyTypes( + viewModel.filterTermFrequencyTypes( groupLoanTemplate?.termFrequencyTypeOptions ) ) termFrequencyTypeAdapter?.notifyDataSetChanged() loanPurposeType.clear() - loanPurposeType.addAll(mGroupLoanAccountPresenter.filterLoanPurposeTypes(groupLoanTemplate?.loanPurposeOptions)) + loanPurposeType.addAll(viewModel.filterLoanPurposeTypes(groupLoanTemplate?.loanPurposeOptions)) loanPurposeTypeAdapter?.notifyDataSetChanged() interestTypeOptions.clear() interestTypeOptions.addAll( - mGroupLoanAccountPresenter.filterInterestTypeOptions( + viewModel.filterInterestTypeOptions( groupLoanTemplate?.interestTypeOptions ) ) interestTypeOptionsAdapter?.notifyDataSetChanged() loanOfficerOptions.clear() - loanOfficerOptions.addAll(mGroupLoanAccountPresenter.filterLoanOfficers(groupLoanTemplate?.loanOfficerOptions)) + loanOfficerOptions.addAll(viewModel.filterLoanOfficers(groupLoanTemplate?.loanOfficerOptions)) loanOfficerOptionsAdapter?.notifyDataSetChanged() fundOptions.clear() - fundOptions.addAll(mGroupLoanAccountPresenter.filterFunds(groupLoanTemplate?.fundOptions)) + fundOptions.addAll(viewModel.filterFunds(groupLoanTemplate?.fundOptions)) fundOptionsAdapter?.notifyDataSetChanged() mListRepaymentFrequencyNthDayTypeOptions.clear() mRepaymentFrequencyNthDayTypeOptions = mGroupLoanTemplate @@ -391,7 +420,7 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene showDefaultValues() } - override fun showGroupLoansAccountCreatedSuccessfully(loans: Loans?) { + private fun showGroupLoansAccountCreatedSuccessfully(loans: Loans?) { Toast.makeText( requireActivity(), "The Loan has been submitted for Approval", @@ -399,19 +428,14 @@ class GroupLoanAccountFragment : ProgressableDialogFragment(), OnDatePickListene ).show() } - override fun showFetchingError(s: String?) { + private fun showFetchingError(s: String?) { Toaster.show(binding.root, s) } - override fun showProgressbar(b: Boolean) { + private fun showProgressbar(b: Boolean) { showProgress(b) } - override fun onDestroyView() { - super.onDestroyView() - mGroupLoanAccountPresenter.detachView() - } - interface OnDialogFragmentInteractionListener override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountMvpView.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountMvpView.kt deleted file mode 100644 index f8810a6e863..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountMvpView.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.mifos.mifosxdroid.online.grouploanaccount - -import com.mifos.mifosxdroid.base.MvpView -import com.mifos.objects.accounts.loan.Loans -import com.mifos.objects.organisation.LoanProducts -import com.mifos.objects.templates.loans.GroupLoanTemplate - -/** - * Created by Rajan Maurya on 08/06/16. - */ -interface GroupLoanAccountMvpView : MvpView { - fun showAllLoans(productLoans: List?) - fun showGroupLoansAccountCreatedSuccessfully(loans: Loans?) - fun showGroupLoanTemplate(groupLoanTemplate: GroupLoanTemplate?) - fun showFetchingError(s: String?) -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountPresenter.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountPresenter.kt deleted file mode 100644 index cac1e5001e7..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouploanaccount/GroupLoanAccountPresenter.kt +++ /dev/null @@ -1,202 +0,0 @@ -package com.mifos.mifosxdroid.online.grouploanaccount - -import com.mifos.api.DataManager -import com.mifos.mifosxdroid.base.BasePresenter -import com.mifos.objects.accounts.loan.Loans -import com.mifos.objects.organisation.LoanProducts -import com.mifos.objects.templates.loans.* -import com.mifos.services.data.GroupLoanPayload -import rx.Observable -import rx.Subscriber -import rx.android.schedulers.AndroidSchedulers -import rx.schedulers.Schedulers -import rx.subscriptions.CompositeSubscription -import java.util.* -import javax.inject.Inject - -/** - * Created by Rajan Maurya on 08/06/16. - */ -class GroupLoanAccountPresenter @Inject constructor(private val mDataManager: DataManager) : BasePresenter() { - private val mSubscriptions: CompositeSubscription - override fun attachView(mvpView: GroupLoanAccountMvpView?) { - super.attachView(mvpView) - } - - override fun detachView() { - super.detachView() - mSubscriptions.clear() - } - - fun loadAllLoans() { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscriptions.add(mDataManager.allLoans - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber?>() { - override fun onCompleted() { - mvpView!!.showProgressbar(false) - } - - override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showFetchingError("Failed to fetch Loans") - } - - override fun onNext(productLoans: List?) { - mvpView!!.showProgressbar(false) - mvpView!!.showAllLoans(productLoans) - } - }) - ) - } - - fun loadGroupLoansAccountTemplate(groupId: Int, productId: Int) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscriptions.add(mDataManager.getGroupLoansAccountTemplate(groupId, productId) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() { - mvpView!!.showProgressbar(false) - } - - override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showFetchingError("Failed to load GroupLoan") - } - - override fun onNext(groupLoanTemplate: GroupLoanTemplate?) { - mvpView!!.showProgressbar(false) - mvpView!!.showGroupLoanTemplate( - groupLoanTemplate) - } - }) - ) - } - - fun createGroupLoanAccount(loansPayload: GroupLoanPayload?) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscriptions.add(mDataManager.createGroupLoansAccount(loansPayload) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() { - mvpView!!.showProgressbar(false) - } - - override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showFetchingError("Try Again") - } - - override fun onNext(loans: Loans?) { - mvpView!!.showProgressbar(false) - mvpView!!.showGroupLoansAccountCreatedSuccessfully(loans) - } - }) - ) - } - - fun filterAmortizations(amortizationTypeOptions: List?): List { - val amortizationNameList = ArrayList() - Observable.from(amortizationTypeOptions) - .subscribe { amortizationTypeOptions -> amortizationTypeOptions.value?.let { - amortizationNameList.add( - it - ) - } } - return amortizationNameList - } - - fun filterInterestCalculationPeriods(interestCalculationPeriodType: List?): List { - val interestCalculationPeriodNameList = ArrayList() - Observable.from(interestCalculationPeriodType) - .subscribe { interestCalculationPeriodType -> - interestCalculationPeriodType.value?.let { - interestCalculationPeriodNameList.add( - it - ) - } - } - return interestCalculationPeriodNameList - } - - fun filterTransactionProcessingStrategies(transactionProcessingStrategyOptions: List?): List { - val transactionProcessingStrategyNameList = ArrayList() - Observable.from(transactionProcessingStrategyOptions) - .subscribe { transactionProcessingStrategyOptions -> - transactionProcessingStrategyOptions.name?.let { - transactionProcessingStrategyNameList.add( - it - ) - } - } - return transactionProcessingStrategyNameList - } - - fun filterLoanProducts(loanProducts: List?): List { - val loanProductsNameList = ArrayList() - Observable.from(loanProducts) - .subscribe { loanProducts -> loanProducts.name?.let { loanProductsNameList.add(it) } } - return loanProductsNameList - } - - fun filterTermFrequencyTypes(termFrequencyTypeOptions: List?): List { - val termFrequencyNameList = ArrayList() - Observable.from(termFrequencyTypeOptions) - .subscribe { termFrequencyTypeOptions -> termFrequencyTypeOptions.value?.let { - termFrequencyNameList.add( - it - ) - } } - return termFrequencyNameList - } - - fun filterLoanPurposeTypes(loanPurposeOptions: List?): List { - val loanPurposeNameList = ArrayList() - Observable.from(loanPurposeOptions) - .subscribe { loanPurposeOptions -> loanPurposeOptions.name?.let { - loanPurposeNameList.add( - it - ) - } } - return loanPurposeNameList - } - - fun filterInterestTypeOptions(interestTypeOptions: List?): List { - val interestTypeNameList = ArrayList() - Observable.from(interestTypeOptions) - .subscribe { interestTypeOptions -> interestTypeOptions.value?.let { - interestTypeNameList.add( - it - ) - } } - return interestTypeNameList - } - - fun filterLoanOfficers(loanOfficerOptions: List?): List { - val loanOfficerNameList = ArrayList() - Observable.from(loanOfficerOptions) - .subscribe { loanOfficerOptions -> loanOfficerOptions.displayName?.let { - loanOfficerNameList.add( - it - ) - } } - return loanOfficerNameList - } - - fun filterFunds(fundOptions: List?): List { - val fundNameList = ArrayList() - Observable.from(fundOptions) - .subscribe { fundOptions -> fundOptions.name?.let { fundNameList.add(it) } } - return fundNameList - } - - init { - mSubscriptions = CompositeSubscription() - } -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentScheduleFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentScheduleFragment.kt index 73966e040c2..620bac03014 100755 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentScheduleFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentScheduleFragment.kt @@ -9,27 +9,27 @@ import android.view.LayoutInflater import android.view.Menu import android.view.View import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.navArgs import com.mifos.mifosxdroid.R import com.mifos.mifosxdroid.adapters.LoanRepaymentScheduleAdapter -import com.mifos.mifosxdroid.core.MifosBaseActivity import com.mifos.mifosxdroid.core.ProgressableFragment import com.mifos.mifosxdroid.core.util.Toaster import com.mifos.mifosxdroid.databinding.FragmentLoanRepaymentScheduleBinding import com.mifos.objects.accounts.loan.LoanWithAssociations import com.mifos.objects.accounts.loan.RepaymentSchedule -import com.mifos.utils.Constants +import com.mifos.states.LoanRepaymentScheduleUiState +import com.mifos.viewmodels.LoanRepaymentScheduleViewModel import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject @AndroidEntryPoint -class LoanRepaymentScheduleFragment : ProgressableFragment(), LoanRepaymentScheduleMvpView { +class LoanRepaymentScheduleFragment : ProgressableFragment() { private lateinit var binding: FragmentLoanRepaymentScheduleBinding - private val arg : LoanRepaymentScheduleFragmentArgs by navArgs() + private val arg: LoanRepaymentScheduleFragmentArgs by navArgs() + + private lateinit var viewModel: LoanRepaymentScheduleViewModel - @Inject - lateinit var mLoanRepaymentSchedulePresenter: LoanRepaymentSchedulePresenter private var loanAccountNumber = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -44,8 +44,25 @@ class LoanRepaymentScheduleFragment : ProgressableFragment(), LoanRepaymentSched ): View { binding = FragmentLoanRepaymentScheduleBinding.inflate(inflater, container, false) setToolbarTitle(resources.getString(R.string.loan_repayment_schedule)) - mLoanRepaymentSchedulePresenter.attachView(this) + viewModel = ViewModelProvider(this)[LoanRepaymentScheduleViewModel::class.java] inflateRepaymentSchedule() + + viewModel.loanRepaymentScheduleUiState.observe(viewLifecycleOwner) { + when (it) { + is LoanRepaymentScheduleUiState.ShowFetchingError -> { + showProgressbar(false) + showFetchingError(it.message) + } + + is LoanRepaymentScheduleUiState.ShowLoanRepaySchedule -> { + showProgressbar(false) + showLoanRepaySchedule(it.loanWithAssociations) + } + + is LoanRepaymentScheduleUiState.ShowProgressbar -> showProgressbar(true) + } + } + return binding.root } @@ -54,20 +71,15 @@ class LoanRepaymentScheduleFragment : ProgressableFragment(), LoanRepaymentSched super.onPrepareOptionsMenu(menu) } - fun inflateRepaymentSchedule() { - mLoanRepaymentSchedulePresenter.loadLoanRepaySchedule(loanAccountNumber) + private fun inflateRepaymentSchedule() { + viewModel.loadLoanRepaySchedule(loanAccountNumber) } - override fun showProgressbar(b: Boolean) { + private fun showProgressbar(b: Boolean) { showProgress(b) } - override fun onDestroyView() { - super.onDestroyView() - mLoanRepaymentSchedulePresenter.detachView() - } - - override fun showLoanRepaySchedule(loanWithAssociations: LoanWithAssociations) { + private fun showLoanRepaySchedule(loanWithAssociations: LoanWithAssociations) { /* Activity is null - Fragment has been detached; no need to do anything. */ if (activity == null) return val listOfActualPeriods = loanWithAssociations @@ -89,18 +101,7 @@ class LoanRepaymentScheduleFragment : ProgressableFragment(), LoanRepaymentSched .getNumberOfRepaymentsPending(listOfActualPeriods) } - override fun showFetchingError(s: String?) { + private fun showFetchingError(s: String?) { Toaster.show(binding.root, s) } - - companion object { - @JvmStatic - fun newInstance(loanAccountNumber: Int): LoanRepaymentScheduleFragment { - val fragment = LoanRepaymentScheduleFragment() - val args = Bundle() - args.putInt(Constants.LOAN_ACCOUNT_NUMBER, loanAccountNumber) - fragment.arguments = args - return fragment - } - } } \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentScheduleMvpView.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentScheduleMvpView.kt deleted file mode 100644 index 95f79b8e023..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentScheduleMvpView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.mifos.mifosxdroid.online.loanrepaymentschedule - -import com.mifos.mifosxdroid.base.MvpView -import com.mifos.objects.accounts.loan.LoanWithAssociations - -/** - * Created by Rajan Maurya on 08/06/16. - */ -interface LoanRepaymentScheduleMvpView : MvpView { - fun showLoanRepaySchedule(loanWithAssociations: LoanWithAssociations) - fun showFetchingError(s: String?) -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentSchedulePresenter.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentSchedulePresenter.kt deleted file mode 100644 index 2c87fee5699..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loanrepaymentschedule/LoanRepaymentSchedulePresenter.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.mifos.mifosxdroid.online.loanrepaymentschedule - -import com.mifos.api.DataManager -import com.mifos.mifosxdroid.base.BasePresenter -import com.mifos.objects.accounts.loan.LoanWithAssociations -import rx.Subscriber -import rx.Subscription -import rx.android.schedulers.AndroidSchedulers -import rx.schedulers.Schedulers -import javax.inject.Inject - -/** - * Created by Rajan Maurya on 08/06/16. - */ -class LoanRepaymentSchedulePresenter @Inject constructor(private val mDataManager: DataManager) : BasePresenter() { - private var mSubscription: Subscription? = null - override fun attachView(mvpView: LoanRepaymentScheduleMvpView?) { - super.attachView(mvpView) - } - - override fun detachView() { - super.detachView() - if (mSubscription != null) mSubscription!!.unsubscribe() - } - - fun loadLoanRepaySchedule(loanId: Int) { - checkViewAttached() - mvpView!!.showProgressbar(true) - if (mSubscription != null) mSubscription!!.unsubscribe() - mSubscription = mDataManager.getLoanRepaySchedule(loanId) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() { - mvpView!!.showProgressbar(false) - } - - override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showFetchingError("Failed to load LoanRepayment") - } - - override fun onNext(loanWithAssociations: LoanWithAssociations?) { - mvpView!!.showProgressbar(false) - loanWithAssociations?.let { mvpView!!.showLoanRepaySchedule(it) } - } - }) - } - -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsFragment.kt index f1591a27abb..aab406529a9 100755 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsFragment.kt @@ -10,24 +10,27 @@ import android.view.LayoutInflater import android.view.Menu import android.view.View import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.navArgs import com.mifos.mifosxdroid.adapters.LoanTransactionAdapter import com.mifos.mifosxdroid.core.MifosBaseFragment import com.mifos.mifosxdroid.core.util.Toaster import com.mifos.mifosxdroid.databinding.FragmentLoanTransactionsBinding import com.mifos.objects.accounts.loan.LoanWithAssociations +import com.mifos.states.LoanTransactionsUiState import com.mifos.utils.Constants +import com.mifos.viewmodels.LoanTransactionsViewModel import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @AndroidEntryPoint -class LoanTransactionsFragment : MifosBaseFragment(), LoanTransactionsMvpView { +class LoanTransactionsFragment : MifosBaseFragment() { private lateinit var binding: FragmentLoanTransactionsBinding private val arg: LoanTransactionsFragmentArgs by navArgs() - @Inject - lateinit var mLoanTransactionsPresenter: LoanTransactionsPresenter + private lateinit var viewModel : LoanTransactionsViewModel + private var adapter: LoanTransactionAdapter? = null private var loanAccountNumber = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -42,8 +45,23 @@ class LoanTransactionsFragment : MifosBaseFragment(), LoanTransactionsMvpView { savedInstanceState: Bundle? ): View { binding = FragmentLoanTransactionsBinding.inflate(inflater, container, false) - mLoanTransactionsPresenter.attachView(this) + viewModel = ViewModelProvider(this)[LoanTransactionsViewModel::class.java] inflateLoanTransactions() + + viewModel.loanTransactionsUiState.observe(viewLifecycleOwner){ + when(it) { + is LoanTransactionsUiState.ShowFetchingError -> { + showProgressbar(false) + showFetchingError(it.message) + } + is LoanTransactionsUiState.ShowLoanTransaction -> { + showProgressbar(false) + showLoanTransaction(it.loanWithAssociations) + } + is LoanTransactionsUiState.ShowProgressBar -> showProgressbar(true) + } + } + return binding.root } @@ -53,10 +71,10 @@ class LoanTransactionsFragment : MifosBaseFragment(), LoanTransactionsMvpView { } private fun inflateLoanTransactions() { - mLoanTransactionsPresenter.loadLoanTransaction(loanAccountNumber) + viewModel.loadLoanTransaction(loanAccountNumber) } - override fun showProgressbar(b: Boolean) { + private fun showProgressbar(b: Boolean) { if (b) { showMifosProgressDialog() } else { @@ -64,7 +82,7 @@ class LoanTransactionsFragment : MifosBaseFragment(), LoanTransactionsMvpView { } } - override fun showLoanTransaction(loanWithAssociations: LoanWithAssociations) { + private fun showLoanTransaction(loanWithAssociations: LoanWithAssociations) { Log.i("Transaction List Size", "" + loanWithAssociations.transactions.size) adapter = LoanTransactionAdapter( requireActivity(), @@ -74,23 +92,7 @@ class LoanTransactionsFragment : MifosBaseFragment(), LoanTransactionsMvpView { binding.elvLoanTransactions.setGroupIndicator(null) } - override fun showFetchingError(s: String?) { + private fun showFetchingError(s: String?) { Toaster.show(binding.root, s) } - - override fun onDestroyView() { - super.onDestroyView() - mLoanTransactionsPresenter.detachView() - } - - companion object { - @JvmStatic - fun newInstance(loanAccountNumber: Int): LoanTransactionsFragment { - val fragment = LoanTransactionsFragment() - val args = Bundle() - args.putInt(Constants.LOAN_ACCOUNT_NUMBER, loanAccountNumber) - fragment.arguments = args - return fragment - } - } } \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsMvpView.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsMvpView.kt deleted file mode 100644 index fd20ad8dfc5..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsMvpView.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.mifos.mifosxdroid.online.loantransactions - -import com.mifos.mifosxdroid.base.MvpView -import com.mifos.objects.accounts.loan.LoanWithAssociations - -/** - * Created by Rajan Maurya on 7/6/16. - */ -interface LoanTransactionsMvpView : MvpView { - fun showLoanTransaction(loanWithAssociations: LoanWithAssociations) - fun showFetchingError(s: String?) -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsPresenter.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsPresenter.kt deleted file mode 100644 index e96c9fb1e34..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/loantransactions/LoanTransactionsPresenter.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.mifos.mifosxdroid.online.loantransactions - -import com.mifos.api.DataManager -import com.mifos.mifosxdroid.base.BasePresenter -import com.mifos.objects.accounts.loan.LoanWithAssociations -import rx.Subscriber -import rx.Subscription -import rx.android.schedulers.AndroidSchedulers -import rx.schedulers.Schedulers -import javax.inject.Inject - -/** - * Created by Rajan Maurya on 7/6/16. - */ -class LoanTransactionsPresenter @Inject constructor(private val mDataManager: DataManager) : BasePresenter() { - private var mSubscription: Subscription? = null - override fun attachView(mvpView: LoanTransactionsMvpView?) { - super.attachView(mvpView) - } - - override fun detachView() { - super.detachView() - if (mSubscription != null) mSubscription!!.unsubscribe() - } - - fun loadLoanTransaction(loan: Int) { - checkViewAttached() - if (mSubscription != null) mSubscription!!.unsubscribe() - mSubscription = mDataManager.getLoanTransactions(loan) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() {} - override fun onError(e: Throwable) { - mvpView!!.showFetchingError("Failed to fetch LoanTransaction") - } - - override fun onNext(loanWithAssociations: LoanWithAssociations?) { - loanWithAssociations?.let { mvpView!!.showLoanTransaction(it) } - } - }) - } - -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt index 6516d1328bc..d1cefb8a094 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt @@ -33,19 +33,16 @@ import java.io.File import java.io.FileWriter import java.io.IOException import java.util.Date -import javax.inject.Inject /** * Created by Tarun on 05-08-17. */ @AndroidEntryPoint -class ReportFragment : MifosBaseFragment(), ReportMvpView, ScrollChangeListener { +class ReportFragment : MifosBaseFragment(), ScrollChangeListener { private lateinit var binding: FragmentClientReportBinding private val arg: ReportFragmentArgs by navArgs() - @Inject - lateinit var presenter: ReportPresenter private var report: FullParameterListResponse? = null private var page = 0 private var bottom = 0 @@ -56,7 +53,6 @@ class ReportFragment : MifosBaseFragment(), ReportMvpView, ScrollChangeListener ): View { binding = FragmentClientReportBinding.inflate(inflater, container, false) setHasOptionsMenu(true) - presenter.attachView(this) val time = Date().time report = arg.respose setUpUi() @@ -254,7 +250,7 @@ class ReportFragment : MifosBaseFragment(), ReportMvpView, ScrollChangeListener } } - override fun showProgressbar(b: Boolean) { + private fun showProgressbar(b: Boolean) { if (b) { showMifosProgressDialog() } else { diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportMvpView.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportMvpView.kt deleted file mode 100644 index 6db80dacbb1..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportMvpView.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.mifos.mifosxdroid.online.runreports.report - -import com.mifos.mifosxdroid.base.MvpView - -/** - * Created by Tarun on 05-08-17. - */ -interface ReportMvpView : MvpView \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportPresenter.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportPresenter.kt deleted file mode 100644 index a900c1af2ad..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportPresenter.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.mifos.mifosxdroid.online.runreports.report - -import com.mifos.mifosxdroid.base.BasePresenter -import javax.inject.Inject - -/** - * Created by Tarun on 05-08-17. - */ -class ReportPresenter @Inject constructor() : BasePresenter() { - override fun attachView(mvpView: ReportMvpView) { - super.attachView(mvpView) - } -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryFragment.kt index f8676cee6f4..59e25d67bf0 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryFragment.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.mifos.mifosxdroid.adapters.ClientReportAdapter @@ -15,27 +16,28 @@ import com.mifos.mifosxdroid.core.MifosBaseFragment import com.mifos.mifosxdroid.core.util.Toaster.show import com.mifos.mifosxdroid.databinding.FragmentRunreportBinding import com.mifos.objects.runreports.client.ClientReportTypeItem +import com.mifos.states.ReportCategoryUiState import com.mifos.utils.Constants +import com.mifos.viewmodels.ReportCategoryViewModel import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject /** * Created by Tarun on 02-08-17. */ @AndroidEntryPoint -class ReportCategoryFragment : MifosBaseFragment(), ReportCategoryMvpView { +class ReportCategoryFragment : MifosBaseFragment() { private lateinit var binding: FragmentRunreportBinding - @Inject - lateinit var presenter: ReportCategoryPresenter - var reportAdapter: ClientReportAdapter? = null + private lateinit var viewModel: ReportCategoryViewModel + + private var reportAdapter: ClientReportAdapter? = null private var reportTypeItems: List? = null private var reportCategory: String? = null - var broadCastNewMessage: BroadcastReceiver = object : BroadcastReceiver() { + private var broadCastNewMessage: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { reportCategory = intent.getStringExtra(Constants.REPORT_CATEGORY) - presenter.fetchCategories(reportCategory, false, true) + viewModel.fetchCategories(reportCategory, false, true) } } @@ -58,16 +60,33 @@ class ReportCategoryFragment : MifosBaseFragment(), ReportCategoryMvpView { ): View { binding = FragmentRunreportBinding.inflate(inflater, container, false) setHasOptionsMenu(true) - presenter.attachView(this) - presenter.fetchCategories(reportCategory, genericResultSet = false, parameterType = true) + viewModel = ViewModelProvider(this)[ReportCategoryViewModel::class.java] + viewModel.fetchCategories(reportCategory, genericResultSet = false, parameterType = true) + + viewModel.reportCategoryUiState.observe(viewLifecycleOwner) { + when (it) { + is ReportCategoryUiState.ShowError -> { + showProgressbar(false) + showError(it.message) + } + + is ReportCategoryUiState.ShowProgressbar -> showProgressbar(true) + + is ReportCategoryUiState.ShowReportCategories -> { + showProgressbar(false) + showReportCategories(it.clientReportTypeItems) + } + } + } + return binding.root } - override fun showError(error: String) { + private fun showError(error: String) { show(binding.root, error) } - override fun showReportCategories(reportTypes: List) { + private fun showReportCategories(reportTypes: List) { reportTypeItems = reportTypes val layoutManager = LinearLayoutManager(context) binding.recyclerReport.layoutManager = layoutManager @@ -87,7 +106,7 @@ class ReportCategoryFragment : MifosBaseFragment(), ReportCategoryMvpView { action?.let { findNavController().navigate(it) } } - override fun showProgressbar(b: Boolean) { + private fun showProgressbar(b: Boolean) { if (b) { showMifosProgressDialog() } else { diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryMvpView.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryMvpView.kt deleted file mode 100644 index dc0298ccf1e..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryMvpView.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.mifos.mifosxdroid.online.runreports.reportcategory - -import com.mifos.mifosxdroid.base.MvpView -import com.mifos.objects.runreports.client.ClientReportTypeItem - -/** - * Created by Tarun on 03-08-17. - */ -interface ReportCategoryMvpView : MvpView { - fun showError(error: String) - - fun showReportCategories(reportTypes: List) -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt index e250ce52560..43b75c02b15 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt @@ -16,6 +16,7 @@ import android.widget.Spinner import android.widget.TableRow import android.widget.TextView import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.mifos.mifosxdroid.R @@ -26,25 +27,26 @@ import com.mifos.mifosxdroid.uihelpers.MFDatePicker import com.mifos.mifosxdroid.uihelpers.MFDatePicker.OnDatePickListener import com.mifos.objects.runreports.FullParameterListResponse import com.mifos.objects.runreports.client.ClientReportTypeItem +import com.mifos.states.ReportDetailUiState import com.mifos.utils.Constants import com.mifos.utils.FragmentConstants +import com.mifos.viewmodels.ReportDetailViewModel import dagger.hilt.android.AndroidEntryPoint import java.text.ParseException import java.text.SimpleDateFormat import java.util.Date -import javax.inject.Inject /** * Created by Tarun on 04-08-17. */ @AndroidEntryPoint -class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePickListener { +class ReportDetailFragment : MifosBaseFragment(), OnDatePickListener { private lateinit var binding: FragmentClientReportDetailsBinding private val arg: ReportDetailFragmentArgs by navArgs() - @Inject - lateinit var presenter: ReportDetailPresenter + private lateinit var viewModel: ReportDetailViewModel + private var reportItem: ClientReportTypeItem? = null private var fetchLoanOfficer = false private var fetchLoanProduct = false @@ -59,7 +61,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic private var obligDateTypeMap: HashMap? = null private var currencyMap: HashMap? = null private var dateField: String? = null - var datePicker: DialogFragment? = null + private var datePicker: DialogFragment? = null private var tvField: EditText? = null override fun onCreateView( @@ -68,9 +70,45 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic ): View { binding = FragmentClientReportDetailsBinding.inflate(inflater, container, false) setHasOptionsMenu(true) - presenter.attachView(this) + viewModel = ViewModelProvider(this)[ReportDetailViewModel::class.java] reportItem = arg.clientReportTypeItem setUpUi() + + viewModel.reportDetailUiState.observe(viewLifecycleOwner) { + when (it) { + is ReportDetailUiState.ShowError -> { + showProgressbar(false) + showError(it.message) + } + + is ReportDetailUiState.ShowFullParameterResponse -> { + showProgressbar(false) + showFullParameterResponse(it.response) + } + + is ReportDetailUiState.ShowOffices -> { + showProgressbar(false) + showOffices(it.response, it.parameterName) + } + + is ReportDetailUiState.ShowParameterDetails -> { + showProgressbar(false) + showParameterDetails(it.response, it.parameterName) + } + + is ReportDetailUiState.ShowProduct -> { + showProgressbar(false) + showProduct(it.response, it.parameterName) + } + + is ReportDetailUiState.ShowProgressbar -> showProgressbar(true) + is ReportDetailUiState.ShowRunReport -> { + showProgressbar(false) + showRunReport(it.response) + } + } + } + return binding.root } @@ -79,7 +117,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic binding.itemClient.tvReportCategory.text = reportItem?.report_category binding.itemClient.tvReportType.text = reportItem?.report_type val reportName = "'" + reportItem?.report_name + "'" - presenter.fetchFullParameterList(reportName, true) + viewModel.fetchFullParameterList(reportName, true) datePicker = MFDatePicker.newInsance(this) } @@ -99,7 +137,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic when (identifier) { Constants.LOAN_OFFICER_ID_SELECT -> { spinner.tag = Constants.R_LOAN_OFFICER_ID - loanOfficerMap = presenter.filterIntHashMapForSpinner( + loanOfficerMap = viewModel.filterIntHashMapForSpinner( data.data, spinnerValues ) @@ -108,7 +146,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic Constants.LOAN_PRODUCT_ID_SELECT -> { spinner.tag = Constants.R_LOAN_PRODUCT_ID - loanProductMap = presenter.filterIntHashMapForSpinner( + loanProductMap = viewModel.filterIntHashMapForSpinner( data.data, spinnerValues ) @@ -117,7 +155,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic Constants.LOAN_PURPOSE_ID_SELECT -> { spinner.tag = Constants.R_LOAN_PURPOSE_ID - loanPurposeMap = presenter.filterIntHashMapForSpinner( + loanPurposeMap = viewModel.filterIntHashMapForSpinner( data.data, spinnerValues ) @@ -126,13 +164,13 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic Constants.FUND_ID_SELECT -> { spinner.tag = Constants.R_FUND_ID - fundMap = presenter.filterIntHashMapForSpinner(data.data, spinnerValues) + fundMap = viewModel.filterIntHashMapForSpinner(data.data, spinnerValues) tvLabel.text = getString(R.string.loan_fund) } Constants.CURRENCY_ID_SELECT -> { spinner.tag = Constants.R_CURRENCY_ID - currencyMap = presenter.filterStringHashMapForSpinner( + currencyMap = viewModel.filterStringHashMapForSpinner( data.data, spinnerValues ) @@ -141,31 +179,31 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic Constants.OFFICE_ID_SELECT -> { spinner.tag = Constants.R_OFFICE_ID - officeMap = presenter.filterIntHashMapForSpinner(data.data, spinnerValues) + officeMap = viewModel.filterIntHashMapForSpinner(data.data, spinnerValues) tvLabel.text = getString(R.string.office) } Constants.PAR_TYPE_SELECT -> { spinner.tag = Constants.R_PAR_TYPE - parMap = presenter.filterIntHashMapForSpinner(data.data, spinnerValues) + parMap = viewModel.filterIntHashMapForSpinner(data.data, spinnerValues) tvLabel.text = getString(R.string.par_calculation) } Constants.SAVINGS_ACCOUNT_SUB_STATUS -> { spinner.tag = Constants.R_SUB_STATUS - subStatusMap = presenter.filterIntHashMapForSpinner(data.data, spinnerValues) + subStatusMap = viewModel.filterIntHashMapForSpinner(data.data, spinnerValues) tvLabel.text = getString(R.string.savings_acc_deposit) } Constants.SELECT_GL_ACCOUNT_NO -> { spinner.tag = Constants.R_ACCOUNT - glAccountNoMap = presenter.filterIntHashMapForSpinner(data.data, spinnerValues) + glAccountNoMap = viewModel.filterIntHashMapForSpinner(data.data, spinnerValues) tvLabel.text = getString(R.string.glaccount) } Constants.OBLIG_DATE_TYPE_SELECT -> { spinner.tag = Constants.R_OBLIG_DATE_TYPE - obligDateTypeMap = presenter.filterIntHashMapForSpinner(data.data, spinnerValues) + obligDateTypeMap = viewModel.filterIntHashMapForSpinner(data.data, spinnerValues) tvLabel.text = getString(R.string.obligation_date_type) } } @@ -184,10 +222,10 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic ) { if (spinner.tag.toString() == Constants.R_OFFICE_ID && fetchLoanOfficer) { val officeId = officeMap!![spinner.selectedItem.toString()]!! - presenter.fetchOffices(Constants.LOAN_OFFICER_ID_SELECT, officeId, true) + viewModel.fetchOffices(Constants.LOAN_OFFICER_ID_SELECT, officeId, true) } else if (spinner.tag.toString() == Constants.R_CURRENCY_ID && fetchLoanProduct) { val currencyId = currencyMap!![spinner.selectedItem.toString()] - presenter.fetchProduct(Constants.LOAN_PRODUCT_ID_SELECT, currencyId, true) + viewModel.fetchProduct(Constants.LOAN_PRODUCT_ID_SELECT, currencyId, true) } } @@ -294,17 +332,17 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic map[et.tag.toString()] = et.text.toString() } } - presenter.fetchRunReportWithQuery(reportItem?.report_name, map) + viewModel.fetchRunReportWithQuery(reportItem?.report_name, map) } } - override fun showRunReport(response: FullParameterListResponse) { + private fun showRunReport(response: FullParameterListResponse) { val action = ReportDetailFragmentDirections.actionReportDetailFragmentToReportFragment(response) findNavController().navigate(action) } - override fun showOffices(response: FullParameterListResponse, identifier: String) { + private fun showOffices(response: FullParameterListResponse, identifier: String) { for (i in 0 until binding.tableDetails.childCount) { val tableRow = binding.tableDetails.getChildAt(i) as TableRow if (tableRow.getChildAt(1) is EditText) { @@ -313,7 +351,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic val sp = tableRow.getChildAt(1) as Spinner if (sp.tag.toString() == Constants.R_LOAN_OFFICER_ID) { val spinnerValues = ArrayList() - loanOfficerMap = presenter.filterIntHashMapForSpinner( + loanOfficerMap = viewModel.filterIntHashMapForSpinner( response.data, spinnerValues ) @@ -329,7 +367,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic addTableRow(response, identifier) } - override fun showProduct(response: FullParameterListResponse, identifier: String) { + private fun showProduct(response: FullParameterListResponse, identifier: String) { for (i in 0 until binding.tableDetails.childCount) { val tableRow = binding.tableDetails.getChildAt(i) as TableRow if (tableRow.getChildAt(1) is EditText) { @@ -338,7 +376,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic val sp = tableRow.getChildAt(1) as Spinner if (sp.tag.toString() == Constants.R_LOAN_PRODUCT_ID) { val spinnerValues = ArrayList() - loanProductMap = presenter.filterIntHashMapForSpinner( + loanProductMap = viewModel.filterIntHashMapForSpinner( response.data, spinnerValues ) @@ -366,11 +404,11 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic return super.onOptionsItemSelected(item) } - override fun showError(error: String) { + private fun showError(error: String) { show(binding.root, error) } - override fun showFullParameterResponse(response: FullParameterListResponse) { + private fun showFullParameterResponse(response: FullParameterListResponse) { for (row in response.data) { when (row.row[0]) { Constants.LOAN_OFFICER_ID_SELECT -> fetchLoanOfficer = true @@ -383,7 +421,7 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic Constants.OVERDUE_X_SELECT -> addTextView(Constants.OVERDUE_X_SELECT) Constants.OVERDUE_Y_SELECT -> addTextView(Constants.OVERDUE_Y_SELECT) } - presenter.fetchParameterDetails(row.row[0], true) + viewModel.fetchParameterDetails(row.row[0], true) } } @@ -448,11 +486,11 @@ class ReportDetailFragment : MifosBaseFragment(), ReportDetailMvpView, OnDatePic binding.tableDetails.addView(row) } - override fun showParameterDetails(response: FullParameterListResponse, identifier: String) { + private fun showParameterDetails(response: FullParameterListResponse, identifier: String) { addTableRow(response, identifier) } - override fun showProgressbar(b: Boolean) { + private fun showProgressbar(b: Boolean) { if (b) { showMifosProgressDialog() } else { diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailMvpView.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailMvpView.kt deleted file mode 100644 index db752651344..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailMvpView.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.mifos.mifosxdroid.online.runreports.reportdetail - -import com.mifos.mifosxdroid.base.MvpView -import com.mifos.objects.runreports.FullParameterListResponse - -/** - * Created by Tarun on 04-08-17. - */ -interface ReportDetailMvpView : MvpView { - fun showError(error: String) - fun showFullParameterResponse(response: FullParameterListResponse) - fun showParameterDetails(response: FullParameterListResponse, identifier: String) - fun showRunReport(response: FullParameterListResponse) - fun showOffices(response: FullParameterListResponse, identifier: String) - fun showProduct(response: FullParameterListResponse, identifier: String) -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailPresenter.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailPresenter.kt deleted file mode 100644 index df6694ddc6e..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailPresenter.kt +++ /dev/null @@ -1,251 +0,0 @@ -package com.mifos.mifosxdroid.online.runreports.reportdetail - -import com.mifos.api.datamanager.DataManagerRunReport -import com.mifos.mifosxdroid.base.BasePresenter -import com.mifos.objects.runreports.DataRow -import com.mifos.objects.runreports.FullParameterListResponse -import com.mifos.utils.MFErrorParser -import org.json.JSONObject -import retrofit2.HttpException -import rx.Observable -import rx.Subscriber -import rx.android.schedulers.AndroidSchedulers -import rx.plugins.RxJavaPlugins -import rx.schedulers.Schedulers -import rx.subscriptions.CompositeSubscription -import javax.inject.Inject - -/** - * Created by Tarun on 04-08-17. - */ -class ReportDetailPresenter @Inject constructor(private val dataManager: DataManagerRunReport) : - BasePresenter() { - private val subscription: CompositeSubscription? - - init { - subscription = CompositeSubscription() - } - - override fun attachView(mvpView: ReportDetailMvpView) { - super.attachView(mvpView) - } - - override fun detachView() { - super.detachView() - subscription?.unsubscribe() - } - - fun fetchFullParameterList(reportName: String?, parameterType: Boolean) { - checkViewAttached() - mvpView?.showProgressbar(true) - subscription?.add( - dataManager.getReportFullParameterList(reportName, parameterType) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() {} - override fun onError(e: Throwable) { - mvpView?.showProgressbar(false) - try { - if (e is HttpException) { - val errorMessage = e.response()?.errorBody() - ?.string() - - // Default User message is null in these queries most of the times. - // Hence, show Developer message. - mvpView?.showError( - MFErrorParser.parseError(errorMessage) - .errors[0].developerMessage - ) - } - } catch (throwable: Throwable) { - RxJavaPlugins.getInstance().errorHandler.handleError(e) - } - } - - override fun onNext(response: FullParameterListResponse) { - mvpView?.showProgressbar(false) - mvpView?.showFullParameterResponse(response) - } - }) - ) - } - - fun fetchParameterDetails(parameterName: String?, parameterType: Boolean) { - checkViewAttached() - mvpView?.showProgressbar(true) - subscription?.add( - dataManager.getReportParameterDetails(parameterName, parameterType) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() {} - override fun onError(e: Throwable) { - mvpView?.showProgressbar(false) - try { - if (e is HttpException) { - val errorMessage = e.response()?.errorBody() - ?.string() - mvpView?.showError( - MFErrorParser.parseError(errorMessage) - .errors[0].developerMessage - ) - } - } catch (throwable: Throwable) { - RxJavaPlugins.getInstance().errorHandler.handleError(e) - } - } - - override fun onNext(response: FullParameterListResponse) { - mvpView?.showProgressbar(false) - mvpView?.showParameterDetails(response, parameterName!!) - } - }) - ) - } - - fun fetchOffices(parameterName: String?, officeId: Int, parameterType: Boolean) { - checkViewAttached() - mvpView?.showProgressbar(true) - subscription?.add( - dataManager.getRunReportOffices(parameterName, officeId, parameterType) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() {} - override fun onError(e: Throwable) { - mvpView?.showProgressbar(false) - try { - if (e is HttpException) { - val errorMessage = e.response()?.errorBody() - ?.string() - mvpView?.showError( - MFErrorParser.parseError(errorMessage) - .errors[0].developerMessage - ) - } - } catch (throwable: Throwable) { - RxJavaPlugins.getInstance().errorHandler.handleError(e) - } - } - - override fun onNext(response: FullParameterListResponse) { - mvpView?.showProgressbar(false) - mvpView?.showOffices(response, parameterName!!) - } - }) - ) - } - - fun fetchProduct(parameterName: String?, currencyId: String?, parameterType: Boolean) { - checkViewAttached() - mvpView?.showProgressbar(true) - subscription?.add( - dataManager.getRunReportProduct(parameterName, currencyId, parameterType) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() {} - override fun onError(e: Throwable) { - mvpView?.showProgressbar(false) - try { - if (e is HttpException) { - val errorMessage = e.response()?.errorBody() - ?.string() - mvpView?.showError( - MFErrorParser.parseError(errorMessage) - .errors[0].developerMessage - ) - } - } catch (throwable: Throwable) { - RxJavaPlugins.getInstance().errorHandler.handleError(e) - } - } - - override fun onNext(response: FullParameterListResponse) { - mvpView?.showProgressbar(false) - mvpView?.showProduct(response, parameterName!!) - } - }) - ) - } - - fun fetchRunReportWithQuery(reportName: String?, options: MutableMap) { - checkViewAttached() - mvpView?.showProgressbar(true) - subscription?.add( - dataManager.getRunReportWithQuery(reportName, options) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() {} - override fun onError(e: Throwable) { - mvpView?.showProgressbar(false) - try { - if (e is HttpException) { - val errorMessage = e.response()?.errorBody() - ?.string() - mvpView?.showError( - JSONObject(errorMessage) - .getString("developerMessage") - ) - } - } catch (throwable: Throwable) { - RxJavaPlugins.getInstance().errorHandler.handleError(e) - } - } - - override fun onNext(response: FullParameterListResponse) { - mvpView?.showProgressbar(false) - mvpView?.showRunReport(response) - } - }) - ) - } - - /** - * Method to filter Values of spinners with associated integer codes - * - * @param response List of DataRows - * @param values List of corresponding String values to be shown in Spinner - * @return HashMap of String values with the corresponding integer code - */ - fun filterIntHashMapForSpinner( - response: List?, - values: ArrayList - ): HashMap { - val map = HashMap() - values.clear() - Observable.from(response) - .subscribe { dataRow -> - val id = dataRow.row[0].toInt() - val value = dataRow.row[1] - values.add(value) - map[value] = id - } - return map - } - - /** - * Method to filter out values for the Spinners. - * - * @param response List of DataRows - * @param values List of the corresponding values - * @return HashMap of value and currency code pairs. - */ - fun filterStringHashMapForSpinner( - response: List?, - values: ArrayList - ): HashMap { - val map = HashMap() - values.clear() - Observable.from(response) - .subscribe { dataRow -> - val code = dataRow.row[0] - val value = dataRow.row[1] - values.add(value) - map[value] = code - } - return map - } -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/GenerateCollectionSheetRepository.kt b/mifosng-android/src/main/java/com/mifos/repositories/GenerateCollectionSheetRepository.kt new file mode 100644 index 00000000000..cd71d724bab --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/GenerateCollectionSheetRepository.kt @@ -0,0 +1,47 @@ +package com.mifos.repositories + +import com.mifos.api.GenericResponse +import com.mifos.objects.collectionsheet.CenterDetail +import com.mifos.objects.collectionsheet.CollectionSheetPayload +import com.mifos.objects.collectionsheet.CollectionSheetRequestPayload +import com.mifos.objects.collectionsheet.CollectionSheetResponse +import com.mifos.objects.collectionsheet.ProductiveCollectionSheetPayload +import com.mifos.objects.group.Center +import com.mifos.objects.group.CenterWithAssociations +import com.mifos.objects.group.Group +import rx.Observable + +/** + * Created by Aditya Gupta on 12/08/23. + */ +interface GenerateCollectionSheetRepository { + + fun getCentersInOffice(id: Int, params: Map): Observable> + + fun getGroupsByOffice( + office: Int, + params: Map + ): Observable> + + fun fetchGroupsAssociatedWithCenter(centerId: Int): Observable + + fun fetchCenterDetails( + format: String?, locale: String?, meetingDate: String?, officeId: Int, staffId: Int + ): Observable> + + fun fetchProductiveCollectionSheet( + centerId: Int, payload: CollectionSheetRequestPayload? + ): Observable + + fun fetchCollectionSheet( + groupId: Int, payload: CollectionSheetRequestPayload? + ): Observable + + fun submitProductiveSheet( + centerId: Int, payload: ProductiveCollectionSheetPayload? + ): Observable + + fun submitCollectionSheet( + groupId: Int, payload: CollectionSheetPayload? + ): Observable +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/GenerateCollectionSheetRepositoryImp.kt b/mifosng-android/src/main/java/com/mifos/repositories/GenerateCollectionSheetRepositoryImp.kt new file mode 100644 index 00000000000..355f2ff9a9d --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/GenerateCollectionSheetRepositoryImp.kt @@ -0,0 +1,86 @@ +package com.mifos.repositories + +import com.mifos.api.DataManager +import com.mifos.api.GenericResponse +import com.mifos.api.datamanager.DataManagerCollectionSheet +import com.mifos.objects.collectionsheet.CenterDetail +import com.mifos.objects.collectionsheet.CollectionSheetPayload +import com.mifos.objects.collectionsheet.CollectionSheetRequestPayload +import com.mifos.objects.collectionsheet.CollectionSheetResponse +import com.mifos.objects.collectionsheet.ProductiveCollectionSheetPayload +import com.mifos.objects.group.Center +import com.mifos.objects.group.CenterWithAssociations +import com.mifos.objects.group.Group +import rx.Observable +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +class GenerateCollectionSheetRepositoryImp @Inject constructor( + private val dataManager: DataManager, + private val collectionDataManager: DataManagerCollectionSheet +) : GenerateCollectionSheetRepository { + + override fun getCentersInOffice( + id: Int, + params: Map + ): Observable> { + return dataManager.getCentersInOffice(id, params) + } + + override fun getGroupsByOffice( + office: Int, + params: Map + ): Observable> { + return dataManager.getGroupsByOffice(office, params) + } + + override fun fetchGroupsAssociatedWithCenter(centerId: Int): Observable { + return collectionDataManager.fetchGroupsAssociatedWithCenter(centerId) + } + + override fun fetchCenterDetails( + format: String?, + locale: String?, + meetingDate: String?, + officeId: Int, + staffId: Int + ): Observable> { + return collectionDataManager.fetchCenterDetails( + format, + locale, + meetingDate, + officeId, + staffId + ) + } + + override fun fetchProductiveCollectionSheet( + centerId: Int, + payload: CollectionSheetRequestPayload? + ): Observable { + return collectionDataManager.fetchProductiveCollectionSheet(centerId, payload) + } + + override fun fetchCollectionSheet( + groupId: Int, + payload: CollectionSheetRequestPayload? + ): Observable { + return collectionDataManager.fetchCollectionSheet(groupId, payload) + } + + override fun submitProductiveSheet( + centerId: Int, + payload: ProductiveCollectionSheetPayload? + ): Observable { + return collectionDataManager.submitProductiveSheet(centerId, payload) + } + + override fun submitCollectionSheet( + groupId: Int, + payload: CollectionSheetPayload? + ): Observable { + return collectionDataManager.submitCollectionSheet(groupId, payload) + } +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/GroupLoanAccountRepository.kt b/mifosng-android/src/main/java/com/mifos/repositories/GroupLoanAccountRepository.kt new file mode 100644 index 00000000000..9747ba0e2a7 --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/GroupLoanAccountRepository.kt @@ -0,0 +1,19 @@ +package com.mifos.repositories + +import com.mifos.objects.accounts.loan.Loans +import com.mifos.objects.organisation.LoanProducts +import com.mifos.objects.templates.loans.GroupLoanTemplate +import com.mifos.services.data.GroupLoanPayload +import rx.Observable + +/** + * Created by Aditya Gupta on 12/08/23. + */ +interface GroupLoanAccountRepository { + + fun allLoans(): Observable> + + fun getGroupLoansAccountTemplate(groupId: Int, productId: Int): Observable + + fun createGroupLoansAccount(loansPayload: GroupLoanPayload?): Observable +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/GroupLoanAccountRepositoryImp.kt b/mifosng-android/src/main/java/com/mifos/repositories/GroupLoanAccountRepositoryImp.kt new file mode 100644 index 00000000000..d67750f916f --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/GroupLoanAccountRepositoryImp.kt @@ -0,0 +1,31 @@ +package com.mifos.repositories + +import com.mifos.api.DataManager +import com.mifos.objects.accounts.loan.Loans +import com.mifos.objects.organisation.LoanProducts +import com.mifos.objects.templates.loans.GroupLoanTemplate +import com.mifos.services.data.GroupLoanPayload +import rx.Observable +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +class GroupLoanAccountRepositoryImp @Inject constructor(private val dataManager: DataManager) : + GroupLoanAccountRepository { + + override fun allLoans(): Observable> { + return dataManager.allLoans + } + + override fun getGroupLoansAccountTemplate( + groupId: Int, + productId: Int + ): Observable { + return dataManager.getGroupLoansAccountTemplate(groupId, productId) + } + + override fun createGroupLoansAccount(loansPayload: GroupLoanPayload?): Observable { + return dataManager.createGroupLoansAccount(loansPayload) + } +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/LoanRepaymentScheduleRepository.kt b/mifosng-android/src/main/java/com/mifos/repositories/LoanRepaymentScheduleRepository.kt new file mode 100644 index 00000000000..78314aea2c0 --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/LoanRepaymentScheduleRepository.kt @@ -0,0 +1,13 @@ +package com.mifos.repositories + +import com.mifos.objects.accounts.loan.LoanWithAssociations +import rx.Observable + +/** + * Created by Aditya Gupta on 12/08/23. + */ +interface LoanRepaymentScheduleRepository { + + fun getLoanRepaySchedule(loanId: Int): Observable + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/LoanRepaymentScheduleRepositoryImp.kt b/mifosng-android/src/main/java/com/mifos/repositories/LoanRepaymentScheduleRepositoryImp.kt new file mode 100644 index 00000000000..20718fe3a3e --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/LoanRepaymentScheduleRepositoryImp.kt @@ -0,0 +1,17 @@ +package com.mifos.repositories + +import com.mifos.api.DataManager +import com.mifos.objects.accounts.loan.LoanWithAssociations +import rx.Observable +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +class LoanRepaymentScheduleRepositoryImp @Inject constructor(private val dataManager: DataManager) : + LoanRepaymentScheduleRepository { + + override fun getLoanRepaySchedule(loanId: Int): Observable { + return dataManager.getLoanRepaySchedule(loanId) + } +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/LoanTransactionsRepository.kt b/mifosng-android/src/main/java/com/mifos/repositories/LoanTransactionsRepository.kt new file mode 100644 index 00000000000..b525c1d5447 --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/LoanTransactionsRepository.kt @@ -0,0 +1,13 @@ +package com.mifos.repositories + +import com.mifos.objects.accounts.loan.LoanWithAssociations +import rx.Observable + +/** + * Created by Aditya Gupta on 12/08/23. + */ +interface LoanTransactionsRepository { + + fun getLoanTransactions(loan: Int): Observable + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/LoanTransactionsRepositoryImp.kt b/mifosng-android/src/main/java/com/mifos/repositories/LoanTransactionsRepositoryImp.kt new file mode 100644 index 00000000000..8f6e148748f --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/LoanTransactionsRepositoryImp.kt @@ -0,0 +1,17 @@ +package com.mifos.repositories + +import com.mifos.api.DataManager +import com.mifos.objects.accounts.loan.LoanWithAssociations +import rx.Observable +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +class LoanTransactionsRepositoryImp @Inject constructor(private val dataManager: DataManager) : + LoanTransactionsRepository { + + override fun getLoanTransactions(loan: Int): Observable { + return dataManager.getLoanTransactions(loan) + } +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/ReportCategoryRepository.kt b/mifosng-android/src/main/java/com/mifos/repositories/ReportCategoryRepository.kt new file mode 100644 index 00000000000..cb8d1f42f59 --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/ReportCategoryRepository.kt @@ -0,0 +1,17 @@ +package com.mifos.repositories + +import com.mifos.objects.runreports.client.ClientReportTypeItem +import rx.Observable + +/** + * Created by Aditya Gupta on 12/08/23. + */ +interface ReportCategoryRepository { + + fun getReportCategories( + reportCategory: String?, + genericResultSet: Boolean, + parameterType: Boolean + ): Observable> + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/ReportCategoryRepositoryImp.kt b/mifosng-android/src/main/java/com/mifos/repositories/ReportCategoryRepositoryImp.kt new file mode 100644 index 00000000000..fee82054b58 --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/ReportCategoryRepositoryImp.kt @@ -0,0 +1,23 @@ +package com.mifos.repositories + +import com.mifos.api.datamanager.DataManagerRunReport +import com.mifos.objects.runreports.client.ClientReportTypeItem +import rx.Observable +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +class ReportCategoryRepositoryImp @Inject constructor(private val dataManager: DataManagerRunReport) : + ReportCategoryRepository { + + override fun getReportCategories( + reportCategory: String?, + genericResultSet: Boolean, + parameterType: Boolean + ): Observable> { + return dataManager.getReportCategories(reportCategory, genericResultSet, parameterType) + } + + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/ReportDetailRepository.kt b/mifosng-android/src/main/java/com/mifos/repositories/ReportDetailRepository.kt new file mode 100644 index 00000000000..7bc01070dba --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/ReportDetailRepository.kt @@ -0,0 +1,31 @@ +package com.mifos.repositories + +import com.mifos.objects.runreports.FullParameterListResponse +import rx.Observable + +/** + * Created by Aditya Gupta on 12/08/23. + */ +interface ReportDetailRepository { + + fun getReportFullParameterList( + reportName: String?, parameterType: Boolean + ): Observable + + fun getReportParameterDetails( + parameterName: String?, parameterType: Boolean + ): Observable + + fun getRunReportOffices( + parameterName: String?, officeId: Int, parameterType: Boolean + ): Observable + + fun getRunReportProduct( + parameterName: String?, currency: String?, parameterType: Boolean + ): Observable + + fun getRunReportWithQuery( + reportName: String?, options: Map + ): Observable + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/repositories/ReportDetailRepositoryImp.kt b/mifosng-android/src/main/java/com/mifos/repositories/ReportDetailRepositoryImp.kt new file mode 100644 index 00000000000..95d0d035b7b --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/repositories/ReportDetailRepositoryImp.kt @@ -0,0 +1,50 @@ +package com.mifos.repositories + +import com.mifos.api.datamanager.DataManagerRunReport +import com.mifos.objects.runreports.FullParameterListResponse +import rx.Observable +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +class ReportDetailRepositoryImp @Inject constructor(private val dataManager: DataManagerRunReport) : + ReportDetailRepository { + + override fun getReportFullParameterList( + reportName: String?, + parameterType: Boolean + ): Observable { + return dataManager.getReportFullParameterList(reportName, parameterType) + } + + override fun getReportParameterDetails( + parameterName: String?, + parameterType: Boolean + ): Observable { + return dataManager.getReportParameterDetails(parameterName, parameterType) + } + + override fun getRunReportOffices( + parameterName: String?, + officeId: Int, + parameterType: Boolean + ): Observable { + return dataManager.getRunReportOffices(parameterName, officeId, parameterType) + } + + override fun getRunReportProduct( + parameterName: String?, + currency: String?, + parameterType: Boolean + ): Observable { + return dataManager.getRunReportProduct(parameterName, currency, parameterType) + } + + override fun getRunReportWithQuery( + reportName: String?, + options: Map + ): Observable { + return dataManager.getRunReportWithQuery(reportName, options) + } +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/states/GenerateCollectionSheetUiState.kt b/mifosng-android/src/main/java/com/mifos/states/GenerateCollectionSheetUiState.kt new file mode 100644 index 00000000000..76a1c12ac6f --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/states/GenerateCollectionSheetUiState.kt @@ -0,0 +1,40 @@ +package com.mifos.states + +import com.mifos.objects.collectionsheet.CenterDetail +import com.mifos.objects.collectionsheet.CollectionSheetResponse +import com.mifos.objects.group.Center +import com.mifos.objects.group.CenterWithAssociations +import com.mifos.objects.group.Group +import com.mifos.objects.organisation.Office +import com.mifos.objects.organisation.Staff + +/** + * Created by Aditya Gupta on 12/08/23. + */ +sealed class GenerateCollectionSheetUiState { + + object ShowProgressbar : GenerateCollectionSheetUiState() + + data class ShowError(val message: String) : GenerateCollectionSheetUiState() + + data class ShowOffices(val offices: List) : GenerateCollectionSheetUiState() + + data class ShowStaffInOffice(val staffs: List, val officeId: Int) : + GenerateCollectionSheetUiState() + + data class ShowCentersInOffice(val centers: List
) : GenerateCollectionSheetUiState() + + data class ShowGroupsInOffice(val groups: List) : GenerateCollectionSheetUiState() + + data class ShowGroupByCenter(val centerWithAssociations: CenterWithAssociations) : + GenerateCollectionSheetUiState() + + data class OnCenterLoadSuccess(val centerDetails: List) : + GenerateCollectionSheetUiState() + + data class ShowProductive(val collectionSheetResponse: CollectionSheetResponse) : + GenerateCollectionSheetUiState() + + data class ShowCollection(val collectionSheetResponse: CollectionSheetResponse) : + GenerateCollectionSheetUiState() +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/states/GroupLoanAccountUiState.kt b/mifosng-android/src/main/java/com/mifos/states/GroupLoanAccountUiState.kt new file mode 100644 index 00000000000..f70d969d64c --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/states/GroupLoanAccountUiState.kt @@ -0,0 +1,25 @@ +package com.mifos.states + +import com.mifos.objects.accounts.loan.Loans +import com.mifos.objects.organisation.LoanProducts +import com.mifos.objects.templates.loans.GroupLoanTemplate + +/** + * Created by Aditya Gupta on 12/08/23. + */ +sealed class GroupLoanAccountUiState { + + object ShowProgressbar : GroupLoanAccountUiState() + + data class ShowFetchingError(val message: String) : GroupLoanAccountUiState() + + data class ShowAllLoans(val productLoans: List) : GroupLoanAccountUiState() + + data class ShowGroupLoanTemplate(val groupLoanTemplate: GroupLoanTemplate) : + GroupLoanAccountUiState() + + data class ShowGroupLoansAccountCreatedSuccessfully(val loans: Loans) : + GroupLoanAccountUiState() + + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/states/LoanRepaymentScheduleUiState.kt b/mifosng-android/src/main/java/com/mifos/states/LoanRepaymentScheduleUiState.kt new file mode 100644 index 00000000000..d5a3c6acecf --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/states/LoanRepaymentScheduleUiState.kt @@ -0,0 +1,16 @@ +package com.mifos.states + +import com.mifos.objects.accounts.loan.LoanWithAssociations + +/** + * Created by Aditya Gupta on 12/08/23. + */ +sealed class LoanRepaymentScheduleUiState { + + object ShowProgressbar : LoanRepaymentScheduleUiState() + + data class ShowFetchingError(val message: String) : LoanRepaymentScheduleUiState() + + data class ShowLoanRepaySchedule(val loanWithAssociations: LoanWithAssociations) : + LoanRepaymentScheduleUiState() +} diff --git a/mifosng-android/src/main/java/com/mifos/states/LoanTransactionsUiState.kt b/mifosng-android/src/main/java/com/mifos/states/LoanTransactionsUiState.kt new file mode 100644 index 00000000000..3ab1c20754c --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/states/LoanTransactionsUiState.kt @@ -0,0 +1,16 @@ +package com.mifos.states + +import com.mifos.objects.accounts.loan.LoanWithAssociations + +/** + * Created by Aditya Gupta on 12/08/23. + */ +sealed class LoanTransactionsUiState { + + object ShowProgressBar : LoanTransactionsUiState() + + data class ShowFetchingError(val message: String) : LoanTransactionsUiState() + + data class ShowLoanTransaction(val loanWithAssociations: LoanWithAssociations) : + LoanTransactionsUiState() +} diff --git a/mifosng-android/src/main/java/com/mifos/states/ReportCategoryUiState.kt b/mifosng-android/src/main/java/com/mifos/states/ReportCategoryUiState.kt new file mode 100644 index 00000000000..581e568ee7a --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/states/ReportCategoryUiState.kt @@ -0,0 +1,18 @@ +package com.mifos.states + +import com.mifos.objects.runreports.client.ClientReportTypeItem + +/** + * Created by Aditya Gupta on 12/08/23. + */ +sealed class ReportCategoryUiState { + + object ShowProgressbar : ReportCategoryUiState() + + data class ShowError(val message: String) : ReportCategoryUiState() + + data class ShowReportCategories(val clientReportTypeItems: List) : + ReportCategoryUiState() + + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/states/ReportDetailUiState.kt b/mifosng-android/src/main/java/com/mifos/states/ReportDetailUiState.kt new file mode 100644 index 00000000000..bf6dec87c41 --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/states/ReportDetailUiState.kt @@ -0,0 +1,29 @@ +package com.mifos.states + +import com.mifos.objects.runreports.FullParameterListResponse + +/** + * Created by Aditya Gupta on 12/08/23. + */ +sealed class ReportDetailUiState { + + object ShowProgressbar : ReportDetailUiState() + + data class ShowError(val message: String) : ReportDetailUiState() + + data class ShowFullParameterResponse(val response: FullParameterListResponse) : + ReportDetailUiState() + + data class ShowParameterDetails( + val response: FullParameterListResponse, + val parameterName: String + ) : ReportDetailUiState() + + data class ShowOffices(val response: FullParameterListResponse, val parameterName: String) : + ReportDetailUiState() + + data class ShowProduct(val response: FullParameterListResponse, val parameterName: String) : + ReportDetailUiState() + + data class ShowRunReport(val response: FullParameterListResponse) : ReportDetailUiState() +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetPresenter.kt b/mifosng-android/src/main/java/com/mifos/viewmodels/GenerateCollectionSheetViewModel.kt similarity index 62% rename from mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetPresenter.kt rename to mifosng-android/src/main/java/com/mifos/viewmodels/GenerateCollectionSheetViewModel.kt index 846468f9486..a860ab69def 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/generatecollectionsheet/GenerateCollectionSheetPresenter.kt +++ b/mifosng-android/src/main/java/com/mifos/viewmodels/GenerateCollectionSheetViewModel.kt @@ -1,11 +1,11 @@ -package com.mifos.mifosxdroid.online.generatecollectionsheet +package com.mifos.viewmodels import android.content.Context -import com.mifos.api.DataManager +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import com.mifos.api.GenericResponse -import com.mifos.api.datamanager.DataManagerCollectionSheet import com.mifos.mifosxdroid.R -import com.mifos.mifosxdroid.base.BasePresenter import com.mifos.objects.PaymentTypeOption import com.mifos.objects.collectionsheet.AttendanceTypeOption import com.mifos.objects.collectionsheet.CenterDetail @@ -18,139 +18,129 @@ import com.mifos.objects.group.CenterWithAssociations import com.mifos.objects.group.Group import com.mifos.objects.organisation.Office import com.mifos.objects.organisation.Staff -import com.mifos.utils.MFErrorParser -import dagger.hilt.android.qualifiers.ActivityContext +import com.mifos.repositories.GenerateCollectionSheetRepository +import com.mifos.repositories.NewIndividualCollectionSheetRepository +import com.mifos.states.GenerateCollectionSheetUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext import rx.Observable import rx.Subscriber import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers -import rx.subscriptions.CompositeSubscription import javax.inject.Inject /** - * Created by Rajan Maurya on 06/06/16. + * Created by Aditya Gupta on 12/08/23. */ -class GenerateCollectionSheetPresenter @Inject constructor( - private val mDataManager: DataManager, - private val collectionDataManager: DataManagerCollectionSheet, - @param:ActivityContext private val c: Context -) : BasePresenter() { - private val mSubscription: CompositeSubscription = CompositeSubscription() - override fun attachView(mvpView: GenerateCollectionSheetMvpView) { - super.attachView(mvpView) - } +@HiltViewModel +class GenerateCollectionSheetViewModel @Inject constructor( + @ApplicationContext private val context: Context, + private val repository: GenerateCollectionSheetRepository, + private val repositoryNewInd: NewIndividualCollectionSheetRepository, +) : ViewModel() { - override fun detachView() { - super.detachView() - mSubscription.clear() - } + private val _generateCollectionSheetUiState = MutableLiveData() + + val generateCollectionSheetUiState: LiveData + get() = _generateCollectionSheetUiState fun loadOffices() { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(mDataManager.offices + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repositoryNewInd.offices() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber>() { override fun onCompleted() { - mvpView!!.showProgressbar(false) } override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(offices: List) { - mvpView!!.showProgressbar(false) - mvpView!!.showOffices(offices) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowOffices(offices) } }) - ) } fun loadStaffInOffice(officeId: Int) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(mDataManager.getStaffInOffice(officeId) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repositoryNewInd.getStaffInOffice(officeId) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber>() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(staffs: List) { - mvpView!!.showProgressbar(false) - mvpView!!.showStaffInOffice(staffs, officeId) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowStaffInOffice(staffs, officeId) } }) - ) + } fun loadCentersInOffice(id: Int, params: Map) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(mDataManager.getCentersInOffice(id, params) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.getCentersInOffice(id, params) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber>() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(centers: List
) { - mvpView!!.showProgressbar(false) - mvpView!!.showCentersInOffice(centers) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowCentersInOffice(centers) } }) - ) } fun loadGroupsInOffice(office: Int, params: Map) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(mDataManager.getGroupsByOffice(office, params) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.getGroupsByOffice(office, params) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber>() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(groups: List) { - mvpView!!.showProgressbar(false) - mvpView!!.showGroupsInOffice(groups) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowGroupsInOffice(groups) } }) - ) } fun loadGroupByCenter(centerId: Int) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(collectionDataManager.fetchGroupsAssociatedWithCenter(centerId) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.fetchGroupsAssociatedWithCenter(centerId) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(centerWithAssociations: CenterWithAssociations) { - mvpView!!.showProgressbar(false) - mvpView!!.showGroupByCenter(centerWithAssociations) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowGroupByCenter(centerWithAssociations) } }) - ) + } /** @@ -161,9 +151,8 @@ class GenerateCollectionSheetPresenter @Inject constructor( format: String?, locale: String?, meetingDate: String?, officeId: Int, staffId: Int ) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(collectionDataManager.fetchCenterDetails( + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.fetchCenterDetails( format, locale, meetingDate, officeId, staffId ) @@ -172,16 +161,16 @@ class GenerateCollectionSheetPresenter @Inject constructor( .subscribe(object : Subscriber>() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(centerDetails: List) { - mvpView!!.showProgressbar(false) - mvpView!!.onCenterLoadSuccess(centerDetails) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.OnCenterLoadSuccess(centerDetails) } }) - ) + } /** @@ -191,104 +180,92 @@ class GenerateCollectionSheetPresenter @Inject constructor( centerId: Int, payload: CollectionSheetRequestPayload? ) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(collectionDataManager.fetchProductiveCollectionSheet(centerId, payload) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.fetchProductiveCollectionSheet(centerId, payload) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(collectionSheetResponse: CollectionSheetResponse) { - mvpView!!.showProgressbar(false) - mvpView!!.showProductive(collectionSheetResponse) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowProductive(collectionSheetResponse) } }) - ) + } fun loadCollectionSheet( groupId: Int, payload: CollectionSheetRequestPayload? ) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(collectionDataManager.fetchCollectionSheet(groupId, payload) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.fetchCollectionSheet(groupId, payload) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(collectionSheetResponse: CollectionSheetResponse) { - mvpView!!.showProgressbar(false) - mvpView!!.showCollection(collectionSheetResponse) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowCollection(collectionSheetResponse) } }) - ) + } /** * Method to submit the ProductiveCollectionSheet */ fun submitProductiveSheet(centerId: Int, payload: ProductiveCollectionSheetPayload?) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(collectionDataManager.submitProductiveSheet(centerId, payload) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.submitProductiveSheet(centerId, payload) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(genericResponse: GenericResponse) { - mvpView!!.showProgressbar(false) - mvpView!!.showError( - c.resources.getString( - R.string.collectionsheet_submit_success - ) - ) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(context.resources.getString(R.string.collectionsheet_submit_success)) } }) - ) + } /** * Method to submit the CollectionSheet */ fun submitCollectionSheet(groupId: Int, payload: CollectionSheetPayload?) { - checkViewAttached() - mvpView!!.showProgressbar(true) - mSubscription.add(collectionDataManager.submitCollectionSheet(groupId, payload) + _generateCollectionSheetUiState.value = GenerateCollectionSheetUiState.ShowProgressbar + repository.submitCollectionSheet(groupId, payload) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(object : Subscriber() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView!!.showProgressbar(false) - mvpView!!.showError(MFErrorParser.errorMessage(e)) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(e.message.toString()) } override fun onNext(genericResponse: GenericResponse) { - mvpView!!.showProgressbar(false) - mvpView!!.showError( - c.resources.getString( - R.string.collectionsheet_submit_success - ) - ) + _generateCollectionSheetUiState.value = + GenerateCollectionSheetUiState.ShowError(context.resources.getString(R.string.collectionsheet_submit_success)) } }) - ) + } /** @@ -304,9 +281,9 @@ class GenerateCollectionSheetPresenter @Inject constructor( officeNames: MutableList ): HashMap { val officeMap = HashMap() - officeMap[c.resources.getString(R.string.spinner_office)] = -1 + officeMap[context.resources.getString(R.string.spinner_office)] = -1 officeNames.clear() - officeNames.add(c.resources.getString(R.string.spinner_office)) + officeNames.add(context.resources.getString(R.string.spinner_office)) Observable.from(offices) .subscribe { office -> officeMap[office.name] = office.id @@ -328,9 +305,9 @@ class GenerateCollectionSheetPresenter @Inject constructor( staffNames: MutableList ): HashMap { val staffMap = HashMap() - staffMap[c.resources.getString(R.string.spinner_staff)] = -1 + staffMap[context.resources.getString(R.string.spinner_staff)] = -1 staffNames.clear() - staffNames.add(c.resources.getString(R.string.spinner_staff)) + staffNames.add(context.resources.getString(R.string.spinner_staff)) Observable.from(staffs) .subscribe { staff -> staffMap[staff.displayName] = staff.id @@ -352,9 +329,9 @@ class GenerateCollectionSheetPresenter @Inject constructor( centerNames: MutableList ): HashMap { val centerMap = HashMap() - centerMap[c.resources.getString(R.string.spinner_center)] = -1 + centerMap[context.resources.getString(R.string.spinner_center)] = -1 centerNames.clear() - centerNames.add(c.resources.getString(R.string.spinner_center)) + centerNames.add(context.resources.getString(R.string.spinner_center)) Observable.from(centers) .subscribe { center -> centerMap[center.name] = center.id @@ -376,9 +353,9 @@ class GenerateCollectionSheetPresenter @Inject constructor( groupNames: MutableList ): HashMap { val groupMap = HashMap() - groupMap[c.resources.getString(R.string.spinner_group)] = -1 + groupMap[context.resources.getString(R.string.spinner_group)] = -1 groupNames.clear() - groupNames.add(c.resources.getString(R.string.spinner_group)) + groupNames.add(context.resources.getString(R.string.spinner_group)) Observable.from(groups) .subscribe { group -> groupMap[group.name] = group.id @@ -405,9 +382,9 @@ class GenerateCollectionSheetPresenter @Inject constructor( paymentTypeNames: MutableList ): HashMap { val paymentMap = HashMap() - paymentMap[c.resources.getString(R.string.payment_type)] = -1 + paymentMap[context.resources.getString(R.string.payment_type)] = -1 paymentTypeNames.clear() - paymentTypeNames.add(c.resources.getString(R.string.payment_type)) + paymentTypeNames.add(context.resources.getString(R.string.payment_type)) Observable.from(paymentTypeOptions) .subscribe { paymentTypeOption -> paymentMap[paymentTypeOption.name] = paymentTypeOption.id @@ -415,5 +392,4 @@ class GenerateCollectionSheetPresenter @Inject constructor( } return paymentMap } - } \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/viewmodels/GroupLoanAccountViewModel.kt b/mifosng-android/src/main/java/com/mifos/viewmodels/GroupLoanAccountViewModel.kt new file mode 100644 index 00000000000..28b32f6ddea --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/viewmodels/GroupLoanAccountViewModel.kt @@ -0,0 +1,208 @@ +package com.mifos.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.mifos.objects.accounts.loan.Loans +import com.mifos.objects.organisation.LoanProducts +import com.mifos.objects.templates.loans.AmortizationTypeOptions +import com.mifos.objects.templates.loans.FundOptions +import com.mifos.objects.templates.loans.GroupLoanTemplate +import com.mifos.objects.templates.loans.InterestCalculationPeriodType +import com.mifos.objects.templates.loans.InterestTypeOptions +import com.mifos.objects.templates.loans.LoanOfficerOptions +import com.mifos.objects.templates.loans.LoanPurposeOptions +import com.mifos.objects.templates.loans.TermFrequencyTypeOptions +import com.mifos.objects.templates.loans.TransactionProcessingStrategyOptions +import com.mifos.repositories.GroupLoanAccountRepository +import com.mifos.services.data.GroupLoanPayload +import com.mifos.states.GroupLoanAccountUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import rx.Observable +import rx.Subscriber +import rx.android.schedulers.AndroidSchedulers +import rx.schedulers.Schedulers +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +@HiltViewModel +class GroupLoanAccountViewModel @Inject constructor(private val repository: GroupLoanAccountRepository) : + ViewModel() { + + private val _groupLoanAccountUiState = MutableLiveData() + + val groupLoanAccountUiState: LiveData + get() = _groupLoanAccountUiState + + fun loadAllLoans() { + _groupLoanAccountUiState.value = GroupLoanAccountUiState.ShowProgressbar + repository.allLoans() + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber>() { + override fun onCompleted() { + } + + override fun onError(e: Throwable) { + _groupLoanAccountUiState.value = + GroupLoanAccountUiState.ShowFetchingError(e.message.toString()) + } + + override fun onNext(productLoans: List) { + _groupLoanAccountUiState.value = + GroupLoanAccountUiState.ShowAllLoans(productLoans) + } + }) + + } + + fun loadGroupLoansAccountTemplate(groupId: Int, productId: Int) { + _groupLoanAccountUiState.value = GroupLoanAccountUiState.ShowProgressbar + repository.getGroupLoansAccountTemplate(groupId, productId) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() { + } + + override fun onError(e: Throwable) { + _groupLoanAccountUiState.value = + GroupLoanAccountUiState.ShowFetchingError(e.message.toString()) + } + + override fun onNext(groupLoanTemplate: GroupLoanTemplate) { + _groupLoanAccountUiState.value = + GroupLoanAccountUiState.ShowGroupLoanTemplate(groupLoanTemplate) + } + }) + } + + fun createGroupLoanAccount(loansPayload: GroupLoanPayload?) { + _groupLoanAccountUiState.value = GroupLoanAccountUiState.ShowProgressbar + repository.createGroupLoansAccount(loansPayload) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() { + } + + override fun onError(e: Throwable) { + _groupLoanAccountUiState.value = + GroupLoanAccountUiState.ShowFetchingError(e.message.toString()) + } + + override fun onNext(loans: Loans) { + _groupLoanAccountUiState.value = + GroupLoanAccountUiState.ShowGroupLoansAccountCreatedSuccessfully(loans) + } + }) + + } + + fun filterAmortizations(amortizationTypeOptions: List?): List { + val amortizationNameList = ArrayList() + Observable.from(amortizationTypeOptions) + .subscribe { amortizationTypeOptions -> + amortizationTypeOptions.value?.let { + amortizationNameList.add( + it + ) + } + } + return amortizationNameList + } + + fun filterInterestCalculationPeriods(interestCalculationPeriodType: List?): List { + val interestCalculationPeriodNameList = ArrayList() + Observable.from(interestCalculationPeriodType) + .subscribe { interestCalculationPeriodType -> + interestCalculationPeriodType.value?.let { + interestCalculationPeriodNameList.add( + it + ) + } + } + return interestCalculationPeriodNameList + } + + fun filterTransactionProcessingStrategies(transactionProcessingStrategyOptions: List?): List { + val transactionProcessingStrategyNameList = ArrayList() + Observable.from(transactionProcessingStrategyOptions) + .subscribe { transactionProcessingStrategyOptions -> + transactionProcessingStrategyOptions.name?.let { + transactionProcessingStrategyNameList.add( + it + ) + } + } + return transactionProcessingStrategyNameList + } + + fun filterLoanProducts(loanProducts: List?): List { + val loanProductsNameList = ArrayList() + Observable.from(loanProducts) + .subscribe { loanProducts -> loanProducts.name?.let { loanProductsNameList.add(it) } } + return loanProductsNameList + } + + fun filterTermFrequencyTypes(termFrequencyTypeOptions: List?): List { + val termFrequencyNameList = ArrayList() + Observable.from(termFrequencyTypeOptions) + .subscribe { termFrequencyTypeOptions -> + termFrequencyTypeOptions.value?.let { + termFrequencyNameList.add( + it + ) + } + } + return termFrequencyNameList + } + + fun filterLoanPurposeTypes(loanPurposeOptions: List?): List { + val loanPurposeNameList = ArrayList() + Observable.from(loanPurposeOptions) + .subscribe { loanPurposeOptions -> + loanPurposeOptions.name?.let { + loanPurposeNameList.add( + it + ) + } + } + return loanPurposeNameList + } + + fun filterInterestTypeOptions(interestTypeOptions: List?): List { + val interestTypeNameList = ArrayList() + Observable.from(interestTypeOptions) + .subscribe { interestTypeOptions -> + interestTypeOptions.value?.let { + interestTypeNameList.add( + it + ) + } + } + return interestTypeNameList + } + + fun filterLoanOfficers(loanOfficerOptions: List?): List { + val loanOfficerNameList = ArrayList() + Observable.from(loanOfficerOptions) + .subscribe { loanOfficerOptions -> + loanOfficerOptions.displayName?.let { + loanOfficerNameList.add( + it + ) + } + } + return loanOfficerNameList + } + + fun filterFunds(fundOptions: List?): List { + val fundNameList = ArrayList() + Observable.from(fundOptions) + .subscribe { fundOptions -> fundOptions.name?.let { fundNameList.add(it) } } + return fundNameList + } +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/viewmodels/LoanRepaymentScheduleViewModel.kt b/mifosng-android/src/main/java/com/mifos/viewmodels/LoanRepaymentScheduleViewModel.kt new file mode 100644 index 00000000000..f0f265c325f --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/viewmodels/LoanRepaymentScheduleViewModel.kt @@ -0,0 +1,48 @@ +package com.mifos.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.mifos.objects.accounts.loan.LoanWithAssociations +import com.mifos.repositories.LoanRepaymentScheduleRepository +import com.mifos.states.LoanRepaymentScheduleUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import rx.Subscriber +import rx.android.schedulers.AndroidSchedulers +import rx.schedulers.Schedulers +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +@HiltViewModel +class LoanRepaymentScheduleViewModel @Inject constructor(private val repository: LoanRepaymentScheduleRepository) : + ViewModel() { + + private val _loanRepaymentScheduleUiState = MutableLiveData() + + val loanRepaymentScheduleUiState: LiveData + get() = _loanRepaymentScheduleUiState + + fun loadLoanRepaySchedule(loanId: Int) { + _loanRepaymentScheduleUiState.value = LoanRepaymentScheduleUiState.ShowProgressbar + repository.getLoanRepaySchedule(loanId) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() { + } + + override fun onError(e: Throwable) { + _loanRepaymentScheduleUiState.value = + LoanRepaymentScheduleUiState.ShowFetchingError(e.message.toString()) + } + + override fun onNext(loanWithAssociations: LoanWithAssociations) { + _loanRepaymentScheduleUiState.value = + LoanRepaymentScheduleUiState.ShowLoanRepaySchedule(loanWithAssociations) + } + }) + } + +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/viewmodels/LoanTransactionsViewModel.kt b/mifosng-android/src/main/java/com/mifos/viewmodels/LoanTransactionsViewModel.kt new file mode 100644 index 00000000000..5650a669473 --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/viewmodels/LoanTransactionsViewModel.kt @@ -0,0 +1,45 @@ +package com.mifos.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.mifos.objects.accounts.loan.LoanWithAssociations +import com.mifos.repositories.LoanTransactionsRepository +import com.mifos.states.LoanTransactionsUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import rx.Subscriber +import rx.android.schedulers.AndroidSchedulers +import rx.schedulers.Schedulers +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +@HiltViewModel +class LoanTransactionsViewModel @Inject constructor(private val repository: LoanTransactionsRepository) : + ViewModel() { + + private val _loanTransactionsUiState = MutableLiveData() + + val loanTransactionsUiState: LiveData + get() = _loanTransactionsUiState + + fun loadLoanTransaction(loan: Int) { + _loanTransactionsUiState.value = LoanTransactionsUiState.ShowProgressBar + repository.getLoanTransactions(loan) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() {} + override fun onError(e: Throwable) { + _loanTransactionsUiState.value = + LoanTransactionsUiState.ShowFetchingError(e.message.toString()) + } + + override fun onNext(loanWithAssociations: LoanWithAssociations) { + _loanTransactionsUiState.value = + LoanTransactionsUiState.ShowLoanTransaction(loanWithAssociations) + } + }) + } +} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryPresenter.kt b/mifosng-android/src/main/java/com/mifos/viewmodels/ReportCategoryViewModel.kt similarity index 56% rename from mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryPresenter.kt rename to mifosng-android/src/main/java/com/mifos/viewmodels/ReportCategoryViewModel.kt index 79e061dc6c7..16c7bc39da1 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportcategory/ReportCategoryPresenter.kt +++ b/mifosng-android/src/main/java/com/mifos/viewmodels/ReportCategoryViewModel.kt @@ -1,45 +1,38 @@ -package com.mifos.mifosxdroid.online.runreports.reportcategory +package com.mifos.viewmodels -import com.mifos.api.datamanager.DataManagerRunReport -import com.mifos.mifosxdroid.base.BasePresenter +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import com.mifos.objects.runreports.client.ClientReportTypeItem -import com.mifos.utils.MFErrorParser +import com.mifos.repositories.ReportCategoryRepository +import com.mifos.states.ReportCategoryUiState +import dagger.hilt.android.lifecycle.HiltViewModel import retrofit2.HttpException import rx.Subscriber import rx.android.schedulers.AndroidSchedulers import rx.plugins.RxJavaPlugins import rx.schedulers.Schedulers -import rx.subscriptions.CompositeSubscription import javax.inject.Inject /** - * Created by Tarun on 03-08-17. + * Created by Aditya Gupta on 12/08/23. */ -class ReportCategoryPresenter @Inject constructor(private val dataManager: DataManagerRunReport) : - BasePresenter() { - private val subscription: CompositeSubscription? +@HiltViewModel +class ReportCategoryViewModel @Inject constructor(private val repository: ReportCategoryRepository) : + ViewModel() { - init { - subscription = CompositeSubscription() - } - - override fun attachView(mvpView: ReportCategoryMvpView) { - super.attachView(mvpView) - } + private val _reportCategoryUiState = MutableLiveData() - override fun detachView() { - super.detachView() - subscription?.unsubscribe() - } + val reportCategoryUiState: LiveData + get() = _reportCategoryUiState fun fetchCategories( reportCategory: String?, genericResultSet: Boolean, parameterType: Boolean ) { - checkViewAttached() - mvpView?.showProgressbar(true) - subscription?.add(dataManager.getReportCategories( + _reportCategoryUiState.value = ReportCategoryUiState.ShowProgressbar + repository.getReportCategories( reportCategory, genericResultSet, parameterType ) @@ -48,17 +41,15 @@ class ReportCategoryPresenter @Inject constructor(private val dataManager: DataM .subscribe(object : Subscriber>() { override fun onCompleted() {} override fun onError(e: Throwable) { - mvpView?.showProgressbar(false) try { if (e is HttpException) { val errorMessage = e.response()?.errorBody() ?.string() - // Default User message is null in these queries most of the times. - // Hence, show Developer message. - mvpView?.showError( - MFErrorParser.parseError(errorMessage) - .errors[0].developerMessage - ) + _reportCategoryUiState.value = errorMessage?.let { + ReportCategoryUiState.ShowError( + it + ) + } } } catch (throwable: Throwable) { RxJavaPlugins.getInstance().errorHandler.handleError(e) @@ -66,11 +57,11 @@ class ReportCategoryPresenter @Inject constructor(private val dataManager: DataM } override fun onNext(clientReportTypeItems: List) { - mvpView?.showProgressbar(false) - mvpView?.showReportCategories(filterUniques(clientReportTypeItems)) + _reportCategoryUiState.value = + ReportCategoryUiState.ShowReportCategories(clientReportTypeItems) } }) - ) + } /** diff --git a/mifosng-android/src/main/java/com/mifos/viewmodels/ReportDetailViewModel.kt b/mifosng-android/src/main/java/com/mifos/viewmodels/ReportDetailViewModel.kt new file mode 100644 index 00000000000..1715822f36a --- /dev/null +++ b/mifosng-android/src/main/java/com/mifos/viewmodels/ReportDetailViewModel.kt @@ -0,0 +1,235 @@ +package com.mifos.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.mifos.objects.runreports.DataRow +import com.mifos.objects.runreports.FullParameterListResponse +import com.mifos.repositories.ReportDetailRepository +import com.mifos.states.ReportDetailUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import retrofit2.HttpException +import rx.Observable +import rx.Subscriber +import rx.android.schedulers.AndroidSchedulers +import rx.plugins.RxJavaPlugins +import rx.schedulers.Schedulers +import javax.inject.Inject + +/** + * Created by Aditya Gupta on 12/08/23. + */ +@HiltViewModel +class ReportDetailViewModel @Inject constructor(private val repository: ReportDetailRepository) : + ViewModel() { + + private val _reportDetailUiState = MutableLiveData() + + val reportDetailUiState: LiveData + get() = _reportDetailUiState + + fun fetchFullParameterList(reportName: String?, parameterType: Boolean) { + _reportDetailUiState.value = ReportDetailUiState.ShowProgressbar + repository.getReportFullParameterList(reportName, parameterType) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() {} + override fun onError(e: Throwable) { + try { + if (e is HttpException) { + val errorMessage = e.response()?.errorBody() + ?.string() + _reportDetailUiState.value = errorMessage?.let { + ReportDetailUiState.ShowError( + it + ) + } + } + } catch (throwable: Throwable) { + RxJavaPlugins.getInstance().errorHandler.handleError(e) + } + } + + override fun onNext(response: FullParameterListResponse) { + _reportDetailUiState.value = + ReportDetailUiState.ShowFullParameterResponse(response) + } + }) + + } + + fun fetchParameterDetails(parameterName: String?, parameterType: Boolean) { + _reportDetailUiState.value = ReportDetailUiState.ShowProgressbar + repository.getReportParameterDetails(parameterName, parameterType) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() {} + override fun onError(e: Throwable) { + try { + if (e is HttpException) { + val errorMessage = e.response()?.errorBody() + ?.string() + _reportDetailUiState.value = errorMessage?.let { + ReportDetailUiState.ShowError( + it + ) + } + } + } catch (throwable: Throwable) { + RxJavaPlugins.getInstance().errorHandler.handleError(e) + } + } + + override fun onNext(response: FullParameterListResponse) { + _reportDetailUiState.value = + parameterName?.let { + ReportDetailUiState.ShowParameterDetails( + response, + it + ) + } + } + }) + + } + + fun fetchOffices(parameterName: String?, officeId: Int, parameterType: Boolean) { + _reportDetailUiState.value = ReportDetailUiState.ShowProgressbar + repository.getRunReportOffices(parameterName, officeId, parameterType) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() {} + override fun onError(e: Throwable) { + try { + if (e is HttpException) { + val errorMessage = e.response()?.errorBody() + ?.string() + _reportDetailUiState.value = errorMessage?.let { + ReportDetailUiState.ShowError( + it + ) + } + } + } catch (throwable: Throwable) { + RxJavaPlugins.getInstance().errorHandler.handleError(e) + } + } + + override fun onNext(response: FullParameterListResponse) { + _reportDetailUiState.value = + parameterName?.let { ReportDetailUiState.ShowOffices(response, it) } + } + }) + + } + + fun fetchProduct(parameterName: String?, currencyId: String?, parameterType: Boolean) { + _reportDetailUiState.value = ReportDetailUiState.ShowProgressbar + repository.getRunReportProduct(parameterName, currencyId, parameterType) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() {} + override fun onError(e: Throwable) { + try { + if (e is HttpException) { + val errorMessage = e.response()?.errorBody() + ?.string() + _reportDetailUiState.value = errorMessage?.let { + ReportDetailUiState.ShowError( + it + ) + } + } + } catch (throwable: Throwable) { + RxJavaPlugins.getInstance().errorHandler.handleError(e) + } + } + + override fun onNext(response: FullParameterListResponse) { + _reportDetailUiState.value = + parameterName?.let { ReportDetailUiState.ShowProduct(response, it) } + } + }) + + } + + fun fetchRunReportWithQuery(reportName: String?, options: MutableMap) { + _reportDetailUiState.value = ReportDetailUiState.ShowProgressbar + repository.getRunReportWithQuery(reportName, options) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() {} + override fun onError(e: Throwable) { + try { + if (e is HttpException) { + val errorMessage = e.response()?.errorBody() + ?.string() + _reportDetailUiState.value = errorMessage?.let { + ReportDetailUiState.ShowError( + it + ) + } + } + } catch (throwable: Throwable) { + RxJavaPlugins.getInstance().errorHandler.handleError(e) + } + } + + override fun onNext(response: FullParameterListResponse) { + _reportDetailUiState.value = ReportDetailUiState.ShowRunReport(response) + } + }) + + } + + /** + * Method to filter Values of spinners with associated integer codes + * + * @param response List of DataRows + * @param values List of corresponding String values to be shown in Spinner + * @return HashMap of String values with the corresponding integer code + */ + fun filterIntHashMapForSpinner( + response: List?, + values: ArrayList + ): HashMap { + val map = HashMap() + values.clear() + Observable.from(response) + .subscribe { dataRow -> + val id = dataRow.row[0].toInt() + val value = dataRow.row[1] + values.add(value) + map[value] = id + } + return map + } + + /** + * Method to filter out values for the Spinners. + * + * @param response List of DataRows + * @param values List of the corresponding values + * @return HashMap of value and currency code pairs. + */ + fun filterStringHashMapForSpinner( + response: List?, + values: ArrayList + ): HashMap { + val map = HashMap() + values.clear() + Observable.from(response) + .subscribe { dataRow -> + val code = dataRow.row[0] + val value = dataRow.row[1] + values.add(value) + map[value] = code + } + return map + } +} \ No newline at end of file