diff --git a/src/main/java/com/example/demo/app/domain/model/TransactionModel.java b/src/main/java/com/example/demo/app/domain/model/TransactionModel.java index d985844..dc01b88 100644 --- a/src/main/java/com/example/demo/app/domain/model/TransactionModel.java +++ b/src/main/java/com/example/demo/app/domain/model/TransactionModel.java @@ -1,6 +1,9 @@ package com.example.demo.app.domain.model; import java.time.LocalDate; +import java.util.List; + +import com.example.demo.app.infra.entity.TransactionEntity; import lombok.AllArgsConstructor; import lombok.Getter; @@ -19,4 +22,17 @@ public class TransactionModel { private LocalDate transactionDate; + public static TransactionModel convertFrom(TransactionEntity transactionEntity) { + return new TransactionModel( + transactionEntity.getTransactionId(), + transactionEntity.getUserEntity().getUserId(), + transactionEntity.getCategoryEntity().getCategoryId(), + transactionEntity.getAmount(), + transactionEntity.getTransactionDate()); + } + + public static List convertFrom(List transactionEntityList) { + return transactionEntityList.stream().map(TransactionModel::convertFrom).toList(); + } + } \ No newline at end of file diff --git a/src/main/java/com/example/demo/app/domain/service/TransactionService.java b/src/main/java/com/example/demo/app/domain/service/TransactionService.java index bcdf8ff..86b85d5 100644 --- a/src/main/java/com/example/demo/app/domain/service/TransactionService.java +++ b/src/main/java/com/example/demo/app/domain/service/TransactionService.java @@ -1,5 +1,19 @@ package com.example.demo.app.domain.service; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + +import com.example.demo.app.domain.model.TransactionModel; + public interface TransactionService { + public Map> findAllByDate(LocalDate startDate, LocalDate endDate, Long userId); + + public List findByUserIdAndDate(LocalDate todayDate, Long userId); + + public int findTotalIncome(LocalDate startDate, LocalDate endDate, Long userId); + + public int findTotalexpense(LocalDate startDate, LocalDate endDate, Long userId); + } diff --git a/src/main/java/com/example/demo/app/domain/service/impl/TransactionServiceImpl.java b/src/main/java/com/example/demo/app/domain/service/impl/TransactionServiceImpl.java index 3484d9e..771d267 100644 --- a/src/main/java/com/example/demo/app/domain/service/impl/TransactionServiceImpl.java +++ b/src/main/java/com/example/demo/app/domain/service/impl/TransactionServiceImpl.java @@ -1,10 +1,55 @@ package com.example.demo.app.domain.service.impl; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import org.springframework.stereotype.Service; +import com.example.demo.app.domain.model.TransactionModel; import com.example.demo.app.domain.service.TransactionService; +import com.example.demo.app.infra.entity.TransactionEntity; +import com.example.demo.app.infra.repository.TransactionRepository; + +import lombok.RequiredArgsConstructor; @Service -public class TransactionServiceImpl implements TransactionService{ +@RequiredArgsConstructor +public class TransactionServiceImpl implements TransactionService { + + private final TransactionRepository transactionRepository; + + public Map> findAllByDate(LocalDate startDate, LocalDate endDate, Long userId) { + + List transactionEntityList = transactionRepository.findAllByDateAndUserId(startDate, endDate, + userId); + + List transactionModelList = TransactionModel + .convertFrom(transactionEntityList); + + Map> transactionModelMap = transactionModelList.stream() + .collect(Collectors.groupingBy(TransactionModel::getTransactionDate)); + + return transactionModelMap; + + } + + public int findTotalIncome(LocalDate startDate, LocalDate endDate, Long userId) { + + return transactionRepository.findTotalIncome(startDate, endDate, userId); + + } + public int findTotalexpense(LocalDate startDate, LocalDate endDate, Long userId) { + + return transactionRepository.findTotalIncome(startDate, endDate, userId); + + } + + public List findByUserIdAndDate(LocalDate todayDate, Long userId) { + + return TransactionModel.convertFrom(transactionRepository.findByUserIdAndDate(todayDate, userId)); + + } } diff --git a/src/main/java/com/example/demo/app/infra/entity/UserEntity.java b/src/main/java/com/example/demo/app/infra/entity/UserEntity.java index ef70930..a6797ee 100644 --- a/src/main/java/com/example/demo/app/infra/entity/UserEntity.java +++ b/src/main/java/com/example/demo/app/infra/entity/UserEntity.java @@ -29,7 +29,7 @@ public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id") - private Integer userId; + private Long userId; @Column(name = "user_name", nullable = false) private String userName; diff --git a/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java b/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java index b4c99f1..242ccdb 100644 --- a/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java +++ b/src/main/java/com/example/demo/app/infra/repository/AllocationRepository.java @@ -6,4 +6,5 @@ import com.example.demo.app.infra.entity.AllocationEntity; public interface AllocationRepository extends JpaRepository{ + } diff --git a/src/main/java/com/example/demo/app/infra/repository/TransactionRepository.java b/src/main/java/com/example/demo/app/infra/repository/TransactionRepository.java index 4d768bc..933aa4f 100644 --- a/src/main/java/com/example/demo/app/infra/repository/TransactionRepository.java +++ b/src/main/java/com/example/demo/app/infra/repository/TransactionRepository.java @@ -1,9 +1,25 @@ package com.example.demo.app.infra.repository; +import java.time.LocalDate; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import com.example.demo.app.infra.entity.TransactionEntity; -public interface TransactionRepository extends JpaRepository{ +public interface TransactionRepository extends JpaRepository { + + @Query("select t from TransactionEntity t where t.userEntity.userId = :userId and t.transactionDate = :transactionDate") + public List findByUserIdAndDate(LocalDate todayDate, Long userId); + + @Query("select t from TransactionEntity t where (t.transactionDate between :startDate and :endDate) and (t.userId = :userId) order by t.transactionDate asc") + public List findAllByDateAndUserId(LocalDate startDate, LocalDate endDate, Long userId); + + @Query("select sum(t.amount) from TransactionEntity t inner join CategoryEntity c on t.categoryId = c.categoryId where (t.userId = :userId and t.transactionDate between :startDate and :endDate) and c.transactionType = 0") + public Integer findTotalExpense(LocalDate startDate, LocalDate endDate, Long userId); + + @Query("select sum(t.amount) from TransactionEntity t inner join CategoryEntity c on t.categoryId = c.categoryId where (t.userId = :userId and t.transactionDate between :startDate and :endDate) and c.transactionType = 1") + public Integer findTotalIncome(LocalDate startDate, LocalDate endDate, Long userId); } diff --git a/src/main/java/com/example/demo/app/presentation/controller/TransactionController.java b/src/main/java/com/example/demo/app/presentation/controller/TransactionController.java index fca93d3..5e51565 100644 --- a/src/main/java/com/example/demo/app/presentation/controller/TransactionController.java +++ b/src/main/java/com/example/demo/app/presentation/controller/TransactionController.java @@ -1,17 +1,83 @@ package com.example.demo.app.presentation.controller; -import org.springframework.stereotype.Controller; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import jakarta.servlet.http.HttpSession; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.example.demo.app.domain.service.CategoryService; import com.example.demo.app.domain.service.TransactionService; +import com.example.demo.app.presentation.form.CategoryForm; +import com.example.demo.app.presentation.form.TransactionForm; import lombok.RequiredArgsConstructor; @Controller @RequiredArgsConstructor public class TransactionController { - + private final TransactionService transactionService; - - - + private final CategoryService categoryService; + + // 一覧画面 + + @GetMapping("/transaction/list") + public String transactionList(@RequestParam LocalDate startDate, @RequestParam LocalDate endDate, Model model, + HttpSession session) { + + LoginUser loginUser = (LoginUser) session.getAttribute("loginUser"); + + Map> transactionFormMap = new HashMap<>(); + + + transactionService.findAll(startDate, endDate, loginUser.getUserId).forEach((date, list) -> { + List transactionFormList = list.stream().map(transaction -> { + TransactionForm transactionForm = TransactionForm.convertFrom( + transaction, + CategoryForm.convertFrom(categoryService.findOne(transaction.getCategoryId())).getCategoryName(), + transactionService.findTotalexpense(startDate, endDate, loginUser.getUserId), + transactionService.findTotalIncome(startDate, endDate, loginUser.getUserId), + CategoryForm.convertFrom(categoryService.findOne(transaction.getCategoryId())).getTransactionType() + ); + return transactionForm; + }).collect(Collectors.toList()); + transactionFormMap.put(date, transactionFormList); + }); + + model.addAttribute("transactionFormMap", transactionFormMap); + + return "transactionList"; + } + + // 詳細画面 + @GetMapping() + public String findOne(@RequestParam LocalDate todayDate, Model model, HttpSession session) { + + LoginUser loginUser = (LoginUser) session.getAttribute("loginUser"); + + List transactionFormList = transactionService.findByUserIdAndDate(todayDate, ((LoginUser)session.getAttribute("loginUser")).getUserId).stream().map(transaction -> { + TransactionForm transactionForm = TransactionForm.convertFrom( + transaction, + CategoryForm.convertFrom(categoryService.findOne(transaction.getCategoryId())).getCategoryName(), + transactionService.findTotalexpense(todayDate, todayDate, loginUser.getUserId), + transactionService.findTotalIncome(todayDate, todayDate, loginUser.getUserId), + CategoryForm.convertFrom(categoryService.findOne(transaction.getCategoryId())).getTransactionType() + ); + return transactionForm; + }).collect(Collectors.toList()); + + + model.addAttribute("transactionFormList", transactionFormList); + + return ""; + } + } diff --git a/src/main/java/com/example/demo/app/presentation/form/TransactionForm.java b/src/main/java/com/example/demo/app/presentation/form/TransactionForm.java index 0f571c7..d43c944 100644 --- a/src/main/java/com/example/demo/app/presentation/form/TransactionForm.java +++ b/src/main/java/com/example/demo/app/presentation/form/TransactionForm.java @@ -23,18 +23,39 @@ public class TransactionForm { private Integer amount; private LocalDate transactionDate; - - public static TransactionForm convertFrom(TransactionModel transactionModel) { + + private String categoryName; + + private Integer income; + + private Integer expense; + + private Integer transactionType; + + public static TransactionForm convertFrom(TransactionModel transactionModel, String categoryName, int income, int expense, int transactionType) { return new TransactionForm( transactionModel.getTransactionId(), transactionModel.getUserId(), transactionModel.getCategoryId(), transactionModel.getAmount(), - transactionModel.getTransactionDate()); + transactionModel.getTransactionDate(), + categoryName, + income, + expense, + transactionType); } - public static List convertFrom(List transactionModelList) { - return transactionModelList.stream().map(TransactionForm::convertFrom).toList(); + public static List convertFrom(List transactionModelList, String categoryName, int income, int expense, int transactionType ) { + return transactionModelList.stream().map(transactionModel -> TransactionForm.convertFrom(transactionModel, categoryName, income, expense, transactionType)).toList(); } + public static TransactionModel convertTo(TransactionForm transactionForm) { + return new TransactionModel( + transactionForm.getTransactionId(), + transactionForm.getUserId(), + transactionForm.getCategoryId(), + transactionForm.getAmount(), + transactionForm.getTransactionDate()); + } + }