From a15eb12fd7f24e726dd13c340520a230eda40ffc Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Wed, 3 Sep 2025 02:51:11 +0530 Subject: [PATCH 1/9] Ticket 575 on android client --- .../ClientCollateralScreen.kt | 152 ++++++++++++++++++ .../ClientCollateralUiState.kt | 18 +++ .../ClientCollateralViewmodel.kt | 78 +++++++++ feature/savings/build.gradle.kts | 1 + gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 6 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt create mode 100644 feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt create mode 100644 feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt new file mode 100644 index 00000000000..d3363186346 --- /dev/null +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt @@ -0,0 +1,152 @@ +package com.mifos.feature.loan.ClientCollateral + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +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.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items + +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +// Koin ViewModel import +import org.koin.compose.viewmodel.koinViewModel + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ClientCollateralScreen( + viewModel: ClientCollateralViewModel = koinViewModel() +) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + Scaffold( + topBar = { + TopAppBar(title = { + val titleText = when (val state = uiState) { + is ClientCollateralUiState.Success -> "Collateral Data (${state.totalItems} ${if (state.totalItems == 1) "Item" else "Items"})" + is ClientCollateralUiState.Empty -> "Collateral Data (0 Items)" + else -> "Collateral Data" + } + Text(text = titleText) + }) + } + ) { paddingValues -> + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + .padding(horizontal = 16.dp, vertical = 8.dp), + contentAlignment = Alignment.TopCenter // Changed to TopCenter for list display + ) { + when (val state = uiState) { + is ClientCollateralUiState.Loading -> { + // Centered loading indicator + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + CircularProgressIndicator() + } + } + is ClientCollateralUiState.Success -> { + CollateralList(items = state.items) + } + is ClientCollateralUiState.Empty -> { + // Centered empty state message + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + EmptyCollateralState() + } + } + is ClientCollateralUiState.Error -> { + // Centered error state message + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + ErrorState(message = state.message, onRetry = { viewModel.loadCollateralItems() }) + } + } + } + } + } +} + +@Composable +fun CollateralList(items: List) { + LazyColumn( + verticalArrangement = Arrangement.spacedBy(8.dp), + contentPadding = PaddingValues(top = 8.dp, bottom = 8.dp) + ) { + items(items, key = { it.id }) { item -> // Use item.id as a key for better performance + CollateralListItem(item = item, onActionClick = { /* TODO: Handle action click */ }) + } + } +} + +@Composable +fun CollateralListItem(item: CollateralDisplayItem, onActionClick: () -> Unit) { + Card( + modifier = Modifier + .fillMaxWidth() + ) { + Column(modifier = Modifier.padding(16.dp)) { + Text("Type/Name: ${item.typeName}", fontWeight = FontWeight.Bold, style = MaterialTheme.typography.titleMedium) + Spacer(modifier = Modifier.height(4.dp)) + Text("Quantity: ${item.quantity}", style = MaterialTheme.typography.bodyMedium) + Spacer(modifier = Modifier.height(4.dp)) + Text("Unit Value: ${item.unitValue}", style = MaterialTheme.typography.bodyMedium) + Spacer(modifier = Modifier.height(4.dp)) + Text("Total Collateral Value: ${item.totalCollateralValue}", style = MaterialTheme.typography.bodyMedium) + Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.CenterEnd) { + IconButton(onClick = onActionClick) { + + } + } + } + } +} + +@Composable +fun EmptyCollateralState() { + Card(modifier = Modifier.padding(16.dp)) { + Column( + modifier = Modifier + .padding(32.dp) + .fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text("No Item Found", style = MaterialTheme.typography.headlineSmall) + } + } +} + +@Composable +fun ErrorState(message: String, onRetry: () -> Unit) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier.padding(16.dp) + ) { + Text("Error: $message", color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodyLarge) + Spacer(modifier = Modifier.height(16.dp)) + Button(onClick = onRetry) { + Text("Retry") + } + } +} + diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt new file mode 100644 index 00000000000..723240b74c7 --- /dev/null +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt @@ -0,0 +1,18 @@ +package com.mifos.feature.loan.ClientCollateral + + + +data class CollateralDisplayItem( + val id: Int, + val typeName: String, + val quantity: Int, + val unitValue: Double, + val totalCollateralValue: Double +) +sealed interface ClientCollateralUiState { + data object Loading : ClientCollateralUiState + data class Error(val message: String) : ClientCollateralUiState + data object Empty : ClientCollateralUiState + data class Success(val items: List, val totalItems: Int) : ClientCollateralUiState +} + diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt new file mode 100644 index 00000000000..7e8bb535044 --- /dev/null +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt @@ -0,0 +1,78 @@ +package com.mifos.feature.loan.ClientCollateral + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.mifos.core.common.utils.DataState +import com.mifos.core.data.repository.ClientDetailsRepository + +import com.mifos.core.network.model.CollateralItem +import com.mifos.feature.loan.ClientCollateral.ClientCollateralUiState.* +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +class ClientCollateralViewModel( + private val savedStateHandle: SavedStateHandle, // Assuming we might need clientId/groupId from nav args + private val clientDetailsRepository: ClientDetailsRepository +) : ViewModel() { + + private val _uiState = MutableStateFlow(ClientCollateralUiState.Loading) + val uiState: StateFlow = _uiState.asStateFlow() + + + private val clientId: Int? = savedStateHandle.get("clientIdKey") + + init { + loadCollateralItems() + } + + fun loadCollateralItems() { + if (clientId == null) { + _uiState.value = ClientCollateralUiState.Error("Client ID not found") + return + } + + viewModelScope.launch { + _uiState.value = ClientCollateralUiState.Loading + when (val result = clientDetailsRepository.getCollateralItems()) { + is DataState.Success -> { + val networkItems = result.data + if (networkItems.isEmpty()) { + _uiState.value = ClientCollateralUiState.Empty + } else { + val displayItems = networkItems.mapNotNull { transformToDisplayItem(it) } + if (displayItems.isEmpty() && networkItems.isNotEmpty()) { + // This case means all items failed to parse quantity, which is an error + _uiState.value = Error("Error parsing collateral data") + } else { + _uiState.value = Success(displayItems, displayItems.size) + } + } + } + is DataState.Error -> { + _uiState.value = Error(result.exception.message ?: "Unknown error") + } + + DataState.Loading -> TODO() + } + } + } + + private fun transformToDisplayItem(networkItem: CollateralItem): CollateralDisplayItem? { + val quantity = networkItem.quality.toIntOrNull() + return if (quantity != null) { + CollateralDisplayItem( + id = networkItem.id, + typeName = networkItem.name, + quantity = quantity, + unitValue = networkItem.basePrice, + totalCollateralValue = quantity * networkItem.basePrice + ) + } else { + + null + } + } +} diff --git a/feature/savings/build.gradle.kts b/feature/savings/build.gradle.kts index 53f95809bf9..ef98964520c 100644 --- a/feature/savings/build.gradle.kts +++ b/feature/savings/build.gradle.kts @@ -25,6 +25,7 @@ kotlin{ implementation(compose.components.uiToolingPreview) implementation(compose.ui) implementation(libs.kotlinx.serialization.json) + } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d9985f08275..2eda60b34ec 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] accompanistPermission = "0.34.0" androidDesugarJdkLibs = "2.1.4" -androidGradlePlugin = "8.7.3" +androidGradlePlugin = "8.12.2" androidTools = "31.8.0" androidxActivity = "1.10.0" androidxAppCompat = "1.7.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dda119f6159..f8d3446b552 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Feb 02 11:29:16 IST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file From 6bfac1e47e977fd40ef6cc1c5cb9df62788df1d7 Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Tue, 9 Sep 2025 12:58:19 +0530 Subject: [PATCH 2/9] facing some error --- .../repository/ClientDetailsRepository.kt | 4 +- .../ClientDetailsRepositoryImp.kt | 2 +- .../ClientCollateralViewModel.kt | 4 +- .../navigation/ViewClientCollateralsRoute.kt | 0 .../ClientCollateralScreen.kt | 252 ++++++++++-------- .../ClientCollateralUiState.kt | 18 -- .../ClientCollateralViewmodel.kt | 153 +++++++---- .../clientCollateralNavigation.kt | 37 +++ 8 files changed, 286 insertions(+), 184 deletions(-) create mode 100644 feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ViewClientCollateralsRoute.kt delete mode 100644 feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt create mode 100644 feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt index fb44b9eeb5f..1d6fb8725b9 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt @@ -39,7 +39,7 @@ interface ClientDetailsRepository { suspend fun getClientCloseTemplate(): DataState - suspend fun getCollateralItems(): DataState> + suspend fun getCollateralItems(clientId: Int): DataState> suspend fun getClient(clientId: Int): ClientEntity @@ -69,4 +69,6 @@ interface ClientDetailsRepository { collateralId: Int, quantity: String, ): DataState + + } diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt index 775245e9e92..2b3adb1e8e0 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt @@ -63,7 +63,7 @@ class ClientDetailsRepositoryImp( } } - override suspend fun getCollateralItems(): DataState> { + override suspend fun getCollateralItems(clientId: Int): DataState> { return try { val res = dataManagerClient.getCollateralItems() return DataState.Success(res) diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt index 0b614d7b897..a02d070afd8 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt @@ -17,7 +17,9 @@ import com.mifos.core.data.repository.ClientDetailsRepository import com.mifos.core.data.util.NetworkMonitor import com.mifos.core.network.model.CollateralItem import com.mifos.core.ui.components.ResultStatus + import com.mifos.core.ui.util.BaseViewModel + import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -44,7 +46,7 @@ internal class ClientCollateralViewModel( private suspend fun loadCollaterals() { mutableStateFlow.update { it.copy(dialogState = ClientCollateralState.DialogState.Loading) } - val result = repo.getCollateralItems() + val result = repo.getCollateralItems(route.clientId) when (result) { is DataState.Error -> { mutableStateFlow.update { diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ViewClientCollateralsRoute.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ViewClientCollateralsRoute.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt index d3363186346..ddcfc02f37c 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt @@ -1,83 +1,125 @@ package com.mifos.feature.loan.ClientCollateral -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box + + +import androidclient.feature.client.generated.resources.Res +import androidclient.feature.client.generated.resources.client_product_shares_account +import androidclient.feature.client.generated.resources.client_savings_item +import androidclient.feature.client.generated.resources.filter +import androidclient.feature.client.generated.resources.search +import androidclient.feature.client.generated.resources.string_not_available +import androidclient.feature.loan.generated.resources.Res import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row 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.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items - -import androidx.compose.material3.Button -import androidx.compose.material3.Card -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -// Koin ViewModel import +import androidx.navigation.NavController +import com.mifos.core.designsystem.component.MifosCircularProgress +import com.mifos.core.designsystem.component.MifosScaffold +import com.mifos.core.designsystem.component.MifosSweetError +import com.mifos.core.designsystem.theme.DesignToken +import com.mifos.core.designsystem.theme.MifosTypography +import com.mifos.core.designsystem.utils.onClick +import com.mifos.core.ui.components.Actions +import com.mifos.core.ui.components.MifosActionsCollateralDataListingComponent +import com.mifos.core.ui.components.MifosActionsShareListingComponent +import com.mifos.core.ui.components.MifosBreadcrumbNavBar +import com.mifos.core.ui.components.MifosEmptyCard +import com.mifos.core.ui.util.EventsEffect +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel -@OptIn(ExperimentalMaterial3Api::class) @Composable -fun ClientCollateralScreen( - viewModel: ClientCollateralViewModel = koinViewModel() +internal fun CollateralScreenRoute( + navController: NavController, + viewAccount: (Int) -> Unit, + viewModel: ClientCollateralViewmodel = koinViewModel(), ) { - val uiState by viewModel.uiState.collectAsStateWithLifecycle() - - Scaffold( - topBar = { - TopAppBar(title = { - val titleText = when (val state = uiState) { - is ClientCollateralUiState.Success -> "Collateral Data (${state.totalItems} ${if (state.totalItems == 1) "Item" else "Items"})" - is ClientCollateralUiState.Empty -> "Collateral Data (0 Items)" - else -> "Collateral Data" - } - Text(text = titleText) - }) + val state by viewModel.stateFlow.collectAsStateWithLifecycle() + + EventsEffect(viewModel.eventFlow) { event -> + when (event) { + is collateralEvent.viewAccount -> viewAccount(event.accountsId) } + } + + collateralScreen( + state = state, + navController = navController, + onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, + ) + + ShareAccountsDialog( + state = state, + onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, + ) +} + +@Composable +internal fun collateralScreen( + navController: NavController, + state: collateralUiState, + onAction: (collateralAction) -> Unit, +) { + MifosScaffold( + title = "Share Accounts", + onBackPressed = {}, ) { paddingValues -> - Box( - modifier = Modifier - .fillMaxSize() - .padding(paddingValues) - .padding(horizontal = 16.dp, vertical = 8.dp), - contentAlignment = Alignment.TopCenter // Changed to TopCenter for list display + Column( + modifier = Modifier.padding(paddingValues) + .fillMaxSize(), ) { - when (val state = uiState) { - is ClientCollateralUiState.Loading -> { - // Centered loading indicator - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - CircularProgressIndicator() - } - } - is ClientCollateralUiState.Success -> { - CollateralList(items = state.items) - } - is ClientCollateralUiState.Empty -> { - // Centered empty state message - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - EmptyCollateralState() - } - } - is ClientCollateralUiState.Error -> { - // Centered error state message - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - ErrorState(message = state.message, onRetry = { viewModel.loadCollateralItems() }) + MifosBreadcrumbNavBar( + navController = navController, + ) + + when (state.isLoading) { + true -> MifosCircularProgress() + + false -> { + Column( + modifier = Modifier.fillMaxSize() + .padding(horizontal = DesignToken.padding.large), + ) { + ShareAccountHeader( + totalItem = state.accounts.size.toString(), + onAction = onAction, + ) + + Spacer(modifier = Modifier.height(DesignToken.padding.large)) + + if (state.accounts.isNotEmpty()) { + val emptyText = stringResource(Res.string.string_not_available) + + LazyColumn { + item { + state.accounts.forEachIndexed { index, account -> + MifosActionsCollateralDataListingComponent( + name = account.name ?: emptyText, + quantity = account.quantity?.toString() ?: emptyText, + totalValue = account.totalValue?.toString() ?: emptyText, + totalCollateralValue = account.totalCollateralValue?.toString() ?: emptyText, + ) + + Spacer(Modifier.height(DesignToken.padding.small)) + } + } + } + } else { + MifosEmptyCard() + } } } } @@ -86,67 +128,55 @@ fun ClientCollateralScreen( } @Composable -fun CollateralList(items: List) { - LazyColumn( - verticalArrangement = Arrangement.spacedBy(8.dp), - contentPadding = PaddingValues(top = 8.dp, bottom = 8.dp) +private fun ShareAccountHeader( + totalItem: String, + onAction: (collateralAction) -> Unit, +) { + Row( + modifier = Modifier.fillMaxWidth(), ) { - items(items, key = { it.id }) { item -> // Use item.id as a key for better performance - CollateralListItem(item = item, onActionClick = { /* TODO: Handle action click */ }) + Column { + Text( + text = stringResource(Res.string.client_product_shares_account), + style = MifosTypography.titleMedium, + ) + + Text( + text = totalItem + " " + stringResource(Res.string.client_savings_item), + style = MifosTypography.labelMedium, + ) } - } -} -@Composable -fun CollateralListItem(item: CollateralDisplayItem, onActionClick: () -> Unit) { - Card( - modifier = Modifier - .fillMaxWidth() - ) { - Column(modifier = Modifier.padding(16.dp)) { - Text("Type/Name: ${item.typeName}", fontWeight = FontWeight.Bold, style = MaterialTheme.typography.titleMedium) - Spacer(modifier = Modifier.height(4.dp)) - Text("Quantity: ${item.quantity}", style = MaterialTheme.typography.bodyMedium) - Spacer(modifier = Modifier.height(4.dp)) - Text("Unit Value: ${item.unitValue}", style = MaterialTheme.typography.bodyMedium) - Spacer(modifier = Modifier.height(4.dp)) - Text("Total Collateral Value: ${item.totalCollateralValue}", style = MaterialTheme.typography.bodyMedium) - Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.CenterEnd) { - IconButton(onClick = onActionClick) { + Spacer(modifier = Modifier.weight(1f)) - } - } - } - } -} + // add a cross icon when its active, talk with design team + Icon( + modifier = Modifier.onClick { onAction.invoke(collateralAction.toggleSearchBar) }, + painter = painterResource(Res.drawable.search), + contentDescription = null, + ) -@Composable -fun EmptyCollateralState() { - Card(modifier = Modifier.padding(16.dp)) { - Column( - modifier = Modifier - .padding(32.dp) - .fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text("No Item Found", style = MaterialTheme.typography.headlineSmall) - } + Icon( + modifier = Modifier.onClick { onAction.invoke(collateralAction.toggleFiler) }, + painter = painterResource(Res.drawable.filter), + contentDescription = null, + ) } } @Composable -fun ErrorState(message: String, onRetry: () -> Unit) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = Modifier.padding(16.dp) - ) { - Text("Error: $message", color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodyLarge) - Spacer(modifier = Modifier.height(16.dp)) - Button(onClick = onRetry) { - Text("Retry") +private fun ShareAccountsDialog( + state: collateralUiState, + onAction: (collateralAction) -> Unit, +) { + when (state.dialogState) { + is collateralUiState.DialogState.Error -> { + MifosSweetError( + message = state.dialogState.message, + onclick = { onAction.invoke(collateralAction.refresh) }, + ) } - } -} + null -> {} + } +} \ No newline at end of file diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt deleted file mode 100644 index 723240b74c7..00000000000 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralUiState.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.mifos.feature.loan.ClientCollateral - - - -data class CollateralDisplayItem( - val id: Int, - val typeName: String, - val quantity: Int, - val unitValue: Double, - val totalCollateralValue: Double -) -sealed interface ClientCollateralUiState { - data object Loading : ClientCollateralUiState - data class Error(val message: String) : ClientCollateralUiState - data object Empty : ClientCollateralUiState - data class Success(val items: List, val totalItems: Int) : ClientCollateralUiState -} - diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt index 7e8bb535044..1940dae3e8c 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt @@ -1,78 +1,127 @@ package com.mifos.feature.loan.ClientCollateral import androidx.lifecycle.SavedStateHandle -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.mifos.core.common.utils.DataState +import androidx.navigation.toRoute import com.mifos.core.data.repository.ClientDetailsRepository +import com.mifos.core.ui.util.BaseViewModel import com.mifos.core.network.model.CollateralItem -import com.mifos.feature.loan.ClientCollateral.ClientCollateralUiState.* -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch +import com.mifos.feature.loan.Clientcollateral.clientCollateralRoute -class ClientCollateralViewModel( - private val savedStateHandle: SavedStateHandle, // Assuming we might need clientId/groupId from nav args - private val clientDetailsRepository: ClientDetailsRepository -) : ViewModel() { +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch - private val _uiState = MutableStateFlow(ClientCollateralUiState.Loading) - val uiState: StateFlow = _uiState.asStateFlow() +class ClientCollateralViewmodel ( + savedStateHandle: SavedStateHandle, + private val repository: ClientDetailsRepository +): BaseViewModel( + initialState = collateralUiState() +){ + private val route = savedStateHandle.toRoute() + override fun handleAction(action: collateralAction) { + when (action) { + is collateralAction.cardClicked -> handleCardClicked(action.activeIndex) + collateralAction.toggleFiler -> toggleFiler() + collateralAction.toggleSearchBar -> toggleSearchBar() + is collateralAction.viewAccount -> sendEvent(collateralEvent.viewAccount(action.accountId)) + collateralAction.refresh -> fetchAllCollateralAccount() - private val clientId: Int? = savedStateHandle.get("clientIdKey") + } - init { - loadCollateralItems() } + init{ + fetchAllCollateralAccount() + } + private fun fetchAllCollateralAccount(){ + viewModelScope.launch { + mutableStateFlow.update{ + it.copy( + isLoading = true, + ) - fun loadCollateralItems() { - if (clientId == null) { - _uiState.value = ClientCollateralUiState.Error("Client ID not found") - return - } + } + try{ + val result = repository.getCollateralItems(route.clientId) + mutableStateFlow.update { + it.copy( + isLoading = false, + accounts = result as List, + dialogState = null - viewModelScope.launch { - _uiState.value = ClientCollateralUiState.Loading - when (val result = clientDetailsRepository.getCollateralItems()) { - is DataState.Success -> { - val networkItems = result.data - if (networkItems.isEmpty()) { - _uiState.value = ClientCollateralUiState.Empty - } else { - val displayItems = networkItems.mapNotNull { transformToDisplayItem(it) } - if (displayItems.isEmpty() && networkItems.isNotEmpty()) { - // This case means all items failed to parse quantity, which is an error - _uiState.value = Error("Error parsing collateral data") - } else { - _uiState.value = Success(displayItems, displayItems.size) - } - } + + ) } - is DataState.Error -> { - _uiState.value = Error(result.exception.message ?: "Unknown error") + }catch(e : Exception){ + mutableStateFlow.update{ + it.copy( + isLoading = false, + dialogState = collateralUiState.DialogState.Error(e.message ?: "Unknown Error") + ) } - - DataState.Loading -> TODO() } } + } + private fun toggleFiler() { + mutableStateFlow.update { + it.copy( + isFilterActive = !state.isFilterActive, + ) + } + - private fun transformToDisplayItem(networkItem: CollateralItem): CollateralDisplayItem? { - val quantity = networkItem.quality.toIntOrNull() - return if (quantity != null) { - CollateralDisplayItem( - id = networkItem.id, - typeName = networkItem.name, - quantity = quantity, - unitValue = networkItem.basePrice, - totalCollateralValue = quantity * networkItem.basePrice + } + private fun toggleSearchBar() { + mutableStateFlow.update { + it.copy( + isSearchBarActive = !state.isSearchBarActive, ) - } else { + } - null + } + private fun handleCardClicked(index : Int){ + mutableStateFlow.update { + it.copy( + isCardActive = !state.isCardActive, + currentlyActiveIndex = index, + ) } + } + + } + + data class collateralUiState( + val isLoading : Boolean = false, + val isFilterActive : Boolean = false, + val accounts : List = emptyList(), + val isSearchBarActive :Boolean = false, + val isCardActive : Boolean = false, + val currentlyActiveIndex: Int = -1, + val dialogState : DialogState? = null,){ + + sealed interface DialogState{ + data class Error (val message : String) : DialogState + } + + + + + } +sealed interface collateralEvent{ + data class viewAccount ( val accountsId : Int) : collateralEvent + +} +sealed interface collateralAction{ + data object toggleFiler : collateralAction + data object toggleSearchBar : collateralAction + data class cardClicked (val activeIndex : Int ): collateralAction + data class viewAccount (val accountId : Int) : collateralAction + data object refresh : collateralAction + + +} + diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt new file mode 100644 index 00000000000..c5def13d0e5 --- /dev/null +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt @@ -0,0 +1,37 @@ +package com.mifos.feature.loan.Clientcollateral + + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import com.mifos.feature.loan.ClientCollateral.CollateralScreenRoute + +import kotlinx.serialization.Serializable + +@Serializable +data class clientCollateralRoute( + val clientId : Int = -1, +) +fun NavGraphBuilder.clientCollateralDestination( + navController: NavController, + navigateToViewAccount: (Int) -> Unit, +) { + composable { + CollateralScreenRoute( + navController = navController, + viewAccount = navigateToViewAccount, + ) + } + +} +fun NavController.navigatetoCollateralScreen( + clientId : Int, +){ + this.navigate( + clientCollateralRoute( + clientId = clientId, + ) + + + ) +} From 276d8c82c479a3187efa37ce01b7d6635e022ada Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Thu, 11 Sep 2025 21:12:19 +0530 Subject: [PATCH 3/9] want to update my fork --- .../core/network/model/CollateralItem.kt | 12 +++---- .../MifosActionsListingCardComponent.kt | 27 +++++++++++++++ .../ClientCollateralScreen.kt | 19 +++++------ .../ClientCollateralViewmodel.kt | 33 +++++++++++++++---- 4 files changed, 68 insertions(+), 23 deletions(-) diff --git a/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt b/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt index a7515f5000f..f3d09bdba2a 100644 --- a/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt +++ b/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt @@ -13,11 +13,11 @@ import kotlinx.serialization.Serializable @Serializable data class CollateralItem( - val quality: String, - val basePrice: Double, - val unitType: String, - val pctToBase: Double, - val currency: String, - val name: String, val id: Int, + val name: String, + val quantity: Double, + val pctToBase: Double, + val unitPrice: Double, + val total: Double, + val totalCollateral: Double ) diff --git a/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt b/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt index 41496a1c5f8..e04ebafcb0c 100644 --- a/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt +++ b/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt @@ -9,6 +9,7 @@ */ package com.mifos.core.ui.components +import com.mifos.core.ui.components.Actions import androidclient.core.ui.generated.resources.Res import androidclient.core.ui.generated.resources.client_share_accounts_approved_shares import androidclient.core.ui.generated.resources.client_share_accounts_pending_for_approval_shares @@ -495,6 +496,31 @@ fun MifosActionsShareListingComponent( } } } +@Composable +fun MifosActionCollateralData ( + name : String, + quantity : String, + totalValue : String, + totalCollateralValue : String, + isExpaneded : Boolean, + onClick : () -> Unit, + menuList : List, + onActionClicked : (Actions) -> Unit, +){ + MifosActionsListingComponentOutline { + Column( + modifier = Modifier.clickable { onClick() }, + ) { + Column( + modifier = Modifier.padding(DesignToken.padding.large), + ) { + MifosListingRowItemHeader( + text = name, + keyStyle = MifosTypography.titleSmallEmphasized, + ) + + +} @Composable fun MifosActionsSavingsListingComponent( @@ -587,6 +613,7 @@ fun MifosActionsSavingsListingComponent( } } + @Composable fun MifosActionsClientFeeListingComponent( name: String, diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt index ddcfc02f37c..e1387416558 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt @@ -2,10 +2,7 @@ package com.mifos.feature.loan.ClientCollateral -import androidclient.feature.client.generated.resources.Res -import androidclient.feature.client.generated.resources.client_product_shares_account -import androidclient.feature.client.generated.resources.client_savings_item -import androidclient.feature.client.generated.resources.filter + import androidclient.feature.client.generated.resources.search import androidclient.feature.client.generated.resources.string_not_available import androidclient.feature.loan.generated.resources.Res @@ -74,7 +71,7 @@ internal fun collateralScreen( onAction: (collateralAction) -> Unit, ) { MifosScaffold( - title = "Share Accounts", + title = "Collateral data", onBackPressed = {}, ) { paddingValues -> Column( @@ -93,7 +90,7 @@ internal fun collateralScreen( modifier = Modifier.fillMaxSize() .padding(horizontal = DesignToken.padding.large), ) { - ShareAccountHeader( + CollateralHeader( totalItem = state.accounts.size.toString(), onAction = onAction, ) @@ -109,8 +106,8 @@ internal fun collateralScreen( MifosActionsCollateralDataListingComponent( name = account.name ?: emptyText, quantity = account.quantity?.toString() ?: emptyText, - totalValue = account.totalValue?.toString() ?: emptyText, - totalCollateralValue = account.totalCollateralValue?.toString() ?: emptyText, + totalValue = account.total?.toString() ?: emptyText, + totalCollateralValue = account.totalCollateral?.toString() ?: emptyText ) Spacer(Modifier.height(DesignToken.padding.small)) @@ -128,7 +125,7 @@ internal fun collateralScreen( } @Composable -private fun ShareAccountHeader( +private fun CollateralHeader( totalItem: String, onAction: (collateralAction) -> Unit, ) { @@ -137,12 +134,12 @@ private fun ShareAccountHeader( ) { Column { Text( - text = stringResource(Res.string.client_product_shares_account), + text = Text("Collateral data"), style = MifosTypography.titleMedium, ) Text( - text = totalItem + " " + stringResource(Res.string.client_savings_item), + text = totalItem + " " + "items", style = MifosTypography.labelMedium, ) } diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt index 1940dae3e8c..9170bdd9c0b 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt @@ -3,6 +3,7 @@ package com.mifos.feature.loan.ClientCollateral import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import androidx.navigation.toRoute +import com.mifos.core.common.utils.DataState import com.mifos.core.data.repository.ClientDetailsRepository import com.mifos.core.ui.util.BaseViewModel @@ -44,15 +45,35 @@ class ClientCollateralViewmodel ( } try{ val result = repository.getCollateralItems(route.clientId) - mutableStateFlow.update { - it.copy( - isLoading = false, - accounts = result as List, - dialogState = null + + when(result){ + is DataState.Success -> { + mutableStateFlow.update { + it.copy( + isLoading = false, + accounts = result.data, + dialogState = null + ) + } + + } + is DataState.Error -> { + mutableStateFlow.update { + it.copy( + isLoading = false, + dialogState = collateralUiState.DialogState.Error(result.message) + ) + } + } + is DataState.Loading -> { + + } - ) } + + + }catch(e : Exception){ mutableStateFlow.update{ it.copy( From 6aa0bd3ec027d12e06af08506206324c49c7b3f2 Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Sun, 28 Sep 2025 18:44:27 +0530 Subject: [PATCH 4/9] ticket 575 completed --- .../MifosActionsListingCardComponent.kt | 112 +++++++++++++++--- .../ClientProfileGeneralNavigation.kt | 2 + .../CollateralDataNavigation.kt} | 9 +- .../collateralData/CollateralDataScreen.kt} | 82 ++++++++----- .../CollateralDataViewModel.kt} | 74 ++++++------ .../client/navigation/ClientNavigation.kt | 8 ++ .../LoanAccountSummaryScreenRoute.kt | 4 +- 7 files changed, 208 insertions(+), 83 deletions(-) rename feature/{loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt => client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt} (80%) rename feature/{loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt => client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt} (64%) rename feature/{loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt => client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt} (61%) diff --git a/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt b/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt index ccb0c2b2397..64a39a75251 100644 --- a/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt +++ b/core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt @@ -9,7 +9,7 @@ */ package com.mifos.core.ui.components -import com.mifos.core.ui.components.Actions + import androidclient.core.ui.generated.resources.Res import androidclient.core.ui.generated.resources.client_share_accounts_approved_shares import androidclient.core.ui.generated.resources.client_share_accounts_pending_for_approval_shares @@ -502,29 +502,86 @@ fun MifosActionsShareListingComponent( } } @Composable -fun MifosActionCollateralData ( - name : String, - quantity : String, - totalValue : String, - totalCollateralValue : String, - isExpaneded : Boolean, - onClick : () -> Unit, - menuList : List, - onActionClicked : (Actions) -> Unit, -){ +fun MifosActionsCollateralDataComponent( + name: String, + quantity: String, + totalValue: String, + totalCollateralValue: String, + menuList: List, + onActionClicked: (Actions) -> Unit, +) { MifosActionsListingComponentOutline { - Column( - modifier = Modifier.clickable { onClick() }, - ) { + Column { Column( modifier = Modifier.padding(DesignToken.padding.large), ) { - MifosListingRowItemHeader( - text = name, + MifosListingRowItem( + key = "Name", + value = name, keyStyle = MifosTypography.titleSmallEmphasized, + valueStyle = MifosTypography.titleSmall, ) + Spacer(Modifier.height(DesignToken.padding.large)) + Column( + verticalArrangement = Arrangement.spacedBy(DesignToken.padding.extraExtraSmall), + ) { + MifosListingRowItem( + key = stringResource(Res.string.core_ui_quantity), + value = quantity, + ) + MifosListingRowItem( + key = stringResource(Res.string.core_ui_total_value), + value = totalValue, + ) + } + Spacer(Modifier.height(DesignToken.padding.medium)) + MifosListingRowItem( + key = stringResource(Res.string.core_ui_total_collateral_value), + value = totalCollateralValue, + valueColor = MaterialTheme.colorScheme.primary, + ) + } + Surface( + modifier = Modifier.fillMaxWidth(), + shape = RoundedCornerShape( + bottomStart = DesignToken.padding.medium, + bottomEnd = DesignToken.padding.medium, + ), + ) { + Column( + modifier = Modifier.padding( + vertical = DesignToken.padding.small, + ), + ) { + menuList.map { menuItem -> + Row( + modifier = Modifier.fillMaxWidth() + .height(DesignToken.sizes.avatarMedium) + .clickable { + onActionClicked(menuItem) + }, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start, + ) { + Icon( + modifier = Modifier.padding(horizontal = DesignToken.padding.large), + imageVector = menuItem.icon, + contentDescription = "", + ) + Text( + modifier = Modifier.fillMaxWidth(), + text = menuItem::class.simpleName ?: "", + color = MaterialTheme.colorScheme.onSurface, + fontSize = MaterialTheme.typography.bodyLarge.fontSize, + ) + } + } + } + } + } + } } @Composable @@ -1163,3 +1220,26 @@ private fun PreviewMifosActionsShareListingComponent() { ) } } +@Preview +@Composable +private fun PreviewMifosActionsCollateralDataComponent() { + MifosTheme { + MifosActionsCollateralDataComponent( + name = "Gold ", + quantity = "5", + totalValue = "$2500", + totalCollateralValue = "$2500", + menuList = listOf( + Actions.ViewAccount(), + Actions.ApproveAccount(), + ), + onActionClicked = { action -> + when (action) { + is Actions.ViewAccount -> println(Actions.ViewDocument::class.simpleName) + is Actions.ApproveAccount -> println(Actions.ApproveAccount::class.simpleName) + else -> println("Action not Handled") + } + }, + ) + } +} diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt index 3fe0f6b75d0..b1a52b3cbf0 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt @@ -28,6 +28,7 @@ fun NavGraphBuilder.clientProfileGeneralDestination( fixedDepositAccounts: (Int) -> Unit, recurringDepositAccounts: (Int) -> Unit, sharesAccounts: (Int) -> Unit, + collateralDatadates: (Int) -> Unit, collateralData: (Int) -> Unit, ) { composable { @@ -41,6 +42,7 @@ fun NavGraphBuilder.clientProfileGeneralDestination( recurringDepositAccounts, sharesAccounts, collateralData, + collateralDatadates, ) } diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt similarity index 80% rename from feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt rename to feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt index c5def13d0e5..82924793272 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/clientCollateralNavigation.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt @@ -1,10 +1,9 @@ -package com.mifos.feature.loan.Clientcollateral - +package com.mifos.feature.client.collateralData import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import com.mifos.feature.loan.ClientCollateral.CollateralScreenRoute + import kotlinx.serialization.Serializable @@ -24,7 +23,7 @@ fun NavGraphBuilder.clientCollateralDestination( } } -fun NavController.navigatetoCollateralScreen( +fun NavController.navigateCollateralScreen( clientId : Int, ){ this.navigate( @@ -34,4 +33,4 @@ fun NavController.navigatetoCollateralScreen( ) -} +} \ No newline at end of file diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt similarity index 64% rename from feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt rename to feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt index e1387416558..b28f5a4316d 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralScreen.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt @@ -1,11 +1,15 @@ -package com.mifos.feature.loan.ClientCollateral +package com.mifos.feature.client.collateralData -import androidclient.feature.client.generated.resources.search + + + + +import androidclient.feature.client.generated.resources.Res import androidclient.feature.client.generated.resources.string_not_available -import androidclient.feature.loan.generated.resources.Res +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -22,9 +26,10 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController -import com.mifos.core.designsystem.component.MifosCircularProgress + import com.mifos.core.designsystem.component.MifosScaffold import com.mifos.core.designsystem.component.MifosSweetError +import com.mifos.core.designsystem.icon.MifosIcons import com.mifos.core.designsystem.theme.DesignToken import com.mifos.core.designsystem.theme.MifosTypography import com.mifos.core.designsystem.utils.onClick @@ -33,11 +38,15 @@ import com.mifos.core.ui.components.MifosActionsCollateralDataListingComponent import com.mifos.core.ui.components.MifosActionsShareListingComponent import com.mifos.core.ui.components.MifosBreadcrumbNavBar import com.mifos.core.ui.components.MifosEmptyCard +import com.mifos.core.ui.components.MifosProgressIndicator import com.mifos.core.ui.util.EventsEffect +import org.jetbrains.compose.resources.DrawableResource import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel + + @Composable internal fun CollateralScreenRoute( navController: NavController, @@ -48,7 +57,7 @@ internal fun CollateralScreenRoute( EventsEffect(viewModel.eventFlow) { event -> when (event) { - is collateralEvent.viewAccount -> viewAccount(event.accountsId) + is CollateralEvent.ViewAccount -> viewAccount(event.accountsId) } } @@ -58,7 +67,7 @@ internal fun CollateralScreenRoute( onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, ) - ShareAccountsDialog( + CollateralDialog( state = state, onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, ) @@ -67,8 +76,8 @@ internal fun CollateralScreenRoute( @Composable internal fun collateralScreen( navController: NavController, - state: collateralUiState, - onAction: (collateralAction) -> Unit, + state: CollateralUiState, + onAction: (CollateralAction) -> Unit, ) { MifosScaffold( title = "Collateral data", @@ -83,7 +92,7 @@ internal fun collateralScreen( ) when (state.isLoading) { - true -> MifosCircularProgress() + true -> MifosProgressIndicator() false -> { Column( @@ -103,12 +112,29 @@ internal fun collateralScreen( LazyColumn { item { state.accounts.forEachIndexed { index, account -> - MifosActionsCollateralDataListingComponent( - name = account.name ?: emptyText, - quantity = account.quantity?.toString() ?: emptyText, - totalValue = account.total?.toString() ?: emptyText, - totalCollateralValue = account.totalCollateral?.toString() ?: emptyText - ) + MifosActionsCollateralDataListingComponent( + name = account.name ?: emptyText, + quantity = account.quantity?.toString() ?: emptyText, + totalValue = account.total?.toString() ?: emptyText, + totalCollateralValue = account.totalCollateral?.toString() ?: emptyText, + menuList = (listOf(Actions.ViewAccount())), + onActionClicked = { actions -> + when (actions) { + is Actions.ViewAccount -> { + onAction( + CollateralAction.ViewAccount(accountId = -1) + ) + } + + else -> { + + } + } + + } + + + ) Spacer(Modifier.height(DesignToken.padding.small)) } @@ -127,50 +153,52 @@ internal fun collateralScreen( @Composable private fun CollateralHeader( totalItem: String, - onAction: (collateralAction) -> Unit, + onAction: (CollateralAction) -> Unit, ) { Row( modifier = Modifier.fillMaxWidth(), ) { Column { Text( - text = Text("Collateral data"), - style = MifosTypography.titleMedium, + text = "Collateral Data", + style = MifosTypography.titleMedium ) Text( text = totalItem + " " + "items", style = MifosTypography.labelMedium, ) + } Spacer(modifier = Modifier.weight(1f)) // add a cross icon when its active, talk with design team Icon( - modifier = Modifier.onClick { onAction.invoke(collateralAction.toggleSearchBar) }, - painter = painterResource(Res.drawable.search), + modifier = Modifier.onClick { onAction.invoke(CollateralAction.ToggleSearchBar) }, + imageVector = MifosIcons.Search , + contentDescription = null, ) Icon( - modifier = Modifier.onClick { onAction.invoke(collateralAction.toggleFiler) }, - painter = painterResource(Res.drawable.filter), + modifier = Modifier.onClick { onAction.invoke(CollateralAction.ToggleFiler) }, + imageVector = MifosIcons.Filter, contentDescription = null, ) } } @Composable -private fun ShareAccountsDialog( - state: collateralUiState, - onAction: (collateralAction) -> Unit, +private fun CollateralDialog( + state: CollateralUiState, + onAction: (CollateralAction) -> Unit, ) { when (state.dialogState) { - is collateralUiState.DialogState.Error -> { + is CollateralUiState.DialogState.Error -> { MifosSweetError( message = state.dialogState.message, - onclick = { onAction.invoke(collateralAction.refresh) }, + onclick = { onAction.invoke(CollateralAction.Refresh) }, ) } diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt similarity index 61% rename from feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt rename to feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt index 9170bdd9c0b..9d1a6d21450 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/ClientCollateral/ClientCollateralViewmodel.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt @@ -1,4 +1,5 @@ -package com.mifos.feature.loan.ClientCollateral +package com.mifos.feature.client.collateralData + import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope @@ -8,7 +9,7 @@ import com.mifos.core.data.repository.ClientDetailsRepository import com.mifos.core.ui.util.BaseViewModel import com.mifos.core.network.model.CollateralItem -import com.mifos.feature.loan.Clientcollateral.clientCollateralRoute + import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -17,17 +18,17 @@ import kotlinx.coroutines.launch class ClientCollateralViewmodel ( savedStateHandle: SavedStateHandle, private val repository: ClientDetailsRepository -): BaseViewModel( - initialState = collateralUiState() +): BaseViewModel( + initialState = CollateralUiState() ){ private val route = savedStateHandle.toRoute() - override fun handleAction(action: collateralAction) { + override fun handleAction(action: CollateralAction) { when (action) { - is collateralAction.cardClicked -> handleCardClicked(action.activeIndex) - collateralAction.toggleFiler -> toggleFiler() - collateralAction.toggleSearchBar -> toggleSearchBar() - is collateralAction.viewAccount -> sendEvent(collateralEvent.viewAccount(action.accountId)) - collateralAction.refresh -> fetchAllCollateralAccount() + is CollateralAction.CardClicked -> handleCardClicked(action.activeIndex) + CollateralAction.ToggleFiler -> toggleFiler() + CollateralAction.ToggleSearchBar -> toggleSearchBar() + is CollateralAction.ViewAccount -> sendEvent(CollateralEvent.ViewAccount(action.accountId)) + CollateralAction.Refresh -> fetchAllCollateralAccount() } @@ -61,11 +62,17 @@ class ClientCollateralViewmodel ( mutableStateFlow.update { it.copy( isLoading = false, - dialogState = collateralUiState.DialogState.Error(result.message) + dialogState = CollateralUiState.DialogState.Error(result.message) ) } } is DataState.Loading -> { + mutableStateFlow.update { + it.copy( + isLoading = true + ) + } + } @@ -78,7 +85,7 @@ class ClientCollateralViewmodel ( mutableStateFlow.update{ it.copy( isLoading = false, - dialogState = collateralUiState.DialogState.Error(e.message ?: "Unknown Error") + dialogState = CollateralUiState.DialogState.Error(e.message ?: "Unknown Error") ) } } @@ -115,34 +122,33 @@ class ClientCollateralViewmodel ( } - data class collateralUiState( - val isLoading : Boolean = false, - val isFilterActive : Boolean = false, - val accounts : List = emptyList(), - val isSearchBarActive :Boolean = false, - val isCardActive : Boolean = false, - val currentlyActiveIndex: Int = -1, - val dialogState : DialogState? = null,){ - - sealed interface DialogState{ - data class Error (val message : String) : DialogState - } +data class CollateralUiState( + val isLoading : Boolean = false, + val isFilterActive : Boolean = false, + val accounts : List = emptyList(), + val isSearchBarActive :Boolean = false, + val isCardActive : Boolean = false, + val currentlyActiveIndex: Int = -1, + val dialogState : DialogState? = null,){ + + sealed interface DialogState{ + data class Error (val message : String) : DialogState + } - } -sealed interface collateralEvent{ - data class viewAccount ( val accountsId : Int) : collateralEvent +} +sealed interface CollateralEvent{ + data class ViewAccount ( val accountsId : Int) : CollateralEvent } -sealed interface collateralAction{ - data object toggleFiler : collateralAction - data object toggleSearchBar : collateralAction - data class cardClicked (val activeIndex : Int ): collateralAction - data class viewAccount (val accountId : Int) : collateralAction - data object refresh : collateralAction +sealed interface CollateralAction{ + data object ToggleFiler : CollateralAction + data object ToggleSearchBar : CollateralAction + data class CardClicked (val activeIndex : Int ): CollateralAction + data class ViewAccount (val accountId : Int) : CollateralAction + data object Refresh : CollateralAction } - diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ClientNavigation.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ClientNavigation.kt index b2e068670f7..0fcf6245fb5 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ClientNavigation.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ClientNavigation.kt @@ -60,6 +60,8 @@ import com.mifos.feature.client.clientUpcomingCharges.navigateToClientUpcomingCh import com.mifos.feature.client.clientUpdateDefaultAccount.navigateToUpdateDefaultAccountRoute import com.mifos.feature.client.clientUpdateDefaultAccount.updateDefaultAccountDestination import com.mifos.feature.client.clientsList.ClientListScreen +import com.mifos.feature.client.collateralData.clientCollateralDestination +import com.mifos.feature.client.collateralData.navigateCollateralScreen import com.mifos.feature.client.createNewClient.CreateNewClientScreen import com.mifos.feature.client.fixedDepositAccount.clientFixedDepositAccountDestination import com.mifos.feature.client.fixedDepositAccount.navigateToFixedDepositAccountRoute @@ -175,6 +177,7 @@ fun NavGraphBuilder.clientNavGraph( recurringDepositAccounts = navController::navigateToRecurringDepositAccountRoute, collateralData = {}, sharesAccounts = navController::navigateToShareAccountsScreen, + collateralDatadates = navController::navigateCollateralScreen, fixedDepositAccounts = navController::navigateToFixedDepositAccountRoute, upcomingCharges = navController::navigateToClientUpcomingChargesRoute, ) @@ -215,6 +218,7 @@ fun NavGraphBuilder.clientNavGraph( onNavigateNext = navController::navigateToClientDetailsProfileRouteOnStatus, navController = navController, ) + clientStaffDestination( onNavigateBack = navController::popBackStack, onNavigateNext = navController::navigateToClientDetailsProfileRouteOnStatus, @@ -272,6 +276,10 @@ fun NavGraphBuilder.clientNavGraph( navController = navController, navigateToViewAccount = {}, ) + clientCollateralDestination( + navController = navController, + navigateToViewAccount = {}, + ) } } diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/loanAccountSummary/LoanAccountSummaryScreenRoute.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/loanAccountSummary/LoanAccountSummaryScreenRoute.kt index 52d7757445a..9668469d396 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/loanAccountSummary/LoanAccountSummaryScreenRoute.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/loanAccountSummary/LoanAccountSummaryScreenRoute.kt @@ -34,7 +34,8 @@ fun NavGraphBuilder.loanAccountSummary( approveLoan: (loadId: Int, loanWithAssociations: LoanWithAssociationsEntity) -> Unit, disburseLoan: (Int) -> Unit, onRepaymentClick: (LoanWithAssociationsEntity) -> Unit, -) { + + ) { composable { LoanAccountSummaryScreen( navigateBack = onBackPressed, @@ -46,6 +47,7 @@ fun NavGraphBuilder.loanAccountSummary( approveLoan = approveLoan, disburseLoan = disburseLoan, onRepaymentClick = onRepaymentClick, + ) } } From a519ffd1ceb9294acf644cdf2a091cad790a33a3 Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Mon, 29 Sep 2025 19:53:02 +0530 Subject: [PATCH 5/9] Somemore Changes --- .../client/collateralData/CollateralDataNavigation.kt | 6 +++--- .../client/collateralData/CollateralDataScreen.kt | 11 +++++------ .../client/collateralData/CollateralDataViewModel.kt | 6 +++--- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt index 82924793272..ab3eb346626 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataNavigation.kt @@ -8,14 +8,14 @@ import androidx.navigation.compose.composable import kotlinx.serialization.Serializable @Serializable -data class clientCollateralRoute( +data class ClientCollateralRoute( val clientId : Int = -1, ) fun NavGraphBuilder.clientCollateralDestination( navController: NavController, navigateToViewAccount: (Int) -> Unit, ) { - composable { + composable { CollateralScreenRoute( navController = navController, viewAccount = navigateToViewAccount, @@ -27,7 +27,7 @@ fun NavController.navigateCollateralScreen( clientId : Int, ){ this.navigate( - clientCollateralRoute( + ClientCollateralRoute( clientId = clientId, ) diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt index b28f5a4316d..e18a244b838 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataScreen.kt @@ -9,7 +9,7 @@ package com.mifos.feature.client.collateralData import androidclient.feature.client.generated.resources.Res import androidclient.feature.client.generated.resources.string_not_available -import androidx.compose.foundation.Image + import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -35,13 +35,12 @@ import com.mifos.core.designsystem.theme.MifosTypography import com.mifos.core.designsystem.utils.onClick import com.mifos.core.ui.components.Actions import com.mifos.core.ui.components.MifosActionsCollateralDataListingComponent -import com.mifos.core.ui.components.MifosActionsShareListingComponent + import com.mifos.core.ui.components.MifosBreadcrumbNavBar import com.mifos.core.ui.components.MifosEmptyCard import com.mifos.core.ui.components.MifosProgressIndicator import com.mifos.core.ui.util.EventsEffect -import org.jetbrains.compose.resources.DrawableResource -import org.jetbrains.compose.resources.painterResource + import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel @@ -61,7 +60,7 @@ internal fun CollateralScreenRoute( } } - collateralScreen( + CollateralScreen( state = state, navController = navController, onAction = remember(viewModel) { { viewModel.trySendAction(it) } }, @@ -74,7 +73,7 @@ internal fun CollateralScreenRoute( } @Composable -internal fun collateralScreen( +internal fun CollateralScreen( navController: NavController, state: CollateralUiState, onAction: (CollateralAction) -> Unit, diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt index 9d1a6d21450..bf82efad445 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt @@ -21,7 +21,7 @@ class ClientCollateralViewmodel ( ): BaseViewModel( initialState = CollateralUiState() ){ - private val route = savedStateHandle.toRoute() + private val route = savedStateHandle.toRoute() override fun handleAction(action: CollateralAction) { when (action) { is CollateralAction.CardClicked -> handleCardClicked(action.activeIndex) @@ -104,7 +104,7 @@ class ClientCollateralViewmodel ( private fun toggleSearchBar() { mutableStateFlow.update { it.copy( - isSearchBarActive = !state.isSearchBarActive, + isSearchBarActive = !it.isSearchBarActive, ) } @@ -112,7 +112,7 @@ class ClientCollateralViewmodel ( private fun handleCardClicked(index : Int){ mutableStateFlow.update { it.copy( - isCardActive = !state.isCardActive, + isCardActive = !it.isCardActive, currentlyActiveIndex = index, ) } From 756e103291763cb9443fe73a2bbc3ba1f8f1ebc6 Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Wed, 1 Oct 2025 21:25:13 +0530 Subject: [PATCH 6/9] made some blunder --- .../repository/ClientDetailsRepository.kt | 2 +- .../ClientDetailsRepositoryImp.kt | 1 + .../core/network/model/CollateralItem.kt | 25 +++++++++++++------ .../newLoanAccount/NewLoanAccountViewModel.kt | 4 +-- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt index 1d6fb8725b9..ce55486316b 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt @@ -39,7 +39,7 @@ interface ClientDetailsRepository { suspend fun getClientCloseTemplate(): DataState - suspend fun getCollateralItems(clientId: Int): DataState> + suspend fun getCollateralItem(clientId: Int): DataState> suspend fun getClient(clientId: Int): ClientEntity diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt index 2b3adb1e8e0..ab4b61a0e82 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt @@ -1,3 +1,4 @@ + /* * Copyright 2024 Mifos Initiative * diff --git a/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt b/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt index f3d09bdba2a..d35b46b9223 100644 --- a/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt +++ b/core/network/src/commonMain/kotlin/com/mifos/core/network/model/CollateralItem.kt @@ -1,3 +1,14 @@ +/* + * Copyright 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * See https://github.com/openMF/android-client/blob/master/LICENSE.md + */ + + /* * Copyright 2025 Mifos Initiative * @@ -13,11 +24,11 @@ import kotlinx.serialization.Serializable @Serializable data class CollateralItem( - val id: Int, - val name: String, - val quantity: Double, + val quality: String, + val basePrice: Double, + val unitType: String, val pctToBase: Double, - val unitPrice: Double, - val total: Double, - val totalCollateral: Double -) + val currency: String, + val name: String, + val id: Int, +) \ No newline at end of file diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt index d7b6a0cc143..a8fdebd7fa5 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt @@ -760,7 +760,7 @@ constructor( val showChargesDatePick: Boolean = false, val chargeAmount: String = "", -) { + ) { sealed interface DialogState { data class Error(val message: String) : DialogState data object AddNewCollateral : DialogState @@ -868,4 +868,4 @@ data class CreatedCharges( val type: String?, val amount: Double? = 0.0, val collectedOn: String = "", -) +) \ No newline at end of file From ff978290cfdf1c17f03133cef924463cd18cbfe4 Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Wed, 1 Oct 2025 22:21:50 +0530 Subject: [PATCH 7/9] looking for error --- .../mifos/core/data/repository/ClientDetailsRepository.kt | 2 +- .../core/data/repositoryImp/ClientDetailsRepositoryImp.kt | 5 ++--- .../feature/client/collateralData/CollateralDataViewModel.kt | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt index ce55486316b..bfc7391f3e6 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt @@ -39,7 +39,7 @@ interface ClientDetailsRepository { suspend fun getClientCloseTemplate(): DataState - suspend fun getCollateralItem(clientId: Int): DataState> + suspend fun getCollateralItem(): DataState> suspend fun getClient(clientId: Int): ClientEntity diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt index ab4b61a0e82..228d2757c41 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt @@ -1,4 +1,3 @@ - /* * Copyright 2024 Mifos Initiative * @@ -64,7 +63,7 @@ class ClientDetailsRepositoryImp( } } - override suspend fun getCollateralItems(clientId: Int): DataState> { + override suspend fun getCollateralItems(): DataState> { return try { val res = dataManagerClient.getCollateralItems() return DataState.Success(res) @@ -202,4 +201,4 @@ class ClientDetailsRepositoryImp( DataState.Error(e) } } -} +} \ No newline at end of file diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt index bf82efad445..e3ac73dcd8c 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/collateralData/CollateralDataViewModel.kt @@ -45,7 +45,7 @@ class ClientCollateralViewmodel ( } try{ - val result = repository.getCollateralItems(route.clientId) + val result = repository.getCollateralItems() when(result){ is DataState.Success -> { From 36beb86470f49048f685877dbad5ac8b96cf5f21 Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Fri, 3 Oct 2025 14:30:53 +0530 Subject: [PATCH 8/9] some other changes --- .../com/mifos/core/data/repository/ClientDetailsRepository.kt | 2 +- .../client/clientCollateral/ClientCollateralViewModel.kt | 2 +- .../client/clientGeneral/ClientProfileGeneralNavigation.kt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt index bfc7391f3e6..10445401af4 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt @@ -39,7 +39,7 @@ interface ClientDetailsRepository { suspend fun getClientCloseTemplate(): DataState - suspend fun getCollateralItem(): DataState> + suspend fun getCollateralItems(): DataState> suspend fun getClient(clientId: Int): ClientEntity diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt index a02d070afd8..e9d920fcaa0 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt @@ -46,7 +46,7 @@ internal class ClientCollateralViewModel( private suspend fun loadCollaterals() { mutableStateFlow.update { it.copy(dialogState = ClientCollateralState.DialogState.Loading) } - val result = repo.getCollateralItems(route.clientId) + val result = repo.getCollateralItems() when (result) { is DataState.Error -> { mutableStateFlow.update { diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt index b1a52b3cbf0..d445bfe21c4 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientGeneral/ClientProfileGeneralNavigation.kt @@ -28,7 +28,7 @@ fun NavGraphBuilder.clientProfileGeneralDestination( fixedDepositAccounts: (Int) -> Unit, recurringDepositAccounts: (Int) -> Unit, sharesAccounts: (Int) -> Unit, - collateralDatadates: (Int) -> Unit, + collateralData: (Int) -> Unit, ) { composable { @@ -42,7 +42,7 @@ fun NavGraphBuilder.clientProfileGeneralDestination( recurringDepositAccounts, sharesAccounts, collateralData, - collateralDatadates, + ) } From 9e47b4f87e6876471b896b871b3ed94a9b3a8db1 Mon Sep 17 00:00:00 2001 From: Ankit kumar Date: Sun, 12 Oct 2025 21:37:49 +0530 Subject: [PATCH 9/9] changes --- .../repository/ClientDetailsRepository.kt | 2 +- .../ClientDetailsRepositoryImp.kt | 2 +- .../ClientCollateralViewModel.kt | 39 +++++++++---------- .../newLoanAccount/NewLoanAccountViewModel.kt | 2 +- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt index 10445401af4..1d6fb8725b9 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repository/ClientDetailsRepository.kt @@ -39,7 +39,7 @@ interface ClientDetailsRepository { suspend fun getClientCloseTemplate(): DataState - suspend fun getCollateralItems(): DataState> + suspend fun getCollateralItems(clientId: Int): DataState> suspend fun getClient(clientId: Int): ClientEntity diff --git a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt index 228d2757c41..e84b95ef45b 100644 --- a/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt +++ b/core/data/src/commonMain/kotlin/com/mifos/core/data/repositoryImp/ClientDetailsRepositoryImp.kt @@ -63,7 +63,7 @@ class ClientDetailsRepositoryImp( } } - override suspend fun getCollateralItems(): DataState> { + override suspend fun getCollateralItems(clientId: Int): DataState> { return try { val res = dataManagerClient.getCollateralItems() return DataState.Success(res) diff --git a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt index e9d920fcaa0..7c2b1e1565e 100644 --- a/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt +++ b/feature/client/src/commonMain/kotlin/com/mifos/feature/client/clientCollateral/ClientCollateralViewModel.kt @@ -45,29 +45,28 @@ internal class ClientCollateralViewModel( } private suspend fun loadCollaterals() { - mutableStateFlow.update { it.copy(dialogState = ClientCollateralState.DialogState.Loading) } val result = repo.getCollateralItems() - when (result) { - is DataState.Error -> { - mutableStateFlow.update { - it.copy( - dialogState = ClientCollateralState.DialogState.Error( - result.message, - ), - ) - } - } - is DataState.Success -> { - mutableStateFlow.update { - it.copy( - collaterals = result.data, - dialogState = null, - ) - } - } - else -> Unit + when (result) { + is DataState.Error -> { + mutableStateFlow.update { + it.copy( + dialogState = ClientCollateralState.DialogState.Error( + result.message, + ), + ) } } + is DataState.Success -> { + mutableStateFlow.update { + it.copy( + collaterals = result.data, + dialogState = null, + ) + } + } + else -> Unit + } + } private suspend fun saveCollateral() { mutableStateFlow.update { it.copy(dialogState = ClientCollateralState.DialogState.Loading) } diff --git a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt index a8fdebd7fa5..ac419b633c1 100644 --- a/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt +++ b/feature/loan/src/commonMain/kotlin/com/mifos/feature/loan/newLoanAccount/NewLoanAccountViewModel.kt @@ -613,7 +613,7 @@ internal class NewLoanAccountViewModel( } private suspend fun loadCollaterals() { - val result = repo.getCollateralItems() + val result = repo.getCollateralItems(clientId = state.clientId) when (result) { is DataState.Error -> {} is DataState.Success -> {