From 295c77df3b1671e709ac88f4df32a9fe36e67322 Mon Sep 17 00:00:00 2001 From: Arin Yadav Date: Wed, 10 Dec 2025 16:23:02 +0530 Subject: [PATCH] New Fixed Deposits Account Interest Charts Step --- .../template/recurring/AccountChart.kt | 1 + .../network/model/FixedDepositTemplate.kt | 2 + .../composeResources/values/strings.xml | 13 ++ .../createShareAccount/pages/DetailsPage.kt | 2 +- .../createShareAccount/pages/PreviewPage.kt | 3 +- .../createShareAccount/pages/TermsPage.kt | 2 +- .../CreateFixedDepositAccountScreen.kt | 91 ++++++---- .../CreateFixedDepositAccountViewmodel.kt | 43 ++++- .../pages/DetailsPage.kt | 2 +- .../pages/InterestPage.kt | 155 ++++++++++++++++-- .../pages/SettingsPage.kt | 5 +- .../newFixedDepositAccount/pages/TermsPage.kt | 2 +- .../loan/newLoanAccount/pages/ChargesPage.kt | 2 +- .../loan/newLoanAccount/pages/DetailsPage.kt | 2 +- .../loan/newLoanAccount/pages/PreviewPage.kt | 3 +- .../loan/newLoanAccount/pages/SchedulePage.kt | 2 +- .../loan/newLoanAccount/pages/TermsPage.kt | 2 +- .../feature_recurring_deposit_string.xml | 2 +- .../RecurringAccountViewModel.kt | 16 +- .../pages/ChargesPage.kt | 3 +- .../pages/DetailsPage.kt | 3 +- .../pages/InterestPage.kt | 3 +- .../pages/SettingsPage.kt | 3 +- .../pages/TermsPage.kt | 3 +- .../savingsAccountv2/pages/ChargesPage.kt | 2 +- .../savingsAccountv2/pages/DetailsPage.kt | 2 +- .../savingsAccountv2/pages/PreviewPage.kt | 2 +- .../savingsAccountv2/pages/TermsPage.kt | 2 +- 28 files changed, 289 insertions(+), 84 deletions(-) diff --git a/core/model/src/commonMain/kotlin/com/mifos/core/model/objects/template/recurring/AccountChart.kt b/core/model/src/commonMain/kotlin/com/mifos/core/model/objects/template/recurring/AccountChart.kt index 49a57ac4fab..2dc02f3c1c4 100644 --- a/core/model/src/commonMain/kotlin/com/mifos/core/model/objects/template/recurring/AccountChart.kt +++ b/core/model/src/commonMain/kotlin/com/mifos/core/model/objects/template/recurring/AccountChart.kt @@ -31,5 +31,6 @@ data class AccountChart( @IgnoredOnParcel val incentiveTypeOptions: List? = null, val isPrimaryGroupingByAmount: Boolean? = null, val name: String? = null, + val description: String? = null, @IgnoredOnParcel val periodTypes: List? = null, ) : Parcelable diff --git a/core/network/src/commonMain/kotlin/com/mifos/core/network/model/FixedDepositTemplate.kt b/core/network/src/commonMain/kotlin/com/mifos/core/network/model/FixedDepositTemplate.kt index 9a8d2900dfc..102ddfba496 100644 --- a/core/network/src/commonMain/kotlin/com/mifos/core/network/model/FixedDepositTemplate.kt +++ b/core/network/src/commonMain/kotlin/com/mifos/core/network/model/FixedDepositTemplate.kt @@ -10,6 +10,7 @@ package com.mifos.core.network.model import com.mifos.core.model.objects.account.saving.FieldOfficerOptions +import com.mifos.core.model.objects.template.recurring.AccountChart import com.mifos.core.model.objects.template.recurring.Currency import com.mifos.core.model.objects.template.recurring.MaturityInstructionOption import com.mifos.core.model.objects.template.recurring.interest.InterestCalculationDaysInYearTypeOption @@ -56,4 +57,5 @@ data class FixedDepositTemplate( val lockinPeriodFrequencyTypeOptions: List? = null, val maturityInstructionOptions: List? = null, + val accountChart: AccountChart? = null, ) diff --git a/feature/client/src/commonMain/composeResources/values/strings.xml b/feature/client/src/commonMain/composeResources/values/strings.xml index ed6a316e0e6..5afb505b265 100644 --- a/feature/client/src/commonMain/composeResources/values/strings.xml +++ b/feature/client/src/commonMain/composeResources/values/strings.xml @@ -620,4 +620,17 @@ Penal Interest (%%) Period + Name + Valid From Date + End Date + Description + Grouping By Amount + INTEREST RATE CHART + Rate Chart + No Interest Rate Chart available + Yes + No + Date Not Found + + \ No newline at end of file diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/DetailsPage.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/DetailsPage.kt index 043ae3dfda9..5e274eeac31 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/DetailsPage.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/DetailsPage.kt @@ -51,8 +51,8 @@ import kotlin.time.ExperimentalTime @Composable fun DetailsPage( state: CreateShareAccountState, - onAction: (CreateShareAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (CreateShareAccountAction) -> Unit, ) { val submissionDatePickerState = rememberDatePickerState( initialSelectedDateMillis = Clock.System.now().toEpochMilliseconds(), diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/PreviewPage.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/PreviewPage.kt index 95a33df87cb..596a2d4af1f 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/PreviewPage.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/PreviewPage.kt @@ -52,13 +52,14 @@ import org.jetbrains.compose.resources.stringResource @Composable fun PreviewPage( state: CreateShareAccountState, + modifier: Modifier = Modifier, onAction: (CreateShareAccountAction) -> Unit, ) { Column( Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large), ) { Column( - modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()), + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(20.dp), ) { Text( diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/TermsPage.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/TermsPage.kt index 9d3fe353735..151ce1dab5e 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/TermsPage.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/createShareAccount/pages/TermsPage.kt @@ -62,8 +62,8 @@ import kotlin.time.ExperimentalTime @Composable fun TermsPage( state: CreateShareAccountState, - onAction: (CreateShareAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (CreateShareAccountAction) -> Unit, ) { val applicationDatePickerState = rememberDatePickerState( initialSelectedDateMillis = Clock.System.now().toEpochMilliseconds(), diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountScreen.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountScreen.kt index 400d6c46cbd..4759fd86b06 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountScreen.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountScreen.kt @@ -32,6 +32,7 @@ import com.mifos.core.ui.components.Step import com.mifos.core.ui.util.EventsEffect import com.mifos.feature.client.newFixedDepositAccount.pages.ChargesPage import com.mifos.feature.client.newFixedDepositAccount.pages.DetailsPage +import com.mifos.feature.client.newFixedDepositAccount.pages.FixedDepositRateChart import com.mifos.feature.client.newFixedDepositAccount.pages.InterestPage import com.mifos.feature.client.newFixedDepositAccount.pages.SettingPage import com.mifos.feature.client.newFixedDepositAccount.pages.TermsPage @@ -53,53 +54,74 @@ internal fun CreateFixedDepositAccountScreen( NewFixedDepositAccountEvent.Finish -> onFinish() } } - FixedDepositAccountScaffold( + CreateFixedDepositAccountScaffold( navController = navController, state = state, onAction = { viewModel.trySendAction(it) }, modifier = modifier, ) + CreateFixedDepositAccountDialog( + state = state, + onAction = { viewModel.trySendAction(it) }, + ) } @Composable -private fun FixedDepositAccountScaffold( +internal fun CreateFixedDepositAccountDialog( + state: NewFixedDepositAccountState, + onAction: (NewFixedDepositAccountAction) -> Unit, +) { + when (state.dialogState) { + NewFixedDepositAccountState.DialogState.RateChartDialog -> { + FixedDepositRateChart( + state = state, + onAction = onAction, + ) + } + + null -> Unit + } +} + +@Composable +private fun CreateFixedDepositAccountScaffold( navController: NavController, state: NewFixedDepositAccountState, onAction: (NewFixedDepositAccountAction) -> Unit, modifier: Modifier = Modifier, ) { - val steps = - listOf( - Step(stringResource(Res.string.step_details)) { - DetailsPage( - state = state, - onAction = onAction, - ) - }, - Step(name = stringResource(Res.string.step_terms)) { - TermsPage( - state = state, - onAction = onAction, - ) - }, + val steps = listOf( + Step(stringResource(Res.string.step_details)) { + DetailsPage( + state = state, + onAction = onAction, + ) + }, + Step(name = stringResource(Res.string.step_terms)) { + TermsPage( + state = state, + onAction = onAction, + ) + }, - Step(name = stringResource(Res.string.step_settings)) { - SettingPage( - state = state, - onAction = onAction, - ) - }, - Step(name = stringResource(Res.string.step_interest)) { - InterestPage( - onNext = { onAction(NewFixedDepositAccountAction.OnNextPress) }, - ) - }, - Step(stringResource(Res.string.step_charges)) { - ChargesPage( - onNext = { onAction(NewFixedDepositAccountAction.OnNextPress) }, - ) - }, - ) + Step(name = stringResource(Res.string.step_settings)) { + SettingPage( + state = state, + onAction = onAction, + ) + }, + Step(name = stringResource(Res.string.step_interest)) { + InterestPage( + state = state, + onAction = onAction, + ) + }, + Step(stringResource(Res.string.step_charges)) { + ChargesPage( + onNext = { onAction(NewFixedDepositAccountAction.OnNextPress) }, + ) + }, + ) MifosScaffold( modifier = modifier, @@ -127,8 +149,7 @@ private fun FixedDepositAccountScaffold( onStepChange = { newIndex -> onAction(NewFixedDepositAccountAction.OnStepChange(newIndex)) }, - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), ) } diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountViewmodel.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountViewmodel.kt index d5cd1aaf010..8ff80ca7e5e 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountViewmodel.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/CreateFixedDepositAccountViewmodel.kt @@ -143,6 +143,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnLockInPeriodFrequencyChange -> { mutableStateFlow.update { it.copy( @@ -150,6 +151,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnLockInPeriodTypeIndexChange -> { mutableStateFlow.update { it.copy( @@ -157,6 +159,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnMaturityInstructionIndexChange -> { mutableStateFlow.update { it.copy( @@ -164,6 +167,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnMaximumDepositFrequencyChange -> { mutableStateFlow.update { it.copy( @@ -171,6 +175,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnMaximumDepositTypeIndexChange -> { mutableStateFlow.update { it.copy( @@ -178,6 +183,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnMinimumDepositTermFrequencyChange -> { mutableStateFlow.update { it.copy( @@ -185,6 +191,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnMinimumDepositTermTypeIndexChange -> { mutableStateFlow.update { it.copy( @@ -192,6 +199,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnMultiplesFrequencyChange -> { mutableStateFlow.update { it.copy( @@ -199,6 +207,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnMultiplesTypeIndexChange -> { mutableStateFlow.update { it.copy( @@ -206,6 +215,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnPenalInterestChange -> { mutableStateFlow.update { it.copy( @@ -213,6 +223,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnPeriodIndexChange -> { mutableStateFlow.update { it.copy( @@ -220,6 +231,7 @@ class CreateFixedDepositAccountViewmodel( ) } } + is NewFixedDepositAccountAction.OnTransferLinkedSavingsAccountInterestChange -> { mutableStateFlow.update { it.copy( @@ -227,6 +239,21 @@ class CreateFixedDepositAccountViewmodel( ) } } + + NewFixedDepositAccountAction.OnDismissDialog -> { + mutableStateFlow.update { + it.copy( + dialogState = null, + ) + } + } + NewFixedDepositAccountAction.OnShowRateChart -> { + mutableStateFlow.update { + it.copy( + dialogState = NewFixedDepositAccountState.DialogState.RateChartDialog, + ) + } + } } } @@ -353,9 +380,7 @@ class CreateFixedDepositAccountViewmodel( ), ) } - if (state.template.fieldOfficerOptions == null) { - loadRecurringAccountTemplateWithProduct() - } + loadRecurringAccountTemplateWithProduct() } private fun handleFieldOfficerChange(action: NewFixedDepositAccountAction.OnFieldOfficerChange) { @@ -466,6 +491,7 @@ class CreateFixedDepositAccountViewmodel( mutableStateFlow.update { it.copy( currentStep = current + 1, + dialogState = null, ) } } else { @@ -477,7 +503,7 @@ class CreateFixedDepositAccountViewmodel( data class NewFixedDepositAccountState( val clientId: Int = -1, val currentStep: Int = 0, - val dialogState: Any? = null, + val dialogState: DialogState? = null, val totalSteps: Int = 4, val screenState: ScreenState = ScreenState.Loading, val fixedDepositAccountDetail: FixedDepositAccountDetailsState = FixedDepositAccountDetailsState(), @@ -500,13 +526,18 @@ data class NewFixedDepositAccountState( val penalInterest: String = "", val transferLinkedSavingAccountInterest: Boolean = false, - ) { sealed interface ScreenState { data class Error(val message: String) : ScreenState data object Loading : ScreenState data object Success : ScreenState } + + sealed interface DialogState { + data object RateChartDialog : DialogState + } + + val isRateChartEmpty = !template.accountChart?.chartSlabs.isNullOrEmpty() } data class FixedDepositAccountTermsState( @@ -544,6 +575,7 @@ sealed class NewFixedDepositAccountAction { data object OnNextPress : NewFixedDepositAccountAction() data object OnDetailNext : NewFixedDepositAccountAction() data object OnTermNext : NewFixedDepositAccountAction() + data object OnDismissDialog : NewFixedDepositAccountAction() data class OnStepChange(val newIndex: Int) : NewFixedDepositAccountAction() data object PreviousStep : NewFixedDepositAccountAction() data object NavigateBack : NewFixedDepositAccountAction() @@ -554,6 +586,7 @@ sealed class NewFixedDepositAccountAction { data class OnFieldOfficerChange(val index: Int) : NewFixedDepositAccountAction() data class OnExternalIdChange(val value: String) : NewFixedDepositAccountAction() data object Retry : NewFixedDepositAccountAction() + data object OnShowRateChart : NewFixedDepositAccountAction() data class OnLockInPeriodFrequencyChange(val value: String) : NewFixedDepositAccountAction() data class OnLockInPeriodTypeIndexChange(val index: Int) : NewFixedDepositAccountAction() data class OnMinimumDepositTermFrequencyChange(val value: String) : diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/DetailsPage.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/DetailsPage.kt index eb881c9f102..0626cf057d7 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/DetailsPage.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/DetailsPage.kt @@ -53,8 +53,8 @@ import kotlin.time.ExperimentalTime @Composable fun DetailsPage( state: NewFixedDepositAccountState, - onAction: (NewFixedDepositAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (NewFixedDepositAccountAction) -> Unit, ) { val submissionDatePickerState = rememberDatePickerState( initialSelectedDateMillis = Clock.System.now().toEpochMilliseconds(), diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/InterestPage.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/InterestPage.kt index 29f9a7f1392..5081552783e 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/InterestPage.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/InterestPage.kt @@ -10,28 +10,161 @@ package com.mifos.feature.client.newFixedDepositAccount.pages import androidclient.feature.client.generated.resources.Res +import androidclient.feature.client.generated.resources.action_view +import androidclient.feature.client.generated.resources.btn_back +import androidclient.feature.client.generated.resources.feature_client_next +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_description +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_empty_date +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_end_date +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_grouping_by_amount +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_interest_rate_chart +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_name +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_no +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_no_interest_chart +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_rate_chart +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_valid_from_date +import androidclient.feature.client.generated.resources.feature_fixed_deposit_interest_yes import androidclient.feature.client.generated.resources.step_interest +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.material3.Button +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp +import com.mifos.core.common.utils.CurrencyFormatter +import com.mifos.core.common.utils.DateHelper +import com.mifos.core.designsystem.component.MifosBottomSheet +import com.mifos.core.designsystem.theme.DesignToken +import com.mifos.core.designsystem.theme.MifosTypography +import com.mifos.core.ui.components.MifosActionsChargeListingComponent +import com.mifos.core.ui.components.MifosDefaultListingComponentFromStringResources +import com.mifos.core.ui.components.MifosRowWithTextAndButton +import com.mifos.core.ui.components.MifosTwoButtonRow +import com.mifos.feature.client.newFixedDepositAccount.NewFixedDepositAccountAction +import com.mifos.feature.client.newFixedDepositAccount.NewFixedDepositAccountState import org.jetbrains.compose.resources.stringResource @Composable -fun InterestPage(onNext: () -> Unit) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text( - stringResource(Res.string.step_interest), +fun InterestPage( + state: NewFixedDepositAccountState, + modifier: Modifier = Modifier, + onAction: (NewFixedDepositAccountAction) -> Unit, +) { + Column(Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { + Column( + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), + ) { + Text( + text = stringResource(Res.string.step_interest), + style = MifosTypography.labelLargeEmphasized, + ) + Spacer(Modifier.height(DesignToken.padding.large)) - ) - Spacer(Modifier.height(8.dp)) - Button(onClick = onNext) { - Text("Next Button") + MifosDefaultListingComponentFromStringResources( + data = mapOf( + Res.string.feature_fixed_deposit_interest_name to state.template.accountChart?.name.orEmpty(), + Res.string.feature_fixed_deposit_interest_valid_from_date to ( + state.template.accountChart?.fromDate + ?.let { DateHelper.getDateAsString(it) } + ?: stringResource(Res.string.feature_fixed_deposit_interest_empty_date) + ), + Res.string.feature_fixed_deposit_interest_end_date to ( + state.template.accountChart?.endDate + ?.let { DateHelper.getDateAsString(it) } + ?: stringResource(Res.string.feature_fixed_deposit_interest_empty_date) + ), + Res.string.feature_fixed_deposit_interest_description to state.template.accountChart?.description.orEmpty(), + Res.string.feature_fixed_deposit_interest_grouping_by_amount to if (state.template.accountChart?.isPrimaryGroupingByAmount == true) { + stringResource( + Res.string.feature_fixed_deposit_interest_yes, + ) + } else { + stringResource(Res.string.feature_fixed_deposit_interest_no) + }, + ), + verticalArrangement = Arrangement.spacedBy(DesignToken.padding.small), + ) + + Spacer(Modifier.height(DesignToken.padding.large)) + + MifosRowWithTextAndButton( + onBtnClick = { + onAction(NewFixedDepositAccountAction.OnShowRateChart) + }, + btnText = stringResource(Res.string.action_view), + text = if (state.isRateChartEmpty) { + stringResource(Res.string.feature_fixed_deposit_interest_interest_rate_chart) + } else { + stringResource(Res.string.feature_fixed_deposit_interest_no_interest_chart) + }, + btnEnabled = state.isRateChartEmpty, + ) + Spacer(Modifier.height(DesignToken.padding.large)) } + + MifosTwoButtonRow( + firstBtnText = stringResource(Res.string.btn_back), + secondBtnText = stringResource(Res.string.feature_client_next), + onFirstBtnClick = { onAction(NewFixedDepositAccountAction.PreviousStep) }, + onSecondBtnClick = { onAction(NewFixedDepositAccountAction.OnNextPress) }, + ) } } + +@Composable +fun FixedDepositRateChart( + state: NewFixedDepositAccountState, + onAction: (NewFixedDepositAccountAction) -> Unit, +) { + MifosBottomSheet( + onDismiss = { + onAction(NewFixedDepositAccountAction.OnDismissDialog) + }, + content = { + Column( + modifier = Modifier.fillMaxWidth().padding(DesignToken.padding.large), + verticalArrangement = Arrangement.spacedBy(DesignToken.padding.largeIncreased), + ) { + Text( + text = stringResource(Res.string.feature_fixed_deposit_interest_rate_chart), + style = MifosTypography.titleMediumEmphasized, + ) + + state.template.accountChart?.chartSlabs?.forEachIndexed { index, slab -> + + /** here amountRangeTo implement later because currently API not support amountRangeTo*/ + MifosActionsChargeListingComponent( + chargeTitle = CurrencyFormatter.format( + balance = slab.amountRangeFrom, + currencyCode = slab.currency?.code, + maximumFractionDigits = slab.currency?.decimalPlaces, + ) + " - ", + type = slab.description ?: "", + collectedOn = "@" + slab.annualInterestRate.toString() + "%", + date = slab.fromPeriod.toString() + " - " + slab.periodType?.value, + onActionClicked = {}, + isExpanded = false, + onExpandToggle = {}, + ) + } + + MifosTwoButtonRow( + firstBtnText = stringResource(Res.string.btn_back), + secondBtnText = stringResource(Res.string.feature_client_next), + onFirstBtnClick = { + onAction(NewFixedDepositAccountAction.OnDismissDialog) + }, + onSecondBtnClick = { + onAction(NewFixedDepositAccountAction.OnNextPress) + }, + ) + } + }, + ) +} diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/SettingsPage.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/SettingsPage.kt index 8e75c7a22b2..4af3698e39c 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/SettingsPage.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/SettingsPage.kt @@ -54,11 +54,12 @@ import org.jetbrains.compose.resources.stringResource @Composable fun SettingPage( state: NewFixedDepositAccountState, + modifier: Modifier = Modifier, onAction: (NewFixedDepositAccountAction) -> Unit, ) { Column(Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( - modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()), + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), ) { Text( stringResource(Res.string.feature_fixed_deposit_setting_lock_in_period), @@ -310,8 +311,6 @@ fun SettingPage( }, label = stringResource(Res.string.feature_fixed_deposit_setting_period), ) - - Spacer(Modifier.height(DesignToken.padding.large)) } } } diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/TermsPage.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/TermsPage.kt index 920fa457c46..158ea917773 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/TermsPage.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/newFixedDepositAccount/pages/TermsPage.kt @@ -48,8 +48,8 @@ import org.jetbrains.compose.resources.stringResource @Composable fun TermsPage( state: NewFixedDepositAccountState, - onAction: (NewFixedDepositAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (NewFixedDepositAccountAction) -> Unit, ) { Column(modifier = Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/ChargesPage.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/ChargesPage.kt index 194aa69a933..83aa00c2bd0 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/ChargesPage.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/ChargesPage.kt @@ -45,8 +45,8 @@ import org.jetbrains.compose.resources.stringResource @Composable fun ChargesPage( state: NewLoanAccountState, - onAction: (NewLoanAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (NewLoanAccountAction) -> Unit, ) { Column(Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/DetailsPage.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/DetailsPage.kt index 1cf82d72bd6..6584a01f421 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/DetailsPage.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/DetailsPage.kt @@ -62,8 +62,8 @@ import kotlin.time.ExperimentalTime @Composable fun DetailsPage( state: NewLoanAccountState, - onAction: (NewLoanAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (NewLoanAccountAction) -> Unit, ) { val submissionDatePickerState = rememberDatePickerState( initialSelectedDateMillis = Clock.System.now().toEpochMilliseconds(), diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/PreviewPage.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/PreviewPage.kt index f711eeb5c76..1c1b364f4e7 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/PreviewPage.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/PreviewPage.kt @@ -75,13 +75,14 @@ import org.jetbrains.compose.resources.stringResource @Composable fun PreviewPage( state: NewLoanAccountState, + modifier: Modifier = Modifier, onAction: (NewLoanAccountAction) -> Unit, ) { Column( Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large), ) { Column( - modifier = Modifier.weight(1f) + modifier = modifier.weight(1f) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(20.dp), ) { diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/SchedulePage.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/SchedulePage.kt index 13be3d4da32..b2cb09cd56f 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/SchedulePage.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/SchedulePage.kt @@ -38,8 +38,8 @@ import org.jetbrains.compose.resources.stringResource @Composable fun SchedulePage( state: NewLoanAccountState, - onAction: (NewLoanAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (NewLoanAccountAction) -> Unit, ) { Column( Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large), diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/TermsPage.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/TermsPage.kt index 9555861c1d8..0ce66a6db66 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/TermsPage.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/pages/TermsPage.kt @@ -102,8 +102,8 @@ import kotlin.time.ExperimentalTime @Composable fun TermsPage( state: NewLoanAccountState, - onAction: (NewLoanAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (NewLoanAccountAction) -> Unit, ) { val firstRepaymentOnDatePickerState = rememberDatePickerState( initialSelectedDateMillis = Clock.System.now().toEpochMilliseconds(), diff --git a/feature/recurringDeposit/src/commonMain/composeResources/values/feature_recurring_deposit_string.xml b/feature/recurringDeposit/src/commonMain/composeResources/values/feature_recurring_deposit_string.xml index d1bc8665ee0..32feb84b44b 100644 --- a/feature/recurringDeposit/src/commonMain/composeResources/values/feature_recurring_deposit_string.xml +++ b/feature/recurringDeposit/src/commonMain/composeResources/values/feature_recurring_deposit_string.xml @@ -61,7 +61,7 @@ Rate Chart Yes No - Empty Date + Date Not Found Add New Charge Active Charge Add New diff --git a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/RecurringAccountViewModel.kt b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/RecurringAccountViewModel.kt index b69c3df63c9..d24e26ea7fc 100644 --- a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/RecurringAccountViewModel.kt +++ b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/RecurringAccountViewModel.kt @@ -67,6 +67,7 @@ class RecurringAccountViewModel( mutableStateFlow.update { it.copy( currentStep = state.currentStep + 1, + dialogState = null, ) } } else { @@ -156,16 +157,11 @@ class RecurringAccountViewModel( ), ) } - - if ( - state.template.fieldOfficerOptions == null - ) { - loadRecurringAccountTemplateWithProduct( - state.clientId, - state.template.productOptions?.get(state.recurringDepositAccountDetail.loanProductSelected)?.id - ?: -1, - ) - } + loadRecurringAccountTemplateWithProduct( + state.clientId, + state.template.productOptions?.get(state.recurringDepositAccountDetail.loanProductSelected)?.id + ?: -1, + ) } private fun handleInterestCalculationDaysInYearType(action: RecurringAccountAction.RecurringAccountTermAction.OnInterestCalculationDaysInYearType) { diff --git a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/ChargesPage.kt b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/ChargesPage.kt index 3d132c3926a..4a14c82738e 100644 --- a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/ChargesPage.kt +++ b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/ChargesPage.kt @@ -60,11 +60,12 @@ import org.jetbrains.compose.resources.stringResource @Composable fun ChargesPage( state: RecurringAccountState, + modifier: Modifier = Modifier, onAction: (RecurringAccountAction) -> Unit, ) { Column(modifier = Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( - modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()), + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), ) { Text( stringResource(Res.string.feature_recurring_deposit_step_charges), diff --git a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/DetailsPage.kt b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/DetailsPage.kt index 066a327969c..7b0efd664c2 100644 --- a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/DetailsPage.kt +++ b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/DetailsPage.kt @@ -55,6 +55,7 @@ import kotlin.time.ExperimentalTime @Composable fun DetailsPage( state: RecurringAccountState, + modifier: Modifier = Modifier, onAction: (RecurringAccountAction) -> Unit, ) { val submissionDatePickerState = rememberDatePickerState( @@ -111,7 +112,7 @@ fun DetailsPage( Column(Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( - modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()), + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), ) { Text( text = stringResource(Res.string.feature_recurring_deposit_step_details), diff --git a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/InterestPage.kt b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/InterestPage.kt index 93c60ce023d..1e0046f5b50 100644 --- a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/InterestPage.kt +++ b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/InterestPage.kt @@ -52,11 +52,12 @@ import org.jetbrains.compose.resources.stringResource @Composable fun InterestPage( state: RecurringAccountState, + modifier: Modifier = Modifier, onAction: (RecurringAccountAction) -> Unit, ) { Column(Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( - modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()), + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), ) { Text( text = stringResource(Res.string.feature_recurring_deposit_step_interest), diff --git a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/SettingsPage.kt b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/SettingsPage.kt index 8b26863b2de..727dfdd6cc7 100644 --- a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/SettingsPage.kt +++ b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/SettingsPage.kt @@ -63,13 +63,14 @@ import org.jetbrains.compose.ui.tooling.preview.Preview @Composable fun SettingPage( state: RecurringAccountState, + modifier: Modifier = Modifier, onAction: (RecurringAccountAction) -> Unit, ) { val settingsState = state.recurringDepositAccountSettings Column(Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( - modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()), + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), ) { Text( text = stringResource(Res.string.feature_recurring_deposit_step_settings), diff --git a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/TermsPage.kt b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/TermsPage.kt index 43954f711c8..1a8a02a9078 100644 --- a/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/TermsPage.kt +++ b/feature/recurringDeposit/src/commonMain/kotlin/com/mifos/feature/recurringDeposit/newRecurringDepositAccount/pages/TermsPage.kt @@ -38,11 +38,12 @@ import org.jetbrains.compose.resources.stringResource @Composable fun TermsPage( state: RecurringAccountState, + modifier: Modifier = Modifier, onAction: (RecurringAccountAction) -> Unit, ) { Column(Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( - modifier = Modifier.weight(1f).verticalScroll(rememberScrollState()), + modifier = modifier.weight(1f).verticalScroll(rememberScrollState()), ) { Text( text = stringResource(Res.string.feature_recurring_deposit_step_terms), diff --git a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/ChargesPage.kt b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/ChargesPage.kt index 762085c88fc..aa30bd2f309 100644 --- a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/ChargesPage.kt +++ b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/ChargesPage.kt @@ -46,8 +46,8 @@ import org.jetbrains.compose.resources.stringResource @Composable fun ChargesPage( state: SavingsAccountState, - onAction: (SavingsAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (SavingsAccountAction) -> Unit, ) { Column(modifier = Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column( diff --git a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/DetailsPage.kt b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/DetailsPage.kt index d9ab16743ce..11350a89666 100644 --- a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/DetailsPage.kt +++ b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/DetailsPage.kt @@ -55,8 +55,8 @@ import kotlin.time.ExperimentalTime @Composable fun DetailsPage( state: SavingsAccountState, - onAction: (SavingsAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (SavingsAccountAction) -> Unit, ) { val submissionDatePickerState = rememberDatePickerState( initialSelectedDateMillis = Clock.System.now().toEpochMilliseconds(), diff --git a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/PreviewPage.kt b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/PreviewPage.kt index 389bbc47355..ed383f54fa8 100644 --- a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/PreviewPage.kt +++ b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/PreviewPage.kt @@ -56,8 +56,8 @@ import kotlin.collections.mapOf @Composable fun PreviewPage( state: SavingsAccountState, - onAction: (SavingsAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (SavingsAccountAction) -> Unit, ) { val previewDetailsMap = mapOf( stringResource(Res.string.feature_savings_product_name) to diff --git a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/TermsPage.kt b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/TermsPage.kt index 89f5352504a..4099cfff0eb 100644 --- a/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/TermsPage.kt +++ b/feature/savings/src/commonMain/kotlin/com/mifos/feature/savings/savingsAccountv2/pages/TermsPage.kt @@ -60,8 +60,8 @@ import org.jetbrains.compose.resources.stringResource @Composable fun TermsPage( state: SavingsAccountState, - onAction: (SavingsAccountAction) -> Unit, modifier: Modifier = Modifier, + onAction: (SavingsAccountAction) -> Unit, ) { Column(modifier = Modifier.fillMaxSize().padding(bottom = DesignToken.padding.large)) { Column(