Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a9c127f
feat(wallet): add FinancialAccount and AccountType domain models
DidierSebas Jun 2, 2026
2bec036
Implement create category form
Giovany7x Jun 2, 2026
6464931
Implement financial account cards and creation form
Giovany7x Jun 2, 2026
b9ad7af
Add financial account routes and improve card form UI
Giovany7x Jun 3, 2026
38dd79f
feat: add disable financial account endpoint and repository implement…
DidierSebas Jun 4, 2026
cbce645
feat: add disable financial account use case and repository method
DidierSebas Jun 4, 2026
3566317
feat: add disable account UI with confirmation dialog and card button
DidierSebas Jun 4, 2026
1fd4370
Merge pull request #19 from Resolum/develop
equinox-1092 Jun 4, 2026
4257ba1
Merge pull request #22 from Resolum/develop
equinox-1092 Jun 4, 2026
d72e5ca
Merge pull request #24 from Resolum/develop
equinox-1092 Jun 4, 2026
ff220e9
chore(wallet): remove FinancialAccount model
DidierSebas Jun 4, 2026
0712325
feat(savings): improve edit screen and fix goal completion flow.
equinox-1092 Jun 4, 2026
f0665eb
Merge pull request #28 from Resolum/feature/savings-goal
Far14z Jun 4, 2026
a17c9b3
refactor(categories): refactor category retrieval to use owner type a…
Far14z Jun 4, 2026
c51e9a5
Merge remote-tracking branch 'origin/develop' into feature/communicat…
Far14z Jun 4, 2026
f4514fb
feat(spendinglimits): add spending limit category selector component …
Far14z Jun 4, 2026
9cf39e8
Merge pull request #29 from Resolum/feature/communications
equinox-1092 Jun 4, 2026
113c1c0
refactor(category-icons): normalize category icon names and update UI…
Far14z Jun 5, 2026
ce823bc
Merge pull request #31 from Resolum/feature/communications
equinox-1092 Jun 5, 2026
32f1354
Merge pull request #15 from Resolum/feature/home
equinox-1092 Jun 5, 2026
f0e95ee
fix: resolve merge conflicts
equinox-1092 Jun 5, 2026
c6ef8f6
docs: add read me file for application.
JuarezLn10 Jun 5, 2026
351ebf0
docs: add contributing and license file.
JuarezLn10 Jun 5, 2026
74aaa1e
fix(categories): update facade service owner query
Giovany7x Jun 5, 2026
358f201
refactor(categories): align repository with owner-based queries
Giovany7x Jun 5, 2026
52c6ac0
fix(categories): fetch categories using active session owner
Giovany7x Jun 5, 2026
be25b78
Merge pull request #33 from Resolum/feature/payment-methods-and-categ…
Far14z Jun 5, 2026
cc8f507
Merge pull request #32 from Resolum/docs/read-me
Far14z Jun 5, 2026
4fb6d2a
fix(deployment): update release base url.
Far14z Jun 5, 2026
cadb232
Merge pull request #34 from Resolum/feature/deployment-configuration
equinox-1092 Jun 5, 2026
4ad7767
feat(deployment): enhance firebase distribution workflow and update k…
Far14z Jun 5, 2026
6989f16
Merge pull request #35 from Resolum/feature/deployment-configuration
Far14z Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 22 additions & 1 deletion .github/workflows/firebase-app-distribution.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,32 @@ jobs:
run: |
echo "GOOGLE_APPLICATION_CREDENTIALS=$PWD/firebase-service-account.json" >> $GITHUB_ENV

- name: Decode and create keystore
env:
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
run: |
if [ -z "$KEYSTORE_BASE64" ]; then
echo "Missing KEYSTORE_BASE64 repository secret."
exit 1
fi
echo "$KEYSTORE_BASE64" | base64 --decode > $HOME/intiva-release.jks
echo "KEYSTORE_FILE_PATH=$HOME/intiva-release.jks" >> $GITHUB_ENV

- name: Grant execute permission to gradlew
run: chmod +x ./gradlew

- name: Build release APK
env:
KEYSTORE_PATH: ${{ env.KEYSTORE_FILE_PATH }}
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: ./gradlew assembleRelease

- name: Upload release to Firebase App Distribution
run: ./gradlew appDistributionUploadRelease
env:
KEYSTORE_PATH: ${{ env.KEYSTORE_FILE_PATH }}
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
run: ./gradlew appDistributionUploadRelease
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea
.DS_Store
/build
/captures
Expand Down
4 changes: 0 additions & 4 deletions .idea/deploymentTargetSelector.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Commit Guidelines

When contributing to this repository, please follow these guidelines to ensure a smooth and efficient collaboration process.

## Conventional Commits

Use the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification for commit messages. This helps maintain a clear and consistent commit history.

- Commit message must be in **English**.
- Use present tense and an imperative mode.
- Include a scope to specify the area of the codebase that is affected by the commit (optional but recommended).
- You can use the following types of commits:
- `feat`: A new feature.
- `fix`: A bug fix.
- `docs`: Documentation changes.
- `refactor`: Code refactoring without changing functionality.
- `test`: Adding or updating tests.
- `chore`: Changes to the build process or auxiliary tools and libraries.

## Example Commit Message

```
feat(home): add home screen.
```

```
docs: update read me file with installation instructions.
```
21 changes: 21 additions & 0 deletions LICENSE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Resolum

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
46 changes: 46 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Intiva Mobile Application

This repository contains the mobile application for the Intiva Platform, which is a platform for managing expenses, savings and incomes.
The mobile application is built using Kotlin and Jetpack Compose and provides a user-friendly interface for users to interact with the features.
It also uses Room for local data storage and Retrofit for network communication with the backend API.

