Skip to content

Commit 08d5937

Browse files
committed
2 parents 347e108 + c589d9d commit 08d5937

111 files changed

Lines changed: 10296 additions & 1730 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ This application leverages **Angular** as the frontend framework and **Tailwind
2121
| Angular | Frontend application logic |
2222
| Tailwind CSS | Styling and responsive UI |
2323
| LocalStorage | Persistent data storage |
24-
| Django | Backend api logic |
24+
| Spring Boot | Backend api logic |
2525

2626
---
2727

@@ -91,32 +91,52 @@ All expenses are stored in the device's **LocalStorage** and reflected immediate
9191

9292
---
9393

94-
### 5. **Budget View**
94+
### 5. **Budget & Salary Management**
9595

96-
* Users can define a **budget range** by selecting a **start** and **end date**.
97-
* Once a budget is set:
96+
The **Budget & Salary** module provides a sophisticated financial dashboard that transitions between total income tracking and granular monthly budgeting.
9897

99-
* A **progress bar** visually represents how much of the budget has been spent.
100-
* Informative summary boxes display:
98+
**Key capabilities include:**
10199

102-
* **Avg Allowed/Day**
103-
* **Spent/Day**
104-
* **Suggested/Day** (based on remaining budget and days)
105-
* Users have the ability to **edit** or **delete** the budget for better flexibility and control.
100+
* 💼 **Dynamic Financial Modes**
101+
* **Salary Tracking:** Tracks total accumulated income and overall savings rates.
102+
* **Budget Tracking:** Focuses on a specific month's limits to prevent overspending.
103+
* The system intelligently calculates metrics based on the active `viewMode`.
106104

105+
106+
* 📊 **Advanced Financial Analytics**
107+
* **Salary Growth:** Automatically calculates the percentage increase or decrease in income compared to the previous month.
108+
* **Savings Rate:** Real-time calculation of the percentage of income retained after expenses:
109+
110+
111+
* **Daily Spending Intelligence:**
112+
* **Allowed/Day:** Your theoretical daily limit based on the total budget and days in the month.
113+
* **Spent/Day:** Actual average spending calculated from the day of your first expense to today.
114+
* **Suggested/Day:** A dynamic "correction" metric that tells you exactly how much you can spend for the *remaining* days to stay on target.
115+
116+
* 🎨 **Visual Feedback & Progress**
117+
* **Smart Progress Bar:** A multi-state indicator that shifts colors based on your spending velocity:
118+
* 🟢 **Green to Indigo:** (Below 50%) - Safe zone.
119+
* 🟠 **Orange:** (50% - 90%) - Warning zone.
120+
* 🔴 **Red:** (Above 90%) - Critical limit/Exceeded.
121+
* **Contextual Status:** Text insights (e.g., *"Excellent! Saving > 50%"* or *"⚠️ You have exceeded your limit!"*).
122+
123+
* 🛠️ **Transaction Management**
124+
* **Full CRUD Operations:** Add, edit, and delete salary/budget records.
125+
* **Validation Layer:** Integrated error handling for amounts (max limit ), required notes, and month selection.
107126
---
108127

109128
### 6. **Settings View**
110129

111130
Provides customization and utility options for better personalization:
112131

113-
* 🎨 **Theme Mode Toggle** — Dark / Light
114-
* ⬇️ **Download Data** — Export your expenses in **PDF**, **JSON**, or **Excel** formats between the selected date range. Users can also choose **All Data** to export all expense records.
115-
* 📤 **Import Data** — Upload expense data.
116-
* 🔄 **Update App** — Update the application to the latest release.
117-
***Add Category** — Create custom categories for better organization.
118-
* ✏️ **Edit Category** — Modify existing categories.
119-
***Delete Category** — Remove unused or incorrect categories.
132+
* 🎨 **Theme Mode Toggle** — Switch between **Dark** and **Light** modes
133+
* ⬇️ **Download Data** — Export expenses in **PDF**, **JSON**, or **Excel** formats within a selected date range. Users can also choose **All Data** to export every expense record
134+
* 📤 **Import Data** — Upload and import expense data into the application
135+
* 🔄 **Update App** — Update the application to the latest available version
136+
* ☁️ **Data Backup** — Enable automatic or manual data backup for data safety. When enabled, a backend API runs automatically in the background to upload your data to the database.
137+
***Add Category** — Create custom categories for better expense organization
138+
* ✏️ **Edit Category** — Update or rename existing categories
139+
***Delete Category** — Remove unused or incorrect categories
120140

121141
---
122142

documentation/components/AddExpenseComponent.html

Lines changed: 36 additions & 18 deletions
Large diffs are not rendered by default.

