From 4dec239ca56a7e01f37e07a8f5a0aff9b600fb89 Mon Sep 17 00:00:00 2001 From: Pradip Mudi Date: Sat, 28 Oct 2023 19:38:55 +0530 Subject: [PATCH] added sorting by price and month in descending order, renamed and added categories, added other logic fixes --- .idea/misc.xml | 2 +- build.gradle | 1 + .../java/com/expensys/config/CorsConfig.java | 23 ++ .../expensys/constant/CategoryMappings.java | 27 +- .../ExpenseManagementController.java | 26 +- .../expensys/controller/ReportController.java | 32 +++ .../com/expensys/entity/ExpenseEntity.java | 2 +- .../ExpenseToReportConvertor.java | 25 +- .../helper/WordSimilarityCalculator.java | 77 ++++++ .../com/expensys/model/enums/Category.java | 6 +- .../expensys/model/request/NewExpense.java | 77 ++++++ .../com/expensys/service/ExpenseService.java | 37 +-- .../service/MainCategoryReportService.java | 2 +- .../com/expensys/service/ReportService.java | 5 +- .../service/SubCategoryReportService.java | 4 +- .../main/ExpenseManagementService.java | 7 +- src/main/resources/ui/addExpense.html | 140 ++++++++++ src/main/resources/ui/index.html | 243 ++++++++++++++++++ 18 files changed, 679 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/expensys/config/CorsConfig.java create mode 100644 src/main/java/com/expensys/controller/ReportController.java rename src/main/java/com/expensys/{convertor => helper}/ExpenseToReportConvertor.java (83%) create mode 100644 src/main/java/com/expensys/helper/WordSimilarityCalculator.java create mode 100644 src/main/java/com/expensys/model/request/NewExpense.java create mode 100644 src/main/resources/ui/addExpense.html create mode 100644 src/main/resources/ui/index.html diff --git a/.idea/misc.xml b/.idea/misc.xml index d3f4acf..bbefa90 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + diff --git a/build.gradle b/build.gradle index 1a4ef9f..de0575e 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,7 @@ dependencies { implementation 'mysql:mysql-connector-java:8.0.27' testImplementation 'ch.qos.logback:logback-classic:1.4.11' implementation 'io.swagger.core.v3:swagger-annotations:2.2.14' + implementation 'org.apache.commons:commons-text:1.10.0' } tasks.named('test') { diff --git a/src/main/java/com/expensys/config/CorsConfig.java b/src/main/java/com/expensys/config/CorsConfig.java new file mode 100644 index 0000000..276b319 --- /dev/null +++ b/src/main/java/com/expensys/config/CorsConfig.java @@ -0,0 +1,23 @@ +package com.expensys.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; + +@Configuration +public class CorsConfig { + + @Bean + public CorsConfigurationSource corsConfigurationSource() { + CorsConfiguration configuration = new CorsConfiguration(); + configuration.addAllowedOrigin("http://localhost:"); // Specify your allowed origin(s) + configuration.addAllowedHeader("*"); + configuration.addAllowedMethod("*"); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", configuration); + return source; + } +} + diff --git a/src/main/java/com/expensys/constant/CategoryMappings.java b/src/main/java/com/expensys/constant/CategoryMappings.java index a1df40f..e71c795 100644 --- a/src/main/java/com/expensys/constant/CategoryMappings.java +++ b/src/main/java/com/expensys/constant/CategoryMappings.java @@ -2,13 +2,12 @@ import com.expensys.model.enums.Category; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.*; public class CategoryMappings { public static final Set MAIN_CATEGORIES; public static final Set SUB_CATEGORIES; + public static final Map SUB_TO_MAIN_CATEGORY_MAPPINGS; private CategoryMappings(){} @@ -22,14 +21,32 @@ private CategoryMappings(){} Set subCategories = new HashSet<>(); subCategories.add(Category.GROCERIES); - subCategories.add(Category.VEGETABLES_AND_FRUITS); + subCategories.add(Category.VEGETABLES_FRUITS_DAIRY_AND_MEAT); subCategories.add(Category.MEDICAL); subCategories.add(Category.OUTSIDE_FOOD); subCategories.add(Category.LOSE_OF_MONEY); - subCategories.add(Category.SALON); + subCategories.add(Category.SALON_AND_COSMETICS); subCategories.add(Category.TRANSPORT); subCategories.add(Category.SHOPPING); + subCategories.add(Category.ENTERTAINMENT); + subCategories.add(Category.RENT_AND_OTHER_BILLS); subCategories.add(Category.OTHERS); SUB_CATEGORIES = Collections.unmodifiableSet(subCategories); + + Map subToMainCategoryMappings = new HashMap<>(); + subToMainCategoryMappings.put(Category.GROCERIES, Category.ESSENTIAL); + subToMainCategoryMappings.put(Category.VEGETABLES_FRUITS_DAIRY_AND_MEAT, Category.ESSENTIAL); + subToMainCategoryMappings.put(Category.MEDICAL, Category.ESSENTIAL); + subToMainCategoryMappings.put(Category.SALON_AND_COSMETICS, Category.EXPENSE); + subToMainCategoryMappings.put(Category.TRANSPORT, Category.EXPENSE); + subToMainCategoryMappings.put(Category.SHOPPING, Category.EXPENSE); + subToMainCategoryMappings.put(Category.OUTSIDE_FOOD, Category.EXPENSE); + subToMainCategoryMappings.put(Category.LOSE_OF_MONEY, Category.LOSE_OF_MONEY); + subToMainCategoryMappings.put(Category.OTHERS, Category.EXPENSE); + subToMainCategoryMappings.put(Category.ESSENTIAL, Category.ESSENTIAL); + subToMainCategoryMappings.put(Category.EXPENSE, Category.EXPENSE); + subToMainCategoryMappings.put(Category.ENTERTAINMENT, Category.EXPENSE); + subToMainCategoryMappings.put(Category.RENT_AND_OTHER_BILLS, Category.EXPENSE); + SUB_TO_MAIN_CATEGORY_MAPPINGS = Collections.unmodifiableMap(subToMainCategoryMappings); } } diff --git a/src/main/java/com/expensys/controller/ExpenseManagementController.java b/src/main/java/com/expensys/controller/ExpenseManagementController.java index 201360b..1318ac0 100644 --- a/src/main/java/com/expensys/controller/ExpenseManagementController.java +++ b/src/main/java/com/expensys/controller/ExpenseManagementController.java @@ -1,34 +1,30 @@ package com.expensys.controller; -import com.expensys.model.request.ReportRequest; -import com.expensys.model.response.Report; +import com.expensys.model.request.NewExpense; import com.expensys.service.main.ExpenseManagementService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; +import org.springframework.web.bind.annotation.*; @RestController -@RequestMapping("/report") +@RequestMapping("/expense") public class ExpenseManagementController { Logger logger = LoggerFactory.getLogger(ExpenseManagementController.class); private final ExpenseManagementService expenseManagementService; + @Autowired public ExpenseManagementController(ExpenseManagementService expenseManagementService) { this.expenseManagementService = expenseManagementService; } - @GetMapping - public ResponseEntity> getReport(@ModelAttribute ReportRequest reportRequest){ - List reportList = expenseManagementService.getReport(reportRequest); - return new ResponseEntity<>(reportList, HttpStatus.OK); + @CrossOrigin + @PostMapping("/save") + public ResponseEntity saveExpense(@RequestBody NewExpense newExpense){ + logger.info("newExpense -> {}",newExpense); +// expenseManagementService.addExpense(newExpense); + return new ResponseEntity<>(expenseManagementService.addExpense(newExpense) ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR); } - - } diff --git a/src/main/java/com/expensys/controller/ReportController.java b/src/main/java/com/expensys/controller/ReportController.java new file mode 100644 index 0000000..77c010d --- /dev/null +++ b/src/main/java/com/expensys/controller/ReportController.java @@ -0,0 +1,32 @@ +package com.expensys.controller; + +import com.expensys.model.request.ReportRequest; +import com.expensys.model.response.Report; +import com.expensys.service.main.ExpenseManagementService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/report") +public class ReportController { + Logger logger = LoggerFactory.getLogger(ReportController.class); + private final ExpenseManagementService expenseManagementService; + + public ReportController(ExpenseManagementService expenseManagementService) { + this.expenseManagementService = expenseManagementService; + } + + @CrossOrigin + @GetMapping + public ResponseEntity> getReport(@ModelAttribute ReportRequest reportRequest){ + List reportList = expenseManagementService.getReport(reportRequest); + return new ResponseEntity<>(reportList, HttpStatus.OK); + } + + +} diff --git a/src/main/java/com/expensys/entity/ExpenseEntity.java b/src/main/java/com/expensys/entity/ExpenseEntity.java index a8c09f8..7e19ce2 100644 --- a/src/main/java/com/expensys/entity/ExpenseEntity.java +++ b/src/main/java/com/expensys/entity/ExpenseEntity.java @@ -8,7 +8,7 @@ @Table(name = "expenses") public class ExpenseEntity { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Long id; diff --git a/src/main/java/com/expensys/convertor/ExpenseToReportConvertor.java b/src/main/java/com/expensys/helper/ExpenseToReportConvertor.java similarity index 83% rename from src/main/java/com/expensys/convertor/ExpenseToReportConvertor.java rename to src/main/java/com/expensys/helper/ExpenseToReportConvertor.java index e44bdca..4683a01 100644 --- a/src/main/java/com/expensys/convertor/ExpenseToReportConvertor.java +++ b/src/main/java/com/expensys/helper/ExpenseToReportConvertor.java @@ -1,4 +1,4 @@ -package com.expensys.convertor; +package com.expensys.helper; import com.expensys.model.Expense; @@ -12,6 +12,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.expensys.constant.CategoryMappings.SUB_TO_MAIN_CATEGORY_MAPPINGS; + public class ExpenseToReportConvertor { private ExpenseToReportConvertor() { // Initialization code @@ -31,7 +33,8 @@ private HashMap> prepareReportInfoListFromExpenseListByM ReportInfo reportInfo = ReportInfo.builder() .mainCategory(expense.getCategory()) - .subCategory(reportRequest.getCategory().equals(Category.MAIN) ? expense.getCategory().getCat() : expense.getSubCategory()) +// .subCategory(reportRequest.getCategory().equals(Category.MAIN) ? expense.getCategory().getCat() : expense.getSubCategory()) + .subCategory(SUB_TO_MAIN_CATEGORY_MAPPINGS.get(expense.getCategory()).toString()) .spent(expense.getSpent()) .user(SpentBy.ALL.equals(spentBy) ? spentBy.toString() : expense.getSpentBy()) .build(); @@ -53,12 +56,16 @@ private HashMap> prepareReportInfoListFromExpenseListByM private List prepareReportInfoFromReportInfoByMonth(HashMap> monthReportInfoMap, ReportRequest reportRequest) { List reportList = new ArrayList<>(); - for (Map.Entry> monthEntry : monthReportInfoMap.entrySet()) { + + for (Map.Entry> monthEntry : monthReportInfoMap.entrySet()) { Month month = monthEntry.getKey(); Report currentReport = new Report(month, processReportInfoList(monthReportInfoMap.get(month), reportRequest)); - reportList.add(currentReport); } + + // Sort the reportList based on the month's integer values in descending order + Collections.sort(reportList, (r1, r2) -> Integer.compare(Integer.valueOf(r2.getMonth().getMonthValue()), Integer.valueOf(r1.getMonth().getMonthValue()))); + return reportList; } @@ -78,10 +85,11 @@ public List processReportInfoList(List reportInfoList, R return spentBycategory.entrySet().stream() .map(entry -> ReportInfo.builder() .mainCategory(entry.getKey()) - .subCategory(entry.getKey().getCat()) + .subCategory(SUB_TO_MAIN_CATEGORY_MAPPINGS.get(entry.getKey()).toString()) .user(SpentBy.ALL.getSpentBy()) .spent(entry.getValue()) .build()) + .sorted(Comparator.comparing(ReportInfo::getSpent).reversed()) .toList(); } else if (SpentBy.USER.equals(reportRequest.getSpentBy())) { // Aggregate spent amount by subCategory and spentBy user, ignoring case @@ -95,7 +103,7 @@ public List processReportInfoList(List reportInfoList, R // Create a new list of ReportInfo objects based on Task 2, retaining the mainCategory return categoryAndSpentByUser.entrySet().stream() .flatMap(entry -> { - String category = entry.getKey().getCat(); + Category category = entry.getKey(); // Extract the mainCategory for the subCategory Category mainCategory = filteredList.stream() .filter(reportInfo -> category.equals(reportInfo.getSubCategory())) @@ -105,13 +113,14 @@ public List processReportInfoList(List reportInfoList, R // Create ReportInfo objects for each user and subCategory combination return entry.getValue().entrySet().stream() .map(userEntry -> ReportInfo.builder() - .mainCategory(mainCategory) - .subCategory(category) + .mainCategory(category) + .subCategory(SUB_TO_MAIN_CATEGORY_MAPPINGS.get(category).toString()) .spent(userEntry.getValue()) .user(userEntry.getKey().toUpperCase()) .build()); }) .sorted(Comparator.comparing(ReportInfo::getUser)) // Sort by user field + .sorted(Comparator.comparing(ReportInfo::getSpent).reversed()) .toList(); } diff --git a/src/main/java/com/expensys/helper/WordSimilarityCalculator.java b/src/main/java/com/expensys/helper/WordSimilarityCalculator.java new file mode 100644 index 0000000..efdfac8 --- /dev/null +++ b/src/main/java/com/expensys/helper/WordSimilarityCalculator.java @@ -0,0 +1,77 @@ +package com.expensys.helper; + +import org.apache.commons.text.similarity.CosineSimilarity; +import java.util.*; + +public class WordSimilarityCalculator { + private int wordLength; + + public WordSimilarityCalculator(int wordLength) { + this.wordLength = wordLength; + } + + public static void main(String[] args) { +// System.out.println(calculateSimilarity("vegetable & fruits", "vegetables and fruits")); + System.out.println(calculateSimilarity("fruit", "fruits")); + } + + public static double calculateSimilarity(String word1, String word2) { + // Tokenization + List word1List = tokenizeWord(word1); + List word2List = tokenizeWord(word2); + + // Remove stopwords + List word1Set = removeStopWords(word1List); + List word2Set = removeStopWords(word2List); + + // Convert the lists to maps with word frequencies + Map word1Map = createWordFrequencyMap(word1Set); + Map word2Map = createWordFrequencyMap(word2Set); + + // Calculate cosine similarity + CosineSimilarity cosineSimilarity = new CosineSimilarity(); + double similarity = cosineSimilarity.cosineSimilarity(word1Map, word2Map); + + return similarity; + } + + private static List tokenizeWord(String word) { + List tokenList = new ArrayList<>(); + String[] tokens = word.split("\\s+"); // Split by whitespace + for (String token : tokens) { + tokenList.add(token.toLowerCase()); + } + return tokenList; + } + + private static List removeStopWords(List tokens) { + List cleanedTokens = new ArrayList<>(); + Set stopWords = getStopWords(); // Define your set of stopwords + + for (String token : tokens) { + if (!stopWords.contains(token)) { + cleanedTokens.add(token); + } + } + + return cleanedTokens; + } + + private static Map createWordFrequencyMap(List words) { + Map wordFrequencyMap = new HashMap<>(); + for (String word : words) { + wordFrequencyMap.put(word, wordFrequencyMap.getOrDefault(word, 0) + 1); + } + return wordFrequencyMap; + } + + private static Set getStopWords() { + // Define your set of English stopwords here + Set stopWords = new HashSet<>(); + stopWords.add("the"); + stopWords.add("and"); + stopWords.add("&"); + // Add more stopwords as needed + return stopWords; + } +} diff --git a/src/main/java/com/expensys/model/enums/Category.java b/src/main/java/com/expensys/model/enums/Category.java index 100aa19..6cc7348 100644 --- a/src/main/java/com/expensys/model/enums/Category.java +++ b/src/main/java/com/expensys/model/enums/Category.java @@ -6,13 +6,15 @@ public enum Category { OUTSIDE_FOOD("outside food"), MEDICAL("medical"), SHOPPING("shopping"), - SALON("salon"), + SALON_AND_COSMETICS("salon and cosmetics"), TRANSPORT("transport"), GROCERIES("groceries"), - VEGETABLES_AND_FRUITS("vegetables and fruits"), + VEGETABLES_FRUITS_DAIRY_AND_MEAT("vegetables, fruits, dairy and meat"), LOSE_OF_MONEY("lose of money"), ESSENTIAL("essential"), EXPENSE("expense"), + ENTERTAINMENT("entertainment"), + RENT_AND_OTHER_BILLS("rent and other bills"), OTHERS("others"); private String cat; diff --git a/src/main/java/com/expensys/model/request/NewExpense.java b/src/main/java/com/expensys/model/request/NewExpense.java new file mode 100644 index 0000000..b9490d6 --- /dev/null +++ b/src/main/java/com/expensys/model/request/NewExpense.java @@ -0,0 +1,77 @@ +package com.expensys.model.request; + +import com.expensys.model.enums.Category; + +import java.time.LocalDate; + +public class NewExpense { + LocalDate date; + String item; + Category category; + Double spent; + String user; + + public NewExpense() { + } + + public NewExpense(LocalDate date, String item, Category category, Double spent, String user) { + this.date = date; + this.item = item; + this.category = category; + this.spent = spent; + this.user = user; + } + + public LocalDate getDate() { + return date; + } + + public Category getCategory() { + return category; + } + + + public Double getSpent() { + return spent; + } + + public String getUser() { + return user; + } + + public String getItem() { + return item; + } + + public void setItem(String item) { + this.item = item; + } + + public void setDate(LocalDate date) { + this.date = date; + } + + public void setCategory(Category category) { + this.category = category; + } + + + public void setSpent(Double spent) { + this.spent = spent; + } + + public void setUser(String user) { + this.user = user; + } + + @Override + public String toString() { + return "NewExpense{" + + "date=" + date + + ", item='" + item + '\'' + + ", category=" + category + + ", spent=" + spent + + ", user='" + user + '\'' + + '}'; + } +} diff --git a/src/main/java/com/expensys/service/ExpenseService.java b/src/main/java/com/expensys/service/ExpenseService.java index d5004f7..8421529 100644 --- a/src/main/java/com/expensys/service/ExpenseService.java +++ b/src/main/java/com/expensys/service/ExpenseService.java @@ -4,6 +4,8 @@ import com.expensys.model.Expense; import com.expensys.model.enums.Category; import com.expensys.model.enums.Month; +import com.expensys.model.request.NewExpense; +import com.expensys.model.request.ReportRequest; import com.expensys.repository.ExpenseRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,6 +17,8 @@ import java.util.ArrayList; import java.util.List; +import static com.expensys.constant.CategoryMappings.SUB_TO_MAIN_CATEGORY_MAPPINGS; + @Service public class ExpenseService { private static final Logger logger = LoggerFactory.getLogger(ExpenseService.class); @@ -27,7 +31,7 @@ public ExpenseService(CategoryMappingService categoryMappingService, ExpenseRepo this.expenseRepository = expenseRepository; } - public List getExpensesByMonth(Month month) { + public List getExpensesByMonth(Month month, ReportRequest reportRequest) { int year = LocalDate.now().getYear(); // You can use the current year or specify a year as needed DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -37,42 +41,43 @@ public List getExpensesByMonth(Month month) { // Create the LocalDate for the end of the month LocalDate dateEnd = LocalDate.parse(dateStart.plusMonths(1).minusDays(1).format(formatter)); List expenseEntityList = expenseRepository.findByDateBetween(dateStart, dateEnd); - logger.info("expenseEntityList.size() -> {} ",expenseEntityList.size()); - return prepareExpenseListFromExpenseEntityList(expenseEntityList); + return prepareExpenseListFromExpenseEntityList(expenseEntityList, reportRequest); } - private List prepareExpenseListFromExpenseEntityList(List expenseEntityList) { + private List prepareExpenseListFromExpenseEntityList(List expenseEntityList, ReportRequest reportRequest) { List expenseList = new ArrayList<>(); for (ExpenseEntity expenseEntity : expenseEntityList) { - Expense expense = new Expense(Month.valueOf(String.valueOf(expenseEntity.getDate().getMonth())), expenseEntity.getItem(), Category.valueOf(expenseEntity.getCategory().toUpperCase().replaceAll("\\s","_")), expenseEntity.getSpent(), expenseEntity.getSpentBy()); + Category expenseCategory = Category.valueOf(expenseEntity.getCategory().toUpperCase().replaceAll("\\s", "_")); + Category category = Category.MAIN.equals(reportRequest.getCategory()) ? SUB_TO_MAIN_CATEGORY_MAPPINGS.get(expenseCategory) : expenseCategory; + Expense expense = new Expense(Month.valueOf(String.valueOf(expenseEntity.getDate().getMonth())), expenseEntity.getItem(), category, expenseEntity.getSpent(), expenseEntity.getSpentBy()); expenseList.add(expense); } return expenseList; } List getAllExpenses() { - return prepareExpenseListFromExpenseEntityList(expenseRepository.findAll()); + return prepareExpenseListFromExpenseEntityList(expenseRepository.findAll(), null); } - public void saveExpense(LocalDate date, String item, Category category, Double spent, String spentBy) { - expenseRepository.save(prepareExpenseEntity(date, item, category, spent, spentBy)); + public void saveExpense(NewExpense newExpense) { + expenseRepository.save(prepareExpenseEntity(newExpense)); } - private ExpenseEntity prepareExpenseEntity(LocalDate date, String item, Category category, Double spent, String spentBy) { + private ExpenseEntity prepareExpenseEntity(NewExpense newExpense) { ExpenseEntity expenseEntity = new ExpenseEntity(); - expenseEntity.setDate(date); - expenseEntity.setItem(item); - expenseEntity.setCategory(category.getCat()); - expenseEntity.setSpent(spent); - expenseEntity.setSpentBy(spentBy); + expenseEntity.setDate(newExpense.getDate()); + expenseEntity.setItem(newExpense.getItem()); + expenseEntity.setCategory(newExpense.getCategory().toString()); + expenseEntity.setSpent(newExpense.getSpent()); + expenseEntity.setSpentBy(newExpense.getUser()); return expenseEntity; } - public List getAllExpensesByYear(int year) { + public List getAllExpensesByYear(int year, ReportRequest reportRequest) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate yearStart = LocalDate.parse(LocalDate.of(year, 1, 1).format(formatter)); // January 1st of the specified year LocalDate yearEnd = LocalDate.parse(LocalDate.of(year, 12, 31).format(formatter)); // December 31st of the specified year List expenseEntityList = expenseRepository.findByDateBetween(yearStart, yearEnd); - return prepareExpenseListFromExpenseEntityList(expenseEntityList); + return prepareExpenseListFromExpenseEntityList(expenseEntityList, reportRequest); } } diff --git a/src/main/java/com/expensys/service/MainCategoryReportService.java b/src/main/java/com/expensys/service/MainCategoryReportService.java index a0043e0..58a253f 100644 --- a/src/main/java/com/expensys/service/MainCategoryReportService.java +++ b/src/main/java/com/expensys/service/MainCategoryReportService.java @@ -1,6 +1,6 @@ package com.expensys.service; -import com.expensys.convertor.ExpenseToReportConvertor; +import com.expensys.helper.ExpenseToReportConvertor; import com.expensys.model.Expense; import com.expensys.model.request.ReportRequest; import com.expensys.model.response.Report; diff --git a/src/main/java/com/expensys/service/ReportService.java b/src/main/java/com/expensys/service/ReportService.java index a574e2d..f20df27 100644 --- a/src/main/java/com/expensys/service/ReportService.java +++ b/src/main/java/com/expensys/service/ReportService.java @@ -30,12 +30,11 @@ public ReportService(MainCategoryReportService mainCategoryReportService, SubCat public List getReport(ReportRequest reportRequest) { List expenseList; if (Month.ALL.equals(reportRequest.getMonth())) { - expenseList = expenseService.getAllExpensesByYear(reportRequest.getYear() == 0 ? LocalDate.now().getYear() : reportRequest.getYear()); + expenseList = expenseService.getAllExpensesByYear(reportRequest.getYear() == 0 ? LocalDate.now().getYear() : reportRequest.getYear(), reportRequest); } else { // this call generally aims to get the specific month data of the current year - expenseList = expenseService.getExpensesByMonth(reportRequest.getMonth()); + expenseList = expenseService.getExpensesByMonth(reportRequest.getMonth(), reportRequest); } - return prepareReportFromExpenses(reportRequest, expenseList); } diff --git a/src/main/java/com/expensys/service/SubCategoryReportService.java b/src/main/java/com/expensys/service/SubCategoryReportService.java index 050cfd0..4793bbd 100644 --- a/src/main/java/com/expensys/service/SubCategoryReportService.java +++ b/src/main/java/com/expensys/service/SubCategoryReportService.java @@ -1,6 +1,6 @@ package com.expensys.service; -import com.expensys.convertor.ExpenseToReportConvertor; +import com.expensys.helper.ExpenseToReportConvertor; import com.expensys.model.Expense; import com.expensys.model.request.ReportRequest; import com.expensys.model.response.Report; @@ -26,6 +26,8 @@ public SubCategoryReportService(CategoryMappingRepository categoryMappingReposit @Override public List prepareReport(ReportRequest reportRequest, List expenseList) { +// for (Expense expense : expenseList) +// logger.info("expense -> {} ", expense); expenseList = expenseList.stream().filter(expense -> SUB_CATEGORIES.contains(expense.getCategory())).toList(); return ExpenseToReportConvertor.getInstance().prepareReportListFromExpenseList(expenseList, reportRequest); } diff --git a/src/main/java/com/expensys/service/main/ExpenseManagementService.java b/src/main/java/com/expensys/service/main/ExpenseManagementService.java index f2aad3f..66ca810 100644 --- a/src/main/java/com/expensys/service/main/ExpenseManagementService.java +++ b/src/main/java/com/expensys/service/main/ExpenseManagementService.java @@ -1,6 +1,6 @@ package com.expensys.service.main; -import com.expensys.model.enums.Category; +import com.expensys.model.request.NewExpense; import com.expensys.model.request.ReportRequest; import com.expensys.model.response.Report; import com.expensys.service.ExpenseService; @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.time.LocalDate; import java.util.List; @Service @@ -29,9 +28,9 @@ public List getReport(ReportRequest reportRequest) { return reportService.getReport(reportRequest); } - boolean addExpense(LocalDate date, String item, Category category, Double spent, String spentBy) { + public boolean addExpense(NewExpense newExpense) { try { - expenseService.saveExpense(date, item, category, spent, spentBy); + expenseService.saveExpense(newExpense); }catch (Exception e){ return false; } diff --git a/src/main/resources/ui/addExpense.html b/src/main/resources/ui/addExpense.html new file mode 100644 index 0000000..6110acf --- /dev/null +++ b/src/main/resources/ui/addExpense.html @@ -0,0 +1,140 @@ + + + + Expense Entry Form + + + +
+

Add Expense

+
+ + + + + + + + + + + + + + + + +
+
+ + + diff --git a/src/main/resources/ui/index.html b/src/main/resources/ui/index.html new file mode 100644 index 0000000..b9f65f5 --- /dev/null +++ b/src/main/resources/ui/index.html @@ -0,0 +1,243 @@ + + + + + Monthly Spending Report + + + + + +
+

Monthly Spending Report

+
+ +
+ + + + + + + + +
+ +
+ +
+ + + + \ No newline at end of file