## Summary

This application is a mobile application for the Intiva Platform. It includes the following features:

- Transaction management: Register and monitor all transactions, including expenses and incomes.
- Categorization: Classify transactions into different categories for better organization and analysis.
- Budget management: Set and track budgets for different categories of expenses and for different periods of time.
- Savings management: Set and track savings goals, and monitor progress towards those goals.
- Reminders and notifications: Set up reminders for upcoming bills, budget limits, and savings goals, and receive notifications to stay on track.
- Family group management: Create and manage family groups to share expenses, budgets, and savings goals among family members.
- Reporting and analytics: Generate reports and visualizations to analyze spending patterns, savings progress, and overall financial health.
- User management: Manage user accounts, including registration, authentication, and authorization.

## Technologies Used

For the development of this API, the following technologies were used:

### Main Stack

- Kotlin: The programming language used for the development of the mobile application.
- Jetpack Compose: A modern toolkit for building native Android UI, used to create the user interface of the mobile application.
- Room: A persistence library for Android, used for local data storage in the mobile application.
- Retrofit: A type-safe HTTP client for Android, used for network communication with the backend API.
- Coroutines: A concurrency framework for Kotlin, used for asynchronous programming in the mobile application.
- Dagger Hilt: A dependency injection framework for Android, used for managing dependencies in the mobile application.
- Navigation Component: A framework for handling navigation in Android applications, used for managing navigation between different screens in the mobile application.
- ViewModel: A component of the Android Architecture Components, used for managing UI-related data in a lifecycle-conscious way in the mobile application.

### Approaches and Patterns

- MVVC (Model-View-ViewModel): The application follows the MVVC architectural pattern, which separates the user interface (View) from the business logic (ViewModel) and the data (Model).
- Clean Architecture: The application is structured following the principles of Clean Architecture, which promotes separation of concerns and makes the codebase more maintainable and testable.
- Feature-based module organization: The codebase is organized into modules based on features, which helps to keep the codebase organized and makes it easier to navigate and maintain.

## Documentation

The project includes basic documentation and is available in the `docs` folder. It includes:

- C4 Model Software Architecture Diagrams: includes context, container and component level diagrams to provide an overview of the system architecture and its components.
- Class Diagrams: includes class diagrams to illustrate the structure of the codebase and the relationships between classes.
14 changes: 13 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@ android {
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

signingConfigs {
create("release") {
storeFile = file(System.getenv("KEYSTORE_PATH"))
storePassword = System.getenv("KEYSTORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
}
}

buildTypes {
debug {
buildConfigField("String", "BASE_URL", "\"http://10.0.2.2:8080/api/v1/\"")
Expand All @@ -52,13 +61,15 @@ android {

matchingFallbacks += listOf("debug")
}

release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
buildConfigField("String", "BASE_URL", "\"https://stocksip-back-end.azurewebsites.net/api/v1/\"")
buildConfigField("String", "BASE_URL", "\"https://intiva-api.azurewebsites.net/api/v1/\"")

firebaseAppDistribution {
// Specifices the release notes file.
Expand Down Expand Up @@ -120,6 +131,7 @@ dependencies {
testImplementation(libs.junit)
testImplementation(libs.mockk)
testImplementation(libs.kotlinx.coroutines.test)
testImplementation(libs.mockwebserver.v4120)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
androidTestImplementation(libs.androidx.espresso.core)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
// IntivaBottomNavBar.kt
package com.resolum.intiva.core.navigation.components

import androidx.compose.foundation.BorderStroke
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Group
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Receipt
import androidx.compose.material.icons.filled.TrackChanges
import androidx.compose.material3.Surface
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
Expand All @@ -17,6 +19,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.resolum.intiva.core.navigation.model.NavItem
import com.resolum.intiva.core.navigation.routes.NavRoutes
Expand All @@ -43,7 +46,7 @@ fun IntivaBottomNavBar(
NavItem(NavRoutes.HOME, "INICIO", Icons.Default.Home, "Home"),
NavItem(
NavRoutes.TRANSACTIONS,
"TRANSACCIONES.",
"TRANSACCIONES",
Icons.Default.Receipt,
"Transactions"
),
Expand All @@ -62,32 +65,37 @@ fun IntivaBottomNavBar(
indicatorColor = Color.White
)

/** Render the bottom navigation bar with the defined items and colors. */
NavigationBar(
modifier = modifier,
containerColor = Color.White,
contentColor = IntivaColors.TextSecondary
Surface(
modifier = modifier,
color = Color.White,
border = BorderStroke(1.dp, Color(0xFFE8E8EF))
) {
navItems.forEach { item ->
NavigationBarItem(
icon = {
Icon(
imageVector = item.icon,
contentDescription = item.contentDescription
)
},
label = {
Text(
text = item.label,
fontSize = 9.sp,
maxLines = 1,
overflow = TextOverflow.Clip
)
},
selected = currentRoute == item.route,
onClick = { onNavigate(item.route) },
colors = itemColors
)
/** Render the bottom navigation bar with the defined items and colors. */
NavigationBar(
containerColor = Color.White,
contentColor = IntivaColors.TextSecondary
) {
navItems.forEach { item ->
NavigationBarItem(
icon = {
Icon(
imageVector = item.icon,
contentDescription = item.contentDescription
)
},
label = {
Text(
text = item.label,
fontSize = 8.sp,
maxLines = 1,
overflow = TextOverflow.Clip
)
},
selected = currentRoute == item.route,
onClick = { onNavigate(item.route) },
colors = itemColors
)
}
}
}
}
}
Loading
Loading