diff --git a/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/controllers/StatisticsController.java b/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/controllers/StatisticsController.java new file mode 100644 index 0000000..6732537 --- /dev/null +++ b/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/controllers/StatisticsController.java @@ -0,0 +1,10 @@ +package dev.mvvasilev.finances.controllers; + +import org.springframework.web.bind.annotation.RestController; + +@RestController("/statistics") +public class StatisticsController { + + + +} diff --git a/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/persistence/ProcessedTransactionCategoryRepository.java b/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/persistence/ProcessedTransactionCategoryRepository.java index abfa51b..065cbe0 100644 --- a/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/persistence/ProcessedTransactionCategoryRepository.java +++ b/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/persistence/ProcessedTransactionCategoryRepository.java @@ -3,8 +3,23 @@ package dev.mvvasilev.finances.persistence; import dev.mvvasilev.finances.entity.ProcessedTransaction; import dev.mvvasilev.finances.entity.ProcessedTransactionCategory; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.Collection; +import java.util.stream.Stream; + @Repository public interface ProcessedTransactionCategoryRepository extends JpaRepository { + @Query( + value=""" + DELETE FROM categories.processed_transaction_category + WHERE processed_transaction_id IN (:transactionIds) + """, + nativeQuery = true + ) + @Modifying + void deleteAllForTransactions(@Param("transactionIds") Collection transactionIds); } diff --git a/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/services/CategoryService.java b/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/services/CategoryService.java index b8fb1f8..689669e 100644 --- a/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/services/CategoryService.java +++ b/PersonalFinancesService/src/main/java/dev/mvvasilev/finances/services/CategoryService.java @@ -80,6 +80,8 @@ public class CategoryService { final var categorizations = categorizationRepository.fetchForUser(userId); final var transactions = processedTransactionRepository.fetchForUser(userId); + processedTransactionCategoryRepository.deleteAllForTransactions(transactions.stream().map(AbstractEntity::getId).toList()); + // Run each category's rules for all transactions in parallel to eachother final var futures = categorizations.stream() .collect(Collectors.groupingBy(Categorization::getCategoryId, HashMap::new, Collectors.toList())) diff --git a/frontend/src/app/pages/CategoriesPage.jsx b/frontend/src/app/pages/CategoriesPage.jsx index bb59ce8..8844097 100644 --- a/frontend/src/app/pages/CategoriesPage.jsx +++ b/frontend/src/app/pages/CategoriesPage.jsx @@ -11,14 +11,12 @@ import Grid from "@mui/material/Unstable_Grid2"; import Button from "@mui/material/Button"; import Divider from "@mui/material/Divider"; import { - Chip, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Modal, - Stack, TextField } from "@mui/material"; import Box from "@mui/material/Box"; @@ -188,39 +186,6 @@ export default function CategoriesPage() { }} showDelete /> - {/**/} - {/* {*/} - {/* categories.map(c => {*/} - {/* let variant = (selectedCategory?.id ?? -1) === c.id ? "filled" : "outlined";*/} - - {/* return (*/} - {/* {*/} - {/* setSelectedCategory({...c});*/} - {/* }}*/} - {/* onDelete={() => {*/} - {/* setSelectedCategory(c);*/} - {/* openConfirmDeleteCategoryModal(true);*/} - {/* }}*/} - {/* label={c.name}*/} - {/* deleteIcon={}*/} - {/* variant={variant}*/} - {/* />*/} - {/* );*/} - {/* })*/} - {/* }*/} - {/**/} diff --git a/frontend/src/components/categories/CategoriesBox.jsx b/frontend/src/components/categories/CategoriesBox.jsx index c576e9b..374da26 100644 --- a/frontend/src/components/categories/CategoriesBox.jsx +++ b/frontend/src/components/categories/CategoriesBox.jsx @@ -12,6 +12,8 @@ export default function CategoriesBox({ minHeight: minHeight = "100px", maxHeight: maxHeight = "250px", }) { + let areChipsDeletable = onCategoryDelete !== undefined; + return ( { let variant = selectable && (selected?.id ?? -1) === c.id ? "filled" : "outlined"; - let isDeletable = onCategoryDelete !== undefined; return ( <> { - isDeletable && + areChipsDeletable && onCategorySelect(e, c)} @@ -44,7 +45,7 @@ export default function CategoriesBox({ /> } { - !isDeletable && + !areChipsDeletable && onCategorySelect(e, c)} diff --git a/frontend/src/components/statements/VisNetwork.jsx b/frontend/src/components/statements/VisNetwork.jsx deleted file mode 100644 index c4b5025..0000000 --- a/frontend/src/components/statements/VisNetwork.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import {useRef, useEffect, useState} from "react"; -import { Network } from "vis-network"; - -export default function VisNetwork({ nodes: nodes = [], edges: edges = [], backgroundColor: backgroundColor = "#ffffff", options: options = {} }) { - const visJsRef = useRef(null); - const [network, setNetwork] = useState(); - - useEffect(() => { - const network = visJsRef.current && new Network(visJsRef.current, { nodes, edges }, options); - - network.on("beforeDrawing", function(ctx) { - // save current translate/zoom - ctx.save(); - - // reset transform to identity - ctx.setTransform(1, 0, 0, 1, 0, 0); - - ctx.fillStyle = backgroundColor; - - ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height) - - // restore old transform - ctx.restore(); - }) - - }, [visJsRef, backgroundColor, edges, nodes, options]); - - return
; -} \ No newline at end of file