Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
3bdf98e
feat(roles): role base authorization added!
sagarboyal May 17, 2025
1f3a6eb
Merge remote-tracking branch 'origin/main'
sagarboyal May 20, 2025
74227d2
feat(expenses): mapped with user and approval status field added!
sagarboyal May 20, 2025
c320422
feat(expenses): Integrated CREATE Expenses!
sagarboyal May 20, 2025
ddbef5f
feat(expenses & deps): Integrated UPDATE Expenses & added validation …
sagarboyal May 20, 2025
e94c991
feat(expenses): Refactoring codes!
sagarboyal May 21, 2025
a6f51ab
feat(expenses): Refactoring codes!
sagarboyal May 21, 2025
3a269ef
feat(expenses): updating and approving expenses feat added!
sagarboyal May 21, 2025
f4a62f4
feat(expenses): added Admin Controller and Specification!
sagarboyal May 21, 2025
d978fc1
feat(expenses): removed unused imports!
sagarboyal May 21, 2025
f83f3ac
feat(expenses): removed unused methods and added access denied handle…
sagarboyal May 22, 2025
30d6288
feat(expenses): added dynamic filter on category module!
sagarboyal May 22, 2025
1a18bbd
feat(expenses): combine all pageResponse classes and create a one gen…
sagarboyal May 22, 2025
0b82ce8
feat(user): added user dtos and updated controller !
sagarboyal May 25, 2025
0d42348
feat(user): updated getUserById functionality!
sagarboyal May 25, 2025
ad2fa16
feat(bugs): fixed role based auth issue!
sagarboyal May 25, 2025
a55cb25
feat(user): updated working mechanism of update users and roles!
sagarboyal May 25, 2025
4122689
feat(user): added user dynamic filter functionality
sagarboyal May 26, 2025
5b71754
feat(security): csrf protection added!
sagarboyal May 27, 2025
2fb8631
feat(endpoints): refactor some admin and manager expense fetch endpoi…
sagarboyal May 30, 2025
51a4e0c
feat(audit-log): audit-log added for category history!
sagarboyal May 30, 2025
fe7d701
feat(audit-log): audit-log added for expense history!
sagarboyal May 31, 2025
3f324b4
feat(audit-log): audit-log added for user history and some code refac…
sagarboyal May 31, 2025
f724e2a
feat(audit-log): changes related audit-log!
sagarboyal May 31, 2025
e834b7a
feat(audit-log): cors and roles!
sagarboyal Jun 3, 2025
d8c8ab8
removed unused imports!
sagarboyal Jun 3, 2025
4936230
Removed application.properties from version control
sagarboyal Jun 3, 2025
5307f8f
chore(deps): added java mail sender and ignored file updated!
sagarboyal Jun 3, 2025
9bb77c1
feat(email): email service configured!
sagarboyal Jun 3, 2025
2091336
feat(reset-password): password reset functionality added!
sagarboyal Jun 3, 2025
7a32106
feat(notification): notification functionality added!
sagarboyal Jun 3, 2025
db652b3
feat(notification): notification configured with different services!
sagarboyal Jun 4, 2025
c254fff
feat(notification): notification filter got updated and some bugs fixed!
sagarboyal Jun 4, 2025
6d9d892
bugs(cors-config): replaced with another approach of cors-config in s…
sagarboyal Jun 5, 2025
d257203
feat(category): added new end point for fetch category with name!
sagarboyal Jun 6, 2025
2634863
feat(analytics): monthly base analytics enabled!
sagarboyal Jun 6, 2025
e56178a
feat(analytics): category base analytics enabled!
sagarboyal Jun 6, 2025
35f7dc0
feat(analytics): status base analytics enabled!
sagarboyal Jun 6, 2025
0210a21
feat(analytics): monthly summary analytics enabled!
sagarboyal Jun 6, 2025
f6f3722
feat(analytics): removed unused import!
sagarboyal Jun 6, 2025
3d51e0e
refactor(approval): migrate to dedicated Approval entity for multi-le…
sagarboyal Jun 10, 2025
eb24db2
feat(export): added export functionality for expenses!
sagarboyal Jun 10, 2025
0cae060
chore(un-used): removed unused functions and imports!
sagarboyal Jun 10, 2025
e5f5128
feat(notification): two new endpoints added for handling unread msg c…
sagarboyal Jun 14, 2025
8cfbdd5
feat(filter-expense): new filter added!
sagarboyal Jun 14, 2025
db554c4
feat(expense): description added!
sagarboyal Jun 14, 2025
a71c2db
feat(expense): expense summary weekly endpoint added!
sagarboyal Jun 15, 2025
0326163
feat(expense): changes bases on frontend requirement!
sagarboyal Jun 18, 2025
2f032b4
chore(config): config file updated
sagarboyal Jun 23, 2025
1807683
feat(invoice): generating invoice features added!
sagarboyal Jun 23, 2025
4032727
feat(bugs): ignore this commit msg!
sagarboyal Jul 5, 2025
06cad73
feat(bugs): ignore this commit msg!
sagarboyal Jul 5, 2025
2cffa4c
feat(bugs): ignore this commit msg!
sagarboyal Jul 5, 2025
362c520
feat(document): added delete doc configuration!
sagarboyal Jul 6, 2025
fab5e1e
feat(expenses): filter bug fixed for admin page!
sagarboyal Jul 8, 2025
97395f8
feat(expenses): filter bug fixed for admin page!
sagarboyal Jul 8, 2025
eb93367
feat(users): bug fixed for delete user!
sagarboyal Jul 9, 2025
e89c3c9
bugs(user): email sending bug fixed!
sagarboyal Jul 16, 2025
d596046
bugs(user): user-filter bug fixed!
sagarboyal Jul 16, 2025
23803e1
bugs(invoice): invoice mail sending a problem fixed and some new endp…
sagarboyal Jul 16, 2025
7665ecb
removed unused import and message for successful export added!
sagarboyal Jul 16, 2025
87aac20
invoice pdf design updated!
sagarboyal Jul 19, 2025
3d2f318
dynamic filter added for invoice filtering and some working mechanism…
sagarboyal Jul 19, 2025
f7c2145
local image store mechanism removed and cloudinary image uploading ad…
sagarboyal Jul 20, 2025
deec666
in cloudinary service file validation added!
sagarboyal Jul 20, 2025
aabb03f
Update README.md
sagarboyal Jul 20, 2025
53b745e
Update README.md
sagarboyal Jul 20, 2025
d4b957e
invoices generation mechanism change and fix mail sending problem
sagarboyal Jul 20, 2025
204796e
removed unused import
sagarboyal Jul 20, 2025
12c5376
Merge remote-tracking branch 'origin/main'
sagarboyal Jul 20, 2025
d808d50
feat(invoice): fetching invoice expenses changed admin to user
sagarboyal Jul 24, 2025
cfb5619
feat(expenses): fixed controller issues
sagarboyal Jul 24, 2025
d28421b
feat(invoices): fixed invoice working mechanism for generating pdf an…
sagarboyal Jul 24, 2025
570c442
feat(expenses): added cloudinary service for image upload and downloa…
sagarboyal Jul 24, 2025
6201415
removed unused import
sagarboyal Jul 24, 2025
96c6eb0
postgres configured with render instance!
sagarboyal Jul 24, 2025
25ff82c
feat(invoice): fixed lob related issue with postgres!
sagarboyal Jul 24, 2025
aea123b
feat(expenses): fixed lob related issue with postgres!
sagarboyal Jul 24, 2025
1c6bfc3
feat(auth): disabled csrf for deployment issue!
sagarboyal Jul 28, 2025
765aeec
chore(deps & config): spring stater version changed for better stabil…
sagarboyal Jul 28, 2025
d1481f0
chore(docker): add Dockerfile for containerizing the app
sagarboyal Jul 28, 2025
48cea48
feat(contact): implement contact request handling
sagarboyal Aug 20, 2025
04c491e
updated instruction about setup
sagarboyal Aug 20, 2025
5f971f7
Update README.md
sagarboyal Mar 4, 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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,8 @@ build/