documentation/components/AiComponent.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,9 @@ <h3>Metadata</h3>
184184
<tr>
185185
<td class="col-md-3">imports</td>
186186
<td class="col-md-9">
187-
<code>CommonModule</code>
188-
<code>FormsModule</code>
189-
<code>HttpClientModule</code>
187+
<code><a href="https://angular.io/api/common/CommonModule" target="_blank" >CommonModule</a></code>
188+
<code><a href="https://angular.io/api/forms/FormsModule" target="_blank" >FormsModule</a></code>
189+
<code><a href="https://angular.io/api/common/http/HttpClientModule" target="_blank" >HttpClientModule</a></code>
190190
</td>
191191
</tr>
192192

@@ -265,7 +265,7 @@ <h3 id="constructor">Constructor</h3>
265265
<tbody>
266266
<tr>
267267
<td class="col-md-4">
268-
<code>constructor(geminiApi: <a href="../injectables/GeminiApiService.html" target="_self">GeminiApiService</a>, sanitizer: DomSanitizer)</code>
268+
<code>constructor(geminiApi: <a href="../injectables/GeminiApiService.html" target="_self">GeminiApiService</a>, sanitizer: <a href="https://angular.io/api/platform-browser/DomSanitizer" target="_blank">DomSanitizer</a>)</code>
269269
</td>
270270
</tr>
271271
<tr>
@@ -310,7 +310,7 @@ <h3 id="constructor">Constructor</h3>
310310
<td>sanitizer</td>
311311

312312
<td>
313-
<code>DomSanitizer</code>
313+
<code><a href="https://angular.io/api/platform-browser/DomSanitizer" target="_blank" >DomSanitizer</a></code>
314314
</td>
315315

316316
<td>
@@ -688,12 +688,12 @@ <h3 id="inputs">
688688

689689
</div>
690690

691-
<script src="../js/libs/vis.min.js"></script>
691+
<script src="../js/libs/vis-network.min.js"></script>
692692
<script src="../js/libs/htmlparser.js"></script>
693693
<script src="../js/libs/deep-iterator.js"></script>
694694
<script>
695695
var COMPONENT_TEMPLATE = '<div><section class="section p-4 mb-4"> <div class="transition-all duration-300 max-w-2xl mx-auto"> <div class="sticky top-0 z-30 bg-[var(--color-bg)] py-2 pb-4"> <h2 class="text-xl font-semibold mb-4 text-[var(--theme-color)] text-center">💬 AI Assistant </h2> <!-- Chat-style Input Area --> <div class="flex gap-2 items-center"> <!-- Send Button with Icon --> <!-- Input Field --> <input type="text" [(ngModel)]="userInput" placeholder="Ask something related to your expenses..." class="flex-1 px-4 py-2 rounded-lg border text-[var(--input-text)] bg-[var(--input-bg)] border-[var(--input-border)] focus:outline-none focus:ring-2 focus:ring-[var(--theme-color)] transition-all duration-200" /> <button (click)="send()" class="shrink-0 bg-[var(--theme-color)] p-3 rounded-full shadow hover:scale-105 transition-transform duration-200" title="Send"> <img src="assets/img/icon/icons8-send-48.png" alt="Send" class="w-5 h-5" style="filter:invert(100%)" /> </button> </div> </div> <!-- AI Response Box --> <div *ngIf="responseHtml" class="mt-1 p-1 pb-4 bg-[var(--color-bg)] animate-fade-in overflow-auto" [innerHTML]="responseHtml"></div> </div></section><!-- for chat --><!-- <section class="p-4 section"> <div class="p-4 max-w-xl mx-auto"> <div class="space-y-4 mb-4"> <div *ngFor="let msg of messages"> <div [ngClass]="{ \'text-right\': msg.role === \'user\', \'text-left\': msg.role === \'model\' }"> <div [ngClass]="{ \'bg-blue-100 text-blue-800\': msg.role === \'user\', \'bg-gray-100 text-gray-800\': msg.role === \'model\' }" class="inline-block px-4 py-2 rounded-lg max-w-full overflow-x-auto"> <ng-container *ngIf="msg.role === \'user\'; else markdownReply"> {{ msg.parts[0].text }} </ng-container> <ng-template #markdownReply> <div [innerHTML]="msg.safeHtml"></div> </ng-template> </div> </div> </div> <div *ngIf="loading" class="text-center text-gray-400">Thinking...</div> </div> <div class="flex gap-2"> <input type="text" [(ngModel)]="userInput" placeholder="Type your message..." class="w-full p-2 border rounded" (keydown.enter)="send()" /> <button (click)="send()" class="bg-blue-500 text-white px-4 py-2 rounded" [disabled]="loading"> Send </button> </div> </div></section> --></div>'
696-
var COMPONENTS = [{'name': 'AddExpenseComponent', 'selector': 'app-add-expense'},{'name': 'AiComponent', 'selector': 'app-ai'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'BudgetComponent', 'selector': 'app-budget'},{'name': 'CalendarComponent', 'selector': 'app-calendar'},{'name': 'CategoryDropdownComponent', 'selector': 'app-category-dropdown'},{'name': 'DownloadComponentComponent', 'selector': 'app-download-component'},{'name': 'ExpenseDetailsModalComponent', 'selector': 'app-expense-details-modal'},{'name': 'ExpenseListComponent', 'selector': 'app-expense-list'},{'name': 'ExpenseWiseComponent', 'selector': 'app-expense-wise'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FormModelComponent', 'selector': 'app-form-model'},{'name': 'GlobalLoaderComponent', 'selector': 'app-global-loader'},{'name': 'GraphsComponent', 'selector': 'app-graphs'},{'name': 'HamburgerMenuComponent', 'selector': 'app-hamburger-menu'},{'name': 'HomeComponent', 'selector': 'app-home'},{'name': 'InstallAppPopupComponentComponent', 'selector': 'app-install-app-popup-component'},{'name': 'ListExpensesComponent', 'selector': 'app-list-expenses'},{'name': 'MusicComponent', 'selector': 'app-music'},{'name': 'NavbarComponent', 'selector': 'app-navbar'},{'name': 'PieChartComponent', 'selector': 'app-pie-chart'},{'name': 'PlaylistMusicComponent', 'selector': 'app-playlist-music'},{'name': 'SearchButtonComponent', 'selector': 'app-search-button'},{'name': 'SearchMusicComponent', 'selector': 'app-search-music'},{'name': 'SettingItemComponent', 'selector': 'app-setting-item'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SplashScreenComponent', 'selector': 'app-splash-screen'},{'name': 'TemplatePlaygroundComponent', 'selector': 'template-playground-root'},{'name': 'ToastComponent', 'selector': 'app-toast'}];
696+
var COMPONENTS = [{'name': 'AddExpenseComponent', 'selector': 'app-add-expense'},{'name': 'AiComponent', 'selector': 'app-ai'},{'name': 'AppComponent', 'selector': 'app-root'},{'name': 'CalendarComponent', 'selector': 'app-calendar'},{'name': 'CategoryDropdownComponent', 'selector': 'app-category-dropdown'},{'name': 'DownloadComponentComponent', 'selector': 'app-download-component'},{'name': 'ExpenseDetailsModalComponent', 'selector': 'app-expense-details-modal'},{'name': 'ExpenseListComponent', 'selector': 'app-expense-list'},{'name': 'ExpenseWiseComponent', 'selector': 'app-expense-wise'},{'name': 'FooterComponent', 'selector': 'app-footer'},{'name': 'FormModelComponent', 'selector': 'app-form-model'},{'name': 'GlobalLoaderComponent', 'selector': 'app-global-loader'},{'name': 'GraphsComponent', 'selector': 'app-graphs'},{'name': 'HamburgerMenuComponent', 'selector': 'app-hamburger-menu'},{'name': 'HelpDashboard', 'selector': 'app-help-dashboard'},{'name': 'HomeComponent', 'selector': 'app-home'},{'name': 'InstallAppPopupComponentComponent', 'selector': 'app-install-app-popup-component'},{'name': 'ListExpensesComponent', 'selector': 'app-list-expenses'},{'name': 'MusicComponent', 'selector': 'app-music'},{'name': 'NavbarComponent', 'selector': 'app-navbar'},{'name': 'PieChartComponent', 'selector': 'app-pie-chart'},{'name': 'PlaylistMusicComponent', 'selector': 'app-playlist-music'},{'name': 'SalaryComponent', 'selector': 'app-salary'},{'name': 'SearchButtonComponent', 'selector': 'app-search-button'},{'name': 'SearchMusicComponent', 'selector': 'app-search-music'},{'name': 'SettingItemComponent', 'selector': 'app-setting-item'},{'name': 'SettingsComponent', 'selector': 'app-settings'},{'name': 'SidebarComponent', 'selector': 'app-sidebar'},{'name': 'SplashScreenComponent', 'selector': 'app-splash-screen'},{'name': 'TemplatePlaygroundComponent', 'selector': 'template-playground-root'},{'name': 'ToastComponent', 'selector': 'app-toast'}];
697697
var DIRECTIVES = [];
698698
var ACTUAL_COMPONENT = {'name': 'AiComponent'};
699699
</script>

0 commit comments

Comments
 (0)