### VS Code ###
.vscode/

# Ignore .env file
.env

uploads/
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM openjdk:17-alpine
WORKDIR /app
COPY target/enterpriseexpensemanagementsystem-0.0.1-SNAPSHOT.jar trex-app.jar
EXPOSE 8080
CMD [ "java", "-jar", "trex-app.jar"]
Binary file modified README.md
Binary file not shown.
52 changes: 40 additions & 12 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.4</version>
<version>3.3.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.team7</groupId>
Expand Down Expand Up @@ -34,7 +34,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
Expand All @@ -46,26 +45,20 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>annotationProcessor</scope>
<version>1.18.32</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.4</version> <!-- Check for the latest version -->
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down Expand Up @@ -93,6 +86,29 @@
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf</artifactId>
<version>1.3.30</version>
</dependency>
<dependency>
<groupId>com.cloudinary</groupId>
<artifactId>cloudinary-http5</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

<build>
Expand All @@ -101,7 +117,19 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>

</project>
Binary file added screenshots/img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/img_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/img_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/img_3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/img_4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/img_5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.team7.enterpriseexpensemanagementsystem;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.team7.enterpriseexpensemanagementsystem.cloudinary;

import com.cloudinary.Cloudinary;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

@Configuration
@EnableConfigurationProperties(CloudinaryProperties.class)
public class CloudinaryConfig {

private final CloudinaryProperties cloudinaryProperties;

public CloudinaryConfig(CloudinaryProperties cloudinaryProperties) {
this.cloudinaryProperties = cloudinaryProperties;
}

@Bean
public Cloudinary cloudinary() {
Map<String, Object> config = Map.of(
"cloud_name", cloudinaryProperties.cloudName(),
"api_key", cloudinaryProperties.apiKey(),
"api_secret", cloudinaryProperties.apiSecret(),
"secure", true);
return new Cloudinary(config);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.team7.enterpriseexpensemanagementsystem.cloudinary;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "cloudinary")
public record CloudinaryProperties(String cloudName, String apiKey, String apiSecret) {
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,79 @@
package com.team7.enterpriseexpensemanagementsystem.config;

import com.team7.enterpriseexpensemanagementsystem.entity.Role;
import com.team7.enterpriseexpensemanagementsystem.entity.Roles;
import com.team7.enterpriseexpensemanagementsystem.entity.User;
import com.team7.enterpriseexpensemanagementsystem.repository.RoleRepository;
import com.team7.enterpriseexpensemanagementsystem.repository.UserRepository;
import com.team7.enterpriseexpensemanagementsystem.service.UserService;
import lombok.RequiredArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.util.Set;

@Configuration
public class AppConfig {
@Bean
public ModelMapper modelMapper() {
return new ModelMapper();
}
@Bean
public CommandLineRunner commandLineRunner(RoleRepository roleRepository,
UserRepository userRepository,
PasswordEncoder passwordEncoder) {
return args -> {

Role roleAdmin = roleRepository.findByRoleName(Roles.ROLE_ADMIN)
.orElseGet(() -> {
Role newUserRole = new Role(Roles.ROLE_ADMIN);
return roleRepository.save(newUserRole);
});
Role roleManager = roleRepository.findByRoleName(Roles.ROLE_MANAGER)
.orElseGet(() -> {
Role newUserRole = new Role(Roles.ROLE_MANAGER);
return roleRepository.save(newUserRole);
});
Role roleEmployee = roleRepository.findByRoleName(Roles.ROLE_EMPLOYEE)
.orElseGet(() -> {
Role newUserRole = new Role(Roles.ROLE_EMPLOYEE);
return roleRepository.save(newUserRole);
});

Set<Role> adminRoles = Set.of(roleAdmin, roleManager, roleEmployee);
Set<Role> managerRoles = Set.of(roleManager, roleEmployee);
Set<Role> employeeRoles = Set.of(roleEmployee);

if (!userRepository.existsByEmail("admin@gmail.com")) {
User admin = new User("admin", "admin@gmail.com", passwordEncoder.encode("admin"));
userRepository.save(admin);
}
if (!userRepository.existsByEmail("manager@gmail.com")) {
User admin = new User("manager", "manager@gmail.com", passwordEncoder.encode("manager"));
userRepository.save(admin);
}
if (!userRepository.existsByEmail("user@gmail.com")) {
User admin = new User("user", "user@gmail.com", passwordEncoder.encode("user"));
userRepository.save(admin);
}

userRepository.findByEmail("admin@gmail.com").ifPresent(admin -> {
admin.setRoles(adminRoles);
userRepository.save(admin);
});
userRepository.findByEmail("manager@gmail.com").ifPresent(manager -> {
manager.setRoles(managerRoles);
userRepository.save(manager);
});
userRepository.findByEmail("user@gmail.com").ifPresent(user -> {
user.setRoles(employeeRoles);
userRepository.save(user);
});
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

public class AppConstants {
public static final String PAGE_NUMBER = "0";
public static final String PAGE_SIZE = "5";
public static final String PAGE_SIZE = "10";
public static final String DEFAULT_SORT_BY_CATEGORY = "id";
public static final String DEFAULT_SORT_BY_EXPENSES = "id";
public static final String DEFAULT_SORT_BY_INVOICE = "id";
public static final String SORT_DIR = "asc";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.team7.enterpriseexpensemanagementsystem.controller;

import com.team7.enterpriseexpensemanagementsystem.config.AppConstants;
import com.team7.enterpriseexpensemanagementsystem.dto.InvoiceDTO;
import com.team7.enterpriseexpensemanagementsystem.entity.AuditLog;
import com.team7.enterpriseexpensemanagementsystem.payload.response.PagedResponse;
import com.team7.enterpriseexpensemanagementsystem.service.AuditLogService;
import com.team7.enterpriseexpensemanagementsystem.service.InvoiceService;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;

@RestController
@RequestMapping("/api/admin")
@RequiredArgsConstructor
public class AdminController {
private final AuditLogService auditLogService;
private final InvoiceService invoiceService;

@GetMapping("/audit-log")
public ResponseEntity<PagedResponse<AuditLog>> getAuditLogs(
@RequestParam(name = "auditId", required = false) Long auditId,
@RequestParam(name = "entityName", required = false) String entityName,
@RequestParam(name = "entityId", required = false) Long entityId,
@RequestParam(name = "deviceIp", required = false) String deviceIp,
@RequestParam(name = "action", required = false) String action,
@RequestParam(name = "performedBy", required = false) String performedBy,
@RequestParam(name = "startDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam(name = "endDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
@RequestParam(name = "pageNumber", defaultValue = AppConstants.PAGE_NUMBER, required = false) Integer pageNumber,
@RequestParam(name = "pageSize", defaultValue = AppConstants.PAGE_SIZE, required = false) Integer pageSize,
@RequestParam(name = "sortBy", defaultValue = AppConstants.DEFAULT_SORT_BY_EXPENSES, required = false) String sortBy,
@RequestParam(name = "sortOrder", defaultValue = AppConstants.SORT_DIR, required = false) String sortOrder
){
return ResponseEntity.ok(auditLogService.findAll(auditId, entityName, entityId, deviceIp, action, performedBy,
startDate, endDate, pageNumber, pageSize, sortBy, sortOrder));
}

@GetMapping("/users/invoice")
public ResponseEntity<PagedResponse<InvoiceDTO>> getAllInvoices(
@RequestParam(name = "userId", required = false) Long userId,
@RequestParam(name = "email", required = false) String email,
@RequestParam(name = "invoiceNumber", required = false) String invoiceNumber,
@RequestParam(name = "status", required = false) String status,
@RequestParam(name = "pageNumber", defaultValue = AppConstants.PAGE_NUMBER, required = false) Integer pageNumber,
@RequestParam(name = "pageSize", defaultValue = AppConstants.PAGE_SIZE, required = false) Integer pageSize,
@RequestParam(name = "sortBy", defaultValue = AppConstants.DEFAULT_SORT_BY_INVOICE, required = false) String sortBy,
@RequestParam(name = "sortOrder", defaultValue = AppConstants.SORT_DIR, required = false) String sortOrder

) {
return ResponseEntity.ok(invoiceService
.findAllInvoices(userId, email, invoiceNumber,status, pageNumber, pageSize, sortBy, sortOrder));
}

@GetMapping("/invoice/mail")
public ResponseEntity<String> sendInvoice(@RequestParam(required = false) Long userId,
@RequestParam Long invoiceId) {
invoiceService.sendInvoice(userId, invoiceId);
return ResponseEntity.ok("Mail Sent!");
}

@GetMapping("/invoice/generate/{userId}")
public ResponseEntity<Void> generateInvoice(@PathVariable Long userId) {
invoiceService.generateInvoice(userId);
return ResponseEntity.noContent().build();
}

@DeleteMapping("/invoice/delete/{invoiceId}")
public ResponseEntity<String> deleteInvoice(@PathVariable Long invoiceId) {
invoiceService.deleteInvoice(invoiceId);
return ResponseEntity.ok("Invoice Deleted!");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.team7.enterpriseexpensemanagementsystem.controller;

import com.team7.enterpriseexpensemanagementsystem.dto.*;
import com.team7.enterpriseexpensemanagementsystem.service.ExpenseService;
import com.team7.enterpriseexpensemanagementsystem.utils.AuthUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.util.List;

@RestController
@RequestMapping("/api/analytics")
@RequiredArgsConstructor
public class AnalyticsController {
private final AuthUtils authUtils;
private final ExpenseService expenseService;

@GetMapping("/monthly")
public ResponseEntity<List<MonthlyExpenseDTO>> getMonthlyExpenses(
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate
) {
return ResponseEntity.ok(expenseService.getMonthlyAnalytics(authUtils.loggedInUser().getId(), startDate, endDate));
}

@GetMapping("/weekly")
public ResponseEntity<List<WeeklyExpenseDTO>> getMonthlyExpenses() {
return ResponseEntity.ok(expenseService.getWeeklyAnalytics());
}

@GetMapping("/category")
public ResponseEntity<List<CategoryExpenseDTO>> getCategoryExpenses(
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
return ResponseEntity.ok(expenseService.getCategoryAnalytics(authUtils.loggedInUser().getId(), startDate, endDate));
}

@GetMapping("/status")
public ResponseEntity<List<StatusExpenseDTO>> getStatusExpenses(
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
return ResponseEntity.ok(expenseService.getStatusAnalytics(authUtils.loggedInUser().getId(), startDate, endDate));
}
@GetMapping("/summary")
public ResponseEntity<SummaryDTO> getSummary() {
SummaryDTO summary = expenseService.getSummary(authUtils.loggedInUser().getId());
return ResponseEntity.ok(summary);
}
}
Loading