diff --git a/pom.xml b/pom.xml index bc89875..97e8c14 100644 --- a/pom.xml +++ b/pom.xml @@ -21,20 +21,20 @@ org.springframework.boot spring-boot-starter-data-jpa + + org.springframework.boot + spring-boot-starter-validation + 2.7.1 + com.auth0 java-jwt 4.0.0 - javax.validation - validation-api - 2.0.1.Final - - - org.hibernate.validator - hibernate-validator - 7.0.5.Final + org.liquibase + liquibase-core + 4.16.0 org.springframework.boot @@ -54,6 +54,10 @@ javax.servlet-api provided + + org.codehaus.groovy + groovy + io.projectreactor reactor-test @@ -159,7 +163,15 @@ - + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + - \ No newline at end of file + diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/CorsConfiguration.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/CorsConfiguration.java new file mode 100644 index 0000000..477a4c7 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/CorsConfiguration.java @@ -0,0 +1,37 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +class CorsConfiguration { + + @Value("${management.endpoints.web.cors.mapping-pattern}") + private String mappingPattern; + + @Value("${management.endpoints.web.cors.allowed-methods}") + private String allowedMethods; + + @Value("${management.endpoints.web.cors.allowed-headers}") + private String allowedHeaders; + + @Value("${management.endpoints.web.cors.allowed-origins}") + private String allowedOrigins; + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://localhost:3000") + .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH") + .allowedHeaders("*") + .allowCredentials(true); + } + }; + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/InfinityFinanceApiApplication.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/InfinityFinanceApiApplication.java index 6c42943..d9d7610 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/InfinityFinanceApiApplication.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/InfinityFinanceApiApplication.java @@ -1,12 +1,16 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleType; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Configuration; +import java.util.Arrays; +import java.util.stream.Collectors; + @Configuration @SpringBootApplication -public class InfinityFinanceApiApplication { +class InfinityFinanceApiApplication { public static void main(String[] args) { SpringApplication.run(InfinityFinanceApiApplication.class, args); diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUser.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUser.java index 66a7aac..eb45b70 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUser.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUser.java @@ -25,25 +25,25 @@ public class AppUser implements UserDetails { @Column(name = "user_id") private Long id; - //@Column(unique = true) + @Column(unique = true) private String username; - //@Column(unique = true) + @Column(unique = true) private String email; private String password; private String firstName; private String secondName; - - - @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER) - @JoinTable(name="user_roles", + + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id") ) private List roles = new ArrayList<>(); + @JsonIgnore @OneToMany(mappedBy = "appuser") private List transactions = new ArrayList<>(); diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminController.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminController.java new file mode 100644 index 0000000..dbbab17 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminController.java @@ -0,0 +1,64 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/api/v1") +class AppUserAdminController { + + private final AppUserAdminService appUserAdminService; + + @GetMapping("/admin/users") + public ResponseEntity> getAllUsers( + @RequestParam(defaultValue = "0") Integer page, + @RequestParam(defaultValue = "ASC") Sort.Direction direction, + @RequestParam(defaultValue = "id") String by) { + + var users = appUserAdminService.getAllUsers(page, direction, by); + + return ResponseEntity.ok(users); + } + + @GetMapping("/admin/users/{userId:[0-9]+}") + public ResponseEntity getSingleUser(@PathVariable long userId) { + + var user = appUserAdminService.getSingleUser(userId); + + return ResponseEntity.ok(user); + } + + @PostMapping("/admin/users") + ResponseEntity createAccount(@RequestBody CreateAppUserAdminDTO createAppUserAdminDTO) { + + var user = appUserAdminService.createAccount(createAppUserAdminDTO); + + return ResponseEntity.created(URI.create("/users/" + user.getId())).body(user); + } + + @DeleteMapping("/admin/users/{userId:[0-9]+}") + ResponseEntity deleteAllUsersAndAllRelated(@PathVariable long userId) { + appUserAdminService.findAndDeleteUserWithRolesAndTransactions(userId); + + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } + + @PutMapping("/admin/users/{userId:[0-9]+}") + ResponseEntity replaceUserAllDetails( + @PathVariable long userId, + @RequestBody ReplaceAppUserAllDetailsDTO replaceAppUserAllDetailsDTO) { + + var replacedUser = appUserAdminService.replaceUserAllDetails(userId, replaceAppUserAllDetailsDTO); + + return ResponseEntity.ok(replacedUser); + } + +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminService.java new file mode 100644 index 0000000..b92dba6 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminService.java @@ -0,0 +1,153 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy.AppUserRoleStrategyFacade; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.exception.ResourceNotFoundException; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.util.CustomPageable; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.TransactionAdminService; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.function.Function; + +@Service +@Slf4j +public class AppUserAdminService implements UserDetailsService { + + @Autowired + private AppUserRepository appUserRepository; + @Autowired + private AppUserUtil appUserUtil; + @Autowired + private AppUserRoleStrategyFacade appUserRoleStrategyFacade; + @Autowired + private CustomPageable customPageable; + + private TransactionAdminService transactionAdminService; + + public void setTransactionAdminService(TransactionAdminService transactionAdminService) { + this.transactionAdminService = transactionAdminService; + } + + public AppUser getUserById(long userId) { + + return appUserRepository.findById(userId).orElseThrow(() -> ResourceNotFoundException.createWith("Could not find any user with id " + userId)); + } + + public AppUser getUserByUserName(String username) { + return appUserRepository.findByUsername(username); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + return getUserByUserName(username); + } + + public Long getLoggedInUserId() { + return appUserRepository.getLoggedInUserId().orElseThrow(() -> new UsernameNotFoundException("User not found in the database")); + } + + public List getAllUsers(Integer pageNumber, Sort.Direction sortDirection, String sortBy) { + Pageable page = validateAndCreatePageable(pageNumber, sortDirection, sortBy); + + var foundUsers = getUsers(page); + + return foundUsers.stream().map(mapToAppUserDTO()).toList(); + } + + private @NotNull Page getUsers(Pageable page) { + return appUserRepository.findAll(page); + } + + @NotNull + private Function mapToAppUserDTO() { + return appUserUtil::mapToAppUserDTO; + } + + private Pageable validateAndCreatePageable(int pageNumber, Sort.Direction sortDirection, String sortBy) { + return customPageable.validateAndCreatePageable(pageNumber, sortDirection, sortBy, AppUser.class); + } + + public AppUserDTO getSingleUser(long userId) { + var foundUser = getUserById(userId); + + return mapToAppUserDTO(foundUser); + } + + private AppUserDTO mapToAppUserDTO(AppUser foundUser) { + return appUserUtil.mapToAppUserDTO(foundUser); + } + + public AppUserDTO createAccount(T objectDTO) { + AppUser user = createAppUserFromCreateAppUserDTOAndHashPassword(objectDTO); + + setRolesForUser(user, objectDTO); + + user = saveUser(user); + + return mapToAppUserDTO(user); + } + + private void setRolesForUser(AppUser user, T objectDTO) { + appUserRoleStrategyFacade.addRolesForUser(user, objectDTO); + } + + + private AppUser createAppUserFromCreateAppUserDTOAndHashPassword(T createAppUserDTO) { + return appUserUtil.mapToAppUserFactory(createAppUserDTO); + } + @Transactional + public void findAndDeleteUserWithRolesAndTransactions(long userId) { + deleteTransactionsRelatedWithUser(userId); + deleteUserWithRoles(userId); + } + + private void deleteTransactionsRelatedWithUser(long userId) { + transactionAdminService.deleteTransactionsRelatedWithUser(userId); + } + + private void deleteUserWithRoles(long userId) { + var user = getUserById(userId); + deleteUser(user); + deleteRoleFromUser(user); + } + + private void deleteRoleFromUser(AppUser user) { + appUserRoleStrategyFacade.removeRoles(user); + } + + private void deleteUser(AppUser user) { + appUserRepository.delete(user); + } + + AppUser saveUser(AppUser user) { + return appUserRepository.save(user); + } + + @Transactional + public AppUserDTO replaceUserAllDetails(long userId, ReplaceAppUserAllDetailsDTO replaceAppUserAllDetailsDTO) { + var foundUser = getUserById(userId); + + var overwrittenUser = overwriteAppUserAllDetails(foundUser, replaceAppUserAllDetailsDTO); + + return mapAppUserToAppUserDTO(overwrittenUser); + } + + private AppUserDTO mapAppUserToAppUserDTO(AppUser user) { + return appUserUtil.mapToAppUserDTO(user); + } + + private AppUser overwriteAppUserAllDetails(AppUser foundUser, ReplaceAppUserAllDetailsDTO replaceAppUserAllDetailsDTO) { + return appUserUtil.overwriteAppUserAllDetails(foundUser, replaceAppUserAllDetailsDTO); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserMapperFactory.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserMapperFactory.java new file mode 100644 index 0000000..6e49b01 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserMapperFactory.java @@ -0,0 +1,116 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Slf4j +public class AppUserMapperFactory { + + @Autowired + private PasswordEncoder encoder; + @Autowired //INTO MAPPER SOON + private RoleService roleService; + + public AppUser mapToAppUserFactory(T dto) { + AppUser user = null; + + /* Keep taken dtos higher than others + * ReplaceAll details > CreateAdminDTO > CreateUserDTO + * because of the inheritance */ + if(dto instanceof ReplaceAppUserAllDetailsDTO) { + user = mapToAppUser((ReplaceAppUserAllDetailsDTO) dto); + user.setPassword(hashPassword(((ReplaceAppUserAllDetailsDTO) dto).getPassword())); + } else if(dto instanceof CreateAppUserAdminDTO) { + user = mapToAppUser((CreateAppUserAdminDTO) dto); + user.setPassword(hashPassword(((CreateAppUserAdminDTO) dto).getPassword())); + } else if(dto instanceof CreateAppUserUserDTO) { + user = mapToAppUser((CreateAppUserUserDTO) dto); + user.setPassword(hashPassword(((CreateAppUserUserDTO) dto).getPassword())); + } else if(dto instanceof ReplaceAppUserByUserDTO) { + user = mapToAppUser((ReplaceAppUserByUserDTO) dto); + } else if(dto instanceof AppUserCredentialsDTO) { + user = mapToAppUser((AppUserCredentialsDTO) dto); + user.setPassword(hashPassword(((AppUserCredentialsDTO) dto).getPassword())); + } + + return user; + } + + private String hashPassword(String password) { + return encoder.encode(password); + } + + private AppUser mapToAppUser(ReplaceAppUserAllDetailsDTO dto) { + + return AppUser.builder() + .username(dto.getUsername()) + .password(dto.getPassword()) + .email(dto.getEmail()) + .secondName(dto.getSecondName()) + .firstName(dto.getFirstName()) + .build(); + } + + private AppUser mapToAppUser(AppUserCredentialsDTO dto) { + + return AppUser.builder() + .username(dto.getUsername()) + .password(dto.getPassword()) + .build(); + } + + private AppUser mapToAppUser(CreateAppUserUserDTO dto) { + + return AppUser.builder() + .username(dto.getUsername()) + .password(dto.getPassword()) + .email(dto.getEmail()) + .build(); + } + + private AppUser mapToAppUser(CreateAppUserAdminDTO dto) { + + return AppUser.builder() + .username(dto.getUsername()) + .email(dto.getEmail()) + .password(dto.getPassword()) + .build(); + } + + private AppUser mapToAppUser(ReplaceAppUserByUserDTO dto) { + + return AppUser.builder() + .firstName(dto.getFirstName()) + .email(dto.getEmail()) + .secondName(dto.getSecondName()) + .build(); + } + + public AppUserDTO mapToAppUserDTO(AppUser appUser) { + + return AppUserDTO.builder() + .id(appUser.getId()) + .username(appUser.getUsername()) + .email(appUser.getEmail()) + .firstName(appUser.getFirstName()) + .secondName(appUser.getSecondName()) + .roles(mapToRolesDTO(appUser.getRoles())) + .build(); + } + + + //INTO MAPPER SOON + + private List mapToRolesDTO(List roles) { + return roleService.mapToRolesDTO(roles); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserRepository.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserRepository.java index e0f98f4..d066e83 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserRepository.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserRepository.java @@ -1,9 +1,41 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Optional; + @Repository -public interface AppUserRepository extends JpaRepository { +interface AppUserRepository extends JpaRepository { + default Optional getLoggedInUserId() { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + + if (!(auth instanceof AnonymousAuthenticationToken)) { + return getIdByUsername(auth.getName()); + } + + return Optional.empty(); + } + + @Query("SELECT u.id FROM AppUser u WHERE u.username = :username") + Optional getIdByUsername(String username); + + @Query("SELECT u FROM AppUser u JOIN FETCH u.roles WHERE u.username = :username") AppUser findByUsername(String username); + + + @Override + @Query( value = "FROM AppUser u LEFT JOIN FETCH u.roles", /* avoid n + 1 */ + countQuery = "SELECT COUNT(u) FROM AppUser u LEFT JOIN u.roles") /* add pageable without n + 1 */ + @NotNull + Page findAll(@NotNull Pageable pageable); + } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserService.java deleted file mode 100644 index 89ae40d..0000000 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserService.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class AppUserService implements UserDetailsService { - - private final AppUserRepository appUserRepository; - - public Optional getUserById(long userId) { - - return appUserRepository.findById(userId); - } - - public AppUser getUserByUserName(String username) { - return appUserRepository.findByUsername(username); - } - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - return getUserByUserName(username); - } -} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserController.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserController.java new file mode 100644 index 0000000..8f2cff6 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserController.java @@ -0,0 +1,68 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; + +/* + * If you hit the + * - DELETE "/users" endpoint + * - PUT "/users/credentials" endpoint + * make sure that you logout + * current user to ensure getting + * troubleshoot errors. + */ + +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/api/v1") +class AppUserUserController { + + private final AppUserUserService appUserUserService; + + @GetMapping("/users") + public ResponseEntity getCurrentLoggedUserInformation() { + + var user = appUserUserService.getCurrentLoggedUserInformation(); + + return ResponseEntity.ok(user); + } + + @PostMapping("/users") + ResponseEntity createAccount(@RequestBody CreateAppUserUserDTO createAppUserUserDTO) { + + var user = appUserUserService.createAccount(createAppUserUserDTO); + + return ResponseEntity.created(URI.create("/users/" + user.getId())).body(user); + } + + @DeleteMapping("/users") + ResponseEntity deleteCurrentLoggedUser() { + appUserUserService.deleteCurrentLoggedUser(); + + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } + + @PutMapping("/users/credentials") + ResponseEntity replaceUserCredentials( + @RequestBody AppUserCredentialsDTO appUserCredentialsDTO) { + + var replacedUser = appUserUserService.replaceUserCredentials(appUserCredentialsDTO); + + return ResponseEntity.ok(replacedUser); + } + + @PutMapping("/users/details") + ResponseEntity replaceUserDetails( + @RequestBody ReplaceAppUserByUserDTO replaceAppUserByUserDTO) { + + var replacedUser = appUserUserService.replaceUserDetails(replaceAppUserByUserDTO); + + return ResponseEntity.ok(replacedUser); + } + +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserService.java new file mode 100644 index 0000000..7a416e2 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserService.java @@ -0,0 +1,85 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.AppUserCredentialsDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.AppUserDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.CreateAppUserUserDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.ReplaceAppUserByUserDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +@RequiredArgsConstructor +public class AppUserUserService { + + private final AppUserAdminService appUserAdminService; + private final AppUserUtil appUserUtil; + + public AppUserDTO getCurrentLoggedUserInformation() { + long loggedInUserId = getLoggedUserId(); + + var user = getUserById(loggedInUserId); + + return mapToAppUserDTO(user); + } + + private AppUserDTO mapToAppUserDTO(AppUser user) { + return appUserUtil.mapToAppUserDTO(user); + } + + private AppUser getUserById(long id) { + return appUserAdminService.getUserById(id); + } + + private long getLoggedUserId() { + return appUserAdminService.getLoggedInUserId(); + } + + public void deleteCurrentLoggedUser() { + long loggedInUserId = getLoggedUserId(); + + appUserAdminService.findAndDeleteUserWithRolesAndTransactions(loggedInUserId); + } + + public AppUserDTO createAccount(CreateAppUserUserDTO createAppUserUserDTO) { + return appUserAdminService.createAccount(createAppUserUserDTO); + } + + public AppUserDTO replaceUserCredentials(AppUserCredentialsDTO appUserCredentialsDTO) { + long loggedInUserId = getLoggedUserId(); + + var foundUser = getUserById(loggedInUserId); + + var overwrittenUser = overwriteAppUserCredentials(foundUser, appUserCredentialsDTO); + + overwrittenUser = saveUser(overwrittenUser); + + return mapToAppUserDTO(overwrittenUser); + } + + private AppUser overwriteAppUserCredentials(AppUser foundUser, AppUserCredentialsDTO appUserCredentialsDTO) { + return appUserUtil.overwriteAppUserCredentials(foundUser, appUserCredentialsDTO); + } + + public AppUserDTO replaceUserDetails(ReplaceAppUserByUserDTO replaceAppUserByUserDTO) { + long loggedInUserId = getLoggedUserId(); + + var foundUser = getUserById(loggedInUserId); + + var overwrittenUser = overwriteAppUserDetails(foundUser, replaceAppUserByUserDTO); + + overwrittenUser = saveUser(overwrittenUser); + + return mapToAppUserDTO(overwrittenUser); + } + + public AppUser overwriteAppUserDetails(AppUser foundUser, ReplaceAppUserByUserDTO replaceAppUserByUserDTO) { + return appUserUtil.overwriteAppUserDetails(foundUser, replaceAppUserByUserDTO); + } + + private AppUser saveUser(AppUser user) { + return appUserAdminService.saveUser(user); + } + +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUtil.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUtil.java new file mode 100644 index 0000000..bdf3bda --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUtil.java @@ -0,0 +1,68 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy.AppUserRoleStrategyFacade; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +class AppUserUtil { + + private final AppUserMapperFactory appUserMapperFactory; + private final AppUserRoleStrategyFacade appUserRoleStrategyFacade; + + public AppUser mapToAppUserFactory(T dto) { + return appUserMapperFactory.mapToAppUserFactory(dto); + } + + public AppUserDTO mapToAppUserDTO(AppUser appUser) { + return appUserMapperFactory.mapToAppUserDTO(appUser); + } + + public AppUser overwriteAppUserDetails(AppUser foundUser, ReplaceAppUserByUserDTO replaceAppUserByUserDTO) { + var convertedUser = mapToAppUser(replaceAppUserByUserDTO); + + foundUser.setFirstName(convertedUser.getFirstName()); + foundUser.setSecondName(convertedUser.getSecondName()); + foundUser.setEmail(convertedUser.getEmail()); + + return foundUser; + } + + private AppUser mapToAppUser(T dto) { + return appUserMapperFactory.mapToAppUserFactory(dto); + } + + public AppUser overwriteAppUserCredentials(AppUser foundUser, AppUserCredentialsDTO appUserCredentialsDTO) { + var convertedUser = mapToAppUser(appUserCredentialsDTO); + + foundUser.setPassword(convertedUser.getPassword()); + foundUser.setUsername(convertedUser.getUsername()); + + return foundUser; + } + + public AppUser overwriteAppUserAllDetails(AppUser foundUser, ReplaceAppUserAllDetailsDTO replaceAppUserAllDetailsDTO) { + var convertedUser = mapToAppUser(replaceAppUserAllDetailsDTO); + + foundUser.setPassword(convertedUser.getPassword()); + foundUser.setUsername(convertedUser.getUsername()); + foundUser.setEmail(convertedUser.getEmail()); + foundUser.setSecondName(convertedUser.getSecondName()); + foundUser.setFirstName(convertedUser.getFirstName()); + + removeAndSetRoles(foundUser, replaceAppUserAllDetailsDTO); + + return foundUser; + } + + private void removeAndSetRoles(AppUser foundUser, ReplaceAppUserAllDetailsDTO replaceAppUserAllDetailsDTO) { + appUserRoleStrategyFacade.removeRoles(foundUser); + + appUserRoleStrategyFacade.addRolesForUser(foundUser, replaceAppUserAllDetailsDTO); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/AppUserCredentialsDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/AppUserCredentialsDTO.java index 6f37406..590d9f6 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/AppUserCredentialsDTO.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/AppUserCredentialsDTO.java @@ -1,10 +1,12 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter @AllArgsConstructor +@Builder public class AppUserCredentialsDTO { private String username; private String password; diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/AppUserDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/AppUserDTO.java new file mode 100644 index 0000000..8d68e8d --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/AppUserDTO.java @@ -0,0 +1,24 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import lombok.*; +import lombok.experimental.FieldNameConstants; + +import java.util.List; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@FieldNameConstants +public class AppUserDTO { + private long id; + + private String username; + private String email; + private String firstName; + private String secondName; + + private List roles; +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/CreateAppUserAdminDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/CreateAppUserAdminDTO.java new file mode 100644 index 0000000..dc8ac16 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/CreateAppUserAdminDTO.java @@ -0,0 +1,25 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import lombok.*; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Slf4j +public class CreateAppUserAdminDTO extends CreateAppUserUserDTO { + private List roles; + + public boolean hasRole(String name) { + RoleDTO role = new RoleDTO(name); + + return roles.stream() + .filter(e -> e.equals(role)) + .toList() + .size() > 0; + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/CreateAppUserUserDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/CreateAppUserUserDTO.java new file mode 100644 index 0000000..0181747 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/CreateAppUserUserDTO.java @@ -0,0 +1,16 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto; + +import lombok.*; +import lombok.experimental.FieldNameConstants; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@FieldNameConstants +public class CreateAppUserUserDTO { + private String username; + private String password; + private String email; +} \ No newline at end of file diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/ReplaceAppUserAllDetailsDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/ReplaceAppUserAllDetailsDTO.java new file mode 100644 index 0000000..af367ea --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/ReplaceAppUserAllDetailsDTO.java @@ -0,0 +1,18 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import lombok.*; +import lombok.experimental.FieldNameConstants; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@FieldNameConstants +public class ReplaceAppUserAllDetailsDTO extends CreateAppUserAdminDTO { + + private String firstName; + private String secondName; +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/ReplaceAppUserByUserDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/ReplaceAppUserByUserDTO.java new file mode 100644 index 0000000..b939486 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/dto/ReplaceAppUserByUserDTO.java @@ -0,0 +1,17 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto; + +import lombok.*; +import lombok.experimental.FieldNameConstants; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@FieldNameConstants +public class ReplaceAppUserByUserDTO { + + private String email; + private String firstName; + private String secondName; +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserAddAdminRole.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserAddAdminRole.java new file mode 100644 index 0000000..b65425d --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserAddAdminRole.java @@ -0,0 +1,60 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleType; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleService; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +class AppUserAddAdminRole implements AppUserRoleStrategy { + + private static AppUserAddAdminRole instance = null; + private final RoleService roleService; + + private AppUserAddAdminRole(RoleService roleService) { + this.roleService = roleService; + } + + public static AppUserAddAdminRole getInstance(RoleService roleService) { + if (instance == null) { + instance = new AppUserAddAdminRole(roleService); + } + + return instance; + } + + @Override + public void addRolesForUser(AppUser user) { + var roles = getRoles(user); + + if(!adminRoleExists(roles)) { + var userRoles = getAdminRoleList(); + + user.setRoles(userRoles); + } + } + + private List getRoles(AppUser user) { + if(user.getRoles() == null) + return new ArrayList<>(); + + return user.getRoles(); + } + + private boolean adminRoleExists(List roles) { + return roles.stream() + .map(Role::getName) + .filter(e -> e.equals(RoleType.ROLE_ADMIN.getName())) + .toList() + .size() > 0; + } + + + private List getAdminRoleList() { + return List.of(roleService.getUserRoleOrCreate(), roleService.getAdminRoleOrCreate()); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserAddUserRole.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserAddUserRole.java new file mode 100644 index 0000000..336a81a --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserAddUserRole.java @@ -0,0 +1,59 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleType; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleService; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +class AppUserAddUserRole implements AppUserRoleStrategy { + + private static AppUserAddUserRole instance = null; + private final RoleService roleService; + + private AppUserAddUserRole(RoleService roleService) { + this.roleService = roleService; + } + + public static AppUserAddUserRole getInstance(RoleService roleService) { + if (instance == null) { + instance = new AppUserAddUserRole(roleService); + } + + return instance; + } + + @Override + public void addRolesForUser(AppUser user) { + var roles = getRoles(user); + + if(!userRoleExists(roles)) { + var userRoles = getUserRoleList(); + + user.setRoles(userRoles); + } + } + + private List getRoles(AppUser user) { + if(user.getRoles() == null) + return new ArrayList<>(); + + return user.getRoles(); + } + + private boolean userRoleExists(List roles) { + return roles.stream() + .map(Role::getName) + .filter(e -> e.equals(RoleType.ROLE_USER.getName())) + .toList() + .size() > 0; + } + + private List getUserRoleList() { + return List.of(roleService.getUserRoleOrCreate()); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleRemover.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleRemover.java new file mode 100644 index 0000000..b69e2cd --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleRemover.java @@ -0,0 +1,26 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleService; + +class AppUserRoleRemover { + + private static AppUserRoleRemover instance = null; + private final RoleService roleService; + + private AppUserRoleRemover(RoleService roleService) { + this.roleService = roleService; + } + + public static AppUserRoleRemover getInstance(RoleService roleService) { + if (instance == null) { + instance = new AppUserRoleRemover(roleService); + } + + return instance; + } + + public void deleteRolesForUser(AppUser user) { + roleService.deleteRolesFromUser(user); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleStrategy.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleStrategy.java new file mode 100644 index 0000000..3e6fb52 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleStrategy.java @@ -0,0 +1,7 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; + +interface AppUserRoleStrategy { + void addRolesForUser(AppUser user); +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleStrategyFacade.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleStrategyFacade.java new file mode 100644 index 0000000..ed8ee56 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/rolestrategy/AppUserRoleStrategyFacade.java @@ -0,0 +1,82 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.CreateAppUserAdminDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.CreateAppUserUserDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.ReplaceAppUserAllDetailsDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleType; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + + +/* + * Class adds roles based on JSON input + * the highest role is taken and the rest + * of the roles are added for example: + * - if we have ROLE_ADMIN in name of the + * json request it adds also ROLE_USER + * - if we have ROLE_USER it adds just + * ROLE_USER. + * + * If you want to add new roles just add + * another object cast in factory + * and add create new strategy file. + */ +@Component +@Slf4j +public class AppUserRoleStrategyFacade { + + private final RoleService roleService; + + public AppUserRoleStrategyFacade(RoleService roleService) { + this.roleService = roleService; + } + + public void addRolesForUser(AppUser user, T objectDTO) { + createStrategy(objectDTO).addRolesForUser(user); + } + + private AppUserRoleStrategy createStrategy(T objectDTO) { + if(isAdmin(objectDTO)) { + return AppUserAddAdminRole.getInstance(roleService); + } else if(isDefaultUser(objectDTO)) { + return AppUserAddUserRole.getInstance(roleService); + } + + throw new IllegalArgumentException("Error during create strategy occurred."); + } + + private boolean isDefaultUser(T objectDTO) { + return isCreateAppUserUserDTO(objectDTO); + } + + + private boolean isAdmin(T objectDTO) { + + /* Also catches ReplaceAppUserAllDetailsDTO due to inheritance. */ + if(isReplaceAppUserAllDetailsDTO(objectDTO)) { + return ((ReplaceAppUserAllDetailsDTO) objectDTO).hasRole(RoleType.ROLE_ADMIN.getName()); + } else if(isCreateAppUserAdminDTO(objectDTO)) { + return ((CreateAppUserAdminDTO) objectDTO).hasRole(RoleType.ROLE_ADMIN.getName()); + } + + return false; + } + + private boolean isReplaceAppUserAllDetailsDTO(T objectDTO) { + return objectDTO instanceof ReplaceAppUserAllDetailsDTO; + } + + private boolean isCreateAppUserUserDTO(T objectDTO) { + return objectDTO instanceof CreateAppUserUserDTO; + } + + private boolean isCreateAppUserAdminDTO(T objectDTO) { + return objectDTO instanceof CreateAppUserAdminDTO; + } + + public void removeRoles(AppUser user) { + AppUserRoleRemover.getInstance(roleService).deleteRolesForUser(user); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/Category.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/Category.java index 5935a77..7ccf5ca 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/Category.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/Category.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.Transaction; +import junit.runner.Version; import lombok.*; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @@ -23,12 +24,10 @@ public class Category { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "category_id") private Long id; - - //@Column(unique = true) private String name; @JsonIgnore - @OneToMany(mappedBy = "category") + @OneToMany(mappedBy = "category", orphanRemoval = true, fetch = FetchType.LAZY) private List transactions = new ArrayList<>(); @CreationTimestamp @@ -38,4 +37,8 @@ public class Category { @UpdateTimestamp @Temporal(TemporalType.TIMESTAMP) private Date updated; + + public Category(String categoryName) { + this.name = categoryName; + } } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryController.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryController.java new file mode 100644 index 0000000..e8d08ba --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryController.java @@ -0,0 +1,25 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.category; + +import lombok.RequiredArgsConstructor; +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.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/api/v1") +class CategoryController { + + private final CategoryService categoryService; + + @GetMapping("/catgories") + public ResponseEntity> getAllCategories(){ + + var categories = categoryService.getAllCategories(); + + return ResponseEntity.ok(categories); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryRepository.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryRepository.java index 956f183..be23d42 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryRepository.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryRepository.java @@ -2,6 +2,6 @@ import org.springframework.data.jpa.repository.JpaRepository; -public interface CategoryRepository extends JpaRepository { +interface CategoryRepository extends JpaRepository { Category findByName(String categoryName); } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryService.java index 10d0c0a..9ecd4f7 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryService.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryService.java @@ -1,11 +1,11 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.category; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.dto.CategoryDTO; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; -import java.util.Optional; +import java.util.List; + @Service @RequiredArgsConstructor @@ -13,14 +13,48 @@ public class CategoryService { private final CategoryRepository categoryRepository; - public Optional getCategoryByName(String categoryName) { + private final CategoryUtil categoryUtil; + + public Category getCategoryByName(String categoryName) { + + return categoryRepository.findByName(categoryName); + } + + public Category createCategory(String categoryName) { + Category category = new Category(categoryName); - return Optional.ofNullable(categoryRepository.findByName(categoryName)); + return saveCategory(category); } - public Category createCategory(Category category) { - var savedCategory = categoryRepository.save(category); + @NotNull + private Category saveCategory(Category category) { + return categoryRepository.save(category); + } + + public void checkAndDeleteCategoryIfNotRelated(Long id) { + var foundCategory = getCategoryById(id); + + deleteCategoryIfNotRelated(foundCategory); + } + + private void deleteCategoryIfNotRelated(Category foundCategory) { + if (!isNumberPositive(foundCategory.getTransactions().size())) + deleteCategoryById(foundCategory.getId()); + } + + private Category getCategoryById(long id) { + return categoryRepository.findById(id).orElseThrow(() -> new RuntimeException("Category not found in database")); + } + + private boolean isNumberPositive(int value) { + return categoryUtil.isNumberPositive(value); + } + + private void deleteCategoryById(Long id) { + categoryRepository.deleteById(id); + } - return savedCategory; + public List getAllCategories() { + return categoryRepository.findAll(); } } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryUtils.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryUtil.java similarity index 50% rename from src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryUtils.java rename to src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryUtil.java index ade1167..8f15988 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryUtils.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/category/CategoryUtil.java @@ -1,15 +1,22 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.category; import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.dto.CategoryDTO; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.Transaction; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Component -public class CategoryUtils { - public CategoryDTO mapCategoryToCategoryDTO(Category category) { +@Slf4j +@RequiredArgsConstructor +class CategoryUtil { + + public CategoryDTO mapToCategoryDTO(Category category) { return CategoryDTO.builder() .name(category.getName()) .build(); } + + public boolean isNumberPositive(int value) { + return value > 0 ? Boolean.TRUE : Boolean.FALSE; + } } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/GlobalExceptionHandler.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..9a33d75 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/GlobalExceptionHandler.java @@ -0,0 +1,77 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.exception; + +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.validation.ConstraintViolationException; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@RestControllerAdvice(basePackages = "com.github.WeeiaEduTeam.InfinityFinanceAPI") +class GlobalExceptionHandler { + + @ExceptionHandler({MethodArgumentNotValidException.class}) + public ResponseEntity>> handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { + + Map errors = new HashMap<>(); + + exception.getBindingResult().getAllErrors().forEach((error) -> { + String fieldName = ((FieldError) error).getField(); + String errorMessage = error.getDefaultMessage(); + + errors.put(fieldName, errorMessage); + }); + + log.error("Validation failed: {}", errors); + + return Result.failedValidation(errors); + } + + + @ExceptionHandler({ConstraintViolationException.class, DataIntegrityViolationException.class}) + public ResponseEntity>> handleConstraintViolationException(ConstraintViolationException exception) { + + Map errors = new HashMap<>(); + errors.put("repository", exception.getMessage()); + + log.error("Constraint violation: {}", errors); + + return Result.constraintViolation(errors); + } + + @ExceptionHandler({ResourceNotFoundException.class, InvalidDataAccessApiUsageException.class}) + public @NotNull ResponseEntity> handleUnknownResourceError(RuntimeException exception) { + + log.error(exception.getMessage()); + + return Result.resourceNotFound(); + } + + @ExceptionHandler({UsernameNotFoundException.class}) + public @NotNull ResponseEntity> handleForbiddenError(RuntimeException exception) { + + log.error(exception.getMessage()); + + return Result.forbidden(); + } + + @ExceptionHandler({Exception.class}) + public @NotNull ResponseEntity> handleUnknownError(Exception exception) { + + log.error(exception.getMessage()); + exception.printStackTrace(); + + return Result.unknownError(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/ResourceNotFoundException.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/ResourceNotFoundException.java new file mode 100644 index 0000000..ce3df73 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/ResourceNotFoundException.java @@ -0,0 +1,21 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.exception; + + +public class ResourceNotFoundException extends RuntimeException { + + public static ResourceNotFoundException createWith(String errorMessage) { + return new ResourceNotFoundException(errorMessage); + } + + public static ResourceNotFoundException createWith(long id) { + return new ResourceNotFoundException(id); + } + + private ResourceNotFoundException(long id) { + super(String.format("Resource with id: %s not found", id)); + } + + private ResourceNotFoundException(String errorMessage) { + super(errorMessage); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/Response.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/Response.java new file mode 100644 index 0000000..fbd0d5a --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/Response.java @@ -0,0 +1,41 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.exception; + +import org.springframework.http.HttpStatus; + +enum Response { + UNSUPPORTED_OPERATION(HttpStatus.NOT_IMPLEMENTED, HttpStatus.NOT_IMPLEMENTED.getReasonPhrase()), + SUCCESS(HttpStatus.OK, HttpStatus.OK.getReasonPhrase()), + VALIDATE_FAILED(HttpStatus.BAD_REQUEST, "Validation failed"), + + CONSTRAINT_VIOLATION(HttpStatus.CONFLICT, "The request could not be completed due to a conflict with the current state of the resource"), + NOT_FOUND(HttpStatus.NOT_FOUND, "Resource not found"), + FORBIDDEN(HttpStatus.FORBIDDEN, HttpStatus.FORBIDDEN.getReasonPhrase()), + ; + + private final Integer code; + private final String message; + private final HttpStatus httpStatus; + + Response(HttpStatus httpStatus, String message) { + this.httpStatus = httpStatus; + this.code = httpStatus.value(); + this.message = message; + } + + Response(int code, String message) { + this.httpStatus = HttpStatus.I_AM_A_TEAPOT; + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + public HttpStatus getStatus() { + return httpStatus; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/ResponseAdvice.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/ResponseAdvice.java new file mode 100644 index 0000000..a9a3ef0 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/ResponseAdvice.java @@ -0,0 +1,35 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.exception; + +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +@Slf4j +@RestControllerAdvice(basePackages = "com.github.WeeiaEduTeam.InfinityFinanceAPI") +class ResponseAdvice implements ResponseBodyAdvice { + + @Override + public boolean supports(@NotNull MethodParameter returnType, @NotNull Class> converterType) { + return true; + } + + @Override + public Object beforeBodyWrite(Object body, @NotNull MethodParameter returnType, + @NotNull MediaType selectedContentType, + @NotNull Class> selectedConverterType, + org.springframework.http.server.@NotNull ServerHttpRequest request, + org.springframework.http.server.@NotNull ServerHttpResponse response) { + + // if the body is already be Result, then just return + if (body instanceof Result) { + return body; + } + + return Result.success(body); + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/Result.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/Result.java new file mode 100644 index 0000000..dda6c19 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/exception/Result.java @@ -0,0 +1,76 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.http.ResponseEntity; + +@Slf4j +@Data +@NoArgsConstructor +@AllArgsConstructor +class Result { + private Integer code; + private String message; + private T data; + + public static Result success(T data) { + var cause = Response.SUCCESS; + + return getResult(cause, data); + } + + public static ResponseEntity> failedValidation(T data) { + var cause = Response.VALIDATE_FAILED; + return getWrappedResultResponseEntity(data, cause); + } + + public static ResponseEntity> constraintViolation(T data) { + var cause = Response.CONSTRAINT_VIOLATION; + return getWrappedResultResponseEntity(data, cause); + } + + public static ResponseEntity> unknownError() { + var cause = Response.UNSUPPORTED_OPERATION; + return getWrappedResultResponseEntity(cause); + } + + public static ResponseEntity> resourceNotFound() { + var cause = Response.NOT_FOUND; + return getWrappedResultResponseEntity(cause); + } + + public static ResponseEntity> forbidden() { + var cause = Response.FORBIDDEN; + return getWrappedResultResponseEntity(cause); + } + + @NotNull + private static Result getResult(Response response, T data) { + return new Result<>(response.getCode(), response.getMessage(), data); + } + + private static ResponseEntity> getWrappedResultResponseEntity(Response cause) { + var result = getResult(cause, null); + return getResultWithStatus(cause, result); + } + + private static ResponseEntity> getWrappedResultResponseEntity(T data, Response cause) { + var result = getResult(cause, data); + return getResultWithStatus(cause, result); + } + + /* + * If you want want to use own + * server responses eg. own status + * code with given description + * use return result and change the + * method return. + */ + + private static ResponseEntity> getResultWithStatus(Response response, Result result) { + return ResponseEntity.status(response.getStatus()).body(result); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/initializer/DatabaseInitializer.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/initializer/DatabaseInitializer.java deleted file mode 100644 index ed543e3..0000000 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/initializer/DatabaseInitializer.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.initializer; - -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserRepository; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.CategoryRepository; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.Transaction; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.TransactionRepository; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleRepository; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.TransactionType; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.CommandLineRunner; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Component; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -@Component -@RequiredArgsConstructor -public class DatabaseInitializer implements CommandLineRunner { - private final AppUserRepository appUserRepository; - private final CategoryRepository categoryRepository; - private final TransactionRepository transactionRepository; - private final RoleRepository roleRepository; - - private final List appUserList; - private final List transactionList; - private final List categoryList; - private final List roleList; - - @Override - public void run(String... args) { - createRolesEntity(); - createAppUserEntity(); - createCategoryList(); - createTransactionList(); - - - appUserRepository.saveAll(appUserList); - categoryRepository.saveAll(categoryList); - transactionRepository.saveAll(transactionList); - roleRepository.saveAll(roleList); - } - - private void createRolesEntity() { - roleList.addAll( - Arrays.asList( - Role.builder() - .name("ROLE_ADMIN") - .build(), - Role.builder() - .name("ROLE_USER") - .build() - ) - ); - } - - private void createAppUserEntity() { - appUserList.addAll( - Arrays.asList( - AppUser.builder() - .username("admin") - .email("patryk@wp.pl") - .password("{noop}admin") - .firstName("Patryk") - .secondName("Yes") - .roles(Collections.singletonList(roleList.get(0))) - .build(), - AppUser.builder() - .username("user") - .email("superaancko@o2.pl") - .password("{noop}user") - .firstName("Geraldo") - .secondName("Ciro") - .roles(Collections.singletonList(roleList.get(1))) - .build(), - AppUser.builder() - .username("test") - .email("superaancko@o2.pl") - .password("{bcrypt}" + new BCryptPasswordEncoder().encode("test")) - .firstName("Oki") - .secondName("Ok") - .roles(roleList) - .build() - ) - ); - } - - private void createCategoryList() { - categoryList.addAll( - Arrays.asList( - Category.builder() - .name("shopping") - .build(), - Category.builder() - .name("fuel") - .build(), - Category.builder() - .name("toys") - .build(), - Category.builder() - .name("drugs") - .build(), - Category.builder() - .name("kitchen ideas") - .build() - ) - ); - } - - private void createTransactionList() { - transactionList.addAll( - Arrays.asList( - Transaction.builder() - .transactionType(TransactionType.INCOME) - .title("Super income") - .description("myDescription") - .value(100) - .quantity(1) - .category(categoryList.get(0)) - .appuser(appUserList.get(0)) - .build(), - Transaction.builder() - .transactionType(TransactionType.INCOME) - .title("waste of money") - .description("need more money") - .value(666) - .quantity(2) - .category(categoryList.get(1)) - .appuser(appUserList.get(1)) - .build(), - Transaction.builder() - .transactionType(TransactionType.INCOME) - .title("idk") - .description("aha") - .value(123) - .quantity(10) - .category(categoryList.get(1)) - .appuser(appUserList.get(0)) - .build(), - Transaction.builder() - .transactionType(TransactionType.INCOME) - .title("haha") - .description("aaaaa") - .value(1020) - .quantity(1) - .category(categoryList.get(4)) - .appuser(appUserList.get(1)) - .build(), - Transaction.builder() - .transactionType(TransactionType.OUTCOME) - .title("what") - .description("is this") - .value(100) - .quantity(1) - .category(categoryList.get(4)) - .appuser(appUserList.get(1)) - .build(), - Transaction.builder() - .transactionType(TransactionType.OUTCOME) - .title("ok") - .description("no") - .value(1000) - .quantity(1) - .category(categoryList.get(3)) - .appuser(appUserList.get(1)) - .build(), - Transaction.builder() - .transactionType(TransactionType.OUTCOME) - .title("oki") - .description("is this") - .value(1001) - .quantity(11) - .category(categoryList.get(0)) - .appuser(appUserList.get(0)) - .build(), - Transaction.builder() - .transactionType(TransactionType.OUTCOME) - .title("ok") - .description("is ok") - .value(10110) - .quantity(1) - .category(categoryList.get(0)) - .appuser(appUserList.get(0)) - .build(), - Transaction.builder() - .transactionType(TransactionType.OUTCOME) - .title("kosi") - .description("isok") - .value(100) - .quantity(1) - .category(categoryList.get(1)) - .appuser(appUserList.get(1)) - .build(), - Transaction.builder() - .transactionType(TransactionType.OUTCOME) - .title("ero") - .description("ero") - .value(100) - .quantity(1) - .category(categoryList.get(2)) - .appuser(appUserList.get(1)) - .build() - ) - ); - } -} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/Role.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/Role.java index 0802466..51bd924 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/Role.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/Role.java @@ -25,7 +25,7 @@ public class Role { @Column(unique = true) private String name; - @JsonIgnoreProperties("roles") - @ManyToMany(mappedBy = "roles") + @JsonIgnore + @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) private List users = new ArrayList<>(); } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleMapper.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleMapper.java new file mode 100644 index 0000000..1f356d6 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleMapper.java @@ -0,0 +1,21 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.role; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +class RoleMapper { + public RoleDTO mapToRoleDTO(Role role) { + return RoleDTO.builder() + .name(role.getName()) + .build(); + } + + public Role buildRole(String roleName) { + return Role.builder() + .name(RoleType.ROLE_ADMIN.getName()) + .build(); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleRepository.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleRepository.java index b2a2cab..265d3c8 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleRepository.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleRepository.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Repository; @Repository -public interface RoleRepository extends JpaRepository { +interface RoleRepository extends JpaRepository { + Role findOneByName(String role); } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleService.java new file mode 100644 index 0000000..f19f6fe --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleService.java @@ -0,0 +1,68 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.role; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class RoleService { + + private final RoleRepository roleRepository; + private final RoleUtil roleUtil; + + public Role getUserRoleOrCreate() { + var role = getRole(RoleType.ROLE_USER.getName()); + + if(role == null) + role = createRole(RoleType.ROLE_USER.getName()); + + return role; + } + + public Role getAdminRoleOrCreate() { + var role = getRole(RoleType.ROLE_ADMIN.getName()); + + if(role == null) + role = createRole(RoleType.ROLE_ADMIN.getName()); + + return role; + } + + private Role getRole(String name) { + return roleRepository.findOneByName(name); + } + + private Role createRole(String name) { + var role = roleUtil.buildRole(name); + + return saveRole(role); + } + + private Role saveRole(Role role) { + return roleRepository.save(role); + } + + public RoleDTO mapToRoleDTO(Role role) { + return roleUtil.mapToRoleDTO(role); + } + + public void deleteRolesFromUser(AppUser user) { + int roleLength = user.getRoles().size(); + + if (roleLength > 0) { + user.getRoles().subList(0, roleLength).clear(); + } + } + + public List mapToRolesDTO(List roles) { + return roles.stream() + .map(this::mapToRoleDTO) + .toList(); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleType.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleType.java new file mode 100644 index 0000000..e60918e --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleType.java @@ -0,0 +1,15 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.role; + +public enum RoleType { + ROLE_USER("ROLE_USER"), + ROLE_ADMIN("ROLE_ADMIN"); + + private final String name; + RoleType(String role_user) { + this.name = role_user; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleUtil.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleUtil.java new file mode 100644 index 0000000..0728243 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/RoleUtil.java @@ -0,0 +1,63 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.role; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +@Slf4j +@RequiredArgsConstructor +class RoleUtil { + + private final RoleMapper roleMapper; + public RoleDTO mapToRoleDTO(Role role) { + return roleMapper.mapToRoleDTO(role); + } + + public Role buildRole(String role) { + role = validateStringRole(role); + + return roleMapper.buildRole(role); + } + + private String validateStringRole(String role) { + List rolesFound = findRolesInEnum(role); + + checkErrors(rolesFound); + + return rolesFound.get(0); + } + + @NotNull + private List findRolesInEnum(String role) { + var enumValues = RoleType.values(); + + return Arrays.stream(enumValues) + .map(RoleType::getName) + .map(String::toUpperCase) + .filter(e -> e.contains(role.toUpperCase())) + .toList(); + } + + private void checkErrors(List rolesFound) { + roleNotFound(rolesFound); + tooManyRolesFound(rolesFound); + } + + private void tooManyRolesFound(List rolesFound) { + if(rolesFound.size() > 1) { + throw new IllegalArgumentException("Found more than one role, try to more specify your role name."); + } + } + + private void roleNotFound(List rolesFound) { + if(rolesFound.size() == 0) { + throw new IllegalArgumentException("Role not found in enum, try enlarge enum and then add role to db."); + } + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/dto/RoleDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/dto/RoleDTO.java new file mode 100644 index 0000000..ea5a6cc --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/role/dto/RoleDTO.java @@ -0,0 +1,34 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto; + +import lombok.*; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class RoleDTO { + private String name; + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + + if (!(o instanceof RoleDTO)) + return false; + + RoleDTO other = (RoleDTO)o; + return (this.name == null && other.name == null) + || (this.name != null && this.name.equals(other.name) + ); + } + + @Override + public int hashCode() { + int result = 7; + result = 31 * result + name.hashCode(); + + return result; + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityController.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityController.java index f175449..8035407 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityController.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityController.java @@ -3,10 +3,8 @@ import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.AppUserCredentialsDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -16,13 +14,16 @@ @Slf4j @RestController @RequiredArgsConstructor -public class SecurityController { +@RequestMapping(path = "/api/v1") +class SecurityController { private final SecurityService securityService; @PostMapping("/login") public void login(@RequestBody AppUserCredentialsDTO credentials) { + System.out.println("sdsds"); } + @PreAuthorize("hasAuthority('ROLE_USER')") @GetMapping("/security/refresh-token") public void refreshToken(HttpServletRequest request, HttpServletResponse response) { String refreshToken = request.getHeader(AUTHORIZATION); diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityService.java index 50cd677..630bfd8 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityService.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityService.java @@ -1,27 +1,33 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.security; import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserAdminService; import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; import com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt.JwtUtil; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import static com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt.JwtUtil.TOKEN_PREFIX; @RequiredArgsConstructor @Service -public class SecurityService { - private final AppUserService appUserService; +@Slf4j +class SecurityService { + private final AppUserAdminService appUserAdminService; private final JwtUtil jwtUtil; public String refreshAccessToken(String refreshToken, String issuer) { + String username = jwtUtil.extractUsernameFromRefreshToken(refreshToken, true); - AppUser user = appUserService.getUserByUserName(username); + AppUser user = appUserAdminService.getUserByUserName(username); + + var roleNames = user.getRoles().stream().map(Role::getName).toList(); + String accessToken = jwtUtil.generateAccessToken( username, - user.getRoles().stream().map(Role::getName).toList(), + roleNames, issuer); return TOKEN_PREFIX + accessToken; diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JsonObjectAuthenticationFilter.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JsonObjectAuthenticationFilter.java index fe29781..8728294 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JsonObjectAuthenticationFilter.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JsonObjectAuthenticationFilter.java @@ -14,7 +14,7 @@ import java.io.IOException; @RequiredArgsConstructor -public class JsonObjectAuthenticationFilter extends UsernamePasswordAuthenticationFilter { +class JsonObjectAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final ObjectMapper objectMapper; diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JwtAuthorizationFilter.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JwtAuthorizationFilter.java index 5d4d45f..da5d7b8 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JwtAuthorizationFilter.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/JwtAuthorizationFilter.java @@ -23,7 +23,7 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @Slf4j -public class JwtAuthorizationFilter extends BasicAuthenticationFilter { +class JwtAuthorizationFilter extends BasicAuthenticationFilter { private final UserDetailsService userDetailsService; private final JwtUtil jwtUtil; diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/PasswordEncoder.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/PasswordEncoder.java similarity index 81% rename from src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/PasswordEncoder.java rename to src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/PasswordEncoder.java index 8e19129..dcf4356 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/PasswordEncoder.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/PasswordEncoder.java @@ -1,11 +1,11 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.security; +package com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.crypto.factory.PasswordEncoderFactories; @Configuration -public class PasswordEncoder { +class PasswordEncoder { @Bean public org.springframework.security.crypto.password.PasswordEncoder bCryptPasswordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationFailureHandler.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationFailureHandler.java index a94ce4a..e796bdd 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationFailureHandler.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationFailureHandler.java @@ -10,7 +10,7 @@ import java.io.IOException; @Component -public class RestAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { +class RestAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationSuccessHandler.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationSuccessHandler.java index 013da2e..6df564d 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationSuccessHandler.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/RestAuthenticationSuccessHandler.java @@ -1,7 +1,6 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt; import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt.JwtUtil; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -15,7 +14,7 @@ @Component @RequiredArgsConstructor -public class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { +class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { private final JwtUtil jwtUtil; diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityConfiguration.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/SecurityConfiguration.java similarity index 93% rename from src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityConfiguration.java rename to src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/SecurityConfiguration.java index 51a808c..75c2a6e 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityConfiguration.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/jwt/SecurityConfiguration.java @@ -1,7 +1,6 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.security; +package com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt; import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -22,7 +21,7 @@ @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) -public class SecurityConfiguration { +class SecurityConfiguration { private final UserDetailsService userDetailsService; private final PasswordEncoder bCryptPasswordEncoder; @@ -32,7 +31,6 @@ public class SecurityConfiguration { private final JwtUtil jwtUtil; private final String secret; - private static final String[] AUTH_WHITELIST = { // -- Swagger UI v2 "/v2/api-docs", @@ -75,8 +73,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(AUTH_WHITELIST).permitAll() - .antMatchers("/api/v1/admin/**").hasAuthority("ROLE_ADMIN") - .antMatchers("/api/v1/**").authenticated() + .antMatchers("/**").permitAll() + //.antMatchers("/api/v1/admin/**").hasAuthority("ROLE_ADMIN") + //.antMatchers("/api/v1/**").authenticated() .and() .sessionManagement().sessionCreationPolicy(STATELESS) .and() diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/swagger/SwaggerConfiguration.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/swagger/SwaggerConfiguration.java index 9a4bc7a..b761b7f 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/swagger/SwaggerConfiguration.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/swagger/SwaggerConfiguration.java @@ -21,7 +21,7 @@ @Configuration @EnableCaching -public class SwaggerConfiguration { +class SwaggerConfiguration { public static final String AUTHORIZATION_HEADER = "Authorization"; diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/Transaction.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/Transaction.java index 0109784..b22ab8c 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/Transaction.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/Transaction.java @@ -7,8 +7,11 @@ import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.Type; import org.hibernate.annotations.UpdateTimestamp; +import org.jetbrains.annotations.NotNull; import javax.persistence.*; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; import java.util.Date; @Entity @@ -25,19 +28,20 @@ public class Transaction { @Enumerated(EnumType.STRING) private TransactionType transactionType; - private int value; private int quantity; + @NotEmpty private String title; + @NotNull private String description; - @ManyToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "category_id") private Category category; @JsonIgnore - @ManyToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "appuser_id") private AppUser appuser; diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminController.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminController.java new file mode 100644 index 0000000..5e5f7bf --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminController.java @@ -0,0 +1,70 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.net.URI; +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/api/v1") +class TransactionAdminController { + + private final TransactionAdminService transactionAdminService; + + @GetMapping("/admin/users/{userId:[0-9]+}/transactions/category/{categoryId:[0-9]+}") + public ResponseEntity> getAllTransactionsForGivenUserAndCategory( + @PathVariable long userId, @PathVariable long categoryId, + @RequestParam(defaultValue = "0") Integer page, + @RequestParam(defaultValue = "ASC") Sort.Direction direction, + @RequestParam(defaultValue = "id") String by){ + + var transactions = transactionAdminService.getAllTransactionsForGivenUserAndCategory( + userId, categoryId, page, direction, by); + + return ResponseEntity.ok(transactions); + } + + @GetMapping("/admin/users/{userId:[0-9]+}/transactions") + public ResponseEntity> getAllTransactionsForGivenUser( + @PathVariable long userId, + @RequestParam(defaultValue = "0") Integer page, + @RequestParam(defaultValue = "ASC") Sort.Direction direction, + @RequestParam(defaultValue = "id") String by) { + + var transactions = transactionAdminService.getAllTransactionsForGivenUser(userId, page, direction, by); + + return ResponseEntity.ok(transactions); + } + + @PostMapping("/admin/users/{userId:[0-9]+}/transactions") + ResponseEntity createTransactionForGivenUser(@PathVariable long userId, @RequestBody @Valid CreateTransactionDTO createTransactionDTO){ + var transaction = transactionAdminService.createTransactionForGivenUser(userId, createTransactionDTO); + + return ResponseEntity.created(URI.create("/users/" + userId + "/transactions")).body(transaction); + } + + @PutMapping("/admin/users/{userId:[0-9]+}/transactions/{transactionId:[0-9]+}") + ResponseEntity replaceTransactionForGivenUserIdAndTransactionId( + @PathVariable Long userId, @PathVariable Long transactionId, + @RequestBody CreateTransactionDTO createTransactionDTO) { + + var replacedTransaction = transactionAdminService.replaceTransaction(userId, transactionId, createTransactionDTO); + + return ResponseEntity.ok(replacedTransaction); + } + + @DeleteMapping("/admin/users/transactions/{transactionId:[0-9]+}") + ResponseEntity deleteTransaction(@PathVariable long transactionId) { + transactionAdminService.deleteTransaction(transactionId); + + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminService.java new file mode 100644 index 0000000..0ae0b13 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminService.java @@ -0,0 +1,194 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserAdminService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.CategoryService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.exception.ResourceNotFoundException; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.util.CustomPageable; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.List; +import java.util.function.Function; + +@Service +@Slf4j +public class TransactionAdminService { + + @Autowired + private TransactionRepository transactionRepository; + @Autowired + private CategoryService categoryService; + + @Autowired + private TransactionUtil transactionUtil; + @Autowired + private CustomPageable customPageable; + + @Autowired + private AppUserAdminService appUserAdminService; + + /* + * Circular dependency between appUserService + * and transactionAdminService is avoided + * by lazy loading beans using @PostConstruct + * annotion and getters & setters. + */ + + @PostConstruct + public void init() { + appUserAdminService.setTransactionAdminService(this); + } + + public AppUserAdminService getAppUserService() { + return appUserAdminService; + } + + public List getAllTransactionsForGivenUserAndCategory(long userId, long categoryId, int pageNumber, + Sort.Direction sortDirection, String sortBy) { + + Pageable page = validateAndCreatePageable(pageNumber, sortDirection, sortBy); + + var foundTransactions = getTransactionsByAppuserIdAndCategoryId(userId, categoryId, page); + + return foundTransactions.stream().map(mapToTransactionDTO()).toList(); + } + + @NotNull + private Function mapToTransactionDTO() { + return transactionUtil::mapToTransactionDTO; + } + + private Pageable validateAndCreatePageable(int pageNumber, Sort.Direction sortDirection, String sortBy) { + return customPageable.validateAndCreatePageable(pageNumber, sortDirection, sortBy, Transaction.class); + } + + + private List getTransactionsByAppuserIdAndCategoryId(long userId, long categoryId, Pageable page) { + return transactionRepository.findAllByAppuserIdAndCategoryId(userId, categoryId, page); + } + + public List getAllTransactionsForGivenUser(long userId, int pageNumber, + Sort.Direction sortDirection, String sortBy) { + + Pageable page = validateAndCreatePageable(pageNumber, sortDirection, sortBy); + + var foundTransactions = getTransactionsByAppuserId(userId, page); + + return foundTransactions.stream().map(mapToTransactionDTO()).toList(); + } + + private List getTransactionsByAppuserId(long userId, Pageable page) { + return transactionRepository.findAllByAppuserId(userId, page); + } + + public TransactionDTO createTransactionForGivenUser(long userId, CreateTransactionDTO createTransactionDTO) { + + var transaction = createTransactionFromCreateTransactionDTOAndUserId(createTransactionDTO, userId); + + ifCategoryDoesNotExistsCreate(transaction, createTransactionDTO.getCategoryName()); + + saveTransaction(transaction); + + return mapTransactionToTransactionDTO(transaction); + } + + private Transaction createTransactionFromCreateTransactionDTOAndUserId(CreateTransactionDTO createTransactionDTO, long userId) { + var transaction = transactionUtil.mapToTransaction(createTransactionDTO); + + var appUser = getUserById(userId); + + var category = getCategoryByName(createTransactionDTO.getCategoryName()); + + transaction.setAppuser(appUser); + transaction.setCategory(category); + + return transaction; + } + + private Category getCategoryByName(String categoryName) { + return categoryService.getCategoryByName(categoryName); + } + + private AppUser getUserById(long userId) { + return getAppUserService().getUserById(userId); + } + + private void ifCategoryDoesNotExistsCreate(Transaction transaction, String categoryName) { + if (transaction != null && transaction.getCategory() == null) { + var savedCategory = saveCategory(categoryName); + + transaction.setCategory(savedCategory); + } + } + + private Category saveCategory(String categoryName) { + return categoryService.createCategory(categoryName); + } + + public TransactionDTO replaceTransaction(Long userId, Long transactionId, CreateTransactionDTO createTransactionDTO) { + + var foundTransaction = getTransactionByIdAndByAppuserId(transactionId, userId); + + var overwrittenTransaction = transactionUtil.overwriteTransactionByCreateTransactionDTO(foundTransaction, createTransactionDTO); + + ifCategoryDoesNotExistsCreate(overwrittenTransaction, createTransactionDTO.getCategoryName()); + + saveTransaction(overwrittenTransaction); + + return mapTransactionToTransactionDTO(overwrittenTransaction); + } + + private void checkIfTransactionDoesNotExist(Transaction foundTransaction) { + if(foundTransaction == null) + throw ResourceNotFoundException.createWith("Transaction not found or transaction id is not related with user id"); + } + + private void saveTransaction(Transaction transaction) { + transactionRepository.save(transaction); + } + + private TransactionDTO mapTransactionToTransactionDTO(Transaction transaction) { + + return transactionUtil.mapToTransactionDTO(transaction); + } + + private Transaction getTransactionById(long transactionId) { + return transactionRepository.findById(transactionId) + .orElseThrow(() -> ResourceNotFoundException.createWith("Could not find any user with id " + transactionId)); + } + + public void deleteTransaction(long transactionId) { + var foundTransaction = getTransactionById(transactionId); + + deleteTransactionWithCategory(foundTransaction); + } + + void deleteTransactionWithCategory(Transaction transaction) { + transactionRepository.delete(transaction); + categoryService.checkAndDeleteCategoryIfNotRelated(transaction.getCategory().getId()); + } + + Transaction getTransactionByIdAndByAppuserId(long transactionId, long loggedInUserId) { + var transaction = transactionRepository.findByIdAndAppuserId(transactionId, loggedInUserId); + + checkIfTransactionDoesNotExist(transaction); + + return transaction; + } + + public void deleteTransactionsRelatedWithUser(long userId) { + var transactions = getTransactionsByAppuserId(userId, null); + + transactions + .forEach(this::deleteTransactionWithCategory); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionController.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionController.java deleted file mode 100644 index fef3664..0000000 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; - -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.net.URI; -import java.util.List; - -@RestController -@RequiredArgsConstructor -@RequestMapping(path = "/api/v1") -public class TransactionController { - - private final TransactionService transactionService; - - @GetMapping("/secured/justAuth") - public String justAuthenticated() { - return "auth"; - } - - @GetMapping("/admin/needAdminRole") - public String justAdmin() { - return "role_admin"; - } - - @PostMapping("/admin/users/{userId}/transactions") - ResponseEntity createTransactionForGivenUser(@PathVariable long userId, @RequestBody CreateTransactionDTO createTransactionDTO) { - var transaction = transactionService.createTransactionForGivenUser(userId, createTransactionDTO); - - return ResponseEntity.created(URI.create("/users/" + userId + "/transactions")).body(transaction); - } - - /* - TODO: pageable - req param income, outcome - req param category name instead of id? - */ - @GetMapping("/admin/user/{userId}/transactions/category/{categoryId}") - public ResponseEntity> getAllTransactionsForGivenUserAndCategory(@PathVariable long userId, @PathVariable long categoryId) { - var transactions = transactionService.getAllTransactionsForGivenUserAndCategory(userId, categoryId); - - return ResponseEntity.ok(transactions); - } - - @GetMapping("/admin/users/{userId}/transactions") - public ResponseEntity> getAllTransactionsForGivenUserAndCategory(@PathVariable long userId) { - var transactions = transactionService.getAllTransactionsForGivenUser(userId); - - return ResponseEntity.ok(transactions); - } - -} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionMapperFactory.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionMapperFactory.java new file mode 100644 index 0000000..6d49074 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionMapperFactory.java @@ -0,0 +1,34 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import org.springframework.stereotype.Component; + +@Component +class TransactionMapperFactory { + + public Transaction mapToTransaction(CreateTransactionDTO createTransactionDTO) { + return Transaction.builder() + .transactionType(createTransactionDTO.getTransactionType()) + .value(createTransactionDTO.getValue()) + .quantity(createTransactionDTO.getQuantity()) + .title(createTransactionDTO.getTitle()) + .description(createTransactionDTO.getDescription()) + .build(); + } + + public TransactionDTO mapToTransactionDTO(Transaction transaction) { + + return TransactionDTO.builder() + .id(transaction.getId()) + .categoryName(transaction.getCategory().getName()) + .transactionType(transaction.getTransactionType()) + .value(transaction.getValue()) + .quantity(transaction.getQuantity()) + .title(transaction.getTitle()) + .description(transaction.getDescription()) + .username(transaction.getAppuser().getUsername()) + .build(); + } + +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionRepository.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionRepository.java index d34ddd6..d88a49d 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionRepository.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionRepository.java @@ -1,10 +1,24 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; -public interface TransactionRepository extends JpaRepository { - List findAllByAppuserIdAndCategoryId(long userId, long categoryId); - List findAllByAppuserId(long appUserId); +interface TransactionRepository extends JpaRepository { + List findAllByAppuserIdAndCategoryId(long userId, long categoryId, Pageable pageable); + + @Query("SELECT DISTINCT t" + + " FROM Transaction t" + + " LEFT JOIN FETCH t.category" + + " LEFT JOIN FETCH t.appuser user" + + " LEFT JOIN t.appuser.roles" + + " WHERE user.id = :appUserId") + List findAllByAppuserId(long appUserId, Pageable pageable); + + Transaction findByIdAndAppuserId(long transactionId, long AppuserId); } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionService.java deleted file mode 100644 index 86beb4a..0000000 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionService.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; - -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.CategoryService; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; -import lombok.RequiredArgsConstructor; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -import static com.github.WeeiaEduTeam.InfinityFinanceAPI.util.Util.isPositive; - -@Service -@RequiredArgsConstructor -@Slf4j -public class TransactionService { - - private final TransactionRepository transactionRepository; - private final CategoryService categoryService; - - private final TransactionUtil transactionUtil; - - public List getAllTransactionsForGivenUserAndCategory(long userId, long categoryId) { - var foundTransactions = transactionRepository.findAllByAppuserIdAndCategoryId(userId, categoryId); - - return foundTransactions.stream() - .map(TransactionUtil::mapTransactionToTransactionDTO) - .toList(); - } - - public List getAllTransactionsForGivenUser(long userId) { - var foundTransactions = transactionRepository.findAllByAppuserId(userId); - - return foundTransactions.stream() - .map(TransactionUtil::mapTransactionToTransactionDTO) - .toList(); - } - - public TransactionDTO createTransactionForGivenUser(long userId, CreateTransactionDTO createTransactionDTO) { - if(!isPositive(createTransactionDTO.getQuantity()) || !isPositive(createTransactionDTO.getValue())) { - log.error("Quantity or value is not positive, called from createTransactionForGivenUser\n Create error handler"); - } - - Transaction savedTransaction = null; - - var transaction = transactionUtil.createTransactionFromCreateTransactionDTOAndUserId(createTransactionDTO, userId); - - if (transaction.getAppuser() == null) { - log.error("User not found in appUserService, called from createTransactionForGivenUser\n Create error handler"); - } - - if (transaction.getCategory() == null) { - var savedCategory = saveCategory(createTransactionDTO.getCategoryName()); - - transaction.setCategory(savedCategory); - } - - log.info("Saved succesfully"); - savedTransaction = transactionRepository.save(transaction); - - log.info(String.valueOf(transactionUtil)); - log.info(String.valueOf(savedTransaction)); - - return TransactionUtil.mapTransactionToTransactionDTO(savedTransaction); - } - - private Category saveCategory(String categoryName) { - Category category = Category.builder() - .name(categoryName) - .build(); - - return categoryService.createCategory(category); - } -} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserController.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserController.java new file mode 100644 index 0000000..c9322d2 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserController.java @@ -0,0 +1,73 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.net.URI; +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/api/v1") +class TransactionUserController { + + private final TransactionUserService transactionUserService; + + @PreAuthorize("hasAuthority('ROLE_USER')") + @GetMapping("/users/transactions") + public ResponseEntity> getAllTransactionsForLoggedUser( + @RequestParam(defaultValue = "0") Integer page, + @RequestParam(defaultValue = "ASC") Sort.Direction direction, + @RequestParam(defaultValue = "id") String by) { + + var transactions = transactionUserService.getAllTransactionsForLoggedUser(page, direction, by); + + return ResponseEntity.ok(transactions); + } + + @PreAuthorize("hasAuthority('ROLE_USER')") + @GetMapping("/users/transactions/category/{categoryId:[0-9]+}") + public ResponseEntity> getAllTransactionsForLoggedUserAndGivenCategory( + @PathVariable long categoryId, + @RequestParam(defaultValue = "0") Integer page, + @RequestParam(defaultValue = "ASC") Sort.Direction direction, + @RequestParam(defaultValue = "id") String by) { + + var transactions = transactionUserService.getAllTransactionsForLoggedUserAndGivenCategory(categoryId, page, direction, by); + + return ResponseEntity.ok(transactions); + } + + @PreAuthorize("hasAuthority('ROLE_USER')") + @DeleteMapping("/users/transactions/{transactionId:[0-9]+}") + ResponseEntity deleteSingleTransactionForLoggedUser(@PathVariable long transactionId) { + transactionUserService.deleteSingleTransactionForLoggedUser(transactionId); + + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } + + @PreAuthorize("hasAuthority('ROLE_USER')") + @PostMapping("/users/transactions") + ResponseEntity createTransactionForLoggedUser( @RequestBody CreateTransactionDTO createTransactionDTO) { + var transaction = transactionUserService.createTransactionForLoggedUser(createTransactionDTO); + + return ResponseEntity.created(URI.create("/users/transactions" + transaction.getId())).body(transaction); + } + + @PreAuthorize("hasAuthority('ROLE_USER')") + @PutMapping("/users/transactions/{transactionId:[0-9]+}") + ResponseEntity replaceUniversityWithLocationForLoggedUser( + @PathVariable Long transactionId, + @RequestBody CreateTransactionDTO createTransactionDTO) { + + var replacedTransaction = transactionUserService.replaceTransactionForLoggedUser(transactionId, createTransactionDTO); + + return ResponseEntity.ok(replacedTransaction); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserService.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserService.java new file mode 100644 index 0000000..c523551 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserService.java @@ -0,0 +1,55 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserAdminService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +class TransactionUserService { + private final AppUserAdminService appUserAdminService; + + private final TransactionAdminService transactionAdminService; + + public List getAllTransactionsForLoggedUser(int pageNumber, Sort.Direction sortDirection, String sortBy) { + long loggedInUserId = getLoggedUserId(); + + return transactionAdminService.getAllTransactionsForGivenUser(loggedInUserId, pageNumber, sortDirection, sortBy); + } + + public List getAllTransactionsForLoggedUserAndGivenCategory(long categoryId, int pageNumber, Sort.Direction sortDirection, String sortBy) { + long loggedInUserId = getLoggedUserId(); + + return transactionAdminService.getAllTransactionsForGivenUserAndCategory(loggedInUserId, categoryId, pageNumber, sortDirection, sortBy); + } + public void deleteSingleTransactionForLoggedUser(long transactionId) { + long loggedInUserId = getLoggedUserId(); + + var foundTransaction = transactionAdminService.getTransactionByIdAndByAppuserId(transactionId, loggedInUserId); + + transactionAdminService.deleteTransactionWithCategory(foundTransaction); + } + + public TransactionDTO createTransactionForLoggedUser(CreateTransactionDTO createTransactionDTO) { + long loggedInUserId = getLoggedUserId(); + + return transactionAdminService.createTransactionForGivenUser(loggedInUserId, createTransactionDTO); + } + + public TransactionDTO replaceTransactionForLoggedUser(Long transactionId, CreateTransactionDTO createTransactionDTO) { + long loggedInUserId = getLoggedUserId(); + + return transactionAdminService.replaceTransaction(loggedInUserId, transactionId, createTransactionDTO); + } + + private long getLoggedUserId() { + return appUserAdminService.getLoggedInUserId(); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUtil.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUtil.java index b34b7e5..604d086 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUtil.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUtil.java @@ -1,9 +1,5 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserService; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.CategoryService; import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; import lombok.RequiredArgsConstructor; @@ -13,63 +9,28 @@ @Component @Slf4j @RequiredArgsConstructor -public class TransactionUtil { +class TransactionUtil { - private final AppUserService appUserService; - private final CategoryService categoryService; + private final TransactionMapperFactory transactionMapperFactory; - public Transaction createTransactionFromCreateTransactionDTOAndUserId(CreateTransactionDTO createTransactionDTO, long userId) { - var appUser = getAppUserById(userId); - var category = getCategoryByName(createTransactionDTO.getCategoryName()); - - return Transaction.builder() - .transactionType(createTransactionDTO.getTransactionType()) - .value(createTransactionDTO.getValue()) - .quantity(createTransactionDTO.getQuantity()) - .title(createTransactionDTO.getTitle()) - .description(createTransactionDTO.getDescription()) - .appuser(appUser) - .category(category) - .build(); - } - - public static TransactionDTO mapTransactionToTransactionDTO(Transaction transaction) { - return TransactionDTO.builder() - .categoryName(transaction.getCategory().getName()) - .transactionType(transaction.getTransactionType()) - .value(transaction.getValue()) - .quantity(transaction.getQuantity()) - .title(transaction.getTitle()) - .description(transaction.getDescription()) - .userName(transaction.getAppuser().getUsername()) - .build(); - } - - public Transaction mapTransactionDTOToTransaction(TransactionDTO transactionDTO) { - return Transaction.builder() - .value(transactionDTO.getValue()) - .quantity(transactionDTO.getQuantity()) - .title(transactionDTO.getTitle()) - .description(transactionDTO.getDescription()) - .appuser(getAppUserByUserName(transactionDTO.getUserName())) - .category(getCategoryByName(transactionDTO.getCategoryName())) - .build(); + public Transaction mapToTransaction(CreateTransactionDTO createTransactionDTO) { + return transactionMapperFactory.mapToTransaction(createTransactionDTO); } - private Category getCategoryByName(String categoryName) { - var foundCategory = categoryService.getCategoryByName(categoryName); - - return foundCategory.orElse(null); + public TransactionDTO mapToTransactionDTO(Transaction transaction) { + return transactionMapperFactory.mapToTransactionDTO(transaction); } - private AppUser getAppUserByUserName(String userName) { - - return appUserService.getUserByUserName(userName); - } + public Transaction overwriteTransactionByCreateTransactionDTO(Transaction main, CreateTransactionDTO toConvert) { + var convertedTransaction = mapToTransaction(toConvert); - private AppUser getAppUserById(long userId) { - var foundUser = appUserService.getUserById(userId); + main.setDescription(convertedTransaction.getDescription()); + main.setTitle(convertedTransaction.getTitle()); + main.setTransactionType(convertedTransaction.getTransactionType()); + main.setCategory(convertedTransaction.getCategory()); + main.setValue(convertedTransaction.getValue()); + main.setQuantity(convertedTransaction.getQuantity()); - return foundUser.orElse(null); + return main; } } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/CreateTransactionDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/CreateTransactionDTO.java index 0f75582..267e7ae 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/CreateTransactionDTO.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/CreateTransactionDTO.java @@ -2,6 +2,9 @@ import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.TransactionType; import lombok.*; +import org.jetbrains.annotations.NotNull; + +import javax.validation.constraints.*; @Getter @Setter @@ -12,10 +15,16 @@ public class CreateTransactionDTO { private TransactionType transactionType; - private int value; private int quantity; - private String title; + @Min(value = 1, message = "Value has to be higher or equal to 1") + private int value; + private String description; + + @NotBlank(message = "Title can not be blank") + private String title; + + @NotBlank(message = "Title can not be blank") private String categoryName; } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/TransactionDTO.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/TransactionDTO.java index 403ca28..c9240dc 100644 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/TransactionDTO.java +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/dto/TransactionDTO.java @@ -1,30 +1,37 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.TransactionType; import lombok.*; -import org.hibernate.annotations.CreationTimestamp; -import org.hibernate.annotations.UpdateTimestamp; +import lombok.experimental.FieldNameConstants; -import javax.persistence.*; -import java.util.Date; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; @Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor +@FieldNameConstants public class TransactionDTO { + private long id; private TransactionType transactionType; - private int value; private int quantity; - private String title; + @Min(value = 1, message = "Value has to be higher or equal to 1") + private int value; + private String description; + + @NotBlank(message = "Title can not be blank") + private String title; + + @NotBlank(message = "Title can not be blank") private String categoryName; - private String userName; + + @NotBlank(message = "Title can not be blank") + private String username; } diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/util/CustomPageable.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/util/CustomPageable.java new file mode 100644 index 0000000..2d791a3 --- /dev/null +++ b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/util/CustomPageable.java @@ -0,0 +1,69 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.util; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Optional; + +@Slf4j +@Configuration +@PropertySource("classpath:application.properties") +@RequiredArgsConstructor +public class CustomPageable { + private final int PAGE_SIZE = 6; + + public Pageable validateAndCreatePageable(int pageNumber, Sort.Direction sortDirection, String sortBy, Class clazz) { + pageNumber = validateAndReturnPageNumber(pageNumber); + + sortBy = validateAndReturnSortString(sortBy, clazz); + + return PageRequest.of(pageNumber, PAGE_SIZE, + Sort.by(sortDirection, sortBy) + ); + } + + private String validateAndReturnSortString(String sortBy, Class clazz) { + + Optional output = checkIfStringExistsInClassValue(clazz, sortBy); + + if(notFoundValueInClass(output)) + return "id"; + + return foundValue(output); + } + + @NotNull + private String foundValue(Optional output) { + return output.orElseGet(output::get); + } + + @NotNull + private Optional checkIfStringExistsInClassValue(Class clazz, String sortBy) { + String sortByToLower = sortBy.toLowerCase(); + + return Arrays.stream(clazz.getDeclaredFields()) + .map(Field::getName) + .map(String::toLowerCase) + .filter(item -> item.equals(sortByToLower)) + .findAny(); + } + + private boolean notFoundValueInClass(Optional output) { + return output.isEmpty(); + } + + private int validateAndReturnPageNumber(int number) { + return Math.max(number, 0); + } +} diff --git a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/util/Util.java b/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/util/Util.java deleted file mode 100644 index 88e774e..0000000 --- a/src/main/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/util/Util.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.util; - -public class Util { - public static boolean isPositive(int number) { - return number > 0 ? Boolean.TRUE : Boolean.FALSE; - } -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 861e1d7..3863d40 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,25 +1,37 @@ +# Server settings spring.application.name=InfinityFinance-API server.port=8080 -# Database connection +# Database connection settings spring.datasource.url=jdbc:postgresql://localhost:5432/infinityfinance spring.datasource.username=postgres spring.datasource.password=postgres # Database configuration -spring.jpa.hibernate.ddl-auto=create - +spring.jpa.hibernate.ddl-auto=none spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.show-sql=true spring.jpa.generate-ddl=true -# logging.level.org.hibernate.SQL=DEBUG +#logging.level.org.hibernate.SQL=DEBUG +# Swagger configuration spring.mvc.pathmatch.matching-strategy=ant_path_matcher +# Spring configuration spring.main.allow-circular-references=true +# JWT configuration jwt.access-token-expiration-time=160000 jwt.refresh-token-expiration-time=360000 -jwt.secret=secret \ No newline at end of file +jwt.secret=secret + +# Liquibase configuration +spring.liquibase.change-log=classpath:liquibase-changelog.xml +spring.liquibase.drop-first=true + +management.endpoints.web.cors.mapping-pattern=/** +management.endpoints.web.cors.allowed-methods=GET,POST,PUT,DELETE,PATCH +management.endpoints.web.cors.allowed-headers=* +management.endpoints.web.cors.allowed-origins=* diff --git a/src/main/resources/db/data/01-create/1-create-role.sql b/src/main/resources/db/data/01-create/1-create-role.sql new file mode 100644 index 0000000..1963f5d --- /dev/null +++ b/src/main/resources/db/data/01-create/1-create-role.sql @@ -0,0 +1,12 @@ +--liquibase formatted sql +--changeset pacion:1 +CREATE TABLE role +( + role_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255), + CONSTRAINT pk_role PRIMARY KEY (role_id) +); + +ALTER TABLE role + ADD CONSTRAINT uc_role_name UNIQUE (name); + diff --git a/src/main/resources/db/data/01-create/2-create-user.sql b/src/main/resources/db/data/01-create/2-create-user.sql new file mode 100644 index 0000000..e9f325c --- /dev/null +++ b/src/main/resources/db/data/01-create/2-create-user.sql @@ -0,0 +1,32 @@ +--liquibase formatted sql +--changeset pacion:2 +CREATE TABLE app_user +( + user_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + username VARCHAR(255), + email VARCHAR(255), + password VARCHAR(255), + first_name VARCHAR(255), + second_name VARCHAR(255), + created TIMESTAMP WITHOUT TIME ZONE, + updated TIMESTAMP WITHOUT TIME ZONE, + CONSTRAINT pk_appuser PRIMARY KEY (user_id) +); + +CREATE TABLE user_roles +( + role_id BIGINT NOT NULL, + user_id BIGINT NOT NULL +); + +ALTER TABLE app_user + ADD CONSTRAINT uc_appuser_email UNIQUE (email); + +ALTER TABLE app_user + ADD CONSTRAINT uc_appuser_username UNIQUE (username); + +ALTER TABLE user_roles + ADD CONSTRAINT fk_userol_on_app_user FOREIGN KEY (user_id) REFERENCES app_user (user_id); + +ALTER TABLE user_roles + ADD CONSTRAINT fk_userol_on_role FOREIGN KEY (role_id) REFERENCES role (role_id); \ No newline at end of file diff --git a/src/main/resources/db/data/01-create/3-create-category.sql b/src/main/resources/db/data/01-create/3-create-category.sql new file mode 100644 index 0000000..f3e4ff1 --- /dev/null +++ b/src/main/resources/db/data/01-create/3-create-category.sql @@ -0,0 +1,10 @@ +--liquibase formatted sql +--changeset pacion:3 +CREATE TABLE category +( + category_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255), + created TIMESTAMP WITHOUT TIME ZONE, + updated TIMESTAMP WITHOUT TIME ZONE, + CONSTRAINT pk_category PRIMARY KEY (category_id) +); \ No newline at end of file diff --git a/src/main/resources/db/data/01-create/4-create-transaction.sql b/src/main/resources/db/data/01-create/4-create-transaction.sql new file mode 100644 index 0000000..9561ec9 --- /dev/null +++ b/src/main/resources/db/data/01-create/4-create-transaction.sql @@ -0,0 +1,22 @@ +--liquibase formatted sql +--changeset pacion:4 +CREATE TABLE transaction +( + transaction_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + transaction_type VARCHAR(255), + value INTEGER NOT NULL, + quantity INTEGER NOT NULL, + title VARCHAR(255), + description VARCHAR(255), + category_id BIGINT, + appuser_id BIGINT, + created TIMESTAMP WITHOUT TIME ZONE, + updated TIMESTAMP WITHOUT TIME ZONE, + CONSTRAINT pk_transaction PRIMARY KEY (transaction_id) +); + +ALTER TABLE transaction + ADD CONSTRAINT FK_TRANSACTION_ON_APPUSER FOREIGN KEY (appuser_id) REFERENCES app_user (user_id); + +ALTER TABLE transaction + ADD CONSTRAINT FK_TRANSACTION_ON_CATEGORY FOREIGN KEY (category_id) REFERENCES category (category_id); \ No newline at end of file diff --git a/src/main/resources/db/data/02-insert/5-insert-roles.sql b/src/main/resources/db/data/02-insert/5-insert-roles.sql new file mode 100644 index 0000000..93d2ee2 --- /dev/null +++ b/src/main/resources/db/data/02-insert/5-insert-roles.sql @@ -0,0 +1,4 @@ +--liquibase formatted sql +--changeset pacion:5 +INSERT INTO role (name) VALUES ('ROLE_USER'); +INSERT INTO role (name) VALUES ('ROLE_ADMIN'); diff --git a/src/main/resources/db/data/02-insert/6-insert-users.sql b/src/main/resources/db/data/02-insert/6-insert-users.sql new file mode 100644 index 0000000..6fb2824 --- /dev/null +++ b/src/main/resources/db/data/02-insert/6-insert-users.sql @@ -0,0 +1,24 @@ +--liquibase formatted sql +--changeset pacion:6 +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('admin', 'admin@wp.pl', '{noop}admin', 'admin', 'admin','2022-10-18T09:37:58.955569','2022-10-18T09:37:58.955569'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('user', 'user@wp.pl', '{noop}user', 'user', 'user','2022-10-18T09:37:58.955569','2022-10-18T09:37:58.955569'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test1', 'test1@wp.pl', '{noop}test1', 'test1', 'test1','2022-07-11T09:37:58.956573700','2022-07-11T09:37:58.956573700'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test2', 'test2@wp.pl', '{noop}test2', 'test2', 'test2','2022-07-12T09:37:58.970566300','2022-07-12T09:37:58.970566300'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test3', 'test3@wp.pl', '{noop}test3', 'test3', 'test3','2022-07-13T09:37:58.971565600','2022-07-13T09:37:58.971565600'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test4', 'test4@wp.pl', '{noop}test4', 'test4', 'test4','2022-07-14T09:37:58.971565600','2022-07-14T09:37:58.971565600'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test5', 'test5@wp.pl', '{noop}test5', 'test5', 'test5','2022-07-15T09:37:58.971565600','2022-07-15T09:37:58.971565600'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test6', 'test6@wp.pl', '{noop}test6', 'test6', 'test6','2022-07-16T09:37:58.972564900','2022-07-16T09:37:58.972564900'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test7', 'test7@wp.pl', '{noop}test7', 'test7', 'test7','2022-07-17T09:37:58.972564900','2022-07-17T09:37:58.972564900'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test8', 'test8@wp.pl', '{noop}test8', 'test8', 'test8','2022-07-18T09:37:58.973608','2022-07-18T09:37:58.973608'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test9', 'test9@wp.pl', '{noop}test9', 'test9', 'test9','2022-07-19T09:37:58.973608','2022-07-19T09:37:58.973608'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test10', 'test10@wp.pl', '{noop}test10', 'test10', 'test10','2022-07-20T09:37:58.973608','2022-07-20T09:37:58.973608'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test11', 'test11@wp.pl', '{noop}test11', 'test11', 'test11','2022-07-21T09:37:58.974563600','2022-07-21T09:37:58.974563600'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test12', 'test12@wp.pl', '{noop}test12', 'test12', 'test12','2022-07-22T09:37:58.974563600','2022-07-22T09:37:58.974563600'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test13', 'test13@wp.pl', '{noop}test13', 'test13', 'test13','2022-07-23T09:37:58.974563600','2022-07-23T09:37:58.974563600'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test14', 'test14@wp.pl', '{noop}test14', 'test14', 'test14','2022-07-24T09:37:58.974563600','2022-07-24T09:37:58.974563600'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test15', 'test15@wp.pl', '{noop}test15', 'test15', 'test15','2022-07-25T09:37:58.975564100','2022-07-25T09:37:58.975564100'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test16', 'test16@wp.pl', '{noop}test16', 'test16', 'test16','2022-07-26T09:37:58.975564100','2022-07-26T09:37:58.975564100'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test17', 'test17@wp.pl', '{noop}test17', 'test17', 'test17','2022-07-27T09:37:58.975564100','2022-07-27T09:37:58.975564100'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test18', 'test18@wp.pl', '{noop}test18', 'test18', 'test18','2022-07-28T09:37:58.976566700','2022-07-28T09:37:58.976566700'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test19', 'test19@wp.pl', '{noop}test19', 'test19', 'test19','2022-07-29T09:37:58.976566700','2022-07-29T09:37:58.976566700'); +INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)VALUES ('test20', 'test20@wp.pl', '{noop}test20', 'test20', 'test20','2022-07-30T09:37:58.976566700','2022-07-30T09:37:58.976566700'); diff --git a/src/main/resources/db/data/02-insert/7-insert-relationUserRole.sql b/src/main/resources/db/data/02-insert/7-insert-relationUserRole.sql new file mode 100644 index 0000000..4935026 --- /dev/null +++ b/src/main/resources/db/data/02-insert/7-insert-relationUserRole.sql @@ -0,0 +1,35 @@ +--liquibase formatted sql +--changeset pacion:7 +INSERT INTO user_roles (role_id, user_id) VALUES(1,1); +INSERT INTO user_roles (role_id, user_id) VALUES(2,1); +INSERT INTO user_roles (role_id, user_id) VALUES(1,2); +INSERT INTO user_roles (role_id, user_id) VALUES(2,3); +INSERT INTO user_roles (role_id, user_id) VALUES(1,3); +INSERT INTO user_roles (role_id, user_id) VALUES(1,4); +INSERT INTO user_roles (role_id, user_id) VALUES(2,5); +INSERT INTO user_roles (role_id, user_id) VALUES(1,5); +INSERT INTO user_roles (role_id, user_id) VALUES(1,6); +INSERT INTO user_roles (role_id, user_id) VALUES(2,7); +INSERT INTO user_roles (role_id, user_id) VALUES(1,7); +INSERT INTO user_roles (role_id, user_id) VALUES(1,8); +INSERT INTO user_roles (role_id, user_id) VALUES(2,9); +INSERT INTO user_roles (role_id, user_id) VALUES(1,9); +INSERT INTO user_roles (role_id, user_id) VALUES(1,10); +INSERT INTO user_roles (role_id, user_id) VALUES(2,11); +INSERT INTO user_roles (role_id, user_id) VALUES(1,11); +INSERT INTO user_roles (role_id, user_id) VALUES(1,12); +INSERT INTO user_roles (role_id, user_id) VALUES(2,13); +INSERT INTO user_roles (role_id, user_id) VALUES(1,13); +INSERT INTO user_roles (role_id, user_id) VALUES(1,14); +INSERT INTO user_roles (role_id, user_id) VALUES(2,15); +INSERT INTO user_roles (role_id, user_id) VALUES(1,15); +INSERT INTO user_roles (role_id, user_id) VALUES(1,16); +INSERT INTO user_roles (role_id, user_id) VALUES(2,17); +INSERT INTO user_roles (role_id, user_id) VALUES(1,17); +INSERT INTO user_roles (role_id, user_id) VALUES(1,18); +INSERT INTO user_roles (role_id, user_id) VALUES(2,19); +INSERT INTO user_roles (role_id, user_id) VALUES(1,19); +INSERT INTO user_roles (role_id, user_id) VALUES(1,20); +INSERT INTO user_roles (role_id, user_id) VALUES(2,21); +INSERT INTO user_roles (role_id, user_id) VALUES(1,21); +INSERT INTO user_roles (role_id, user_id) VALUES(1,22); diff --git a/src/main/resources/db/data/02-insert/8-insert-categories.sql b/src/main/resources/db/data/02-insert/8-insert-categories.sql new file mode 100644 index 0000000..2a3c5ae --- /dev/null +++ b/src/main/resources/db/data/02-insert/8-insert-categories.sql @@ -0,0 +1,22 @@ +--liquibase formatted sql +--changeset pacion:8 +INSERT INTO category (name, created, updated) VALUES ('Test name 1','2022-07-11T09:37:58.985565','2022-07-11T09:37:58.985565'); +INSERT INTO category (name, created, updated) VALUES ('Test name 2','2022-07-12T09:37:58.986562900','2022-07-12T09:37:58.986562900'); +INSERT INTO category (name, created, updated) VALUES ('Test name 3','2022-07-13T09:37:58.986562900','2022-07-13T09:37:58.986562900'); +INSERT INTO category (name, created, updated) VALUES ('Test name 4','2022-07-14T09:37:58.987565900','2022-07-14T09:37:58.987565900'); +INSERT INTO category (name, created, updated) VALUES ('Test name 5','2022-07-15T09:37:58.987565900','2022-07-15T09:37:58.987565900'); +INSERT INTO category (name, created, updated) VALUES ('Test name 6','2022-07-16T09:37:58.987565900','2022-07-16T09:37:58.987565900'); +INSERT INTO category (name, created, updated) VALUES ('Test name 7','2022-07-17T09:37:58.987565900','2022-07-17T09:37:58.987565900'); +INSERT INTO category (name, created, updated) VALUES ('Test name 8','2022-07-18T09:37:58.988562','2022-07-18T09:37:58.988562'); +INSERT INTO category (name, created, updated) VALUES ('Test name 9','2022-07-19T09:37:58.988562','2022-07-19T09:37:58.988562'); +INSERT INTO category (name, created, updated) VALUES ('Test name 10','2022-07-20T09:37:58.988562','2022-07-20T09:37:58.988562'); +INSERT INTO category (name, created, updated) VALUES ('Test name 11','2022-07-21T09:37:58.988562','2022-07-21T09:37:58.988562'); +INSERT INTO category (name, created, updated) VALUES ('Test name 12','2022-07-22T09:37:58.989568800','2022-07-22T09:37:58.989568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 13','2022-07-23T09:37:58.989568800','2022-07-23T09:37:58.989568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 14','2022-07-24T09:37:58.989568800','2022-07-24T09:37:58.989568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 15','2022-07-25T09:37:58.989568800','2022-07-25T09:37:58.989568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 16','2022-07-26T09:37:58.990568800','2022-07-26T09:37:58.990568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 17','2022-07-27T09:37:58.990568800','2022-07-27T09:37:58.990568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 18','2022-07-28T09:37:58.990568800','2022-07-28T09:37:58.990568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 19','2022-07-29T09:37:58.990568800','2022-07-29T09:37:58.990568800'); +INSERT INTO category (name, created, updated) VALUES ('Test name 20','2022-07-30T09:37:58.991568100','2022-07-30T09:37:58.991568100'); diff --git a/src/main/resources/db/data/02-insert/9-insert-transactions.sql b/src/main/resources/db/data/02-insert/9-insert-transactions.sql new file mode 100644 index 0000000..39bef0f --- /dev/null +++ b/src/main/resources/db/data/02-insert/9-insert-transactions.sql @@ -0,0 +1,1002 @@ +--liquibase formatted sql +--changeset pacion:9 +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 13, 100, 'Title 1', 'Description 1', 2, '2' ,'2022-10-17T09:37:58.992565200','2022-10-17T09:37:58.992565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 24, 99, 'Title 2', 'Description 2', 3, '3' ,'2022-10-16T09:37:59.011564300','2022-10-16T09:37:59.011564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 37, 98, 'Title 3', 'Description 3', 4, '4' ,'2022-10-15T09:37:59.011564300','2022-10-15T09:37:59.011564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 48, 97, 'Title 4', 'Description 4', 5, '5' ,'2022-10-14T09:37:59.012565600','2022-10-14T09:37:59.012565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 61, 96, 'Title 5', 'Description 5', 6, '6' ,'2022-10-13T09:37:59.012565600','2022-10-13T09:37:59.012565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 72, 95, 'Title 6', 'Description 6', 7, '7' ,'2022-10-12T09:37:59.013564900','2022-10-12T09:37:59.013564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 85, 94, 'Title 7', 'Description 7', 8, '8' ,'2022-10-11T09:37:59.013564900','2022-10-11T09:37:59.013564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 96, 93, 'Title 8', 'Description 8', 9, '9' ,'2022-10-10T09:37:59.013564900','2022-10-10T09:37:59.013564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 109, 101, 'Title 9', 'Description 9', 10, '10' ,'2022-10-09T09:37:59.014564800','2022-10-09T09:37:59.014564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 20, 100, 'Title 10', 'Description 10', 11, '11' ,'2022-10-08T09:37:59.014564800','2022-10-08T09:37:59.014564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 33, 99, 'Title 11', 'Description 11', 12, '12' ,'2022-10-07T09:37:59.014564800','2022-10-07T09:37:59.014564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 44, 98, 'Title 12', 'Description 12', 13, '13' ,'2022-10-06T09:37:59.015567300','2022-10-06T09:37:59.015567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 57, 97, 'Title 13', 'Description 13', 14, '14' ,'2022-10-05T09:37:59.015567300','2022-10-05T09:37:59.015567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 68, 96, 'Title 14', 'Description 14', 15, '15' ,'2022-10-04T09:37:59.015567300','2022-10-04T09:37:59.015567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 81, 95, 'Title 15', 'Description 15', 16, '16' ,'2022-10-03T09:37:59.015567300','2022-10-03T09:37:59.015567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 92, 94, 'Title 16', 'Description 16', 17, '17' ,'2022-10-02T09:37:59.016563400','2022-10-02T09:37:59.016563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 105, 93, 'Title 17', 'Description 17', 18, '18' ,'2022-10-01T09:37:59.016563400','2022-10-01T09:37:59.016563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 116, 101, 'Title 18', 'Description 18', 19, '19' ,'2022-09-30T09:37:59.016563400','2022-09-30T09:37:59.016563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 129, 100, 'Title 19', 'Description 19', 20, '20' ,'2022-09-29T09:37:59.016563400','2022-09-29T09:37:59.016563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 40, 99, 'Title 20', 'Description 20', 1, '21' ,'2022-09-28T09:37:59.017564','2022-09-28T09:37:59.017564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 53, 98, 'Title 21', 'Description 21', 2, '22' ,'2022-09-27T09:37:59.017564','2022-09-27T09:37:59.017564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 64, 97, 'Title 22', 'Description 22', 3, '1' ,'2022-09-26T09:37:59.017564','2022-09-26T09:37:59.017564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 77, 96, 'Title 23', 'Description 23', 4, '2' ,'2022-09-25T09:37:59.018563300','2022-09-25T09:37:59.018563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 88, 95, 'Title 24', 'Description 24', 5, '3' ,'2022-09-24T09:37:59.018563300','2022-09-24T09:37:59.018563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 101, 94, 'Title 25', 'Description 25', 6, '4' ,'2022-09-23T09:37:59.019564800','2022-09-23T09:37:59.019564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 112, 93, 'Title 26', 'Description 26', 7, '5' ,'2022-09-22T09:37:59.019564800','2022-09-22T09:37:59.019564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 125, 101, 'Title 27', 'Description 27', 8, '6' ,'2022-09-21T09:37:59.019564800','2022-09-21T09:37:59.019564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 136, 100, 'Title 28', 'Description 28', 9, '7' ,'2022-09-20T09:37:59.019564800','2022-09-20T09:37:59.019564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 149, 99, 'Title 29', 'Description 29', 10, '8' ,'2022-09-19T09:37:59.020567100','2022-09-19T09:37:59.020567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 60, 98, 'Title 30', 'Description 30', 11, '9' ,'2022-09-18T09:37:59.020567100','2022-09-18T09:37:59.020567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 73, 97, 'Title 31', 'Description 31', 12, '10' ,'2022-09-17T09:37:59.020567100','2022-09-17T09:37:59.020567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 84, 96, 'Title 32', 'Description 32', 13, '11' ,'2022-09-16T09:37:59.021565400','2022-09-16T09:37:59.021565400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 97, 95, 'Title 33', 'Description 33', 14, '12' ,'2022-09-15T09:37:59.021565400','2022-09-15T09:37:59.021565400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 108, 94, 'Title 34', 'Description 34', 15, '13' ,'2022-09-14T09:37:59.021565400','2022-09-14T09:37:59.021565400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 121, 93, 'Title 35', 'Description 35', 16, '14' ,'2022-09-13T09:37:59.022564800','2022-09-13T09:37:59.022564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 132, 101, 'Title 36', 'Description 36', 17, '15' ,'2022-09-12T09:37:59.022564800','2022-09-12T09:37:59.022564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 145, 100, 'Title 37', 'Description 37', 18, '16' ,'2022-09-11T09:37:59.022564800','2022-09-11T09:37:59.022564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 156, 99, 'Title 38', 'Description 38', 19, '17' ,'2022-09-10T09:37:59.023565700','2022-09-10T09:37:59.023565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 169, 98, 'Title 39', 'Description 39', 20, '18' ,'2022-09-09T09:37:59.023565700','2022-09-09T09:37:59.023565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 80, 97, 'Title 40', 'Description 40', 1, '19' ,'2022-09-08T09:37:59.023565700','2022-09-08T09:37:59.023565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 93, 96, 'Title 41', 'Description 41', 2, '20' ,'2022-09-07T09:37:59.023565700','2022-09-07T09:37:59.023565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 104, 95, 'Title 42', 'Description 42', 3, '21' ,'2022-09-06T09:37:59.024566500','2022-09-06T09:37:59.024566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 117, 94, 'Title 43', 'Description 43', 4, '22' ,'2022-09-05T09:37:59.024566500','2022-09-05T09:37:59.024566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 128, 93, 'Title 44', 'Description 44', 5, '1' ,'2022-09-04T09:37:59.025563700','2022-09-04T09:37:59.025563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 141, 101, 'Title 45', 'Description 45', 6, '2' ,'2022-09-03T09:37:59.025563700','2022-09-03T09:37:59.025563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 152, 100, 'Title 46', 'Description 46', 7, '3' ,'2022-09-02T09:37:59.025563700','2022-09-02T09:37:59.025563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 165, 99, 'Title 47', 'Description 47', 8, '4' ,'2022-09-01T09:37:59.025563700','2022-09-01T09:37:59.025563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 176, 98, 'Title 48', 'Description 48', 9, '5' ,'2022-08-31T09:37:59.026565100','2022-08-31T09:37:59.026565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 189, 97, 'Title 49', 'Description 49', 10, '6' ,'2022-08-30T09:37:59.026565100','2022-08-30T09:37:59.026565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 100, 96, 'Title 50', 'Description 50', 11, '7' ,'2022-08-29T09:37:59.026565100','2022-08-29T09:37:59.026565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 113, 95, 'Title 51', 'Description 51', 12, '8' ,'2022-08-28T09:37:59.027564800','2022-08-28T09:37:59.027564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 124, 94, 'Title 52', 'Description 52', 13, '9' ,'2022-08-27T09:37:59.027564800','2022-08-27T09:37:59.027564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 137, 93, 'Title 53', 'Description 53', 14, '10' ,'2022-08-26T09:37:59.027564800','2022-08-26T09:37:59.027564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 148, 101, 'Title 54', 'Description 54', 15, '11' ,'2022-08-25T09:37:59.027564800','2022-08-25T09:37:59.027564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 161, 100, 'Title 55', 'Description 55', 16, '12' ,'2022-08-24T09:37:59.028564200','2022-08-24T09:37:59.028564200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 172, 99, 'Title 56', 'Description 56', 17, '13' ,'2022-08-23T09:37:59.028564200','2022-08-23T09:37:59.028564200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 185, 98, 'Title 57', 'Description 57', 18, '14' ,'2022-08-22T09:37:59.028564200','2022-08-22T09:37:59.028564200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 196, 97, 'Title 58', 'Description 58', 19, '15' ,'2022-08-21T09:37:59.028564200','2022-08-21T09:37:59.028564200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 209, 96, 'Title 59', 'Description 59', 20, '16' ,'2022-08-20T09:37:59.029565100','2022-08-20T09:37:59.029565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 120, 95, 'Title 60', 'Description 60', 1, '17' ,'2022-08-19T09:37:59.029565100','2022-08-19T09:37:59.029565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 133, 94, 'Title 61', 'Description 61', 2, '18' ,'2022-08-18T09:37:59.029565100','2022-08-18T09:37:59.029565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 144, 93, 'Title 62', 'Description 62', 3, '19' ,'2022-08-17T09:37:59.030567300','2022-08-17T09:37:59.030567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 157, 101, 'Title 63', 'Description 63', 4, '20' ,'2022-08-16T09:37:59.030567300','2022-08-16T09:37:59.030567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 168, 100, 'Title 64', 'Description 64', 5, '21' ,'2022-08-15T09:37:59.030567300','2022-08-15T09:37:59.030567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 181, 99, 'Title 65', 'Description 65', 6, '22' ,'2022-08-14T09:37:59.031566400','2022-08-14T09:37:59.031566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 192, 98, 'Title 66', 'Description 66', 7, '1' ,'2022-08-13T09:37:59.031566400','2022-08-13T09:37:59.031566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 205, 97, 'Title 67', 'Description 67', 8, '2' ,'2022-08-12T09:37:59.031566400','2022-08-12T09:37:59.031566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 216, 96, 'Title 68', 'Description 68', 9, '3' ,'2022-08-11T09:37:59.031566400','2022-08-11T09:37:59.031566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 229, 95, 'Title 69', 'Description 69', 10, '4' ,'2022-08-10T09:37:59.031566400','2022-08-10T09:37:59.031566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 140, 94, 'Title 70', 'Description 70', 11, '5' ,'2022-08-09T09:37:59.032563600','2022-08-09T09:37:59.032563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 153, 93, 'Title 71', 'Description 71', 12, '6' ,'2022-08-08T09:37:59.032563600','2022-08-08T09:37:59.032563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 164, 101, 'Title 72', 'Description 72', 13, '7' ,'2022-08-07T09:37:59.032563600','2022-08-07T09:37:59.032563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 177, 100, 'Title 73', 'Description 73', 14, '8' ,'2022-08-06T09:37:59.033564800','2022-08-06T09:37:59.033564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 188, 99, 'Title 74', 'Description 74', 15, '9' ,'2022-08-05T09:37:59.033564800','2022-08-05T09:37:59.033564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 201, 98, 'Title 75', 'Description 75', 16, '10' ,'2022-08-04T09:37:59.033564800','2022-08-04T09:37:59.033564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 212, 97, 'Title 76', 'Description 76', 17, '11' ,'2022-08-03T09:37:59.033564800','2022-08-03T09:37:59.033564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 225, 96, 'Title 77', 'Description 77', 18, '12' ,'2022-08-02T09:37:59.033564800','2022-08-02T09:37:59.033564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 236, 95, 'Title 78', 'Description 78', 19, '13' ,'2022-08-01T09:37:59.034562700','2022-08-01T09:37:59.034562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 249, 94, 'Title 79', 'Description 79', 20, '14' ,'2022-07-31T09:37:59.034562700','2022-07-31T09:37:59.034562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 160, 93, 'Title 80', 'Description 80', 1, '15' ,'2022-07-30T09:37:59.034562700','2022-07-30T09:37:59.034562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 173, 101, 'Title 81', 'Description 81', 2, '16' ,'2022-07-29T09:37:59.034562700','2022-07-29T09:37:59.034562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 184, 100, 'Title 82', 'Description 82', 3, '17' ,'2022-07-28T09:37:59.035563100','2022-07-28T09:37:59.035563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 197, 99, 'Title 83', 'Description 83', 4, '18' ,'2022-07-27T09:37:59.035563100','2022-07-27T09:37:59.035563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 208, 98, 'Title 84', 'Description 84', 5, '19' ,'2022-07-26T09:37:59.035563100','2022-07-26T09:37:59.035563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 221, 97, 'Title 85', 'Description 85', 6, '20' ,'2022-07-25T09:37:59.035563100','2022-07-25T09:37:59.035563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 232, 96, 'Title 86', 'Description 86', 7, '21' ,'2022-07-24T09:37:59.035563100','2022-07-24T09:37:59.035563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 245, 95, 'Title 87', 'Description 87', 8, '22' ,'2022-07-23T09:37:59.036566700','2022-07-23T09:37:59.036566700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 256, 94, 'Title 88', 'Description 88', 9, '1' ,'2022-07-22T09:37:59.036566700','2022-07-22T09:37:59.036566700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 269, 93, 'Title 89', 'Description 89', 10, '2' ,'2022-07-21T09:37:59.037566100','2022-07-21T09:37:59.037566100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 180, 101, 'Title 90', 'Description 90', 11, '3' ,'2022-07-20T09:37:59.037566100','2022-07-20T09:37:59.037566100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 193, 100, 'Title 91', 'Description 91', 12, '4' ,'2022-07-19T09:37:59.038568100','2022-07-19T09:37:59.038568100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 204, 99, 'Title 92', 'Description 92', 13, '5' ,'2022-07-18T09:37:59.038568100','2022-07-18T09:37:59.038568100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 217, 98, 'Title 93', 'Description 93', 14, '6' ,'2022-07-17T09:37:59.038568100','2022-07-17T09:37:59.038568100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 228, 97, 'Title 94', 'Description 94', 15, '7' ,'2022-07-16T09:37:59.039569','2022-07-16T09:37:59.039569'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 241, 96, 'Title 95', 'Description 95', 16, '8' ,'2022-07-15T09:37:59.039569','2022-07-15T09:37:59.039569'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 252, 95, 'Title 96', 'Description 96', 17, '9' ,'2022-07-14T09:37:59.039569','2022-07-14T09:37:59.039569'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 265, 94, 'Title 97', 'Description 97', 18, '10' ,'2022-07-13T09:37:59.039569','2022-07-13T09:37:59.039569'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 276, 93, 'Title 98', 'Description 98', 19, '11' ,'2022-07-12T09:37:59.040567100','2022-07-12T09:37:59.040567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 289, 101, 'Title 99', 'Description 99', 20, '12' ,'2022-07-11T09:37:59.040567100','2022-07-11T09:37:59.040567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 200, 100, 'Title 100', 'Description 100', 1, '13' ,'2022-07-10T09:37:59.040567100','2022-07-10T09:37:59.040567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 213, 99, 'Title 101', 'Description 101', 2, '14' ,'2022-07-09T09:37:59.040567100','2022-07-09T09:37:59.040567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 224, 98, 'Title 102', 'Description 102', 3, '15' ,'2022-07-08T09:37:59.041564300','2022-07-08T09:37:59.041564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 237, 97, 'Title 103', 'Description 103', 4, '16' ,'2022-07-07T09:37:59.041564300','2022-07-07T09:37:59.041564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 248, 96, 'Title 104', 'Description 104', 5, '17' ,'2022-07-06T09:37:59.041564300','2022-07-06T09:37:59.041564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 261, 95, 'Title 105', 'Description 105', 6, '18' ,'2022-07-05T09:37:59.041564300','2022-07-05T09:37:59.041564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 272, 94, 'Title 106', 'Description 106', 7, '19' ,'2022-07-04T09:37:59.042566500','2022-07-04T09:37:59.042566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 285, 93, 'Title 107', 'Description 107', 8, '20' ,'2022-07-03T09:37:59.042566500','2022-07-03T09:37:59.042566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 296, 101, 'Title 108', 'Description 108', 9, '21' ,'2022-07-02T09:37:59.042566500','2022-07-02T09:37:59.042566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 309, 100, 'Title 109', 'Description 109', 10, '22' ,'2022-07-01T09:37:59.043564400','2022-07-01T09:37:59.043564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 220, 99, 'Title 110', 'Description 110', 11, '1' ,'2022-06-30T09:37:59.043564400','2022-06-30T09:37:59.043564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 233, 98, 'Title 111', 'Description 111', 12, '2' ,'2022-06-29T09:37:59.043564400','2022-06-29T09:37:59.043564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 244, 97, 'Title 112', 'Description 112', 13, '3' ,'2022-06-28T09:37:59.044570300','2022-06-28T09:37:59.044570300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 257, 96, 'Title 113', 'Description 113', 14, '4' ,'2022-06-27T09:37:59.044570300','2022-06-27T09:37:59.044570300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 268, 95, 'Title 114', 'Description 114', 15, '5' ,'2022-06-26T09:37:59.044570300','2022-06-26T09:37:59.044570300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 281, 94, 'Title 115', 'Description 115', 16, '6' ,'2022-06-25T09:37:59.045564500','2022-06-25T09:37:59.045564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 292, 93, 'Title 116', 'Description 116', 17, '7' ,'2022-06-24T09:37:59.045564500','2022-06-24T09:37:59.045564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 305, 101, 'Title 117', 'Description 117', 18, '8' ,'2022-06-23T09:37:59.045564500','2022-06-23T09:37:59.045564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 316, 100, 'Title 118', 'Description 118', 19, '9' ,'2022-06-22T09:37:59.045564500','2022-06-22T09:37:59.045564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 329, 99, 'Title 119', 'Description 119', 20, '10' ,'2022-06-21T09:37:59.046565200','2022-06-21T09:37:59.046565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 240, 98, 'Title 120', 'Description 120', 1, '11' ,'2022-06-20T09:37:59.046565200','2022-06-20T09:37:59.046565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 253, 97, 'Title 121', 'Description 121', 2, '12' ,'2022-06-19T09:37:59.046565200','2022-06-19T09:37:59.046565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 264, 96, 'Title 122', 'Description 122', 3, '13' ,'2022-06-18T09:37:59.046565200','2022-06-18T09:37:59.046565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 277, 95, 'Title 123', 'Description 123', 4, '14' ,'2022-06-17T09:37:59.047565500','2022-06-17T09:37:59.047565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 288, 94, 'Title 124', 'Description 124', 5, '15' ,'2022-06-16T09:37:59.047565500','2022-06-16T09:37:59.047565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 301, 93, 'Title 125', 'Description 125', 6, '16' ,'2022-06-15T09:37:59.048561600','2022-06-15T09:37:59.048561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 312, 101, 'Title 126', 'Description 126', 7, '17' ,'2022-06-14T09:37:59.048561600','2022-06-14T09:37:59.048561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 325, 100, 'Title 127', 'Description 127', 8, '18' ,'2022-06-13T09:37:59.048561600','2022-06-13T09:37:59.048561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 336, 99, 'Title 128', 'Description 128', 9, '19' ,'2022-06-12T09:37:59.048561600','2022-06-12T09:37:59.048561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 349, 98, 'Title 129', 'Description 129', 10, '20' ,'2022-06-11T09:37:59.049562','2022-06-11T09:37:59.049562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 260, 97, 'Title 130', 'Description 130', 11, '21' ,'2022-06-10T09:37:59.049562','2022-06-10T09:37:59.049562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 273, 96, 'Title 131', 'Description 131', 12, '22' ,'2022-06-09T09:37:59.049562','2022-06-09T09:37:59.049562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 284, 95, 'Title 132', 'Description 132', 13, '1' ,'2022-06-08T09:37:59.050562','2022-06-08T09:37:59.050562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 297, 94, 'Title 133', 'Description 133', 14, '2' ,'2022-06-07T09:37:59.050562','2022-06-07T09:37:59.050562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 308, 93, 'Title 134', 'Description 134', 15, '3' ,'2022-06-06T09:37:59.050562','2022-06-06T09:37:59.050562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 321, 101, 'Title 135', 'Description 135', 16, '4' ,'2022-06-05T09:37:59.051562','2022-06-05T09:37:59.051562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 332, 100, 'Title 136', 'Description 136', 17, '5' ,'2022-06-04T09:37:59.051562','2022-06-04T09:37:59.051562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 345, 99, 'Title 137', 'Description 137', 18, '6' ,'2022-06-03T09:37:59.051562','2022-06-03T09:37:59.051562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 356, 98, 'Title 138', 'Description 138', 19, '7' ,'2022-06-02T09:37:59.051562','2022-06-02T09:37:59.051562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 369, 97, 'Title 139', 'Description 139', 20, '8' ,'2022-06-01T09:37:59.051562','2022-06-01T09:37:59.051562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 280, 96, 'Title 140', 'Description 140', 1, '9' ,'2022-05-31T09:37:59.052561600','2022-05-31T09:37:59.052561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 293, 95, 'Title 141', 'Description 141', 2, '10' ,'2022-05-30T09:37:59.052561600','2022-05-30T09:37:59.052561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 304, 94, 'Title 142', 'Description 142', 3, '11' ,'2022-05-29T09:37:59.052561600','2022-05-29T09:37:59.052561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 317, 93, 'Title 143', 'Description 143', 4, '12' ,'2022-05-28T09:37:59.052561600','2022-05-28T09:37:59.052561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 328, 101, 'Title 144', 'Description 144', 5, '13' ,'2022-05-27T09:37:59.053561800','2022-05-27T09:37:59.053561800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 341, 100, 'Title 145', 'Description 145', 6, '14' ,'2022-05-26T09:37:59.053561800','2022-05-26T09:37:59.053561800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 352, 99, 'Title 146', 'Description 146', 7, '15' ,'2022-05-25T09:37:59.053561800','2022-05-25T09:37:59.053561800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 365, 98, 'Title 147', 'Description 147', 8, '16' ,'2022-05-24T09:37:59.053561800','2022-05-24T09:37:59.053561800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 376, 97, 'Title 148', 'Description 148', 9, '17' ,'2022-05-23T09:37:59.054562300','2022-05-23T09:37:59.054562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 389, 96, 'Title 149', 'Description 149', 10, '18' ,'2022-05-22T09:37:59.054562300','2022-05-22T09:37:59.054562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 300, 95, 'Title 150', 'Description 150', 11, '19' ,'2022-05-21T09:37:59.055564800','2022-05-21T09:37:59.055564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 313, 94, 'Title 151', 'Description 151', 12, '20' ,'2022-05-20T09:37:59.055564800','2022-05-20T09:37:59.055564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 324, 93, 'Title 152', 'Description 152', 13, '21' ,'2022-05-19T09:37:59.055564800','2022-05-19T09:37:59.055564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 337, 101, 'Title 153', 'Description 153', 14, '22' ,'2022-05-18T09:37:59.056566400','2022-05-18T09:37:59.056566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 348, 100, 'Title 154', 'Description 154', 15, '1' ,'2022-05-17T09:37:59.056566400','2022-05-17T09:37:59.056566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 361, 99, 'Title 155', 'Description 155', 16, '2' ,'2022-05-16T09:37:59.056566400','2022-05-16T09:37:59.056566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 372, 98, 'Title 156', 'Description 156', 17, '3' ,'2022-05-15T09:37:59.056566400','2022-05-15T09:37:59.056566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 385, 97, 'Title 157', 'Description 157', 18, '4' ,'2022-05-14T09:37:59.057566','2022-05-14T09:37:59.057566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 396, 96, 'Title 158', 'Description 158', 19, '5' ,'2022-05-13T09:37:59.057566','2022-05-13T09:37:59.057566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 409, 95, 'Title 159', 'Description 159', 20, '6' ,'2022-05-12T09:37:59.057566','2022-05-12T09:37:59.057566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 320, 94, 'Title 160', 'Description 160', 1, '7' ,'2022-05-11T09:37:59.058567700','2022-05-11T09:37:59.058567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 333, 93, 'Title 161', 'Description 161', 2, '8' ,'2022-05-10T09:37:59.058567700','2022-05-10T09:37:59.058567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 344, 101, 'Title 162', 'Description 162', 3, '9' ,'2022-05-09T09:37:59.058567700','2022-05-09T09:37:59.058567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 357, 100, 'Title 163', 'Description 163', 4, '10' ,'2022-05-08T09:37:59.058567700','2022-05-08T09:37:59.058567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 368, 99, 'Title 164', 'Description 164', 5, '11' ,'2022-05-07T09:37:59.059564600','2022-05-07T09:37:59.059564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 381, 98, 'Title 165', 'Description 165', 6, '12' ,'2022-05-06T09:37:59.059564600','2022-05-06T09:37:59.059564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 392, 97, 'Title 166', 'Description 166', 7, '13' ,'2022-05-05T09:37:59.059564600','2022-05-05T09:37:59.059564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 405, 96, 'Title 167', 'Description 167', 8, '14' ,'2022-05-04T09:37:59.060564400','2022-05-04T09:37:59.060564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 416, 95, 'Title 168', 'Description 168', 9, '15' ,'2022-05-03T09:37:59.060564400','2022-05-03T09:37:59.060564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 429, 94, 'Title 169', 'Description 169', 10, '16' ,'2022-05-02T09:37:59.060564400','2022-05-02T09:37:59.060564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 340, 93, 'Title 170', 'Description 170', 11, '17' ,'2022-05-01T09:37:59.060564400','2022-05-01T09:37:59.060564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 353, 101, 'Title 171', 'Description 171', 12, '18' ,'2022-04-30T09:37:59.061567400','2022-04-30T09:37:59.061567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 364, 100, 'Title 172', 'Description 172', 13, '19' ,'2022-04-29T09:37:59.061567400','2022-04-29T09:37:59.061567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 377, 99, 'Title 173', 'Description 173', 14, '20' ,'2022-04-28T09:37:59.061567400','2022-04-28T09:37:59.061567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 388, 98, 'Title 174', 'Description 174', 15, '21' ,'2022-04-27T09:37:59.061567400','2022-04-27T09:37:59.061567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 401, 97, 'Title 175', 'Description 175', 16, '22' ,'2022-04-26T09:37:59.062568500','2022-04-26T09:37:59.062568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 412, 96, 'Title 176', 'Description 176', 17, '1' ,'2022-04-25T09:37:59.062568500','2022-04-25T09:37:59.062568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 425, 95, 'Title 177', 'Description 177', 18, '2' ,'2022-04-24T09:37:59.062568500','2022-04-24T09:37:59.062568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 436, 94, 'Title 178', 'Description 178', 19, '3' ,'2022-04-23T09:37:59.063565100','2022-04-23T09:37:59.063565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 449, 93, 'Title 179', 'Description 179', 20, '4' ,'2022-04-22T09:37:59.063565100','2022-04-22T09:37:59.063565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 360, 101, 'Title 180', 'Description 180', 1, '5' ,'2022-04-21T09:37:59.063565100','2022-04-21T09:37:59.063565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 373, 100, 'Title 181', 'Description 181', 2, '6' ,'2022-04-20T09:37:59.064564400','2022-04-20T09:37:59.064564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 384, 99, 'Title 182', 'Description 182', 3, '7' ,'2022-04-19T09:37:59.064564400','2022-04-19T09:37:59.064564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 397, 98, 'Title 183', 'Description 183', 4, '8' ,'2022-04-18T09:37:59.064564400','2022-04-18T09:37:59.064564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 408, 97, 'Title 184', 'Description 184', 5, '9' ,'2022-04-17T09:37:59.064564400','2022-04-17T09:37:59.064564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 421, 96, 'Title 185', 'Description 185', 6, '10' ,'2022-04-16T09:37:59.065565700','2022-04-16T09:37:59.065565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 432, 95, 'Title 186', 'Description 186', 7, '11' ,'2022-04-15T09:37:59.065565700','2022-04-15T09:37:59.065565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 445, 94, 'Title 187', 'Description 187', 8, '12' ,'2022-04-14T09:37:59.065565700','2022-04-14T09:37:59.065565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 456, 93, 'Title 188', 'Description 188', 9, '13' ,'2022-04-13T09:37:59.065565700','2022-04-13T09:37:59.065565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 469, 101, 'Title 189', 'Description 189', 10, '14' ,'2022-04-12T09:37:59.066568200','2022-04-12T09:37:59.066568200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 380, 100, 'Title 190', 'Description 190', 11, '15' ,'2022-04-11T09:37:59.066568200','2022-04-11T09:37:59.066568200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 393, 99, 'Title 191', 'Description 191', 12, '16' ,'2022-04-10T09:37:59.066568200','2022-04-10T09:37:59.066568200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 404, 98, 'Title 192', 'Description 192', 13, '17' ,'2022-04-09T09:37:59.066568200','2022-04-09T09:37:59.066568200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 417, 97, 'Title 193', 'Description 193', 14, '18' ,'2022-04-08T09:37:59.067564300','2022-04-08T09:37:59.067564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 428, 96, 'Title 194', 'Description 194', 15, '19' ,'2022-04-07T09:37:59.067564300','2022-04-07T09:37:59.067564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 441, 95, 'Title 195', 'Description 195', 16, '20' ,'2022-04-06T09:37:59.067564300','2022-04-06T09:37:59.067564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 452, 94, 'Title 196', 'Description 196', 17, '21' ,'2022-04-05T09:37:59.067564300','2022-04-05T09:37:59.067564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 465, 93, 'Title 197', 'Description 197', 18, '22' ,'2022-04-04T09:37:59.068563600','2022-04-04T09:37:59.068563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 476, 101, 'Title 198', 'Description 198', 19, '1' ,'2022-04-03T09:37:59.068563600','2022-04-03T09:37:59.068563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 489, 100, 'Title 199', 'Description 199', 20, '2' ,'2022-04-02T09:37:59.068563600','2022-04-02T09:37:59.068563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 400, 99, 'Title 200', 'Description 200', 1, '3' ,'2022-04-01T09:37:59.069565100','2022-04-01T09:37:59.069565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 413, 98, 'Title 201', 'Description 201', 2, '4' ,'2022-03-31T09:37:59.069565100','2022-03-31T09:37:59.069565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 424, 97, 'Title 202', 'Description 202', 3, '5' ,'2022-03-30T09:37:59.069565100','2022-03-30T09:37:59.069565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 437, 96, 'Title 203', 'Description 203', 4, '6' ,'2022-03-29T09:37:59.069565100','2022-03-29T09:37:59.069565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 448, 95, 'Title 204', 'Description 204', 5, '7' ,'2022-03-28T09:37:59.070565500','2022-03-28T09:37:59.070565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 461, 94, 'Title 205', 'Description 205', 6, '8' ,'2022-03-27T09:37:59.070565500','2022-03-27T09:37:59.070565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 472, 93, 'Title 206', 'Description 206', 7, '9' ,'2022-03-26T09:37:59.070565500','2022-03-26T09:37:59.070565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 485, 101, 'Title 207', 'Description 207', 8, '10' ,'2022-03-25T09:37:59.071563100','2022-03-25T09:37:59.071563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 496, 100, 'Title 208', 'Description 208', 9, '11' ,'2022-03-24T09:37:59.071563100','2022-03-24T09:37:59.071563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 509, 99, 'Title 209', 'Description 209', 10, '12' ,'2022-03-23T09:37:59.071563100','2022-03-23T09:37:59.071563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 420, 98, 'Title 210', 'Description 210', 11, '13' ,'2022-03-22T09:37:59.071563100','2022-03-22T09:37:59.071563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 433, 97, 'Title 211', 'Description 211', 12, '14' ,'2022-03-21T09:37:59.071563100','2022-03-21T09:37:59.071563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 444, 96, 'Title 212', 'Description 212', 13, '15' ,'2022-03-20T09:37:59.072563300','2022-03-20T09:37:59.072563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 457, 95, 'Title 213', 'Description 213', 14, '16' ,'2022-03-19T09:37:59.072563300','2022-03-19T09:37:59.072563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 468, 94, 'Title 214', 'Description 214', 15, '17' ,'2022-03-18T09:37:59.072563300','2022-03-18T09:37:59.072563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 481, 93, 'Title 215', 'Description 215', 16, '18' ,'2022-03-17T09:37:59.073563100','2022-03-17T09:37:59.073563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 492, 101, 'Title 216', 'Description 216', 17, '19' ,'2022-03-16T09:37:59.073563100','2022-03-16T09:37:59.073563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 505, 100, 'Title 217', 'Description 217', 18, '20' ,'2022-03-15T09:37:59.074563900','2022-03-15T09:37:59.074563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 516, 99, 'Title 218', 'Description 218', 19, '21' ,'2022-03-14T09:37:59.074563900','2022-03-14T09:37:59.074563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 529, 98, 'Title 219', 'Description 219', 20, '22' ,'2022-03-13T09:37:59.075564100','2022-03-13T09:37:59.075564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 440, 97, 'Title 220', 'Description 220', 1, '1' ,'2022-03-12T09:37:59.075564100','2022-03-12T09:37:59.075564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 453, 96, 'Title 221', 'Description 221', 2, '2' ,'2022-03-11T09:37:59.075564100','2022-03-11T09:37:59.075564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 464, 95, 'Title 222', 'Description 222', 3, '3' ,'2022-03-10T09:37:59.076564','2022-03-10T09:37:59.076564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 477, 94, 'Title 223', 'Description 223', 4, '4' ,'2022-03-09T09:37:59.076564','2022-03-09T09:37:59.076564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 488, 93, 'Title 224', 'Description 224', 5, '5' ,'2022-03-08T09:37:59.076564','2022-03-08T09:37:59.076564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 501, 101, 'Title 225', 'Description 225', 6, '6' ,'2022-03-07T09:37:59.076564','2022-03-07T09:37:59.076564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 512, 100, 'Title 226', 'Description 226', 7, '7' ,'2022-03-06T09:37:59.076564','2022-03-06T09:37:59.076564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 525, 99, 'Title 227', 'Description 227', 8, '8' ,'2022-03-05T09:37:59.077563700','2022-03-05T09:37:59.077563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 536, 98, 'Title 228', 'Description 228', 9, '9' ,'2022-03-04T09:37:59.077563700','2022-03-04T09:37:59.077563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 549, 97, 'Title 229', 'Description 229', 10, '10' ,'2022-03-03T09:37:59.077563700','2022-03-03T09:37:59.077563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 460, 96, 'Title 230', 'Description 230', 11, '11' ,'2022-03-02T09:37:59.077563700','2022-03-02T09:37:59.077563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 473, 95, 'Title 231', 'Description 231', 12, '12' ,'2022-03-01T09:37:59.078563','2022-03-01T09:37:59.078563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 484, 94, 'Title 232', 'Description 232', 13, '13' ,'2022-02-28T09:37:59.078563','2022-02-28T09:37:59.078563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 497, 93, 'Title 233', 'Description 233', 14, '14' ,'2022-02-27T09:37:59.078563','2022-02-27T09:37:59.078563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 508, 101, 'Title 234', 'Description 234', 15, '15' ,'2022-02-26T09:37:59.078563','2022-02-26T09:37:59.078563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 521, 100, 'Title 235', 'Description 235', 16, '16' ,'2022-02-25T09:37:59.079563100','2022-02-25T09:37:59.079563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 532, 99, 'Title 236', 'Description 236', 17, '17' ,'2022-02-24T09:37:59.079563100','2022-02-24T09:37:59.079563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 545, 98, 'Title 237', 'Description 237', 18, '18' ,'2022-02-23T09:37:59.079563100','2022-02-23T09:37:59.079563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 556, 97, 'Title 238', 'Description 238', 19, '19' ,'2022-02-22T09:37:59.079563100','2022-02-22T09:37:59.079563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 569, 96, 'Title 239', 'Description 239', 20, '20' ,'2022-02-21T09:37:59.079563100','2022-02-21T09:37:59.079563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 480, 95, 'Title 240', 'Description 240', 1, '21' ,'2022-02-20T09:37:59.080563100','2022-02-20T09:37:59.080563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 493, 94, 'Title 241', 'Description 241', 2, '22' ,'2022-02-19T09:37:59.080563100','2022-02-19T09:37:59.080563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 504, 93, 'Title 242', 'Description 242', 3, '1' ,'2022-02-18T09:37:59.080563100','2022-02-18T09:37:59.080563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 517, 101, 'Title 243', 'Description 243', 4, '2' ,'2022-02-17T09:37:59.080563100','2022-02-17T09:37:59.080563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 528, 100, 'Title 244', 'Description 244', 5, '3' ,'2022-02-16T09:37:59.081564100','2022-02-16T09:37:59.081564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 541, 99, 'Title 245', 'Description 245', 6, '4' ,'2022-02-15T09:37:59.081564100','2022-02-15T09:37:59.081564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 552, 98, 'Title 246', 'Description 246', 7, '5' ,'2022-02-14T09:37:59.081564100','2022-02-14T09:37:59.081564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 565, 97, 'Title 247', 'Description 247', 8, '6' ,'2022-02-13T09:37:59.081564100','2022-02-13T09:37:59.081564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 576, 96, 'Title 248', 'Description 248', 9, '7' ,'2022-02-12T09:37:59.082567100','2022-02-12T09:37:59.082567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 589, 95, 'Title 249', 'Description 249', 10, '8' ,'2022-02-11T09:37:59.082567100','2022-02-11T09:37:59.082567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 500, 94, 'Title 250', 'Description 250', 11, '9' ,'2022-02-10T09:37:59.082567100','2022-02-10T09:37:59.082567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 513, 93, 'Title 251', 'Description 251', 12, '10' ,'2022-02-09T09:37:59.082567100','2022-02-09T09:37:59.082567100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 524, 101, 'Title 252', 'Description 252', 13, '11' ,'2022-02-08T09:37:59.083568500','2022-02-08T09:37:59.083568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 537, 100, 'Title 253', 'Description 253', 14, '12' ,'2022-02-07T09:37:59.083568500','2022-02-07T09:37:59.083568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 548, 99, 'Title 254', 'Description 254', 15, '13' ,'2022-02-06T09:37:59.083568500','2022-02-06T09:37:59.083568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 561, 98, 'Title 255', 'Description 255', 16, '14' ,'2022-02-05T09:37:59.083568500','2022-02-05T09:37:59.083568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 572, 97, 'Title 256', 'Description 256', 17, '15' ,'2022-02-04T09:37:59.084566800','2022-02-04T09:37:59.084566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 585, 96, 'Title 257', 'Description 257', 18, '16' ,'2022-02-03T09:37:59.084566800','2022-02-03T09:37:59.084566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 596, 95, 'Title 258', 'Description 258', 19, '17' ,'2022-02-02T09:37:59.084566800','2022-02-02T09:37:59.084566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 609, 94, 'Title 259', 'Description 259', 20, '18' ,'2022-02-01T09:37:59.085569100','2022-02-01T09:37:59.085569100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 520, 93, 'Title 260', 'Description 260', 1, '19' ,'2022-01-31T09:37:59.085569100','2022-01-31T09:37:59.085569100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 533, 101, 'Title 261', 'Description 261', 2, '20' ,'2022-01-30T09:37:59.085569100','2022-01-30T09:37:59.085569100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 544, 100, 'Title 262', 'Description 262', 3, '21' ,'2022-01-29T09:37:59.085569100','2022-01-29T09:37:59.085569100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 557, 99, 'Title 263', 'Description 263', 4, '22' ,'2022-01-28T09:37:59.086567400','2022-01-28T09:37:59.086567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 568, 98, 'Title 264', 'Description 264', 5, '1' ,'2022-01-27T09:37:59.086567400','2022-01-27T09:37:59.086567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 581, 97, 'Title 265', 'Description 265', 6, '2' ,'2022-01-26T09:37:59.086567400','2022-01-26T09:37:59.086567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 592, 96, 'Title 266', 'Description 266', 7, '3' ,'2022-01-25T09:37:59.086567400','2022-01-25T09:37:59.086567400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 605, 95, 'Title 267', 'Description 267', 8, '4' ,'2022-01-24T09:37:59.087567300','2022-01-24T09:37:59.087567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 616, 94, 'Title 268', 'Description 268', 9, '5' ,'2022-01-23T09:37:59.087567300','2022-01-23T09:37:59.087567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 629, 93, 'Title 269', 'Description 269', 10, '6' ,'2022-01-22T09:37:59.087567300','2022-01-22T09:37:59.087567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 540, 101, 'Title 270', 'Description 270', 11, '7' ,'2022-01-21T09:37:59.087567300','2022-01-21T09:37:59.087567300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 553, 100, 'Title 271', 'Description 271', 12, '8' ,'2022-01-20T09:37:59.088565100','2022-01-20T09:37:59.088565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 564, 99, 'Title 272', 'Description 272', 13, '9' ,'2022-01-19T09:37:59.088565100','2022-01-19T09:37:59.088565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 577, 98, 'Title 273', 'Description 273', 14, '10' ,'2022-01-18T09:37:59.088565100','2022-01-18T09:37:59.088565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 588, 97, 'Title 274', 'Description 274', 15, '11' ,'2022-01-17T09:37:59.089565100','2022-01-17T09:37:59.089565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 601, 96, 'Title 275', 'Description 275', 16, '12' ,'2022-01-16T09:37:59.089565100','2022-01-16T09:37:59.089565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 612, 95, 'Title 276', 'Description 276', 17, '13' ,'2022-01-15T09:37:59.089565100','2022-01-15T09:37:59.089565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 625, 94, 'Title 277', 'Description 277', 18, '14' ,'2022-01-14T09:37:59.089565100','2022-01-14T09:37:59.089565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 636, 93, 'Title 278', 'Description 278', 19, '15' ,'2022-01-13T09:37:59.090564','2022-01-13T09:37:59.090564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 649, 101, 'Title 279', 'Description 279', 20, '16' ,'2022-01-12T09:37:59.090564','2022-01-12T09:37:59.090564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 560, 100, 'Title 280', 'Description 280', 1, '17' ,'2022-01-11T09:37:59.090564','2022-01-11T09:37:59.090564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 573, 99, 'Title 281', 'Description 281', 2, '18' ,'2022-01-10T09:37:59.090564','2022-01-10T09:37:59.090564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 584, 98, 'Title 282', 'Description 282', 3, '19' ,'2022-01-09T09:37:59.091563600','2022-01-09T09:37:59.091563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 597, 97, 'Title 283', 'Description 283', 4, '20' ,'2022-01-08T09:37:59.091563600','2022-01-08T09:37:59.091563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 608, 96, 'Title 284', 'Description 284', 5, '21' ,'2022-01-07T09:37:59.091563600','2022-01-07T09:37:59.091563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 621, 95, 'Title 285', 'Description 285', 6, '22' ,'2022-01-06T09:37:59.091563600','2022-01-06T09:37:59.091563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 632, 94, 'Title 286', 'Description 286', 7, '1' ,'2022-01-05T09:37:59.091563600','2022-01-05T09:37:59.091563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 645, 93, 'Title 287', 'Description 287', 8, '2' ,'2022-01-04T09:37:59.092561600','2022-01-04T09:37:59.092561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 656, 101, 'Title 288', 'Description 288', 9, '3' ,'2022-01-03T09:37:59.092561600','2022-01-03T09:37:59.092561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 669, 100, 'Title 289', 'Description 289', 10, '4' ,'2022-01-02T09:37:59.092561600','2022-01-02T09:37:59.092561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 580, 99, 'Title 290', 'Description 290', 11, '5' ,'2022-01-01T09:37:59.093563300','2022-01-01T09:37:59.093563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 593, 98, 'Title 291', 'Description 291', 12, '6' ,'2021-12-31T09:37:59.093563300','2021-12-31T09:37:59.093563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 604, 97, 'Title 292', 'Description 292', 13, '7' ,'2021-12-30T09:37:59.094564','2021-12-30T09:37:59.094564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 617, 96, 'Title 293', 'Description 293', 14, '8' ,'2021-12-29T09:37:59.094564','2021-12-29T09:37:59.094564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 628, 95, 'Title 294', 'Description 294', 15, '9' ,'2021-12-28T09:37:59.094564','2021-12-28T09:37:59.094564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 641, 94, 'Title 295', 'Description 295', 16, '10' ,'2021-12-27T09:37:59.095564500','2021-12-27T09:37:59.095564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 652, 93, 'Title 296', 'Description 296', 17, '11' ,'2021-12-26T09:37:59.095564500','2021-12-26T09:37:59.095564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 665, 101, 'Title 297', 'Description 297', 18, '12' ,'2021-12-25T09:37:59.095564500','2021-12-25T09:37:59.095564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 676, 100, 'Title 298', 'Description 298', 19, '13' ,'2021-12-24T09:37:59.095564500','2021-12-24T09:37:59.095564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 689, 99, 'Title 299', 'Description 299', 20, '14' ,'2021-12-23T09:37:59.096564400','2021-12-23T09:37:59.096564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 600, 98, 'Title 300', 'Description 300', 1, '15' ,'2021-12-22T09:37:59.096564400','2021-12-22T09:37:59.096564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 613, 97, 'Title 301', 'Description 301', 2, '16' ,'2021-12-21T09:37:59.096564400','2021-12-21T09:37:59.096564400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 624, 96, 'Title 302', 'Description 302', 3, '17' ,'2021-12-20T09:37:59.097568700','2021-12-20T09:37:59.097568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 637, 95, 'Title 303', 'Description 303', 4, '18' ,'2021-12-19T09:37:59.097568700','2021-12-19T09:37:59.097568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 648, 94, 'Title 304', 'Description 304', 5, '19' ,'2021-12-18T09:37:59.097568700','2021-12-18T09:37:59.097568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 661, 93, 'Title 305', 'Description 305', 6, '20' ,'2021-12-17T09:37:59.098563300','2021-12-17T09:37:59.098563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 672, 101, 'Title 306', 'Description 306', 7, '21' ,'2021-12-16T09:37:59.098563300','2021-12-16T09:37:59.098563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 685, 100, 'Title 307', 'Description 307', 8, '22' ,'2021-12-15T09:37:59.098563300','2021-12-15T09:37:59.098563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 696, 99, 'Title 308', 'Description 308', 9, '1' ,'2021-12-14T09:37:59.098563300','2021-12-14T09:37:59.098563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 709, 98, 'Title 309', 'Description 309', 10, '2' ,'2021-12-13T09:37:59.098563300','2021-12-13T09:37:59.098563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 620, 97, 'Title 310', 'Description 310', 11, '3' ,'2021-12-12T09:37:59.099560900','2021-12-12T09:37:59.099560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 633, 96, 'Title 311', 'Description 311', 12, '4' ,'2021-12-11T09:37:59.099560900','2021-12-11T09:37:59.099560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 644, 95, 'Title 312', 'Description 312', 13, '5' ,'2021-12-10T09:37:59.099560900','2021-12-10T09:37:59.099560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 657, 94, 'Title 313', 'Description 313', 14, '6' ,'2021-12-09T09:37:59.099560900','2021-12-09T09:37:59.099560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 668, 93, 'Title 314', 'Description 314', 15, '7' ,'2021-12-08T09:37:59.100559900','2021-12-08T09:37:59.100559900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 681, 101, 'Title 315', 'Description 315', 16, '8' ,'2021-12-07T09:37:59.100559900','2021-12-07T09:37:59.100559900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 692, 100, 'Title 316', 'Description 316', 17, '9' ,'2021-12-06T09:37:59.100559900','2021-12-06T09:37:59.100559900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 705, 99, 'Title 317', 'Description 317', 18, '10' ,'2021-12-05T09:37:59.100559900','2021-12-05T09:37:59.100559900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 716, 98, 'Title 318', 'Description 318', 19, '11' ,'2021-12-04T09:37:59.100559900','2021-12-04T09:37:59.100559900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 729, 97, 'Title 319', 'Description 319', 20, '12' ,'2021-12-03T09:37:59.100559900','2021-12-03T09:37:59.100559900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 640, 96, 'Title 320', 'Description 320', 1, '13' ,'2021-12-02T09:37:59.101561600','2021-12-02T09:37:59.101561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 653, 95, 'Title 321', 'Description 321', 2, '14' ,'2021-12-01T09:37:59.101561600','2021-12-01T09:37:59.101561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 664, 94, 'Title 322', 'Description 322', 3, '15' ,'2021-11-30T09:37:59.101561600','2021-11-30T09:37:59.101561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 677, 93, 'Title 323', 'Description 323', 4, '16' ,'2021-11-29T09:37:59.101561600','2021-11-29T09:37:59.101561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 688, 101, 'Title 324', 'Description 324', 5, '17' ,'2021-11-28T09:37:59.101561600','2021-11-28T09:37:59.101561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 701, 100, 'Title 325', 'Description 325', 6, '18' ,'2021-11-27T09:37:59.102561600','2021-11-27T09:37:59.102561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 712, 99, 'Title 326', 'Description 326', 7, '19' ,'2021-11-26T09:37:59.102561600','2021-11-26T09:37:59.102561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 725, 98, 'Title 327', 'Description 327', 8, '20' ,'2021-11-25T09:37:59.102561600','2021-11-25T09:37:59.102561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 736, 97, 'Title 328', 'Description 328', 9, '21' ,'2021-11-24T09:37:59.102561600','2021-11-24T09:37:59.102561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 749, 96, 'Title 329', 'Description 329', 10, '22' ,'2021-11-23T09:37:59.102561600','2021-11-23T09:37:59.102561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 660, 95, 'Title 330', 'Description 330', 11, '1' ,'2021-11-22T09:37:59.103561400','2021-11-22T09:37:59.103561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 673, 94, 'Title 331', 'Description 331', 12, '2' ,'2021-11-21T09:37:59.103561400','2021-11-21T09:37:59.103561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 684, 93, 'Title 332', 'Description 332', 13, '3' ,'2021-11-20T09:37:59.103561400','2021-11-20T09:37:59.103561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 697, 101, 'Title 333', 'Description 333', 14, '4' ,'2021-11-19T09:37:59.103561400','2021-11-19T09:37:59.103561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 708, 100, 'Title 334', 'Description 334', 15, '5' ,'2021-11-18T09:37:59.103561400','2021-11-18T09:37:59.103561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 721, 99, 'Title 335', 'Description 335', 16, '6' ,'2021-11-17T09:37:59.104561200','2021-11-17T09:37:59.104561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 732, 98, 'Title 336', 'Description 336', 17, '7' ,'2021-11-16T09:37:59.104561200','2021-11-16T09:37:59.104561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 745, 97, 'Title 337', 'Description 337', 18, '8' ,'2021-11-15T09:37:59.104561200','2021-11-15T09:37:59.104561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 756, 96, 'Title 338', 'Description 338', 19, '9' ,'2021-11-14T09:37:59.104561200','2021-11-14T09:37:59.104561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 769, 95, 'Title 339', 'Description 339', 20, '10' ,'2021-11-13T09:37:59.104561200','2021-11-13T09:37:59.104561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 680, 94, 'Title 340', 'Description 340', 1, '11' ,'2021-11-12T09:37:59.104561200','2021-11-12T09:37:59.104561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 693, 93, 'Title 341', 'Description 341', 2, '12' ,'2021-11-11T09:37:59.105561200','2021-11-11T09:37:59.105561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 704, 101, 'Title 342', 'Description 342', 3, '13' ,'2021-11-10T09:37:59.105561200','2021-11-10T09:37:59.105561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 717, 100, 'Title 343', 'Description 343', 4, '14' ,'2021-11-09T09:37:59.105561200','2021-11-09T09:37:59.105561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 728, 99, 'Title 344', 'Description 344', 5, '15' ,'2021-11-08T09:37:59.105561200','2021-11-08T09:37:59.105561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 741, 98, 'Title 345', 'Description 345', 6, '16' ,'2021-11-07T09:37:59.106564600','2021-11-07T09:37:59.106564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 752, 97, 'Title 346', 'Description 346', 7, '17' ,'2021-11-06T09:37:59.106564600','2021-11-06T09:37:59.106564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 765, 96, 'Title 347', 'Description 347', 8, '18' ,'2021-11-05T09:37:59.106564600','2021-11-05T09:37:59.106564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 776, 95, 'Title 348', 'Description 348', 9, '19' ,'2021-11-04T09:37:59.107565','2021-11-04T09:37:59.107565'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 789, 94, 'Title 349', 'Description 349', 10, '20' ,'2021-11-03T09:37:59.107565','2021-11-03T09:37:59.107565'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 700, 93, 'Title 350', 'Description 350', 11, '21' ,'2021-11-02T09:37:59.107565','2021-11-02T09:37:59.107565'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 713, 101, 'Title 351', 'Description 351', 12, '22' ,'2021-11-01T09:37:59.107565','2021-11-01T09:37:59.107565'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 724, 100, 'Title 352', 'Description 352', 13, '1' ,'2021-10-31T09:37:59.107565','2021-10-31T09:37:59.107565'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 737, 99, 'Title 353', 'Description 353', 14, '2' ,'2021-10-30T09:37:59.108562400','2021-10-30T09:37:59.108562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 748, 98, 'Title 354', 'Description 354', 15, '3' ,'2021-10-29T09:37:59.108562400','2021-10-29T09:37:59.108562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 761, 97, 'Title 355', 'Description 355', 16, '4' ,'2021-10-28T09:37:59.108562400','2021-10-28T09:37:59.108562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 772, 96, 'Title 356', 'Description 356', 17, '5' ,'2021-10-27T09:37:59.108562400','2021-10-27T09:37:59.108562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 785, 95, 'Title 357', 'Description 357', 18, '6' ,'2021-10-26T09:37:59.108562400','2021-10-26T09:37:59.108562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 796, 94, 'Title 358', 'Description 358', 19, '7' ,'2021-10-25T09:37:59.109562800','2021-10-25T09:37:59.109562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 809, 93, 'Title 359', 'Description 359', 20, '8' ,'2021-10-24T09:37:59.109562800','2021-10-24T09:37:59.109562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 720, 101, 'Title 360', 'Description 360', 1, '9' ,'2021-10-23T09:37:59.109562800','2021-10-23T09:37:59.109562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 733, 100, 'Title 361', 'Description 361', 2, '10' ,'2021-10-22T09:37:59.109562800','2021-10-22T09:37:59.109562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 744, 99, 'Title 362', 'Description 362', 3, '11' ,'2021-10-21T09:37:59.109562800','2021-10-21T09:37:59.109562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 757, 98, 'Title 363', 'Description 363', 4, '12' ,'2021-10-20T09:37:59.109562800','2021-10-20T09:37:59.109562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 768, 97, 'Title 364', 'Description 364', 5, '13' ,'2021-10-19T09:37:59.110561700','2021-10-19T09:37:59.110561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 781, 96, 'Title 365', 'Description 365', 6, '14' ,'2021-10-18T09:37:59.110561700','2021-10-18T09:37:59.110561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 792, 95, 'Title 366', 'Description 366', 7, '15' ,'2021-10-17T09:37:59.110561700','2021-10-17T09:37:59.110561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 805, 94, 'Title 367', 'Description 367', 8, '16' ,'2021-10-16T09:37:59.110561700','2021-10-16T09:37:59.110561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 816, 93, 'Title 368', 'Description 368', 9, '17' ,'2021-10-15T09:37:59.110561700','2021-10-15T09:37:59.110561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 829, 101, 'Title 369', 'Description 369', 10, '18' ,'2021-10-14T09:37:59.111562300','2021-10-14T09:37:59.111562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 740, 100, 'Title 370', 'Description 370', 11, '19' ,'2021-10-13T09:37:59.111562300','2021-10-13T09:37:59.111562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 753, 99, 'Title 371', 'Description 371', 12, '20' ,'2021-10-12T09:37:59.111562300','2021-10-12T09:37:59.111562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 764, 98, 'Title 372', 'Description 372', 13, '21' ,'2021-10-11T09:37:59.111562300','2021-10-11T09:37:59.111562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 777, 97, 'Title 373', 'Description 373', 14, '22' ,'2021-10-10T09:37:59.112564900','2021-10-10T09:37:59.112564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 788, 96, 'Title 374', 'Description 374', 15, '1' ,'2021-10-09T09:37:59.112564900','2021-10-09T09:37:59.112564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 801, 95, 'Title 375', 'Description 375', 16, '2' ,'2021-10-08T09:37:59.112564900','2021-10-08T09:37:59.112564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 812, 94, 'Title 376', 'Description 376', 17, '3' ,'2021-10-07T09:37:59.112564900','2021-10-07T09:37:59.112564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 825, 93, 'Title 377', 'Description 377', 18, '4' ,'2021-10-06T09:37:59.112564900','2021-10-06T09:37:59.112564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 836, 101, 'Title 378', 'Description 378', 19, '5' ,'2021-10-05T09:37:59.112564900','2021-10-05T09:37:59.112564900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 849, 100, 'Title 379', 'Description 379', 20, '6' ,'2021-10-04T09:37:59.113564600','2021-10-04T09:37:59.113564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 760, 99, 'Title 380', 'Description 380', 1, '7' ,'2021-10-03T09:37:59.113564600','2021-10-03T09:37:59.113564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 773, 98, 'Title 381', 'Description 381', 2, '8' ,'2021-10-02T09:37:59.113564600','2021-10-02T09:37:59.113564600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 784, 97, 'Title 382', 'Description 382', 3, '9' ,'2021-10-01T09:37:59.114561700','2021-10-01T09:37:59.114561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 797, 96, 'Title 383', 'Description 383', 4, '10' ,'2021-09-30T09:37:59.114561700','2021-09-30T09:37:59.114561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 808, 95, 'Title 384', 'Description 384', 5, '11' ,'2021-09-29T09:37:59.114561700','2021-09-29T09:37:59.114561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 821, 94, 'Title 385', 'Description 385', 6, '12' ,'2021-09-28T09:37:59.114561700','2021-09-28T09:37:59.114561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 832, 93, 'Title 386', 'Description 386', 7, '13' ,'2021-09-27T09:37:59.115561300','2021-09-27T09:37:59.115561300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 845, 101, 'Title 387', 'Description 387', 8, '14' ,'2021-09-26T09:37:59.115561300','2021-09-26T09:37:59.115561300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 856, 100, 'Title 388', 'Description 388', 9, '15' ,'2021-09-25T09:37:59.115561300','2021-09-25T09:37:59.115561300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 869, 99, 'Title 389', 'Description 389', 10, '16' ,'2021-09-24T09:37:59.115561300','2021-09-24T09:37:59.115561300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 780, 98, 'Title 390', 'Description 390', 11, '17' ,'2021-09-23T09:37:59.116561400','2021-09-23T09:37:59.116561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 793, 97, 'Title 391', 'Description 391', 12, '18' ,'2021-09-22T09:37:59.116561400','2021-09-22T09:37:59.116561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 804, 96, 'Title 392', 'Description 392', 13, '19' ,'2021-09-21T09:37:59.116561400','2021-09-21T09:37:59.116561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 817, 95, 'Title 393', 'Description 393', 14, '20' ,'2021-09-20T09:37:59.116561400','2021-09-20T09:37:59.116561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 828, 94, 'Title 394', 'Description 394', 15, '21' ,'2021-09-19T09:37:59.116561400','2021-09-19T09:37:59.116561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 841, 93, 'Title 395', 'Description 395', 16, '22' ,'2021-09-18T09:37:59.117562400','2021-09-18T09:37:59.117562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 852, 101, 'Title 396', 'Description 396', 17, '1' ,'2021-09-17T09:37:59.117562400','2021-09-17T09:37:59.117562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 865, 100, 'Title 397', 'Description 397', 18, '2' ,'2021-09-16T09:37:59.117562400','2021-09-16T09:37:59.117562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 876, 99, 'Title 398', 'Description 398', 19, '3' ,'2021-09-15T09:37:59.117562400','2021-09-15T09:37:59.117562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 889, 98, 'Title 399', 'Description 399', 20, '4' ,'2021-09-14T09:37:59.117562400','2021-09-14T09:37:59.117562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 800, 97, 'Title 400', 'Description 400', 1, '5' ,'2021-09-13T09:37:59.118561600','2021-09-13T09:37:59.118561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 813, 96, 'Title 401', 'Description 401', 2, '6' ,'2021-09-12T09:37:59.118561600','2021-09-12T09:37:59.118561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 824, 95, 'Title 402', 'Description 402', 3, '7' ,'2021-09-11T09:37:59.118561600','2021-09-11T09:37:59.118561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 837, 94, 'Title 403', 'Description 403', 4, '8' ,'2021-09-10T09:37:59.118561600','2021-09-10T09:37:59.118561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 848, 93, 'Title 404', 'Description 404', 5, '9' ,'2021-09-09T09:37:59.118561600','2021-09-09T09:37:59.118561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 861, 101, 'Title 405', 'Description 405', 6, '10' ,'2021-09-08T09:37:59.119565300','2021-09-08T09:37:59.119565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 872, 100, 'Title 406', 'Description 406', 7, '11' ,'2021-09-07T09:37:59.119565300','2021-09-07T09:37:59.119565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 885, 99, 'Title 407', 'Description 407', 8, '12' ,'2021-09-06T09:37:59.119565300','2021-09-06T09:37:59.119565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 896, 98, 'Title 408', 'Description 408', 9, '13' ,'2021-09-05T09:37:59.120567500','2021-09-05T09:37:59.120567500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 909, 97, 'Title 409', 'Description 409', 10, '14' ,'2021-09-04T09:37:59.120567500','2021-09-04T09:37:59.120567500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 820, 96, 'Title 410', 'Description 410', 11, '15' ,'2021-09-03T09:37:59.120567500','2021-09-03T09:37:59.120567500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 833, 95, 'Title 411', 'Description 411', 12, '16' ,'2021-09-02T09:37:59.120567500','2021-09-02T09:37:59.120567500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 844, 94, 'Title 412', 'Description 412', 13, '17' ,'2021-09-01T09:37:59.121562200','2021-09-01T09:37:59.121562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 857, 93, 'Title 413', 'Description 413', 14, '18' ,'2021-08-31T09:37:59.121562200','2021-08-31T09:37:59.121562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 868, 101, 'Title 414', 'Description 414', 15, '19' ,'2021-08-30T09:37:59.121562200','2021-08-30T09:37:59.121562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 881, 100, 'Title 415', 'Description 415', 16, '20' ,'2021-08-29T09:37:59.121562200','2021-08-29T09:37:59.121562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 892, 99, 'Title 416', 'Description 416', 17, '21' ,'2021-08-28T09:37:59.122562800','2021-08-28T09:37:59.122562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 905, 98, 'Title 417', 'Description 417', 18, '22' ,'2021-08-27T09:37:59.122562800','2021-08-27T09:37:59.122562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 916, 97, 'Title 418', 'Description 418', 19, '1' ,'2021-08-26T09:37:59.122562800','2021-08-26T09:37:59.122562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 929, 96, 'Title 419', 'Description 419', 20, '2' ,'2021-08-25T09:37:59.123564100','2021-08-25T09:37:59.123564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 840, 95, 'Title 420', 'Description 420', 1, '3' ,'2021-08-24T09:37:59.123564100','2021-08-24T09:37:59.123564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 853, 94, 'Title 421', 'Description 421', 2, '4' ,'2021-08-23T09:37:59.124561800','2021-08-23T09:37:59.124561800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 864, 93, 'Title 422', 'Description 422', 3, '5' ,'2021-08-22T09:37:59.124561800','2021-08-22T09:37:59.124561800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 877, 101, 'Title 423', 'Description 423', 4, '6' ,'2021-08-21T09:37:59.124561800','2021-08-21T09:37:59.124561800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 888, 100, 'Title 424', 'Description 424', 5, '7' ,'2021-08-20T09:37:59.125566700','2021-08-20T09:37:59.125566700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 901, 99, 'Title 425', 'Description 425', 6, '8' ,'2021-08-19T09:37:59.125566700','2021-08-19T09:37:59.125566700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 912, 98, 'Title 426', 'Description 426', 7, '9' ,'2021-08-18T09:37:59.125566700','2021-08-18T09:37:59.125566700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 925, 97, 'Title 427', 'Description 427', 8, '10' ,'2021-08-17T09:37:59.125566700','2021-08-17T09:37:59.125566700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 936, 96, 'Title 428', 'Description 428', 9, '11' ,'2021-08-16T09:37:59.126565800','2021-08-16T09:37:59.126565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 949, 95, 'Title 429', 'Description 429', 10, '12' ,'2021-08-15T09:37:59.126565800','2021-08-15T09:37:59.126565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 860, 94, 'Title 430', 'Description 430', 11, '13' ,'2021-08-14T09:37:59.126565800','2021-08-14T09:37:59.126565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 873, 93, 'Title 431', 'Description 431', 12, '14' ,'2021-08-13T09:37:59.126565800','2021-08-13T09:37:59.126565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 884, 101, 'Title 432', 'Description 432', 13, '15' ,'2021-08-12T09:37:59.127562900','2021-08-12T09:37:59.127562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 897, 100, 'Title 433', 'Description 433', 14, '16' ,'2021-08-11T09:37:59.127562900','2021-08-11T09:37:59.127562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 908, 99, 'Title 434', 'Description 434', 15, '17' ,'2021-08-10T09:37:59.127562900','2021-08-10T09:37:59.127562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 921, 98, 'Title 435', 'Description 435', 16, '18' ,'2021-08-09T09:37:59.127562900','2021-08-09T09:37:59.127562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 932, 97, 'Title 436', 'Description 436', 17, '19' ,'2021-08-08T09:37:59.127562900','2021-08-08T09:37:59.127562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 945, 96, 'Title 437', 'Description 437', 18, '20' ,'2021-08-07T09:37:59.128561600','2021-08-07T09:37:59.128561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 956, 95, 'Title 438', 'Description 438', 19, '21' ,'2021-08-06T09:37:59.128561600','2021-08-06T09:37:59.128561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 969, 94, 'Title 439', 'Description 439', 20, '22' ,'2021-08-05T09:37:59.128561600','2021-08-05T09:37:59.128561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 880, 93, 'Title 440', 'Description 440', 1, '1' ,'2021-08-04T09:37:59.128561600','2021-08-04T09:37:59.128561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 893, 101, 'Title 441', 'Description 441', 2, '2' ,'2021-08-03T09:37:59.129560900','2021-08-03T09:37:59.129560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 904, 100, 'Title 442', 'Description 442', 3, '3' ,'2021-08-02T09:37:59.129560900','2021-08-02T09:37:59.129560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 917, 99, 'Title 443', 'Description 443', 4, '4' ,'2021-08-01T09:37:59.129560900','2021-08-01T09:37:59.129560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 928, 98, 'Title 444', 'Description 444', 5, '5' ,'2021-07-31T09:37:59.129560900','2021-07-31T09:37:59.129560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 941, 97, 'Title 445', 'Description 445', 6, '6' ,'2021-07-30T09:37:59.129560900','2021-07-30T09:37:59.129560900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 952, 96, 'Title 446', 'Description 446', 7, '7' ,'2021-07-29T09:37:59.130563900','2021-07-29T09:37:59.130563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 965, 95, 'Title 447', 'Description 447', 8, '8' ,'2021-07-28T09:37:59.130563900','2021-07-28T09:37:59.130563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 976, 94, 'Title 448', 'Description 448', 9, '9' ,'2021-07-27T09:37:59.130563900','2021-07-27T09:37:59.130563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 989, 93, 'Title 449', 'Description 449', 10, '10' ,'2021-07-26T09:37:59.130563900','2021-07-26T09:37:59.130563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 900, 101, 'Title 450', 'Description 450', 11, '11' ,'2021-07-25T09:37:59.130563900','2021-07-25T09:37:59.130563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 913, 100, 'Title 451', 'Description 451', 12, '12' ,'2021-07-24T09:37:59.130563900','2021-07-24T09:37:59.130563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 924, 99, 'Title 452', 'Description 452', 13, '13' ,'2021-07-23T09:37:59.131561400','2021-07-23T09:37:59.131561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 937, 98, 'Title 453', 'Description 453', 14, '14' ,'2021-07-22T09:37:59.131561400','2021-07-22T09:37:59.131561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 948, 97, 'Title 454', 'Description 454', 15, '15' ,'2021-07-21T09:37:59.131561400','2021-07-21T09:37:59.131561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 961, 96, 'Title 455', 'Description 455', 16, '16' ,'2021-07-20T09:37:59.131561400','2021-07-20T09:37:59.131561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 972, 95, 'Title 456', 'Description 456', 17, '17' ,'2021-07-19T09:37:59.131561400','2021-07-19T09:37:59.131561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 985, 94, 'Title 457', 'Description 457', 18, '18' ,'2021-07-18T09:37:59.132561200','2021-07-18T09:37:59.132561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 996, 93, 'Title 458', 'Description 458', 19, '19' ,'2021-07-17T09:37:59.132561200','2021-07-17T09:37:59.132561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1009, 101, 'Title 459', 'Description 459', 20, '20' ,'2021-07-16T09:37:59.132561200','2021-07-16T09:37:59.132561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 920, 100, 'Title 460', 'Description 460', 1, '21' ,'2021-07-15T09:37:59.132561200','2021-07-15T09:37:59.132561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 933, 99, 'Title 461', 'Description 461', 2, '22' ,'2021-07-14T09:37:59.132561200','2021-07-14T09:37:59.132561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 944, 98, 'Title 462', 'Description 462', 3, '1' ,'2021-07-13T09:37:59.132561200','2021-07-13T09:37:59.132561200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 957, 97, 'Title 463', 'Description 463', 4, '2' ,'2021-07-12T09:37:59.133562300','2021-07-12T09:37:59.133562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 968, 96, 'Title 464', 'Description 464', 5, '3' ,'2021-07-11T09:37:59.133562300','2021-07-11T09:37:59.133562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 981, 95, 'Title 465', 'Description 465', 6, '4' ,'2021-07-10T09:37:59.133562300','2021-07-10T09:37:59.133562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 992, 94, 'Title 466', 'Description 466', 7, '5' ,'2021-07-09T09:37:59.133562300','2021-07-09T09:37:59.133562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1005, 93, 'Title 467', 'Description 467', 8, '6' ,'2021-07-08T09:37:59.133562300','2021-07-08T09:37:59.133562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1016, 101, 'Title 468', 'Description 468', 9, '7' ,'2021-07-07T09:37:59.133562300','2021-07-07T09:37:59.133562300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1029, 100, 'Title 469', 'Description 469', 10, '8' ,'2021-07-06T09:37:59.134561400','2021-07-06T09:37:59.134561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 940, 99, 'Title 470', 'Description 470', 11, '9' ,'2021-07-05T09:37:59.134561400','2021-07-05T09:37:59.134561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 953, 98, 'Title 471', 'Description 471', 12, '10' ,'2021-07-04T09:37:59.134561400','2021-07-04T09:37:59.134561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 964, 97, 'Title 472', 'Description 472', 13, '11' ,'2021-07-03T09:37:59.134561400','2021-07-03T09:37:59.134561400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 977, 96, 'Title 473', 'Description 473', 14, '12' ,'2021-07-02T09:37:59.135563200','2021-07-02T09:37:59.135563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 988, 95, 'Title 474', 'Description 474', 15, '13' ,'2021-07-01T09:37:59.135563200','2021-07-01T09:37:59.135563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1001, 94, 'Title 475', 'Description 475', 16, '14' ,'2021-06-30T09:37:59.135563200','2021-06-30T09:37:59.135563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1012, 93, 'Title 476', 'Description 476', 17, '15' ,'2021-06-29T09:37:59.136563600','2021-06-29T09:37:59.136563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1025, 101, 'Title 477', 'Description 477', 18, '16' ,'2021-06-28T09:37:59.136563600','2021-06-28T09:37:59.136563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1036, 100, 'Title 478', 'Description 478', 19, '17' ,'2021-06-27T09:37:59.136563600','2021-06-27T09:37:59.136563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1049, 99, 'Title 479', 'Description 479', 20, '18' ,'2021-06-26T09:37:59.136563600','2021-06-26T09:37:59.136563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 960, 98, 'Title 480', 'Description 480', 1, '19' ,'2021-06-25T09:37:59.136563600','2021-06-25T09:37:59.136563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 973, 97, 'Title 481', 'Description 481', 2, '20' ,'2021-06-24T09:37:59.136563600','2021-06-24T09:37:59.136563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 984, 96, 'Title 482', 'Description 482', 3, '21' ,'2021-06-23T09:37:59.137566600','2021-06-23T09:37:59.137566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 997, 95, 'Title 483', 'Description 483', 4, '22' ,'2021-06-22T09:37:59.137566600','2021-06-22T09:37:59.137566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1008, 94, 'Title 484', 'Description 484', 5, '1' ,'2021-06-21T09:37:59.137566600','2021-06-21T09:37:59.137566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1021, 93, 'Title 485', 'Description 485', 6, '2' ,'2021-06-20T09:37:59.137566600','2021-06-20T09:37:59.137566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1032, 101, 'Title 486', 'Description 486', 7, '3' ,'2021-06-19T09:37:59.137566600','2021-06-19T09:37:59.137566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1045, 100, 'Title 487', 'Description 487', 8, '4' ,'2021-06-18T09:37:59.138565700','2021-06-18T09:37:59.138565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1056, 99, 'Title 488', 'Description 488', 9, '5' ,'2021-06-17T09:37:59.138565700','2021-06-17T09:37:59.138565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1069, 98, 'Title 489', 'Description 489', 10, '6' ,'2021-06-16T09:37:59.138565700','2021-06-16T09:37:59.138565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 980, 97, 'Title 490', 'Description 490', 11, '7' ,'2021-06-15T09:37:59.138565700','2021-06-15T09:37:59.138565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 993, 96, 'Title 491', 'Description 491', 12, '8' ,'2021-06-14T09:37:59.138565700','2021-06-14T09:37:59.138565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1004, 95, 'Title 492', 'Description 492', 13, '9' ,'2021-06-13T09:37:59.139566','2021-06-13T09:37:59.139566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1017, 94, 'Title 493', 'Description 493', 14, '10' ,'2021-06-12T09:37:59.139566','2021-06-12T09:37:59.139566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1028, 93, 'Title 494', 'Description 494', 15, '11' ,'2021-06-11T09:37:59.139566','2021-06-11T09:37:59.139566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1041, 101, 'Title 495', 'Description 495', 16, '12' ,'2021-06-10T09:37:59.139566','2021-06-10T09:37:59.139566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1052, 100, 'Title 496', 'Description 496', 17, '13' ,'2021-06-09T09:37:59.140565300','2021-06-09T09:37:59.140565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1065, 99, 'Title 497', 'Description 497', 18, '14' ,'2021-06-08T09:37:59.140565300','2021-06-08T09:37:59.140565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1076, 98, 'Title 498', 'Description 498', 19, '15' ,'2021-06-07T09:37:59.140565300','2021-06-07T09:37:59.140565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1089, 97, 'Title 499', 'Description 499', 20, '16' ,'2021-06-06T09:37:59.140565300','2021-06-06T09:37:59.140565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1000, 96, 'Title 500', 'Description 500', 1, '17' ,'2021-06-05T09:37:59.140565300','2021-06-05T09:37:59.140565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1013, 95, 'Title 501', 'Description 501', 2, '18' ,'2021-06-04T09:37:59.141562600','2021-06-04T09:37:59.141562600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1024, 94, 'Title 502', 'Description 502', 3, '19' ,'2021-06-03T09:37:59.141562600','2021-06-03T09:37:59.141562600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1037, 93, 'Title 503', 'Description 503', 4, '20' ,'2021-06-02T09:37:59.141562600','2021-06-02T09:37:59.141562600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1048, 101, 'Title 504', 'Description 504', 5, '21' ,'2021-06-01T09:37:59.141562600','2021-06-01T09:37:59.141562600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1061, 100, 'Title 505', 'Description 505', 6, '22' ,'2021-05-31T09:37:59.141562600','2021-05-31T09:37:59.141562600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1072, 99, 'Title 506', 'Description 506', 7, '1' ,'2021-05-30T09:37:59.141562600','2021-05-30T09:37:59.141562600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1085, 98, 'Title 507', 'Description 507', 8, '2' ,'2021-05-29T09:37:59.142561900','2021-05-29T09:37:59.142561900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1096, 97, 'Title 508', 'Description 508', 9, '3' ,'2021-05-28T09:37:59.142561900','2021-05-28T09:37:59.142561900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1109, 96, 'Title 509', 'Description 509', 10, '4' ,'2021-05-27T09:37:59.142561900','2021-05-27T09:37:59.142561900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1020, 95, 'Title 510', 'Description 510', 11, '5' ,'2021-05-26T09:37:59.142561900','2021-05-26T09:37:59.142561900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1033, 94, 'Title 511', 'Description 511', 12, '6' ,'2021-05-25T09:37:59.142561900','2021-05-25T09:37:59.142561900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1044, 93, 'Title 512', 'Description 512', 13, '7' ,'2021-05-24T09:37:59.143567900','2021-05-24T09:37:59.143567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1057, 101, 'Title 513', 'Description 513', 14, '8' ,'2021-05-23T09:37:59.143567900','2021-05-23T09:37:59.143567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1068, 100, 'Title 514', 'Description 514', 15, '9' ,'2021-05-22T09:37:59.143567900','2021-05-22T09:37:59.143567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1081, 99, 'Title 515', 'Description 515', 16, '10' ,'2021-05-21T09:37:59.144568900','2021-05-21T09:37:59.144568900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1092, 98, 'Title 516', 'Description 516', 17, '11' ,'2021-05-20T09:37:59.144568900','2021-05-20T09:37:59.144568900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1105, 97, 'Title 517', 'Description 517', 18, '12' ,'2021-05-19T09:37:59.144568900','2021-05-19T09:37:59.144568900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1116, 96, 'Title 518', 'Description 518', 19, '13' ,'2021-05-18T09:37:59.145568500','2021-05-18T09:37:59.145568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1129, 95, 'Title 519', 'Description 519', 20, '14' ,'2021-05-17T09:37:59.145568500','2021-05-17T09:37:59.145568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1040, 94, 'Title 520', 'Description 520', 1, '15' ,'2021-05-16T09:37:59.145568500','2021-05-16T09:37:59.145568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1053, 93, 'Title 521', 'Description 521', 2, '16' ,'2021-05-15T09:37:59.145568500','2021-05-15T09:37:59.145568500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1064, 101, 'Title 522', 'Description 522', 3, '17' ,'2021-05-14T09:37:59.146568700','2021-05-14T09:37:59.146568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1077, 100, 'Title 523', 'Description 523', 4, '18' ,'2021-05-13T09:37:59.146568700','2021-05-13T09:37:59.146568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1088, 99, 'Title 524', 'Description 524', 5, '19' ,'2021-05-12T09:37:59.146568700','2021-05-12T09:37:59.146568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1101, 98, 'Title 525', 'Description 525', 6, '20' ,'2021-05-11T09:37:59.146568700','2021-05-11T09:37:59.146568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1112, 97, 'Title 526', 'Description 526', 7, '21' ,'2021-05-10T09:37:59.146568700','2021-05-10T09:37:59.146568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1125, 96, 'Title 527', 'Description 527', 8, '22' ,'2021-05-09T09:37:59.147565200','2021-05-09T09:37:59.147565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1136, 95, 'Title 528', 'Description 528', 9, '1' ,'2021-05-08T09:37:59.147565200','2021-05-08T09:37:59.147565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1149, 94, 'Title 529', 'Description 529', 10, '2' ,'2021-05-07T09:37:59.147565200','2021-05-07T09:37:59.147565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1060, 93, 'Title 530', 'Description 530', 11, '3' ,'2021-05-06T09:37:59.147565200','2021-05-06T09:37:59.147565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1073, 101, 'Title 531', 'Description 531', 12, '4' ,'2021-05-05T09:37:59.147565200','2021-05-05T09:37:59.147565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1084, 100, 'Title 532', 'Description 532', 13, '5' ,'2021-05-04T09:37:59.147565200','2021-05-04T09:37:59.147565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1097, 99, 'Title 533', 'Description 533', 14, '6' ,'2021-05-03T09:37:59.148562900','2021-05-03T09:37:59.148562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1108, 98, 'Title 534', 'Description 534', 15, '7' ,'2021-05-02T09:37:59.148562900','2021-05-02T09:37:59.148562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1121, 97, 'Title 535', 'Description 535', 16, '8' ,'2021-05-01T09:37:59.148562900','2021-05-01T09:37:59.148562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1132, 96, 'Title 536', 'Description 536', 17, '9' ,'2021-04-30T09:37:59.148562900','2021-04-30T09:37:59.148562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1145, 95, 'Title 537', 'Description 537', 18, '10' ,'2021-04-29T09:37:59.148562900','2021-04-29T09:37:59.148562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1156, 94, 'Title 538', 'Description 538', 19, '11' ,'2021-04-28T09:37:59.148562900','2021-04-28T09:37:59.148562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1169, 93, 'Title 539', 'Description 539', 20, '12' ,'2021-04-27T09:37:59.148562900','2021-04-27T09:37:59.148562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1080, 101, 'Title 540', 'Description 540', 1, '13' ,'2021-04-26T09:37:59.149563700','2021-04-26T09:37:59.149563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1093, 100, 'Title 541', 'Description 541', 2, '14' ,'2021-04-25T09:37:59.149563700','2021-04-25T09:37:59.149563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1104, 99, 'Title 542', 'Description 542', 3, '15' ,'2021-04-24T09:37:59.149563700','2021-04-24T09:37:59.149563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1117, 98, 'Title 543', 'Description 543', 4, '16' ,'2021-04-23T09:37:59.149563700','2021-04-23T09:37:59.149563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1128, 97, 'Title 544', 'Description 544', 5, '17' ,'2021-04-22T09:37:59.149563700','2021-04-22T09:37:59.149563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1141, 96, 'Title 545', 'Description 545', 6, '18' ,'2021-04-21T09:37:59.150565100','2021-04-21T09:37:59.150565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1152, 95, 'Title 546', 'Description 546', 7, '19' ,'2021-04-20T09:37:59.150565100','2021-04-20T09:37:59.150565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1165, 94, 'Title 547', 'Description 547', 8, '20' ,'2021-04-19T09:37:59.150565100','2021-04-19T09:37:59.150565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1176, 93, 'Title 548', 'Description 548', 9, '21' ,'2021-04-18T09:37:59.150565100','2021-04-18T09:37:59.150565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1189, 101, 'Title 549', 'Description 549', 10, '22' ,'2021-04-17T09:37:59.150565100','2021-04-17T09:37:59.150565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1100, 100, 'Title 550', 'Description 550', 11, '1' ,'2021-04-16T09:37:59.151564300','2021-04-16T09:37:59.151564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1113, 99, 'Title 551', 'Description 551', 12, '2' ,'2021-04-15T09:37:59.151564300','2021-04-15T09:37:59.151564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1124, 98, 'Title 552', 'Description 552', 13, '3' ,'2021-04-14T09:37:59.151564300','2021-04-14T09:37:59.151564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1137, 97, 'Title 553', 'Description 553', 14, '4' ,'2021-04-13T09:37:59.151564300','2021-04-13T09:37:59.151564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1148, 96, 'Title 554', 'Description 554', 15, '5' ,'2021-04-12T09:37:59.151564300','2021-04-12T09:37:59.151564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1161, 95, 'Title 555', 'Description 555', 16, '6' ,'2021-04-11T09:37:59.152563900','2021-04-11T09:37:59.152563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1172, 94, 'Title 556', 'Description 556', 17, '7' ,'2021-04-10T09:37:59.152563900','2021-04-10T09:37:59.152563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1185, 93, 'Title 557', 'Description 557', 18, '8' ,'2021-04-09T09:37:59.152563900','2021-04-09T09:37:59.152563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1196, 101, 'Title 558', 'Description 558', 19, '9' ,'2021-04-08T09:37:59.152563900','2021-04-08T09:37:59.152563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1209, 100, 'Title 559', 'Description 559', 20, '10' ,'2021-04-07T09:37:59.152563900','2021-04-07T09:37:59.152563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1120, 99, 'Title 560', 'Description 560', 1, '11' ,'2021-04-06T09:37:59.152563900','2021-04-06T09:37:59.152563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1133, 98, 'Title 561', 'Description 561', 2, '12' ,'2021-04-05T09:37:59.153564700','2021-04-05T09:37:59.153564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1144, 97, 'Title 562', 'Description 562', 3, '13' ,'2021-04-04T09:37:59.153564700','2021-04-04T09:37:59.153564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1157, 96, 'Title 563', 'Description 563', 4, '14' ,'2021-04-03T09:37:59.153564700','2021-04-03T09:37:59.153564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1168, 95, 'Title 564', 'Description 564', 5, '15' ,'2021-04-02T09:37:59.153564700','2021-04-02T09:37:59.153564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1181, 94, 'Title 565', 'Description 565', 6, '16' ,'2021-04-01T09:37:59.153564700','2021-04-01T09:37:59.153564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1192, 93, 'Title 566', 'Description 566', 7, '17' ,'2021-03-31T09:37:59.153564700','2021-03-31T09:37:59.153564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1205, 101, 'Title 567', 'Description 567', 8, '18' ,'2021-03-30T09:37:59.153564700','2021-03-30T09:37:59.153564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1216, 100, 'Title 568', 'Description 568', 9, '19' ,'2021-03-29T09:37:59.154563200','2021-03-29T09:37:59.154563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1229, 99, 'Title 569', 'Description 569', 10, '20' ,'2021-03-28T09:37:59.154563200','2021-03-28T09:37:59.154563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1140, 98, 'Title 570', 'Description 570', 11, '21' ,'2021-03-27T09:37:59.154563200','2021-03-27T09:37:59.154563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1153, 97, 'Title 571', 'Description 571', 12, '22' ,'2021-03-26T09:37:59.154563200','2021-03-26T09:37:59.154563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1164, 96, 'Title 572', 'Description 572', 13, '1' ,'2021-03-25T09:37:59.154563200','2021-03-25T09:37:59.154563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1177, 95, 'Title 573', 'Description 573', 14, '2' ,'2021-03-24T09:37:59.154563200','2021-03-24T09:37:59.154563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1188, 94, 'Title 574', 'Description 574', 15, '3' ,'2021-03-23T09:37:59.155563','2021-03-23T09:37:59.155563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1201, 93, 'Title 575', 'Description 575', 16, '4' ,'2021-03-22T09:37:59.155563','2021-03-22T09:37:59.155563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1212, 101, 'Title 576', 'Description 576', 17, '5' ,'2021-03-21T09:37:59.155563','2021-03-21T09:37:59.155563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1225, 100, 'Title 577', 'Description 577', 18, '6' ,'2021-03-20T09:37:59.155563','2021-03-20T09:37:59.155563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1236, 99, 'Title 578', 'Description 578', 19, '7' ,'2021-03-19T09:37:59.155563','2021-03-19T09:37:59.155563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1249, 98, 'Title 579', 'Description 579', 20, '8' ,'2021-03-18T09:37:59.155563','2021-03-18T09:37:59.155563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1160, 97, 'Title 580', 'Description 580', 1, '9' ,'2021-03-17T09:37:59.156563900','2021-03-17T09:37:59.156563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1173, 96, 'Title 581', 'Description 581', 2, '10' ,'2021-03-16T09:37:59.156563900','2021-03-16T09:37:59.156563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1184, 95, 'Title 582', 'Description 582', 3, '11' ,'2021-03-15T09:37:59.156563900','2021-03-15T09:37:59.156563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1197, 94, 'Title 583', 'Description 583', 4, '12' ,'2021-03-14T09:37:59.156563900','2021-03-14T09:37:59.156563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1208, 93, 'Title 584', 'Description 584', 5, '13' ,'2021-03-13T09:37:59.156563900','2021-03-13T09:37:59.156563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1221, 101, 'Title 585', 'Description 585', 6, '14' ,'2021-03-12T09:37:59.156563900','2021-03-12T09:37:59.156563900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1232, 100, 'Title 586', 'Description 586', 7, '15' ,'2021-03-11T09:37:59.157562800','2021-03-11T09:37:59.157562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1245, 99, 'Title 587', 'Description 587', 8, '16' ,'2021-03-10T09:37:59.157562800','2021-03-10T09:37:59.157562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1256, 98, 'Title 588', 'Description 588', 9, '17' ,'2021-03-09T09:37:59.157562800','2021-03-09T09:37:59.157562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1269, 97, 'Title 589', 'Description 589', 10, '18' ,'2021-03-08T09:37:59.157562800','2021-03-08T09:37:59.157562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1180, 96, 'Title 590', 'Description 590', 11, '19' ,'2021-03-07T09:37:59.157562800','2021-03-07T09:37:59.157562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1193, 95, 'Title 591', 'Description 591', 12, '20' ,'2021-03-06T09:37:59.157562800','2021-03-06T09:37:59.157562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1204, 94, 'Title 592', 'Description 592', 13, '21' ,'2021-03-05T09:37:59.158561600','2021-03-05T09:37:59.158561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1217, 93, 'Title 593', 'Description 593', 14, '22' ,'2021-03-04T09:37:59.158561600','2021-03-04T09:37:59.158561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1228, 101, 'Title 594', 'Description 594', 15, '1' ,'2021-03-03T09:37:59.158561600','2021-03-03T09:37:59.158561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1241, 100, 'Title 595', 'Description 595', 16, '2' ,'2021-03-02T09:37:59.158561600','2021-03-02T09:37:59.158561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1252, 99, 'Title 596', 'Description 596', 17, '3' ,'2021-03-01T09:37:59.158561600','2021-03-01T09:37:59.158561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1265, 98, 'Title 597', 'Description 597', 18, '4' ,'2021-02-28T09:37:59.158561600','2021-02-28T09:37:59.158561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1276, 97, 'Title 598', 'Description 598', 19, '5' ,'2021-02-27T09:37:59.159561600','2021-02-27T09:37:59.159561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1289, 96, 'Title 599', 'Description 599', 20, '6' ,'2021-02-26T09:37:59.159561600','2021-02-26T09:37:59.159561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1200, 95, 'Title 600', 'Description 600', 1, '7' ,'2021-02-25T09:37:59.159561600','2021-02-25T09:37:59.159561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1213, 94, 'Title 601', 'Description 601', 2, '8' ,'2021-02-24T09:37:59.159561600','2021-02-24T09:37:59.159561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1224, 93, 'Title 602', 'Description 602', 3, '9' ,'2021-02-23T09:37:59.159561600','2021-02-23T09:37:59.159561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1237, 101, 'Title 603', 'Description 603', 4, '10' ,'2021-02-22T09:37:59.159561600','2021-02-22T09:37:59.159561600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1248, 100, 'Title 604', 'Description 604', 5, '11' ,'2021-02-21T09:37:59.160562','2021-02-21T09:37:59.160562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1261, 99, 'Title 605', 'Description 605', 6, '12' ,'2021-02-20T09:37:59.160562','2021-02-20T09:37:59.160562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1272, 98, 'Title 606', 'Description 606', 7, '13' ,'2021-02-19T09:37:59.160562','2021-02-19T09:37:59.160562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1285, 97, 'Title 607', 'Description 607', 8, '14' ,'2021-02-18T09:37:59.160562','2021-02-18T09:37:59.160562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1296, 96, 'Title 608', 'Description 608', 9, '15' ,'2021-02-17T09:37:59.160562','2021-02-17T09:37:59.160562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1309, 95, 'Title 609', 'Description 609', 10, '16' ,'2021-02-16T09:37:59.160562','2021-02-16T09:37:59.160562'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1220, 94, 'Title 610', 'Description 610', 11, '17' ,'2021-02-15T09:37:59.161563100','2021-02-15T09:37:59.161563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1233, 93, 'Title 611', 'Description 611', 12, '18' ,'2021-02-14T09:37:59.161563100','2021-02-14T09:37:59.161563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1244, 101, 'Title 612', 'Description 612', 13, '19' ,'2021-02-13T09:37:59.161563100','2021-02-13T09:37:59.161563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1257, 100, 'Title 613', 'Description 613', 14, '20' ,'2021-02-12T09:37:59.161563100','2021-02-12T09:37:59.161563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1268, 99, 'Title 614', 'Description 614', 15, '21' ,'2021-02-11T09:37:59.161563100','2021-02-11T09:37:59.161563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1281, 98, 'Title 615', 'Description 615', 16, '22' ,'2021-02-10T09:37:59.161563100','2021-02-10T09:37:59.161563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1292, 97, 'Title 616', 'Description 616', 17, '1' ,'2021-02-09T09:37:59.162563200','2021-02-09T09:37:59.162563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1305, 96, 'Title 617', 'Description 617', 18, '2' ,'2021-02-08T09:37:59.162563200','2021-02-08T09:37:59.162563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1316, 95, 'Title 618', 'Description 618', 19, '3' ,'2021-02-07T09:37:59.162563200','2021-02-07T09:37:59.162563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1329, 94, 'Title 619', 'Description 619', 20, '4' ,'2021-02-06T09:37:59.162563200','2021-02-06T09:37:59.162563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1240, 93, 'Title 620', 'Description 620', 1, '5' ,'2021-02-05T09:37:59.162563200','2021-02-05T09:37:59.162563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1253, 101, 'Title 621', 'Description 621', 2, '6' ,'2021-02-04T09:37:59.162563200','2021-02-04T09:37:59.162563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1264, 100, 'Title 622', 'Description 622', 3, '7' ,'2021-02-03T09:37:59.163562900','2021-02-03T09:37:59.163562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1277, 99, 'Title 623', 'Description 623', 4, '8' ,'2021-02-02T09:37:59.163562900','2021-02-02T09:37:59.163562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1288, 98, 'Title 624', 'Description 624', 5, '9' ,'2021-02-01T09:37:59.163562900','2021-02-01T09:37:59.163562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1301, 97, 'Title 625', 'Description 625', 6, '10' ,'2021-01-31T09:37:59.163562900','2021-01-31T09:37:59.163562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1312, 96, 'Title 626', 'Description 626', 7, '11' ,'2021-01-30T09:37:59.163562900','2021-01-30T09:37:59.163562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1325, 95, 'Title 627', 'Description 627', 8, '12' ,'2021-01-29T09:37:59.163562900','2021-01-29T09:37:59.163562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1336, 94, 'Title 628', 'Description 628', 9, '13' ,'2021-01-28T09:37:59.164562900','2021-01-28T09:37:59.164562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1349, 93, 'Title 629', 'Description 629', 10, '14' ,'2021-01-27T09:37:59.164562900','2021-01-27T09:37:59.164562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1260, 101, 'Title 630', 'Description 630', 11, '15' ,'2021-01-26T09:37:59.164562900','2021-01-26T09:37:59.164562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1273, 100, 'Title 631', 'Description 631', 12, '16' ,'2021-01-25T09:37:59.164562900','2021-01-25T09:37:59.164562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1284, 99, 'Title 632', 'Description 632', 13, '17' ,'2021-01-24T09:37:59.164562900','2021-01-24T09:37:59.164562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1297, 98, 'Title 633', 'Description 633', 14, '18' ,'2021-01-23T09:37:59.164562900','2021-01-23T09:37:59.164562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1308, 97, 'Title 634', 'Description 634', 15, '19' ,'2021-01-22T09:37:59.165568','2021-01-22T09:37:59.165568'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1321, 96, 'Title 635', 'Description 635', 16, '20' ,'2021-01-21T09:37:59.165568','2021-01-21T09:37:59.165568'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1332, 95, 'Title 636', 'Description 636', 17, '21' ,'2021-01-20T09:37:59.165568','2021-01-20T09:37:59.165568'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1345, 94, 'Title 637', 'Description 637', 18, '22' ,'2021-01-19T09:37:59.165568','2021-01-19T09:37:59.165568'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1356, 93, 'Title 638', 'Description 638', 19, '1' ,'2021-01-18T09:37:59.165568','2021-01-18T09:37:59.165568'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1369, 101, 'Title 639', 'Description 639', 20, '2' ,'2021-01-17T09:37:59.166566800','2021-01-17T09:37:59.166566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1280, 100, 'Title 640', 'Description 640', 1, '3' ,'2021-01-16T09:37:59.166566800','2021-01-16T09:37:59.166566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1293, 99, 'Title 641', 'Description 641', 2, '4' ,'2021-01-15T09:37:59.166566800','2021-01-15T09:37:59.166566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1304, 98, 'Title 642', 'Description 642', 3, '5' ,'2021-01-14T09:37:59.166566800','2021-01-14T09:37:59.166566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1317, 97, 'Title 643', 'Description 643', 4, '6' ,'2021-01-13T09:37:59.167565700','2021-01-13T09:37:59.167565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1328, 96, 'Title 644', 'Description 644', 5, '7' ,'2021-01-12T09:37:59.167565700','2021-01-12T09:37:59.167565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1341, 95, 'Title 645', 'Description 645', 6, '8' ,'2021-01-11T09:37:59.167565700','2021-01-11T09:37:59.167565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1352, 94, 'Title 646', 'Description 646', 7, '9' ,'2021-01-10T09:37:59.167565700','2021-01-10T09:37:59.167565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1365, 93, 'Title 647', 'Description 647', 8, '10' ,'2021-01-09T09:37:59.167565700','2021-01-09T09:37:59.167565700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1376, 101, 'Title 648', 'Description 648', 9, '11' ,'2021-01-08T09:37:59.168566400','2021-01-08T09:37:59.168566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1389, 100, 'Title 649', 'Description 649', 10, '12' ,'2021-01-07T09:37:59.168566400','2021-01-07T09:37:59.168566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1300, 99, 'Title 650', 'Description 650', 11, '13' ,'2021-01-06T09:37:59.168566400','2021-01-06T09:37:59.168566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1313, 98, 'Title 651', 'Description 651', 12, '14' ,'2021-01-05T09:37:59.168566400','2021-01-05T09:37:59.168566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1324, 97, 'Title 652', 'Description 652', 13, '15' ,'2021-01-04T09:37:59.168566400','2021-01-04T09:37:59.168566400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1337, 96, 'Title 653', 'Description 653', 14, '16' ,'2021-01-03T09:37:59.169565500','2021-01-03T09:37:59.169565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1348, 95, 'Title 654', 'Description 654', 15, '17' ,'2021-01-02T09:37:59.169565500','2021-01-02T09:37:59.169565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1361, 94, 'Title 655', 'Description 655', 16, '18' ,'2021-01-01T09:37:59.169565500','2021-01-01T09:37:59.169565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1372, 93, 'Title 656', 'Description 656', 17, '19' ,'2020-12-31T09:37:59.169565500','2020-12-31T09:37:59.169565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1385, 101, 'Title 657', 'Description 657', 18, '20' ,'2020-12-30T09:37:59.169565500','2020-12-30T09:37:59.169565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1396, 100, 'Title 658', 'Description 658', 19, '21' ,'2020-12-29T09:37:59.169565500','2020-12-29T09:37:59.169565500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1409, 99, 'Title 659', 'Description 659', 20, '22' ,'2020-12-28T09:37:59.170566800','2020-12-28T09:37:59.170566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1320, 98, 'Title 660', 'Description 660', 1, '1' ,'2020-12-27T09:37:59.170566800','2020-12-27T09:37:59.170566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1333, 97, 'Title 661', 'Description 661', 2, '2' ,'2020-12-26T09:37:59.170566800','2020-12-26T09:37:59.170566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1344, 96, 'Title 662', 'Description 662', 3, '3' ,'2020-12-25T09:37:59.170566800','2020-12-25T09:37:59.170566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1357, 95, 'Title 663', 'Description 663', 4, '4' ,'2020-12-24T09:37:59.170566800','2020-12-24T09:37:59.170566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1368, 94, 'Title 664', 'Description 664', 5, '5' ,'2020-12-23T09:37:59.171566500','2020-12-23T09:37:59.171566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1381, 93, 'Title 665', 'Description 665', 6, '6' ,'2020-12-22T09:37:59.171566500','2020-12-22T09:37:59.171566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1392, 101, 'Title 666', 'Description 666', 7, '7' ,'2020-12-21T09:37:59.171566500','2020-12-21T09:37:59.171566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1405, 100, 'Title 667', 'Description 667', 8, '8' ,'2020-12-20T09:37:59.171566500','2020-12-20T09:37:59.171566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1416, 99, 'Title 668', 'Description 668', 9, '9' ,'2020-12-19T09:37:59.171566500','2020-12-19T09:37:59.171566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1429, 98, 'Title 669', 'Description 669', 10, '10' ,'2020-12-18T09:37:59.171566500','2020-12-18T09:37:59.171566500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1340, 97, 'Title 670', 'Description 670', 11, '11' ,'2020-12-17T09:37:59.172562200','2020-12-17T09:37:59.172562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1353, 96, 'Title 671', 'Description 671', 12, '12' ,'2020-12-16T09:37:59.172562200','2020-12-16T09:37:59.172562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1364, 95, 'Title 672', 'Description 672', 13, '13' ,'2020-12-15T09:37:59.172562200','2020-12-15T09:37:59.172562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1377, 94, 'Title 673', 'Description 673', 14, '14' ,'2020-12-14T09:37:59.172562200','2020-12-14T09:37:59.172562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1388, 93, 'Title 674', 'Description 674', 15, '15' ,'2020-12-13T09:37:59.172562200','2020-12-13T09:37:59.172562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1401, 101, 'Title 675', 'Description 675', 16, '16' ,'2020-12-12T09:37:59.172562200','2020-12-12T09:37:59.172562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1412, 100, 'Title 676', 'Description 676', 17, '17' ,'2020-12-11T09:37:59.173562800','2020-12-11T09:37:59.173562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1425, 99, 'Title 677', 'Description 677', 18, '18' ,'2020-12-10T09:37:59.173562800','2020-12-10T09:37:59.173562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1436, 98, 'Title 678', 'Description 678', 19, '19' ,'2020-12-09T09:37:59.173562800','2020-12-09T09:37:59.173562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1449, 97, 'Title 679', 'Description 679', 20, '20' ,'2020-12-08T09:37:59.173562800','2020-12-08T09:37:59.173562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1360, 96, 'Title 680', 'Description 680', 1, '21' ,'2020-12-07T09:37:59.173562800','2020-12-07T09:37:59.173562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1373, 95, 'Title 681', 'Description 681', 2, '22' ,'2020-12-06T09:37:59.174563600','2020-12-06T09:37:59.174563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1384, 94, 'Title 682', 'Description 682', 3, '1' ,'2020-12-05T09:37:59.174563600','2020-12-05T09:37:59.174563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1397, 93, 'Title 683', 'Description 683', 4, '2' ,'2020-12-04T09:37:59.174563600','2020-12-04T09:37:59.174563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1408, 101, 'Title 684', 'Description 684', 5, '3' ,'2020-12-03T09:37:59.174563600','2020-12-03T09:37:59.174563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1421, 100, 'Title 685', 'Description 685', 6, '4' ,'2020-12-02T09:37:59.174563600','2020-12-02T09:37:59.174563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1432, 99, 'Title 686', 'Description 686', 7, '5' ,'2020-12-01T09:37:59.174563600','2020-12-01T09:37:59.174563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1445, 98, 'Title 687', 'Description 687', 8, '6' ,'2020-11-30T09:37:59.175562900','2020-11-30T09:37:59.175562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1456, 97, 'Title 688', 'Description 688', 9, '7' ,'2020-11-29T09:37:59.175562900','2020-11-29T09:37:59.175562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1469, 96, 'Title 689', 'Description 689', 10, '8' ,'2020-11-28T09:37:59.175562900','2020-11-28T09:37:59.175562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1380, 95, 'Title 690', 'Description 690', 11, '9' ,'2020-11-27T09:37:59.175562900','2020-11-27T09:37:59.175562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1393, 94, 'Title 691', 'Description 691', 12, '10' ,'2020-11-26T09:37:59.175562900','2020-11-26T09:37:59.175562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1404, 93, 'Title 692', 'Description 692', 13, '11' ,'2020-11-25T09:37:59.175562900','2020-11-25T09:37:59.175562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1417, 101, 'Title 693', 'Description 693', 14, '12' ,'2020-11-24T09:37:59.176563300','2020-11-24T09:37:59.176563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1428, 100, 'Title 694', 'Description 694', 15, '13' ,'2020-11-23T09:37:59.176563300','2020-11-23T09:37:59.176563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1441, 99, 'Title 695', 'Description 695', 16, '14' ,'2020-11-22T09:37:59.176563300','2020-11-22T09:37:59.176563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1452, 98, 'Title 696', 'Description 696', 17, '15' ,'2020-11-21T09:37:59.176563300','2020-11-21T09:37:59.176563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1465, 97, 'Title 697', 'Description 697', 18, '16' ,'2020-11-20T09:37:59.176563300','2020-11-20T09:37:59.176563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1476, 96, 'Title 698', 'Description 698', 19, '17' ,'2020-11-19T09:37:59.176563300','2020-11-19T09:37:59.176563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1489, 95, 'Title 699', 'Description 699', 20, '18' ,'2020-11-18T09:37:59.176563300','2020-11-18T09:37:59.176563300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1400, 94, 'Title 700', 'Description 700', 1, '19' ,'2020-11-17T09:37:59.177563100','2020-11-17T09:37:59.177563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1413, 93, 'Title 701', 'Description 701', 2, '20' ,'2020-11-16T09:37:59.177563100','2020-11-16T09:37:59.177563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1424, 101, 'Title 702', 'Description 702', 3, '21' ,'2020-11-15T09:37:59.177563100','2020-11-15T09:37:59.177563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1437, 100, 'Title 703', 'Description 703', 4, '22' ,'2020-11-14T09:37:59.177563100','2020-11-14T09:37:59.177563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1448, 99, 'Title 704', 'Description 704', 5, '1' ,'2020-11-13T09:37:59.178566','2020-11-13T09:37:59.178566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1461, 98, 'Title 705', 'Description 705', 6, '2' ,'2020-11-12T09:37:59.178566','2020-11-12T09:37:59.178566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1472, 97, 'Title 706', 'Description 706', 7, '3' ,'2020-11-11T09:37:59.178566','2020-11-11T09:37:59.178566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1485, 96, 'Title 707', 'Description 707', 8, '4' ,'2020-11-10T09:37:59.178566','2020-11-10T09:37:59.178566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1496, 95, 'Title 708', 'Description 708', 9, '5' ,'2020-11-09T09:37:59.178566','2020-11-09T09:37:59.178566'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1509, 94, 'Title 709', 'Description 709', 10, '6' ,'2020-11-08T09:37:59.179562200','2020-11-08T09:37:59.179562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1420, 93, 'Title 710', 'Description 710', 11, '7' ,'2020-11-07T09:37:59.179562200','2020-11-07T09:37:59.179562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1433, 101, 'Title 711', 'Description 711', 12, '8' ,'2020-11-06T09:37:59.179562200','2020-11-06T09:37:59.179562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1444, 100, 'Title 712', 'Description 712', 13, '9' ,'2020-11-05T09:37:59.179562200','2020-11-05T09:37:59.179562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1457, 99, 'Title 713', 'Description 713', 14, '10' ,'2020-11-04T09:37:59.179562200','2020-11-04T09:37:59.179562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1468, 98, 'Title 714', 'Description 714', 15, '11' ,'2020-11-03T09:37:59.179562200','2020-11-03T09:37:59.179562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1481, 97, 'Title 715', 'Description 715', 16, '12' ,'2020-11-02T09:37:59.179562200','2020-11-02T09:37:59.179562200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1492, 96, 'Title 716', 'Description 716', 17, '13' ,'2020-11-01T09:37:59.180563','2020-11-01T09:37:59.180563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1505, 95, 'Title 717', 'Description 717', 18, '14' ,'2020-10-31T09:37:59.180563','2020-10-31T09:37:59.180563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1516, 94, 'Title 718', 'Description 718', 19, '15' ,'2020-10-30T09:37:59.180563','2020-10-30T09:37:59.180563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1529, 93, 'Title 719', 'Description 719', 20, '16' ,'2020-10-29T09:37:59.180563','2020-10-29T09:37:59.180563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1440, 101, 'Title 720', 'Description 720', 1, '17' ,'2020-10-28T09:37:59.180563','2020-10-28T09:37:59.180563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1453, 100, 'Title 721', 'Description 721', 2, '18' ,'2020-10-27T09:37:59.180563','2020-10-27T09:37:59.180563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1464, 99, 'Title 722', 'Description 722', 3, '19' ,'2020-10-26T09:37:59.181563400','2020-10-26T09:37:59.181563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1477, 98, 'Title 723', 'Description 723', 4, '20' ,'2020-10-25T09:37:59.181563400','2020-10-25T09:37:59.181563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1488, 97, 'Title 724', 'Description 724', 5, '21' ,'2020-10-24T09:37:59.181563400','2020-10-24T09:37:59.181563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1501, 96, 'Title 725', 'Description 725', 6, '22' ,'2020-10-23T09:37:59.181563400','2020-10-23T09:37:59.181563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1512, 95, 'Title 726', 'Description 726', 7, '1' ,'2020-10-22T09:37:59.181563400','2020-10-22T09:37:59.181563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1525, 94, 'Title 727', 'Description 727', 8, '2' ,'2020-10-21T09:37:59.181563400','2020-10-21T09:37:59.181563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1536, 93, 'Title 728', 'Description 728', 9, '3' ,'2020-10-20T09:37:59.182562900','2020-10-20T09:37:59.182562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1549, 101, 'Title 729', 'Description 729', 10, '4' ,'2020-10-19T09:37:59.182562900','2020-10-19T09:37:59.182562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1460, 100, 'Title 730', 'Description 730', 11, '5' ,'2020-10-18T09:37:59.182562900','2020-10-18T09:37:59.182562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1473, 99, 'Title 731', 'Description 731', 12, '6' ,'2020-10-17T09:37:59.182562900','2020-10-17T09:37:59.182562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1484, 98, 'Title 732', 'Description 732', 13, '7' ,'2020-10-16T09:37:59.182562900','2020-10-16T09:37:59.182562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1497, 97, 'Title 733', 'Description 733', 14, '8' ,'2020-10-15T09:37:59.182562900','2020-10-15T09:37:59.182562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1508, 96, 'Title 734', 'Description 734', 15, '9' ,'2020-10-14T09:37:59.183563500','2020-10-14T09:37:59.183563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1521, 95, 'Title 735', 'Description 735', 16, '10' ,'2020-10-13T09:37:59.183563500','2020-10-13T09:37:59.183563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1532, 94, 'Title 736', 'Description 736', 17, '11' ,'2020-10-12T09:37:59.183563500','2020-10-12T09:37:59.183563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1545, 93, 'Title 737', 'Description 737', 18, '12' ,'2020-10-11T09:37:59.183563500','2020-10-11T09:37:59.183563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1556, 101, 'Title 738', 'Description 738', 19, '13' ,'2020-10-10T09:37:59.183563500','2020-10-10T09:37:59.183563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1569, 100, 'Title 739', 'Description 739', 20, '14' ,'2020-10-09T09:37:59.183563500','2020-10-09T09:37:59.183563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1480, 99, 'Title 740', 'Description 740', 1, '15' ,'2020-10-08T09:37:59.184562800','2020-10-08T09:37:59.184562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1493, 98, 'Title 741', 'Description 741', 2, '16' ,'2020-10-07T09:37:59.184562800','2020-10-07T09:37:59.184562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1504, 97, 'Title 742', 'Description 742', 3, '17' ,'2020-10-06T09:37:59.184562800','2020-10-06T09:37:59.184562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1517, 96, 'Title 743', 'Description 743', 4, '18' ,'2020-10-05T09:37:59.184562800','2020-10-05T09:37:59.184562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1528, 95, 'Title 744', 'Description 744', 5, '19' ,'2020-10-04T09:37:59.184562800','2020-10-04T09:37:59.184562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1541, 94, 'Title 745', 'Description 745', 6, '20' ,'2020-10-03T09:37:59.184562800','2020-10-03T09:37:59.184562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1552, 93, 'Title 746', 'Description 746', 7, '21' ,'2020-10-02T09:37:59.185563','2020-10-02T09:37:59.185563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1565, 101, 'Title 747', 'Description 747', 8, '22' ,'2020-10-01T09:37:59.185563','2020-10-01T09:37:59.185563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1576, 100, 'Title 748', 'Description 748', 9, '1' ,'2020-09-30T09:37:59.185563','2020-09-30T09:37:59.185563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1589, 99, 'Title 749', 'Description 749', 10, '2' ,'2020-09-29T09:37:59.185563','2020-09-29T09:37:59.185563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1500, 98, 'Title 750', 'Description 750', 11, '3' ,'2020-09-28T09:37:59.185563','2020-09-28T09:37:59.185563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1513, 97, 'Title 751', 'Description 751', 12, '4' ,'2020-09-27T09:37:59.185563','2020-09-27T09:37:59.185563'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1524, 96, 'Title 752', 'Description 752', 13, '5' ,'2020-09-26T09:37:59.186563400','2020-09-26T09:37:59.186563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1537, 95, 'Title 753', 'Description 753', 14, '6' ,'2020-09-25T09:37:59.186563400','2020-09-25T09:37:59.186563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1548, 94, 'Title 754', 'Description 754', 15, '7' ,'2020-09-24T09:37:59.186563400','2020-09-24T09:37:59.186563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1561, 93, 'Title 755', 'Description 755', 16, '8' ,'2020-09-23T09:37:59.186563400','2020-09-23T09:37:59.186563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1572, 101, 'Title 756', 'Description 756', 17, '9' ,'2020-09-22T09:37:59.186563400','2020-09-22T09:37:59.186563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1585, 100, 'Title 757', 'Description 757', 18, '10' ,'2020-09-21T09:37:59.186563400','2020-09-21T09:37:59.186563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1596, 99, 'Title 758', 'Description 758', 19, '11' ,'2020-09-20T09:37:59.187563700','2020-09-20T09:37:59.187563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1609, 98, 'Title 759', 'Description 759', 20, '12' ,'2020-09-19T09:37:59.187563700','2020-09-19T09:37:59.187563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1520, 97, 'Title 760', 'Description 760', 1, '13' ,'2020-09-18T09:37:59.187563700','2020-09-18T09:37:59.187563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1533, 96, 'Title 761', 'Description 761', 2, '14' ,'2020-09-17T09:37:59.187563700','2020-09-17T09:37:59.187563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1544, 95, 'Title 762', 'Description 762', 3, '15' ,'2020-09-16T09:37:59.187563700','2020-09-16T09:37:59.187563700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1557, 94, 'Title 763', 'Description 763', 4, '16' ,'2020-09-15T09:37:59.188570300','2020-09-15T09:37:59.188570300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1568, 93, 'Title 764', 'Description 764', 5, '17' ,'2020-09-14T09:37:59.188570300','2020-09-14T09:37:59.188570300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1581, 101, 'Title 765', 'Description 765', 6, '18' ,'2020-09-13T09:37:59.188570300','2020-09-13T09:37:59.188570300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1592, 100, 'Title 766', 'Description 766', 7, '19' ,'2020-09-12T09:37:59.188570300','2020-09-12T09:37:59.188570300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1605, 99, 'Title 767', 'Description 767', 8, '20' ,'2020-09-11T09:37:59.189568400','2020-09-11T09:37:59.189568400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1616, 98, 'Title 768', 'Description 768', 9, '21' ,'2020-09-10T09:37:59.189568400','2020-09-10T09:37:59.189568400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1629, 97, 'Title 769', 'Description 769', 10, '22' ,'2020-09-09T09:37:59.189568400','2020-09-09T09:37:59.189568400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1540, 96, 'Title 770', 'Description 770', 11, '1' ,'2020-09-08T09:37:59.189568400','2020-09-08T09:37:59.189568400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1553, 95, 'Title 771', 'Description 771', 12, '2' ,'2020-09-07T09:37:59.189568400','2020-09-07T09:37:59.189568400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1564, 94, 'Title 772', 'Description 772', 13, '3' ,'2020-09-06T09:37:59.190567200','2020-09-06T09:37:59.190567200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1577, 93, 'Title 773', 'Description 773', 14, '4' ,'2020-09-05T09:37:59.190567200','2020-09-05T09:37:59.190567200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1588, 101, 'Title 774', 'Description 774', 15, '5' ,'2020-09-04T09:37:59.190567200','2020-09-04T09:37:59.190567200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1601, 100, 'Title 775', 'Description 775', 16, '6' ,'2020-09-03T09:37:59.190567200','2020-09-03T09:37:59.190567200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1612, 99, 'Title 776', 'Description 776', 17, '7' ,'2020-09-02T09:37:59.190567200','2020-09-02T09:37:59.190567200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1625, 98, 'Title 777', 'Description 777', 18, '8' ,'2020-09-01T09:37:59.191565800','2020-09-01T09:37:59.191565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1636, 97, 'Title 778', 'Description 778', 19, '9' ,'2020-08-31T09:37:59.191565800','2020-08-31T09:37:59.191565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1649, 96, 'Title 779', 'Description 779', 20, '10' ,'2020-08-30T09:37:59.191565800','2020-08-30T09:37:59.191565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1560, 95, 'Title 780', 'Description 780', 1, '11' ,'2020-08-29T09:37:59.191565800','2020-08-29T09:37:59.191565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1573, 94, 'Title 781', 'Description 781', 2, '12' ,'2020-08-28T09:37:59.191565800','2020-08-28T09:37:59.191565800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1584, 93, 'Title 782', 'Description 782', 3, '13' ,'2020-08-27T09:37:59.192564500','2020-08-27T09:37:59.192564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1597, 101, 'Title 783', 'Description 783', 4, '14' ,'2020-08-26T09:37:59.192564500','2020-08-26T09:37:59.192564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1608, 100, 'Title 784', 'Description 784', 5, '15' ,'2020-08-25T09:37:59.192564500','2020-08-25T09:37:59.192564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1621, 99, 'Title 785', 'Description 785', 6, '16' ,'2020-08-24T09:37:59.192564500','2020-08-24T09:37:59.192564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1632, 98, 'Title 786', 'Description 786', 7, '17' ,'2020-08-23T09:37:59.192564500','2020-08-23T09:37:59.192564500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1645, 97, 'Title 787', 'Description 787', 8, '18' ,'2020-08-22T09:37:59.193565200','2020-08-22T09:37:59.193565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1656, 96, 'Title 788', 'Description 788', 9, '19' ,'2020-08-21T09:37:59.193565200','2020-08-21T09:37:59.193565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1669, 95, 'Title 789', 'Description 789', 10, '20' ,'2020-08-20T09:37:59.193565200','2020-08-20T09:37:59.193565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1580, 94, 'Title 790', 'Description 790', 11, '21' ,'2020-08-19T09:37:59.193565200','2020-08-19T09:37:59.193565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1593, 93, 'Title 791', 'Description 791', 12, '22' ,'2020-08-18T09:37:59.193565200','2020-08-18T09:37:59.193565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1604, 101, 'Title 792', 'Description 792', 13, '1' ,'2020-08-17T09:37:59.193565200','2020-08-17T09:37:59.193565200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1617, 100, 'Title 793', 'Description 793', 14, '2' ,'2020-08-16T09:37:59.194564100','2020-08-16T09:37:59.194564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1628, 99, 'Title 794', 'Description 794', 15, '3' ,'2020-08-15T09:37:59.194564100','2020-08-15T09:37:59.194564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1641, 98, 'Title 795', 'Description 795', 16, '4' ,'2020-08-14T09:37:59.194564100','2020-08-14T09:37:59.194564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1652, 97, 'Title 796', 'Description 796', 17, '5' ,'2020-08-13T09:37:59.194564100','2020-08-13T09:37:59.194564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1665, 96, 'Title 797', 'Description 797', 18, '6' ,'2020-08-12T09:37:59.194564100','2020-08-12T09:37:59.194564100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1676, 95, 'Title 798', 'Description 798', 19, '7' ,'2020-08-11T09:37:59.195562500','2020-08-11T09:37:59.195562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1689, 94, 'Title 799', 'Description 799', 20, '8' ,'2020-08-10T09:37:59.195562500','2020-08-10T09:37:59.195562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1600, 93, 'Title 800', 'Description 800', 1, '9' ,'2020-08-09T09:37:59.195562500','2020-08-09T09:37:59.195562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1613, 101, 'Title 801', 'Description 801', 2, '10' ,'2020-08-08T09:37:59.195562500','2020-08-08T09:37:59.195562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1624, 100, 'Title 802', 'Description 802', 3, '11' ,'2020-08-07T09:37:59.195562500','2020-08-07T09:37:59.195562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1637, 99, 'Title 803', 'Description 803', 4, '12' ,'2020-08-06T09:37:59.195562500','2020-08-06T09:37:59.195562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1648, 98, 'Title 804', 'Description 804', 5, '13' ,'2020-08-05T09:37:59.195562500','2020-08-05T09:37:59.195562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1661, 97, 'Title 805', 'Description 805', 6, '14' ,'2020-08-04T09:37:59.196563600','2020-08-04T09:37:59.196563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1672, 96, 'Title 806', 'Description 806', 7, '15' ,'2020-08-03T09:37:59.196563600','2020-08-03T09:37:59.196563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1685, 95, 'Title 807', 'Description 807', 8, '16' ,'2020-08-02T09:37:59.196563600','2020-08-02T09:37:59.196563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1696, 94, 'Title 808', 'Description 808', 9, '17' ,'2020-08-01T09:37:59.196563600','2020-08-01T09:37:59.196563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1709, 93, 'Title 809', 'Description 809', 10, '18' ,'2020-07-31T09:37:59.196563600','2020-07-31T09:37:59.196563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1620, 101, 'Title 810', 'Description 810', 11, '19' ,'2020-07-30T09:37:59.196563600','2020-07-30T09:37:59.196563600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1633, 100, 'Title 811', 'Description 811', 12, '20' ,'2020-07-29T09:37:59.197565300','2020-07-29T09:37:59.197565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1644, 99, 'Title 812', 'Description 812', 13, '21' ,'2020-07-28T09:37:59.197565300','2020-07-28T09:37:59.197565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1657, 98, 'Title 813', 'Description 813', 14, '22' ,'2020-07-27T09:37:59.197565300','2020-07-27T09:37:59.197565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1668, 97, 'Title 814', 'Description 814', 15, '1' ,'2020-07-26T09:37:59.197565300','2020-07-26T09:37:59.197565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1681, 96, 'Title 815', 'Description 815', 16, '2' ,'2020-07-25T09:37:59.197565300','2020-07-25T09:37:59.197565300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1692, 95, 'Title 816', 'Description 816', 17, '3' ,'2020-07-24T09:37:59.198566900','2020-07-24T09:37:59.198566900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1705, 94, 'Title 817', 'Description 817', 18, '4' ,'2020-07-23T09:37:59.198566900','2020-07-23T09:37:59.198566900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1716, 93, 'Title 818', 'Description 818', 19, '5' ,'2020-07-22T09:37:59.198566900','2020-07-22T09:37:59.198566900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1729, 101, 'Title 819', 'Description 819', 20, '6' ,'2020-07-21T09:37:59.198566900','2020-07-21T09:37:59.198566900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1640, 100, 'Title 820', 'Description 820', 1, '7' ,'2020-07-20T09:37:59.198566900','2020-07-20T09:37:59.198566900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1653, 99, 'Title 821', 'Description 821', 2, '8' ,'2020-07-19T09:37:59.199563500','2020-07-19T09:37:59.199563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1664, 98, 'Title 822', 'Description 822', 3, '9' ,'2020-07-18T09:37:59.199563500','2020-07-18T09:37:59.199563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1677, 97, 'Title 823', 'Description 823', 4, '10' ,'2020-07-17T09:37:59.199563500','2020-07-17T09:37:59.199563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1688, 96, 'Title 824', 'Description 824', 5, '11' ,'2020-07-16T09:37:59.199563500','2020-07-16T09:37:59.199563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1701, 95, 'Title 825', 'Description 825', 6, '12' ,'2020-07-15T09:37:59.199563500','2020-07-15T09:37:59.199563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1712, 94, 'Title 826', 'Description 826', 7, '13' ,'2020-07-14T09:37:59.200565100','2020-07-14T09:37:59.200565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1725, 93, 'Title 827', 'Description 827', 8, '14' ,'2020-07-13T09:37:59.200565100','2020-07-13T09:37:59.200565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1736, 101, 'Title 828', 'Description 828', 9, '15' ,'2020-07-12T09:37:59.200565100','2020-07-12T09:37:59.200565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1749, 100, 'Title 829', 'Description 829', 10, '16' ,'2020-07-11T09:37:59.200565100','2020-07-11T09:37:59.200565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1660, 99, 'Title 830', 'Description 830', 11, '17' ,'2020-07-10T09:37:59.200565100','2020-07-10T09:37:59.200565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1673, 98, 'Title 831', 'Description 831', 12, '18' ,'2020-07-09T09:37:59.200565100','2020-07-09T09:37:59.200565100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1684, 97, 'Title 832', 'Description 832', 13, '19' ,'2020-07-08T09:37:59.201566600','2020-07-08T09:37:59.201566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1697, 96, 'Title 833', 'Description 833', 14, '20' ,'2020-07-07T09:37:59.201566600','2020-07-07T09:37:59.201566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1708, 95, 'Title 834', 'Description 834', 15, '21' ,'2020-07-06T09:37:59.201566600','2020-07-06T09:37:59.201566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1721, 94, 'Title 835', 'Description 835', 16, '22' ,'2020-07-05T09:37:59.201566600','2020-07-05T09:37:59.201566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1732, 93, 'Title 836', 'Description 836', 17, '1' ,'2020-07-04T09:37:59.201566600','2020-07-04T09:37:59.201566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1745, 101, 'Title 837', 'Description 837', 18, '2' ,'2020-07-03T09:37:59.202564800','2020-07-03T09:37:59.202564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1756, 100, 'Title 838', 'Description 838', 19, '3' ,'2020-07-02T09:37:59.202564800','2020-07-02T09:37:59.202564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1769, 99, 'Title 839', 'Description 839', 20, '4' ,'2020-07-01T09:37:59.202564800','2020-07-01T09:37:59.202564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1680, 98, 'Title 840', 'Description 840', 1, '5' ,'2020-06-30T09:37:59.202564800','2020-06-30T09:37:59.202564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1693, 97, 'Title 841', 'Description 841', 2, '6' ,'2020-06-29T09:37:59.202564800','2020-06-29T09:37:59.202564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1704, 96, 'Title 842', 'Description 842', 3, '7' ,'2020-06-28T09:37:59.202564800','2020-06-28T09:37:59.202564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1717, 95, 'Title 843', 'Description 843', 4, '8' ,'2020-06-27T09:37:59.203563400','2020-06-27T09:37:59.203563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1728, 94, 'Title 844', 'Description 844', 5, '9' ,'2020-06-26T09:37:59.203563400','2020-06-26T09:37:59.203563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1741, 93, 'Title 845', 'Description 845', 6, '10' ,'2020-06-25T09:37:59.203563400','2020-06-25T09:37:59.203563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1752, 101, 'Title 846', 'Description 846', 7, '11' ,'2020-06-24T09:37:59.203563400','2020-06-24T09:37:59.203563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1765, 100, 'Title 847', 'Description 847', 8, '12' ,'2020-06-23T09:37:59.203563400','2020-06-23T09:37:59.203563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1776, 99, 'Title 848', 'Description 848', 9, '13' ,'2020-06-22T09:37:59.203563400','2020-06-22T09:37:59.203563400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1789, 98, 'Title 849', 'Description 849', 10, '14' ,'2020-06-21T09:37:59.204561700','2020-06-21T09:37:59.204561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1700, 97, 'Title 850', 'Description 850', 11, '15' ,'2020-06-20T09:37:59.204561700','2020-06-20T09:37:59.204561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1713, 96, 'Title 851', 'Description 851', 12, '16' ,'2020-06-19T09:37:59.204561700','2020-06-19T09:37:59.204561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1724, 95, 'Title 852', 'Description 852', 13, '17' ,'2020-06-18T09:37:59.204561700','2020-06-18T09:37:59.204561700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1737, 94, 'Title 853', 'Description 853', 14, '18' ,'2020-06-17T09:37:59.205565600','2020-06-17T09:37:59.205565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1748, 93, 'Title 854', 'Description 854', 15, '19' ,'2020-06-16T09:37:59.205565600','2020-06-16T09:37:59.205565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1761, 101, 'Title 855', 'Description 855', 16, '20' ,'2020-06-15T09:37:59.205565600','2020-06-15T09:37:59.205565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1772, 100, 'Title 856', 'Description 856', 17, '21' ,'2020-06-14T09:37:59.205565600','2020-06-14T09:37:59.205565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1785, 99, 'Title 857', 'Description 857', 18, '22' ,'2020-06-13T09:37:59.205565600','2020-06-13T09:37:59.205565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1796, 98, 'Title 858', 'Description 858', 19, '1' ,'2020-06-12T09:37:59.205565600','2020-06-12T09:37:59.205565600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1809, 97, 'Title 859', 'Description 859', 20, '2' ,'2020-06-11T09:37:59.206566600','2020-06-11T09:37:59.206566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1720, 96, 'Title 860', 'Description 860', 1, '3' ,'2020-06-10T09:37:59.206566600','2020-06-10T09:37:59.206566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1733, 95, 'Title 861', 'Description 861', 2, '4' ,'2020-06-09T09:37:59.206566600','2020-06-09T09:37:59.206566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1744, 94, 'Title 862', 'Description 862', 3, '5' ,'2020-06-08T09:37:59.206566600','2020-06-08T09:37:59.206566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1757, 93, 'Title 863', 'Description 863', 4, '6' ,'2020-06-07T09:37:59.206566600','2020-06-07T09:37:59.206566600'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1768, 101, 'Title 864', 'Description 864', 5, '7' ,'2020-06-06T09:37:59.207569700','2020-06-06T09:37:59.207569700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1781, 100, 'Title 865', 'Description 865', 6, '8' ,'2020-06-05T09:37:59.207569700','2020-06-05T09:37:59.207569700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1792, 99, 'Title 866', 'Description 866', 7, '9' ,'2020-06-04T09:37:59.207569700','2020-06-04T09:37:59.207569700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1805, 98, 'Title 867', 'Description 867', 8, '10' ,'2020-06-03T09:37:59.207569700','2020-06-03T09:37:59.207569700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1816, 97, 'Title 868', 'Description 868', 9, '11' ,'2020-06-02T09:37:59.207569700','2020-06-02T09:37:59.207569700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1829, 96, 'Title 869', 'Description 869', 10, '12' ,'2020-06-01T09:37:59.207569700','2020-06-01T09:37:59.207569700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1740, 95, 'Title 870', 'Description 870', 11, '13' ,'2020-05-31T09:37:59.208568700','2020-05-31T09:37:59.208568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1753, 94, 'Title 871', 'Description 871', 12, '14' ,'2020-05-30T09:37:59.208568700','2020-05-30T09:37:59.208568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1764, 93, 'Title 872', 'Description 872', 13, '15' ,'2020-05-29T09:37:59.208568700','2020-05-29T09:37:59.208568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1777, 101, 'Title 873', 'Description 873', 14, '16' ,'2020-05-28T09:37:59.208568700','2020-05-28T09:37:59.208568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1788, 100, 'Title 874', 'Description 874', 15, '17' ,'2020-05-27T09:37:59.208568700','2020-05-27T09:37:59.208568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1801, 99, 'Title 875', 'Description 875', 16, '18' ,'2020-05-26T09:37:59.208568700','2020-05-26T09:37:59.208568700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1812, 98, 'Title 876', 'Description 876', 17, '19' ,'2020-05-25T09:37:59.209564700','2020-05-25T09:37:59.209564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1825, 97, 'Title 877', 'Description 877', 18, '20' ,'2020-05-24T09:37:59.209564700','2020-05-24T09:37:59.209564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1836, 96, 'Title 878', 'Description 878', 19, '21' ,'2020-05-23T09:37:59.209564700','2020-05-23T09:37:59.209564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1849, 95, 'Title 879', 'Description 879', 20, '22' ,'2020-05-22T09:37:59.209564700','2020-05-22T09:37:59.209564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1760, 94, 'Title 880', 'Description 880', 1, '1' ,'2020-05-21T09:37:59.209564700','2020-05-21T09:37:59.209564700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1773, 93, 'Title 881', 'Description 881', 2, '2' ,'2020-05-20T09:37:59.210567900','2020-05-20T09:37:59.210567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1784, 101, 'Title 882', 'Description 882', 3, '3' ,'2020-05-19T09:37:59.210567900','2020-05-19T09:37:59.210567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1797, 100, 'Title 883', 'Description 883', 4, '4' ,'2020-05-18T09:37:59.210567900','2020-05-18T09:37:59.210567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1808, 99, 'Title 884', 'Description 884', 5, '5' ,'2020-05-17T09:37:59.210567900','2020-05-17T09:37:59.210567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1821, 98, 'Title 885', 'Description 885', 6, '6' ,'2020-05-16T09:37:59.210567900','2020-05-16T09:37:59.210567900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1832, 97, 'Title 886', 'Description 886', 7, '7' ,'2020-05-15T09:37:59.211564800','2020-05-15T09:37:59.211564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1845, 96, 'Title 887', 'Description 887', 8, '8' ,'2020-05-14T09:37:59.211564800','2020-05-14T09:37:59.211564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1856, 95, 'Title 888', 'Description 888', 9, '9' ,'2020-05-13T09:37:59.211564800','2020-05-13T09:37:59.211564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1869, 94, 'Title 889', 'Description 889', 10, '10' ,'2020-05-12T09:37:59.211564800','2020-05-12T09:37:59.211564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1780, 93, 'Title 890', 'Description 890', 11, '11' ,'2020-05-11T09:37:59.211564800','2020-05-11T09:37:59.211564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1793, 101, 'Title 891', 'Description 891', 12, '12' ,'2020-05-10T09:37:59.211564800','2020-05-10T09:37:59.211564800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1804, 100, 'Title 892', 'Description 892', 13, '13' ,'2020-05-09T09:37:59.212564300','2020-05-09T09:37:59.212564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1817, 99, 'Title 893', 'Description 893', 14, '14' ,'2020-05-08T09:37:59.212564300','2020-05-08T09:37:59.212564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1828, 98, 'Title 894', 'Description 894', 15, '15' ,'2020-05-07T09:37:59.212564300','2020-05-07T09:37:59.212564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1841, 97, 'Title 895', 'Description 895', 16, '16' ,'2020-05-06T09:37:59.212564300','2020-05-06T09:37:59.212564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1852, 96, 'Title 896', 'Description 896', 17, '17' ,'2020-05-05T09:37:59.212564300','2020-05-05T09:37:59.212564300'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1865, 95, 'Title 897', 'Description 897', 18, '18' ,'2020-05-04T09:37:59.213567700','2020-05-04T09:37:59.213567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1876, 94, 'Title 898', 'Description 898', 19, '19' ,'2020-05-03T09:37:59.213567700','2020-05-03T09:37:59.213567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1889, 93, 'Title 899', 'Description 899', 20, '20' ,'2020-05-02T09:37:59.213567700','2020-05-02T09:37:59.213567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1800, 101, 'Title 900', 'Description 900', 1, '21' ,'2020-05-01T09:37:59.213567700','2020-05-01T09:37:59.213567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1813, 100, 'Title 901', 'Description 901', 2, '22' ,'2020-04-30T09:37:59.213567700','2020-04-30T09:37:59.213567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1824, 99, 'Title 902', 'Description 902', 3, '1' ,'2020-04-29T09:37:59.213567700','2020-04-29T09:37:59.213567700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1837, 98, 'Title 903', 'Description 903', 4, '2' ,'2020-04-28T09:37:59.214563100','2020-04-28T09:37:59.214563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1848, 97, 'Title 904', 'Description 904', 5, '3' ,'2020-04-27T09:37:59.214563100','2020-04-27T09:37:59.214563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1861, 96, 'Title 905', 'Description 905', 6, '4' ,'2020-04-26T09:37:59.214563100','2020-04-26T09:37:59.214563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1872, 95, 'Title 906', 'Description 906', 7, '5' ,'2020-04-25T09:37:59.214563100','2020-04-25T09:37:59.214563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1885, 94, 'Title 907', 'Description 907', 8, '6' ,'2020-04-24T09:37:59.214563100','2020-04-24T09:37:59.214563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1896, 93, 'Title 908', 'Description 908', 9, '7' ,'2020-04-23T09:37:59.215563200','2020-04-23T09:37:59.215563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1909, 101, 'Title 909', 'Description 909', 10, '8' ,'2020-04-22T09:37:59.215563200','2020-04-22T09:37:59.215563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1820, 100, 'Title 910', 'Description 910', 11, '9' ,'2020-04-21T09:37:59.215563200','2020-04-21T09:37:59.215563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1833, 99, 'Title 911', 'Description 911', 12, '10' ,'2020-04-20T09:37:59.215563200','2020-04-20T09:37:59.215563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1844, 98, 'Title 912', 'Description 912', 13, '11' ,'2020-04-19T09:37:59.215563200','2020-04-19T09:37:59.215563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1857, 97, 'Title 913', 'Description 913', 14, '12' ,'2020-04-18T09:37:59.215563200','2020-04-18T09:37:59.215563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1868, 96, 'Title 914', 'Description 914', 15, '13' ,'2020-04-17T09:37:59.215563200','2020-04-17T09:37:59.215563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1881, 95, 'Title 915', 'Description 915', 16, '14' ,'2020-04-16T09:37:59.216563500','2020-04-16T09:37:59.216563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1892, 94, 'Title 916', 'Description 916', 17, '15' ,'2020-04-15T09:37:59.216563500','2020-04-15T09:37:59.216563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1905, 93, 'Title 917', 'Description 917', 18, '16' ,'2020-04-14T09:37:59.216563500','2020-04-14T09:37:59.216563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1916, 101, 'Title 918', 'Description 918', 19, '17' ,'2020-04-13T09:37:59.216563500','2020-04-13T09:37:59.216563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1929, 100, 'Title 919', 'Description 919', 20, '18' ,'2020-04-12T09:37:59.216563500','2020-04-12T09:37:59.216563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1840, 99, 'Title 920', 'Description 920', 1, '19' ,'2020-04-11T09:37:59.216563500','2020-04-11T09:37:59.216563500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1853, 98, 'Title 921', 'Description 921', 2, '20' ,'2020-04-10T09:37:59.217562500','2020-04-10T09:37:59.217562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1864, 97, 'Title 922', 'Description 922', 3, '21' ,'2020-04-09T09:37:59.217562500','2020-04-09T09:37:59.217562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1877, 96, 'Title 923', 'Description 923', 4, '22' ,'2020-04-08T09:37:59.217562500','2020-04-08T09:37:59.217562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1888, 95, 'Title 924', 'Description 924', 5, '1' ,'2020-04-07T09:37:59.217562500','2020-04-07T09:37:59.217562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1901, 94, 'Title 925', 'Description 925', 6, '2' ,'2020-04-06T09:37:59.217562500','2020-04-06T09:37:59.217562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1912, 93, 'Title 926', 'Description 926', 7, '3' ,'2020-04-05T09:37:59.217562500','2020-04-05T09:37:59.217562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1925, 101, 'Title 927', 'Description 927', 8, '4' ,'2020-04-04T09:37:59.218563800','2020-04-04T09:37:59.218563800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1936, 100, 'Title 928', 'Description 928', 9, '5' ,'2020-04-03T09:37:59.218563800','2020-04-03T09:37:59.218563800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1949, 99, 'Title 929', 'Description 929', 10, '6' ,'2020-04-02T09:37:59.218563800','2020-04-02T09:37:59.218563800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1860, 98, 'Title 930', 'Description 930', 11, '7' ,'2020-04-01T09:37:59.218563800','2020-04-01T09:37:59.218563800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1873, 97, 'Title 931', 'Description 931', 12, '8' ,'2020-03-31T09:37:59.218563800','2020-03-31T09:37:59.218563800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1884, 96, 'Title 932', 'Description 932', 13, '9' ,'2020-03-30T09:37:59.218563800','2020-03-30T09:37:59.218563800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1897, 95, 'Title 933', 'Description 933', 14, '10' ,'2020-03-29T09:37:59.219562400','2020-03-29T09:37:59.219562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1908, 94, 'Title 934', 'Description 934', 15, '11' ,'2020-03-28T09:37:59.219562400','2020-03-28T09:37:59.219562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1921, 93, 'Title 935', 'Description 935', 16, '12' ,'2020-03-27T09:37:59.219562400','2020-03-27T09:37:59.219562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1932, 101, 'Title 936', 'Description 936', 17, '13' ,'2020-03-26T09:37:59.219562400','2020-03-26T09:37:59.219562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1945, 100, 'Title 937', 'Description 937', 18, '14' ,'2020-03-25T09:37:59.219562400','2020-03-25T09:37:59.219562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1956, 99, 'Title 938', 'Description 938', 19, '15' ,'2020-03-24T09:37:59.219562400','2020-03-24T09:37:59.219562400'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1969, 98, 'Title 939', 'Description 939', 20, '16' ,'2020-03-23T09:37:59.220562800','2020-03-23T09:37:59.220562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1880, 97, 'Title 940', 'Description 940', 1, '17' ,'2020-03-22T09:37:59.220562800','2020-03-22T09:37:59.220562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1893, 96, 'Title 941', 'Description 941', 2, '18' ,'2020-03-21T09:37:59.220562800','2020-03-21T09:37:59.220562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1904, 95, 'Title 942', 'Description 942', 3, '19' ,'2020-03-20T09:37:59.220562800','2020-03-20T09:37:59.220562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1917, 94, 'Title 943', 'Description 943', 4, '20' ,'2020-03-19T09:37:59.220562800','2020-03-19T09:37:59.220562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1928, 93, 'Title 944', 'Description 944', 5, '21' ,'2020-03-18T09:37:59.221563100','2020-03-18T09:37:59.221563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1941, 101, 'Title 945', 'Description 945', 6, '22' ,'2020-03-17T09:37:59.221563100','2020-03-17T09:37:59.221563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1952, 100, 'Title 946', 'Description 946', 7, '1' ,'2020-03-16T09:37:59.221563100','2020-03-16T09:37:59.221563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1965, 99, 'Title 947', 'Description 947', 8, '2' ,'2020-03-15T09:37:59.221563100','2020-03-15T09:37:59.221563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1976, 98, 'Title 948', 'Description 948', 9, '3' ,'2020-03-14T09:37:59.221563100','2020-03-14T09:37:59.221563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1989, 97, 'Title 949', 'Description 949', 10, '4' ,'2020-03-13T09:37:59.221563100','2020-03-13T09:37:59.221563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1900, 96, 'Title 950', 'Description 950', 11, '5' ,'2020-03-12T09:37:59.221563100','2020-03-12T09:37:59.221563100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1913, 95, 'Title 951', 'Description 951', 12, '6' ,'2020-03-11T09:37:59.222562100','2020-03-11T09:37:59.222562100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1924, 94, 'Title 952', 'Description 952', 13, '7' ,'2020-03-10T09:37:59.222562100','2020-03-10T09:37:59.222562100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1937, 93, 'Title 953', 'Description 953', 14, '8' ,'2020-03-09T09:37:59.222562100','2020-03-09T09:37:59.222562100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1948, 101, 'Title 954', 'Description 954', 15, '9' ,'2020-03-08T09:37:59.222562100','2020-03-08T09:37:59.222562100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1961, 100, 'Title 955', 'Description 955', 16, '10' ,'2020-03-07T09:37:59.222562100','2020-03-07T09:37:59.222562100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1972, 99, 'Title 956', 'Description 956', 17, '11' ,'2020-03-06T09:37:59.222562100','2020-03-06T09:37:59.222562100'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1985, 98, 'Title 957', 'Description 957', 18, '12' ,'2020-03-05T09:37:59.223562700','2020-03-05T09:37:59.223562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1996, 97, 'Title 958', 'Description 958', 19, '13' ,'2020-03-04T09:37:59.223562700','2020-03-04T09:37:59.223562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2009, 96, 'Title 959', 'Description 959', 20, '14' ,'2020-03-03T09:37:59.223562700','2020-03-03T09:37:59.223562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1920, 95, 'Title 960', 'Description 960', 1, '15' ,'2020-03-02T09:37:59.223562700','2020-03-02T09:37:59.223562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1933, 94, 'Title 961', 'Description 961', 2, '16' ,'2020-03-01T09:37:59.223562700','2020-03-01T09:37:59.223562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1944, 93, 'Title 962', 'Description 962', 3, '17' ,'2020-02-29T09:37:59.223562700','2020-02-29T09:37:59.223562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1957, 101, 'Title 963', 'Description 963', 4, '18' ,'2020-02-28T09:37:59.224562800','2020-02-28T09:37:59.224562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1968, 100, 'Title 964', 'Description 964', 5, '19' ,'2020-02-27T09:37:59.224562800','2020-02-27T09:37:59.224562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1981, 99, 'Title 965', 'Description 965', 6, '20' ,'2020-02-26T09:37:59.224562800','2020-02-26T09:37:59.224562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1992, 98, 'Title 966', 'Description 966', 7, '21' ,'2020-02-25T09:37:59.224562800','2020-02-25T09:37:59.224562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2005, 97, 'Title 967', 'Description 967', 8, '22' ,'2020-02-24T09:37:59.224562800','2020-02-24T09:37:59.224562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2016, 96, 'Title 968', 'Description 968', 9, '1' ,'2020-02-23T09:37:59.224562800','2020-02-23T09:37:59.224562800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2029, 95, 'Title 969', 'Description 969', 10, '2' ,'2020-02-22T09:37:59.225564','2020-02-22T09:37:59.225564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1940, 94, 'Title 970', 'Description 970', 11, '3' ,'2020-02-21T09:37:59.225564','2020-02-21T09:37:59.225564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1953, 93, 'Title 971', 'Description 971', 12, '4' ,'2020-02-20T09:37:59.225564','2020-02-20T09:37:59.225564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1964, 101, 'Title 972', 'Description 972', 13, '5' ,'2020-02-19T09:37:59.225564','2020-02-19T09:37:59.225564'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1977, 100, 'Title 973', 'Description 973', 14, '6' ,'2020-02-18T09:37:59.226566800','2020-02-18T09:37:59.226566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1988, 99, 'Title 974', 'Description 974', 15, '7' ,'2020-02-17T09:37:59.226566800','2020-02-17T09:37:59.226566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2001, 98, 'Title 975', 'Description 975', 16, '8' ,'2020-02-16T09:37:59.226566800','2020-02-16T09:37:59.226566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2012, 97, 'Title 976', 'Description 976', 17, '9' ,'2020-02-15T09:37:59.226566800','2020-02-15T09:37:59.226566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2025, 96, 'Title 977', 'Description 977', 18, '10' ,'2020-02-14T09:37:59.226566800','2020-02-14T09:37:59.226566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2036, 95, 'Title 978', 'Description 978', 19, '11' ,'2020-02-13T09:37:59.226566800','2020-02-13T09:37:59.226566800'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2049, 94, 'Title 979', 'Description 979', 20, '12' ,'2020-02-12T09:37:59.227562500','2020-02-12T09:37:59.227562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1960, 93, 'Title 980', 'Description 980', 1, '13' ,'2020-02-11T09:37:59.227562500','2020-02-11T09:37:59.227562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1973, 101, 'Title 981', 'Description 981', 2, '14' ,'2020-02-10T09:37:59.227562500','2020-02-10T09:37:59.227562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 1984, 100, 'Title 982', 'Description 982', 3, '15' ,'2020-02-09T09:37:59.227562500','2020-02-09T09:37:59.227562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1997, 99, 'Title 983', 'Description 983', 4, '16' ,'2020-02-08T09:37:59.227562500','2020-02-08T09:37:59.227562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2008, 98, 'Title 984', 'Description 984', 5, '17' ,'2020-02-07T09:37:59.227562500','2020-02-07T09:37:59.227562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2021, 97, 'Title 985', 'Description 985', 6, '18' ,'2020-02-06T09:37:59.227562500','2020-02-06T09:37:59.227562500'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2032, 96, 'Title 986', 'Description 986', 7, '19' ,'2020-02-05T09:37:59.228562700','2020-02-05T09:37:59.228562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2045, 95, 'Title 987', 'Description 987', 8, '20' ,'2020-02-04T09:37:59.228562700','2020-02-04T09:37:59.228562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2056, 94, 'Title 988', 'Description 988', 9, '21' ,'2020-02-03T09:37:59.228562700','2020-02-03T09:37:59.228562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2069, 93, 'Title 989', 'Description 989', 10, '22' ,'2020-02-02T09:37:59.228562700','2020-02-02T09:37:59.228562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1980, 101, 'Title 990', 'Description 990', 11, '1' ,'2020-02-01T09:37:59.228562700','2020-02-01T09:37:59.228562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 1993, 100, 'Title 991', 'Description 991', 12, '2' ,'2020-01-31T09:37:59.228562700','2020-01-31T09:37:59.228562700'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2004, 99, 'Title 992', 'Description 992', 13, '3' ,'2020-01-30T09:37:59.229562900','2020-01-30T09:37:59.229562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2017, 98, 'Title 993', 'Description 993', 14, '4' ,'2020-01-29T09:37:59.229562900','2020-01-29T09:37:59.229562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2028, 97, 'Title 994', 'Description 994', 15, '5' ,'2020-01-28T09:37:59.229562900','2020-01-28T09:37:59.229562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2041, 96, 'Title 995', 'Description 995', 16, '6' ,'2020-01-27T09:37:59.229562900','2020-01-27T09:37:59.229562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2052, 95, 'Title 996', 'Description 996', 17, '7' ,'2020-01-26T09:37:59.229562900','2020-01-26T09:37:59.229562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('INCOME', 2065, 94, 'Title 997', 'Description 997', 18, '8' ,'2020-01-25T09:37:59.229562900','2020-01-25T09:37:59.229562900'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2076, 93, 'Title 998', 'Description 998', 19, '9' ,'2020-01-24T09:37:59.230563200','2020-01-24T09:37:59.230563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2089, 101, 'Title 999', 'Description 999', 20, '10' ,'2020-01-23T09:37:59.230563200','2020-01-23T09:37:59.230563200'); +INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES ('OUTCOME', 2000, 100, 'Title 1000', 'Description 1000', 1, '11' ,'2020-01-22T09:37:59.230563200','2020-01-22T09:37:59.230563200'); diff --git a/src/main/resources/liquibase-changelog.xml b/src/main/resources/liquibase-changelog.xml new file mode 100644 index 0000000..6fa125d --- /dev/null +++ b/src/main/resources/liquibase-changelog.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/src/main/resources/populateDatabase.groovy b/src/main/resources/populateDatabase.groovy new file mode 100644 index 0000000..8432019 --- /dev/null +++ b/src/main/resources/populateDatabase.groovy @@ -0,0 +1,148 @@ +import groovy.transform.Field +import groovy.time.* +import java.time.* + +@Field int counter = 5 /*write here next number after creating tables*/ + +def createFile(name) { + def currentDirPath = System.getProperty("user.dir") + def pathToInsertData = "/db/data/02-insert/" + + def fullName = currentDirPath + pathToInsertData + counter++ + "-insert-" + name + + return new File(fullName) +} + +def clearFileAndGenerateHeader(file) { + clearFile(file) + generateHeader(file) +} + +def clearFile(file) { + file.write("") +} + +def generateHeader(file) { + def sqlHeader = "--liquibase formatted sql" + def currentChangeset = counter - 1 + def changesetHeader = "--changeset pacion:" + currentChangeset + + file.append(sqlHeader + "\n") + file.append(changesetHeader + "\n") +} + +def generateCategories() { + File categories = createFile("categories.sql") + clearFileAndGenerateHeader(categories) + + for (int i = 1; i <= 20; i++) { + def exampleTimestamp = LocalDateTime.now().minusDays(100 - i) + + def categoryInsert = "INSERT INTO category (name, created, updated) " + + "VALUES ('Test name ${i}','" + exampleTimestamp + "','" + exampleTimestamp + "');\n" + + categories.append(categoryInsert) + } +} + +def generateRoles() { + File roles = createFile("roles.sql") + clearFileAndGenerateHeader(roles) + + roles.append("INSERT INTO role (name) " + + "VALUES ('ROLE_USER');\n") + + roles.append("INSERT INTO role (name) " + + "VALUES ('ROLE_ADMIN');\n") +} + +def generateUsers() { + File users = createFile("users.sql") + clearFileAndGenerateHeader(users) + + def exampleTimestamp = LocalDateTime.now() + + users.append("INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)" + + "VALUES ('admin', 'admin@wp.pl', '{noop}admin', 'admin', 'admin','" + exampleTimestamp + "','" + exampleTimestamp + "');\n") + + users.append("INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)" + + "VALUES ('user', 'user@wp.pl', '{noop}user', 'user', 'user','" + exampleTimestamp + "','" + exampleTimestamp + "');\n") + + for (int i = 1; i <= 20; i++) { + exampleTimestamp = LocalDateTime.now().minusDays(100 - i) + + def categoryInsert = "INSERT INTO app_user (username, email, password, first_name, second_name, created, updated)" + + "VALUES ('test${i}', 'test${i}@wp.pl', '{noop}test${i}', 'test${i}', 'test${i}','" + exampleTimestamp + "','" + exampleTimestamp + "');\n" + + users.append(categoryInsert) + } +} + +def generateRelationUserRole() { + File relation = createFile("relationUserRole.sql") + clearFileAndGenerateHeader(relation) + + def userRole = 1 + def adminRole = 2 + def adminId = 1 + def userId = 2 + + relation.append("INSERT INTO user_roles (role_id, user_id) " + + "VALUES(" + userRole + "," + adminId + ");\n") + + relation.append("INSERT INTO user_roles (role_id, user_id) " + + "VALUES(" + adminRole + "," + adminId + ");\n") + + relation.append("INSERT INTO user_roles (role_id, user_id) " + + "VALUES(" + userRole + "," + userId + ");\n") + + def numberOfUsersInserted = 22 + + for (int i = 3; i <= numberOfUsersInserted; i++) { + + def randomRole = (i % 2) + 1 + + def categoryInsert = "INSERT INTO user_roles (role_id, user_id) " + + "VALUES(" + randomRole + "," + i + ");\n" + + relation.append(categoryInsert) + + // admin has to obtain user role + if(randomRole == adminRole) { + categoryInsert = "INSERT INTO user_roles (role_id, user_id) " + + "VALUES(" + userRole + "," + i + ");\n" + + relation.append(categoryInsert) + } + } +} + +def generateTransactions() { + File categories = createFile("transactions.sql") + clearFileAndGenerateHeader(categories) + + def transactionsMap = [0:"INCOME", 1:"OUTCOME"] + + def numberOfUsers = 22 + for (int i = 1; i <= 1000; i++) { + def exampleTimestamp = LocalDateTime.now().minusDays(i) + + def randomId = Math.abs(new Random().nextInt() % 2) + def value = i + i + (i % 10) * 10 + i % 2 + def quantity = 100 - (i % 9) + 1 + def category = (i % 20) + 1 + def user = (i % numberOfUsers) + 1 + + def categoryInsert = "INSERT INTO transaction (transaction_type, value, quantity, title, description, category_id, appuser_id, created, updated) VALUES " + + "('" + transactionsMap[randomId] + "', ${value}, ${quantity}, 'Title ${i}', 'Description ${i}', ${category}, '${user}' ,'" + exampleTimestamp + "','" + exampleTimestamp + "');\n" + + categories.append(categoryInsert) + } + +} + +generateRoles() +generateUsers() +generateRelationUserRole() +generateCategories() +generateTransactions() \ No newline at end of file diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/BaseIntegrationTests.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/BaseIntegrationTests.java index 41bee5a..7fae69b 100644 --- a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/BaseIntegrationTests.java +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/BaseIntegrationTests.java @@ -12,7 +12,8 @@ @SpringBootTest @ActiveProfiles("test") @Testcontainers -public class BaseIntegrationTests { +public +class BaseIntegrationTests { private static final String SPRING_DB_URL_PROPERTY = "spring.datasource.url"; private static final String SPRING_DB_USERNAME_PROPERTY = "spring.datasource.username"; diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/InfinityFinanceApiApplicationTests.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/InfinityFinanceApiApplicationTests.java deleted file mode 100644 index 3433bef..0000000 --- a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/InfinityFinanceApiApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class InfinityFinanceApiApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminControllerTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminControllerTest.java new file mode 100644 index 0000000..20abbd4 --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminControllerTest.java @@ -0,0 +1,116 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.BaseIntegrationTests; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.AppUserDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.CreateAppUserAdminDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.ReplaceAppUserAllDetailsDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import java.nio.charset.StandardCharsets; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + +@AutoConfigureMockMvc +class AppUserAdminControllerTest extends BaseIntegrationTests { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + private final MediaType JSON = new MediaType( + MediaType.APPLICATION_JSON.getType(), + MediaType.APPLICATION_JSON.getSubtype(), + StandardCharsets.UTF_8 + ); + + private final String apiVersionUrl = "/api/v1"; + private final String getAllUsersAdminUrl = apiVersionUrl + "/admin/users"; + private final String deleteAllUsersAdminUrl = apiVersionUrl + "/admin/users/1"; + private final String putReplaceUserAdminUrl = apiVersionUrl + "/admin/users/1"; + private final String postCreateUserAdminUrl = apiVersionUrl + "/admin/users"; + + private String exampleEmail = "example@wp.pl"; + private String exampleUsername = "Patryk1235!"; + private final String examplePassword = "{noop}example1231!"; + + @Test + @DisplayName("Should get all users.") + void shouldGetAllUsers() throws Exception { + MvcResult mvcResult = mockMvc.perform( + MockMvcRequestBuilders.get(getAllUsersAdminUrl)) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andReturn(); + + assertEquals("application/json", mvcResult.getResponse().getContentType()); + } + + @Test + @DisplayName("Should add correct user with user and admin role.") + void shouldAddUser() throws Exception { + CreateAppUserAdminDTO createAppUserAdminDTO = new CreateAppUserAdminDTO(); + createAppUserAdminDTO.setEmail(exampleEmail); + createAppUserAdminDTO.setPassword(examplePassword); + createAppUserAdminDTO.setUsername(exampleUsername); + createAppUserAdminDTO.setRoles(List.of(RoleDTO.builder().name("ROLE_ADMIN").build())); + + String json = objectMapper.writer().withDefaultPrettyPrinter().writeValueAsString(createAppUserAdminDTO); + + mockMvc.perform( + MockMvcRequestBuilders.post(postCreateUserAdminUrl) + .contentType(JSON) + .content(json)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.email").value(exampleEmail)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.username").value(exampleUsername)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.roles[0].name").value("ROLE_USER")) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.roles[1].name").value("ROLE_ADMIN")) + .andExpect(MockMvcResultMatchers.status().isCreated()); + } + + @Test + @DisplayName("Should delete user by id.") + void shouldDeleteUserById() throws Exception { + mockMvc.perform( + MockMvcRequestBuilders.delete(deleteAllUsersAdminUrl)) + .andExpect(MockMvcResultMatchers.status().isNoContent()); + } + + @Test + @DisplayName("Should replace user.") + void shouldReplaceUser() throws Exception { + exampleUsername += "unique"; + exampleEmail += "unique"; + + var userToReplace = new ReplaceAppUserAllDetailsDTO(); + userToReplace.setUsername(exampleUsername); + userToReplace.setEmail(exampleEmail); + userToReplace.setPassword(examplePassword); + userToReplace.setRoles(List.of(RoleDTO.builder().name("shouldCreateOnlyUserRole").build())); + + String json = objectMapper.writer().withDefaultPrettyPrinter().writeValueAsString(userToReplace); + + mockMvc.perform( + MockMvcRequestBuilders.put(putReplaceUserAdminUrl) + .contentType(JSON) + .content(json)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.email").value(exampleEmail)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.username").value(exampleUsername)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.roles[0].name").value("ROLE_USER")) + .andExpect(MockMvcResultMatchers.status().isOk()); + } +} \ No newline at end of file diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminServiceTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminServiceTest.java new file mode 100644 index 0000000..dfe6890 --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserAdminServiceTest.java @@ -0,0 +1,183 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.rolestrategy.AppUserRoleStrategyFacade; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.exception.ResourceNotFoundException; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.RoleService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.util.CustomPageable; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.TransactionAdminService; +import org.checkerframework.checker.units.qual.A; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.data.domain.*; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +class AppUserAdminServiceTest extends AppUserTestHelper { + + @InjectMocks + private AppUserAdminService appUserAdminService; + + @Mock + private AppUserRepository appUserRepository; + @Mock + private AppUserUtil appUserUtil; + @Mock + private RoleService roleService; + @Mock + private TransactionAdminService transactionAdminService; + @Mock + private AppUserRoleStrategyFacade appUserRoleStrategyFacade; + @Mock + private CustomPageable customPageable; + + @Test + @DisplayName("Should get all users") + void shouldGetAllUsers() { + //given + final Page page = new PageImpl<>(List.of(appUserTest)); + given(appUserRepository.findAll(any(Pageable.class))).willReturn(page); + given(appUserUtil.mapToAppUserDTO(Mockito.any(AppUser.class))).willReturn(appUserDTOTest); + given(customPageable.validateAndCreatePageable(anyInt(), any(Sort.Direction.class), anyString(), ArgumentMatchers.>any())).willReturn(PageRequest.of(1,1)); + + // when + var users = appUserAdminService.getAllUsers(1, Sort.Direction.ASC, "id"); + + //then + assertEquals(1, users.size()); + + var firstUser = users.get(0); + assertThat(firstUser, instanceOf(AppUserDTO.class)); + assertThat(firstUser, hasProperty("id", equalTo(TEST_ID))); + assertThat(firstUser, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(firstUser, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(firstUser, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(firstUser, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, firstUser.getRoles().size()); + assertThat(firstUser.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } + + @Test + @DisplayName("Should get single user") + void shouldGetSingleUser() { + //given + given(appUserRepository.findById(anyLong())).willReturn(Optional.ofNullable(appUserTest)); + given(appUserUtil.mapToAppUserDTO(Mockito.any(AppUser.class))).willReturn(appUserDTOTest); + + // when + var user = appUserAdminService.getSingleUser(appUserTest.getId()); + + //then + assertThat(user, instanceOf(AppUserDTO.class)); + assertThat(user, hasProperty("id", equalTo(TEST_ID))); + assertThat(user, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(user, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(user, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(user, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, user.getRoles().size()); + assertThat(user.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } + + @Test + @DisplayName("Should create user") + void shouldCreateUser() { + //given + given(appUserUtil.mapToAppUserFactory(ArgumentMatchers.any())).willReturn(appUserTest); + given(roleService.getUserRoleOrCreate()).willReturn(roleTest); + given(appUserRepository.save(Mockito.any(AppUser.class))).willReturn(appUserTest); + given(appUserUtil.mapToAppUserDTO(Mockito.any(AppUser.class))).willReturn(appUserDTOTest); + + // when + var user = appUserAdminService.createAccount(createAppUserAdminDTOTest); + + //then + assertThat(user, instanceOf(AppUserDTO.class)); + assertThat(user, hasProperty("id", equalTo(TEST_ID))); + assertThat(user, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(user, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(user, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(user, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, user.getRoles().size()); + assertThat(user.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } + + @Test + @DisplayName("Should delete user and all relations") + void shouldDeleteUser() { + //given + given(appUserRepository.findById(anyLong())).willReturn(Optional.ofNullable(appUserTest)); + + // when + appUserAdminService.findAndDeleteUserWithRolesAndTransactions(TEST_ID); + + //then + verify(transactionAdminService).deleteTransactionsRelatedWithUser(TEST_ID); + verify(appUserRepository).delete(appUserTest); + verify(appUserRoleStrategyFacade).removeRoles(appUserTest); + } + + + @Test + @DisplayName("Should replace user all details") + void shouldReplaceAllUserDetails() { + //given + given(appUserRepository.findById(anyLong())).willReturn(Optional.ofNullable(appUserTest)); + given(appUserUtil.overwriteAppUserAllDetails(Mockito.any(AppUser.class), Mockito.any(ReplaceAppUserAllDetailsDTO.class))).willReturn(appUserTest); + given(appUserRepository.save(Mockito.any(AppUser.class))).willReturn(appUserTest); + given(appUserUtil.mapToAppUserDTO(Mockito.any(AppUser.class))).willReturn(appUserDTOTest); + + // when + var user = appUserAdminService.replaceUserAllDetails(TEST_ID, replaceAppUserAllDetailsDTO); + + //then + assertThat(user, instanceOf(AppUserDTO.class)); + assertThat(user, hasProperty("id", equalTo(TEST_ID))); + assertThat(user, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(user, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(user, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(user, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, user.getRoles().size()); + assertThat(user.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } + + @Test + @DisplayName("Should throw when logged in user does not exist") + void shouldThrowExceptionWhenLoggedInUserDoesNotExist() { + //given + given(appUserRepository.getIdByUsername(anyString())).willReturn(null); + + // when + assertThatThrownBy(() -> appUserAdminService.getLoggedInUserId()) + .isInstanceOf(UsernameNotFoundException.class) + .hasMessage("User not found in the database"); + } + + @Test + @DisplayName("Should throw when user does not exist in db") + void shouldThrowWhenUserDoesNotExist() { + //given + given(appUserRepository.findById(anyLong())).willReturn(Optional.ofNullable(null)); + + // when + assertThatThrownBy(() -> appUserAdminService.getUserById(TEST_ID)) + .isInstanceOf(ResourceNotFoundException.class) + .hasMessage("Could not find any user with id " + TEST_ID); + + } + +} \ No newline at end of file diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserNameHolder.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserNameHolder.java new file mode 100644 index 0000000..e08dc6c --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserNameHolder.java @@ -0,0 +1,12 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +abstract class AppUserNameHolder { + protected static long TEST_ID = 1L; + + protected static String TEST_ROLENAME = "ROLE_USER"; + protected static String TEST_PLAINTEXT_PASSWORD = "{noop}example1!"; + protected static String TEST_EMAIL = "testemail@wp.pl"; + protected static String TEST_FIRSTNAME = "John"; + protected static String TEST_SECONDNAME = "Kowalski"; + protected static String TEST_USERNAME = "username132"; +} diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserTestHelper.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserTestHelper.java new file mode 100644 index 0000000..f97ceec --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserTestHelper.java @@ -0,0 +1,89 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + +import java.util.Collections; + +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class AppUserTestHelper extends AppUserNameHolder{ + protected AppUser appUserTest; + protected AppUserDTO appUserDTOTest; + protected Role roleTest; + protected RoleDTO roleDTOTest; + protected CreateAppUserAdminDTO createAppUserAdminDTOTest; + protected CreateAppUserUserDTO createAppUserUserDTO; + protected AppUserCredentialsDTO appUserCredentialsDTO; + protected ReplaceAppUserByUserDTO replaceAppUserByUserDTO; + protected ReplaceAppUserAllDetailsDTO replaceAppUserAllDetailsDTO; + + + @BeforeEach + void init() { + roleTest = Role.builder() + .id(TEST_ID) + .name(TEST_ROLENAME) + .build(); + + roleDTOTest = RoleDTO.builder() + .name(TEST_ROLENAME) + .build(); + + appUserTest = AppUser.builder() + .id(TEST_ID) + .email(TEST_EMAIL) + .firstName(TEST_FIRSTNAME) + .secondName(TEST_SECONDNAME) + .username(TEST_USERNAME) + .password(TEST_PLAINTEXT_PASSWORD) + .roles(Collections.singletonList(roleTest)) + .build(); + + appUserDTOTest = AppUserDTO.builder() + .id(TEST_ID) + .email(TEST_EMAIL) + .firstName(TEST_FIRSTNAME) + .secondName(TEST_SECONDNAME) + .username(TEST_USERNAME) + .roles(Collections.singletonList(roleDTOTest)) + .build(); + + createAppUserAdminDTOTest = new CreateAppUserAdminDTO(); + createAppUserAdminDTOTest.setPassword(TEST_PLAINTEXT_PASSWORD); + createAppUserAdminDTOTest.setEmail(TEST_EMAIL); + createAppUserAdminDTOTest.setUsername(TEST_USERNAME); + + createAppUserUserDTO = CreateAppUserUserDTO.builder() + .email(TEST_EMAIL) + .username(TEST_USERNAME) + .password(TEST_PLAINTEXT_PASSWORD) + .build(); + + appUserCredentialsDTO = AppUserCredentialsDTO.builder() + .password(TEST_PLAINTEXT_PASSWORD) + .username(TEST_USERNAME) + .build(); + + replaceAppUserByUserDTO = ReplaceAppUserByUserDTO.builder() + .email(TEST_EMAIL) + .firstName(TEST_FIRSTNAME) + .secondName(TEST_SECONDNAME) + .build(); + + replaceAppUserAllDetailsDTO = new ReplaceAppUserAllDetailsDTO(); + replaceAppUserAllDetailsDTO.setPassword(TEST_PLAINTEXT_PASSWORD); + replaceAppUserAllDetailsDTO.setEmail(TEST_EMAIL); + replaceAppUserAllDetailsDTO.setUsername(TEST_USERNAME); + replaceAppUserAllDetailsDTO.setFirstName(TEST_FIRSTNAME); + replaceAppUserAllDetailsDTO.setSecondName(TEST_SECONDNAME); + replaceAppUserAllDetailsDTO.setRoles(Collections.singletonList(roleDTOTest)); + + } +} diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserServiceTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserServiceTest.java new file mode 100644 index 0000000..e25f8f5 --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/appuser/AppUserUserServiceTest.java @@ -0,0 +1,134 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.*; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + +import java.util.Collections; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.verify; + +class AppUserUserServiceTest extends AppUserTestHelper { + + @InjectMocks + private AppUserUserService appUserUserService; + @Mock + private AppUserAdminService appUserAdminService; + @Mock + private AppUserUtil appUserUtil; + + @Test + @DisplayName("Should get current logged user information.") + void shouldGetCurrentLoggedUserInformation() { + //given + given(appUserAdminService.getLoggedInUserId()).willReturn(appUserTest.getId()); + given(appUserAdminService.getUserById(anyLong())).willReturn(appUserTest); + given(appUserUtil.mapToAppUserDTO(any(AppUser.class))).willReturn(appUserDTOTest); + + // when + var user = appUserUserService.getCurrentLoggedUserInformation(); + + //then + assertThat(user, instanceOf(AppUserDTO.class)); + assertThat(user, hasProperty("id", equalTo(TEST_ID))); + assertThat(user, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(user, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(user, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(user, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, user.getRoles().size()); + assertThat(user.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } + + @Test + @DisplayName("Should register user.") + void shouldRegisterUser() { + given(appUserAdminService.createAccount(any(CreateAppUserUserDTO.class))).willReturn(appUserDTOTest); + + // when + var user = appUserUserService.createAccount(createAppUserUserDTO); + + //then + assertThat(user, instanceOf(AppUserDTO.class)); + assertThat(user, hasProperty("id", equalTo(TEST_ID))); + assertThat(user, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(user, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(user, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(user, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, user.getRoles().size()); + assertThat(user.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } + + @Test + @DisplayName("Should delete current logged user.") + void shouldDeleteUser() { + given(appUserAdminService.getLoggedInUserId()).willReturn(appUserTest.getId()); + + // when + appUserUserService.deleteCurrentLoggedUser(); + + //then + verify(appUserAdminService).findAndDeleteUserWithRolesAndTransactions(appUserTest.getId()); + } + + @Test + @DisplayName("Should replace current user credentials.") + void shouldReplaceCurrentLoggedUserCredentials() { + given(appUserAdminService.getLoggedInUserId()).willReturn(appUserTest.getId()); + given(appUserAdminService.getUserById(anyLong())).willReturn(appUserTest); + given(appUserAdminService.saveUser(any(AppUser.class))).willReturn(appUserTest); + given(appUserUtil.overwriteAppUserCredentials(any(AppUser.class), any(AppUserCredentialsDTO.class))).willReturn(appUserTest); + given(appUserUtil.mapToAppUserDTO(any(AppUser.class))).willReturn(appUserDTOTest); + + // when + var user = appUserUserService.replaceUserCredentials(appUserCredentialsDTO); + + //then + assertThat(user, instanceOf(AppUserDTO.class)); + assertThat(user, hasProperty("id", equalTo(TEST_ID))); + assertThat(user, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(user, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(user, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(user, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, user.getRoles().size()); + assertThat(user.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } + + @Test + @DisplayName("Should replace current user details.") + void shouldReplaceCurrentLoggedUserDetails() { + given(appUserAdminService.getLoggedInUserId()).willReturn(appUserTest.getId()); + given(appUserAdminService.getUserById(anyLong())).willReturn(appUserTest); + given(appUserAdminService.saveUser(any(AppUser.class))).willReturn(appUserTest); + given(appUserUtil.overwriteAppUserDetails(any(AppUser.class), any(ReplaceAppUserByUserDTO.class))).willReturn(appUserTest); + given(appUserUtil.mapToAppUserDTO(any(AppUser.class))).willReturn(appUserDTOTest); + + // when + var user = appUserUserService.replaceUserDetails(replaceAppUserByUserDTO); + + //then + assertThat(user, instanceOf(AppUserDTO.class)); + assertThat(user, hasProperty("id", equalTo(TEST_ID))); + assertThat(user, hasProperty("email", equalTo(TEST_EMAIL))); + assertThat(user, hasProperty("firstName", equalTo(TEST_FIRSTNAME))); + assertThat(user, hasProperty("secondName", equalTo(TEST_SECONDNAME))); + assertThat(user, hasProperty("username", equalTo(TEST_USERNAME))); + assertEquals(1, user.getRoles().size()); + assertThat(user.getRoles().get(0), hasProperty("name", equalTo(TEST_ROLENAME))); + } +} \ No newline at end of file diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityServiceTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityServiceTest.java index 7292279..dfda5f0 100644 --- a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityServiceTest.java +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/security/SecurityServiceTest.java @@ -1,7 +1,7 @@ package com.github.WeeiaEduTeam.InfinityFinanceAPI.security; import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserAdminService; import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; import com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt.JwtUtil; import org.junit.jupiter.api.BeforeEach; @@ -11,16 +11,17 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static com.github.WeeiaEduTeam.InfinityFinanceAPI.security.jwt.JwtUtil.TOKEN_PREFIX; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.when; +import static org.mockito.BDDMockito.given; +@MockitoSettings(strictness = Strictness.LENIENT) @ExtendWith(MockitoExtension.class) class SecurityServiceTest { @@ -28,23 +29,18 @@ class SecurityServiceTest { private SecurityService securityService; @Mock - private AppUserService appUserService; + private AppUserAdminService appUserAdminService; @Mock private JwtUtil jwtUtil; AppUser userAdminTest; - List roles; + Role roleTest; @BeforeEach void init() { - roles = new ArrayList<>(Arrays.asList( - Role.builder() - .name("ROLE_ADMIN") - .build(), - Role.builder() - .name("ROLE_USER") - .build() - )); + roleTest = Role.builder() + .name("ROLE_ADMIN") + .build(); userAdminTest = AppUser.builder() .username("adm") @@ -52,22 +48,22 @@ void init() { .password("{noop}adm") .firstName("Ok") .secondName("Oki") - .roles(roles) + .roles(List.of(roleTest)) .build(); } - /*@Test + @Test @DisplayName("Should refresh access token.") void shouldRefreshAccessToken() { // given String issuer = "issuer"; + String refreshToken = "refresh"; + String expectedToken = "expected"; - String refreshToken = jwtUtil.generateRefreshToken(userAdminTest.getUsername(), issuer); - String expectedAccessToken = jwtUtil.generateAccessToken(userAdminTest.getUsername(), new ArrayList<>(), issuer); + given(jwtUtil.extractUsernameFromRefreshToken(anyString(), anyBoolean())).willReturn(userAdminTest.getUsername()); - when(jwtUtil.extractUsernameFromRefreshToken(anyString(), anyBoolean())).thenReturn(userAdminTest.getUsername()); - when(appUserService.getUserByUserName(anyString())).thenReturn(userAdminTest); - when(jwtUtil.generateAccessToken(anyString(), anyList(), anyString())).thenReturn(expectedAccessToken); + given(appUserAdminService.getUserByUserName(anyString())).willReturn(userAdminTest); + given(jwtUtil.generateAccessToken(anyString(), anyList(), anyString())).willReturn(expectedToken); // when String accessToken = securityService.refreshAccessToken(refreshToken, issuer); @@ -75,6 +71,6 @@ void shouldRefreshAccessToken() { // then assertThat(accessToken) .isNotEmpty() - .isEqualTo(TOKEN_PREFIX + expectedAccessToken); - }*/ + .isEqualTo(TOKEN_PREFIX + expectedToken); + } } \ No newline at end of file diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminControllerTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminControllerTest.java new file mode 100644 index 0000000..8d91183 --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminControllerTest.java @@ -0,0 +1,126 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.BaseIntegrationTests; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.CreateAppUserAdminDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.dto.ReplaceAppUserAllDetailsDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.dto.RoleDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import java.nio.charset.StandardCharsets; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + +@AutoConfigureMockMvc +class TransactionAdminControllerTest extends BaseIntegrationTests { + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + private final MediaType JSON = new MediaType( + MediaType.APPLICATION_JSON.getType(), + MediaType.APPLICATION_JSON.getSubtype(), + StandardCharsets.UTF_8 + ); + + private final String apiVersionUrl = "/api/v1"; + private final String getAllTransactionsAdminUrl = apiVersionUrl + "/admin/users/4/transactions"; + private final String postCreateTransactionAdminUrl = apiVersionUrl + "/admin/users/4/transactions"; + private final String putReplaceTransactionAdminUrl = apiVersionUrl + "/admin/users/8/transactions/7"; + private final String deleteTransactionAdminUrl = apiVersionUrl + "/admin/users/transactions/4"; + + private final String exampleCategory = "exampleCategory"; + private final String exampleDescription = "exampleDescription"; + private final String exampleTitle = "exampleTitle"; + private final int exampleValue = 10; + private final int exampleQuantity = 10; + + @Test + @DisplayName("Should get all transactions.") + void shouldGetAllTransactions() throws Exception { + MvcResult mvcResult = mockMvc.perform( + MockMvcRequestBuilders.get(getAllTransactionsAdminUrl)) + .andDo(print()) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andReturn(); + + assertEquals("application/json", mvcResult.getResponse().getContentType()); + } + + @Test + @DisplayName("Should add transaction for given user id.") + void shouldAddTransaction() throws Exception { + var transactionToAdd = CreateTransactionDTO.builder() + .transactionType(TransactionType.INCOME) + .title(exampleTitle) + .categoryName(exampleCategory) + .value(exampleValue) + .quantity(exampleQuantity) + .description(exampleDescription) + .build(); + + String json = objectMapper.writer().withDefaultPrettyPrinter().writeValueAsString(transactionToAdd); + + mockMvc.perform( + MockMvcRequestBuilders.post(postCreateTransactionAdminUrl) + .contentType(JSON) + .content(json)) + .andDo(print()) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.categoryName").value(exampleCategory)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.title").value(exampleTitle)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.value").value(exampleValue)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.quantity").value(exampleQuantity)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.description").value(exampleDescription)) + .andExpect(MockMvcResultMatchers.status().isCreated()); + } + + @Test + @DisplayName("Should delete transaction by id.") + void shouldDeleteTransactionById() throws Exception { + mockMvc.perform( + MockMvcRequestBuilders.delete(deleteTransactionAdminUrl)) + .andExpect(MockMvcResultMatchers.status().isNoContent()); + } + + @Test + @DisplayName("Should replace transaction.") + void shouldReplaceTransaction() throws Exception { + var transactionToAdd = CreateTransactionDTO.builder() + .transactionType(TransactionType.OUTCOME) + .title(exampleTitle) + .categoryName(exampleCategory) + .value(exampleValue) + .quantity(exampleQuantity) + .description(exampleDescription) + .build(); + + String json = objectMapper.writer().withDefaultPrettyPrinter().writeValueAsString(transactionToAdd); + + mockMvc.perform( + MockMvcRequestBuilders.put(putReplaceTransactionAdminUrl) + .contentType(JSON) + .content(json)) + .andDo(print()) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.categoryName").value(exampleCategory)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.title").value(exampleTitle)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.value").value(exampleValue)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.quantity").value(exampleQuantity)) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.description").value(exampleDescription)) + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + +} \ No newline at end of file diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminServiceTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminServiceTest.java new file mode 100644 index 0000000..1a4c36c --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionAdminServiceTest.java @@ -0,0 +1,194 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserAdminService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.CategoryService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.util.CustomPageable; +import org.checkerframework.checker.units.qual.A; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.InjectMocks; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.mockito.ArgumentMatchers.*; + +import org.mockito.Mock; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +import java.util.Collections; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.verify; + +class TransactionAdminServiceTest extends TransactionTestHelper{ + + @InjectMocks + private TransactionAdminService transactionAdminService; + + @Mock + private TransactionRepository transactionRepository; + + @Mock + private CategoryService categoryService; + + @Mock + private AppUserAdminService appUserAdminService; + + @Mock + private TransactionUtil transactionUtil; + + @Mock + private CustomPageable customPageable; + + + + @Test + @DisplayName("Should delete transaction and related category with no relations.") + void shouldDeleteTransactionByIdAndCategory() { + // given + given(transactionRepository.findById(anyLong())).willReturn(Optional.ofNullable(transactionTest)); + + // when + transactionAdminService.deleteTransaction(transactionTest.getId()); + + // then + verify(transactionRepository).delete(transactionTest); + verify(categoryService).checkAndDeleteCategoryIfNotRelated(transactionTest.getCategory().getId()); + } + + @Test + @DisplayName("Should create transaction for given user with known category.") + void shouldCreateTransactionForGivenUserWithKnownCategory() { + //given + given(transactionUtil.mapToTransaction(any(CreateTransactionDTO.class))).willReturn(transactionTest); + given(transactionUtil.mapToTransactionDTO(any(Transaction.class))).willReturn(transactionDTOTest); + given(appUserAdminService.getUserById(anyLong())).willReturn(appUserTest); + given(transactionRepository.save(any(Transaction.class))).willReturn(transactionTest); + + //when + var savedTransaction = transactionAdminService.createTransactionForGivenUser(appUserTest.getId(), createTransactionDTOTest); + + //then + assertThat(savedTransaction, instanceOf(TransactionDTO.class)); + assertThat(savedTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(savedTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(savedTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(savedTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + @Test + @DisplayName("Should save transaction for given user and found category.") + void shouldCreateTransactionForGivenUser() { + //given + given(transactionUtil.mapToTransaction(any(CreateTransactionDTO.class))).willReturn(transactionTest); + given(transactionUtil.mapToTransactionDTO(any(Transaction.class))).willReturn(transactionDTOTest); + given(appUserAdminService.getUserById(anyLong())).willReturn(appUserTest); + given(transactionRepository.save(any(Transaction.class))).willReturn(transactionTest); + + //when + var savedTransaction = transactionAdminService.createTransactionForGivenUser(appUserTest.getId(), createTransactionDTOTest); + + //then + assertThat(savedTransaction, instanceOf(TransactionDTO.class)); + assertThat(savedTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(savedTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(savedTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(savedTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + @Test + @DisplayName("Should replace transaction content.") + void shouldReplaceTransactionForGivenUser() { + //given + given(transactionUtil.overwriteTransactionByCreateTransactionDTO(any(Transaction.class), any(CreateTransactionDTO.class))).willReturn(transactionTest); + given(transactionUtil.mapToTransactionDTO(any(Transaction.class))).willReturn(transactionDTOTest); + given(transactionRepository.findByIdAndAppuserId(anyLong(), anyLong())).willReturn(transactionTest); + + //when + var savedTransaction = transactionAdminService.replaceTransaction(transactionTest.getAppuser().getId(), transactionTest.getId(), createTransactionDTOTest); + + //then + assertThat(savedTransaction, instanceOf(TransactionDTO.class)); + assertThat(savedTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(savedTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(savedTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(savedTransaction, hasProperty("description", equalTo(TEST_DESCRIPTION))); + assertThat(savedTransaction, hasProperty("title", equalTo(TEST_TITLE))); + assertThat(savedTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + + @Test + @DisplayName("Should get all transactions for given user and category.") + void shouldGetAllTransactionsForGivenUserAndCategory() { + //given + given(customPageable.validateAndCreatePageable(anyInt(), any(Sort.Direction.class), anyString(), ArgumentMatchers.>any())).willReturn(PageRequest.of(1,1)); + given(transactionUtil.mapToTransactionDTO(any(Transaction.class))).willReturn(transactionDTOTest); + given(transactionRepository.findAllByAppuserIdAndCategoryId(anyLong(), anyLong(), any(Pageable.class))).willReturn(Collections.singletonList(transactionTest)); + + //when + var transactions = transactionAdminService.getAllTransactionsForGivenUserAndCategory(appUserTest.getId(), categoryTest.getId(), 0, Sort.Direction.valueOf("ASC"),"id"); + + //then + assertEquals(1, transactions.size()); + + var firstTransaction = transactions.get(0); + assertThat(firstTransaction, instanceOf(TransactionDTO.class)); + assertThat(firstTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(firstTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(firstTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(firstTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + @Test + @DisplayName("Should get all transactions for given user.") + void shouldGetAllTransactionsForGivenUser() { + //given + given(transactionUtil.mapToTransactionDTO(any(Transaction.class))).willReturn(transactionDTOTest); + given(customPageable.validateAndCreatePageable(anyInt(), any(Sort.Direction.class), anyString(), ArgumentMatchers.>any())).willReturn(PageRequest.of(1,1)); + given(transactionRepository.findAllByAppuserId(anyLong(), any(Pageable.class))).willReturn(Collections.singletonList(transactionTest)); + + //when + var transactions = transactionAdminService.getAllTransactionsForGivenUser(appUserTest.getId(), 1, Sort.Direction.valueOf("ASC"), "id"); + + //then + assertEquals(1, transactions.size()); + + var firstTransaction = transactions.get(0); + assertThat(firstTransaction, instanceOf(TransactionDTO.class)); + assertThat(firstTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(firstTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(firstTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(firstTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + @Test + @DisplayName("Should create category during create transaction.") + void shouldThrowExceptionWhenUnknownCategory() { + //given + transactionNullCategoryAndUserTest.setAppuser(appUserTest); + + given(transactionUtil.mapToTransactionDTO(any(Transaction.class))).willReturn(transactionDTOTest); + given(categoryService.createCategory(anyString())).willReturn(categoryTest); + given(transactionRepository.save(any(Transaction.class))).willReturn(transactionTest); + given(appUserAdminService.getUserById(anyLong())).willReturn(appUserTest); + given(transactionUtil.mapToTransaction(any(CreateTransactionDTO.class))) + .willReturn(transactionNullCategoryAndUserTest); + + //when + var transaction = transactionAdminService.createTransactionForGivenUser(TEST_ID, createTransactionDTOTest); + + assertThat(transaction, instanceOf(TransactionDTO.class)); + assertThat(transaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } +} + diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionNameHolder.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionNameHolder.java new file mode 100644 index 0000000..a69996c --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionNameHolder.java @@ -0,0 +1,22 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +abstract class TransactionNameHolder { + protected static long TEST_ID = 1L; + protected static int TEST_VALUE = 600; + protected static int TEST_QUANTITY = 3; + + protected static TransactionType TEST_TRANSACTION_TYPE = TransactionType.INCOME; + + protected static String TEST_ROLENAME = "ROLE_USER"; + protected static String TEST_PLAINTEXT_PASSWORD = "{noop}example1!"; + protected static String TEST_EMAIL = "testemail@wp.pl"; + protected static String TEST_FIRSTNAME = "John"; + protected static String TEST_SECONDNAME = "Kowalski"; + protected static String TEST_USERNAME = "username132"; + protected static String TEST_CATEGORY_NAME = "category"; + protected static String TEST_TITLE = "title"; + protected static String TEST_DESCRIPTION = "description"; + + + +} diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionServiceTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionServiceTest.java deleted file mode 100644 index f90360f..0000000 --- a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionServiceTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; - -import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.CategoryService; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; -import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.mockito.Mockito.when; - -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.junit.jupiter.MockitoSettings; -import org.mockito.quality.Strictness; - -import java.util.Collections; - -import static org.junit.jupiter.api.Assertions.*; - -@ExtendWith(MockitoExtension.class) -class TransactionServiceTest { - - @InjectMocks - private TransactionService transactionService; - - @Mock - private TransactionRepository transactionRepository; - - @Mock - private CategoryService categoryService; - @Mock - private TransactionUtil transactionUtil; - - Transaction transactionTest; - AppUser appUserTest; - Role roleTest; - Category categoryTest; - CreateTransactionDTO createTransactionDTOTest; - - @BeforeEach - void init() { - roleTest = Role.builder() - .id(1L) - .name("TEST_ROLE") - .build(); - - appUserTest = AppUser.builder() - .id(1L) - .email("testemail@wp.pl") - .firstName("John") - .secondName("Smith") - .username("smith123") - .password("123") - .roles(Collections.singletonList(roleTest)) - .build(); - - categoryTest = Category.builder() - .id(1L) - .name("testCategory") - .build(); - - transactionTest = Transaction.builder() - .id(1L) - .transactionType(TransactionType.INCOME) - .title("testTitle") - .description("testDescription") - .category(categoryTest) - .appuser(appUserTest) - .value(600) - .quantity(2) - .build(); - - createTransactionDTOTest = CreateTransactionDTO.builder() - .transactionType(transactionTest.getTransactionType()) - .title(transactionTest.getTitle()) - .description(transactionTest.getDescription()) - .value(transactionTest.getValue()) - .quantity(transactionTest.getQuantity()) - .categoryName(transactionTest.getCategory().getName()) - .build(); - } - - - /*@Test - @DisplayName("Should save transaction for given user and found category.") - void createTransactionForGivenUser() { - //given - Mockito.when(transactionRepository.save(Mockito.any(Transaction.class))).thenReturn(transactionTest); - - //when - var savedTransaction = transactionService.createTransactionForGivenUser(appUserTest.getId(), createTransactionDTOTest); - - //then - assertThat(savedTransaction, instanceOf(TransactionDTO.class)); - assertThat(savedTransaction, hasProperty("transactionType", equalTo(TransactionType.INCOME))); - assertThat(savedTransaction, hasProperty("value", equalTo(600))); - assertThat(savedTransaction, hasProperty("quantity", equalTo(2))); - }*/ - - @Test - @DisplayName("Should get all transactions for given user and category.") - void getAllTransactionsForGivenUserAndCategory() { - //given - when(transactionRepository.findAllByAppuserIdAndCategoryId(appUserTest.getId(), categoryTest.getId())).thenReturn(Collections.singletonList(transactionTest)); - - //when - var transactions = transactionService.getAllTransactionsForGivenUserAndCategory(appUserTest.getId(), categoryTest.getId()); - - //then - assertEquals(transactions.size(), 1); - - var firstTransaction = transactions.get(0); - assertThat(firstTransaction, instanceOf(TransactionDTO.class)); - assertThat(firstTransaction, hasProperty("transactionType", equalTo(TransactionType.INCOME))); - assertThat(firstTransaction, hasProperty("value", equalTo(600))); - assertThat(firstTransaction, hasProperty("quantity", equalTo(2))); - //category etc - } - - @Test - @DisplayName("Should get all transactions for given user.") - void getAllTransactionsForGivenUser() { - //given - when(transactionRepository.findAllByAppuserId(appUserTest.getId())).thenReturn(Collections.singletonList(transactionTest)); - - //when - var transactions = transactionService.getAllTransactionsForGivenUser(appUserTest.getId()); - - //then - assertEquals(transactions.size(), 1); - - var firstTransaction = transactions.get(0); - assertThat(firstTransaction, instanceOf(TransactionDTO.class)); - assertThat(firstTransaction, hasProperty("transactionType", equalTo(TransactionType.INCOME))); - assertThat(firstTransaction, hasProperty("value", equalTo(600))); - assertThat(firstTransaction, hasProperty("quantity", equalTo(2))); - //category etc - - } -} diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionTestHelper.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionTestHelper.java new file mode 100644 index 0000000..43c88b1 --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionTestHelper.java @@ -0,0 +1,86 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + +import java.util.Collections; + +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class TransactionTestHelper extends TransactionNameHolder{ + protected Transaction transactionTest; + protected TransactionDTO transactionDTOTest; + protected AppUser appUserTest; + protected Role roleTest; + protected Category categoryTest; + protected CreateTransactionDTO createTransactionDTOTest; + protected Transaction transactionNullCategoryAndUserTest; + + @BeforeEach + void init() { + roleTest = Role.builder() + .id(TEST_ID) + .name(TEST_ROLENAME) + .build(); + + appUserTest = AppUser.builder() + .id(TEST_ID) + .email(TEST_EMAIL) + .firstName(TEST_FIRSTNAME) + .secondName(TEST_SECONDNAME) + .username(TEST_USERNAME) + .password(TEST_PLAINTEXT_PASSWORD) + .roles(Collections.singletonList(roleTest)) + .build(); + + categoryTest = Category.builder() + .id(TEST_ID) + .name(TEST_CATEGORY_NAME) + .build(); + + transactionTest = Transaction.builder() + .id(TEST_ID) + .transactionType(TEST_TRANSACTION_TYPE) + .title(TEST_TITLE) + .description(TEST_DESCRIPTION) + .category(categoryTest) + .appuser(appUserTest) + .value(TEST_VALUE) + .quantity(TEST_QUANTITY) + .build(); + + transactionDTOTest = TransactionDTO.builder() + .id(TEST_ID) + .transactionType(TEST_TRANSACTION_TYPE) + .title(TEST_TITLE) + .description(TEST_DESCRIPTION) + .value(TEST_VALUE) + .quantity(TEST_QUANTITY) + .categoryName(TEST_CATEGORY_NAME) + .build(); + + createTransactionDTOTest = CreateTransactionDTO.builder() + .transactionType(TEST_TRANSACTION_TYPE) + .title(TEST_TITLE) + .description(TEST_DESCRIPTION) + .value(TEST_VALUE) + .quantity(TEST_QUANTITY) + .categoryName(TEST_CATEGORY_NAME) + .build(); + + transactionNullCategoryAndUserTest = Transaction.builder() + .appuser(null) + .category(null) + .description(TEST_DESCRIPTION) + .build(); + } +} diff --git a/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserServiceTest.java b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserServiceTest.java new file mode 100644 index 0000000..c4833c6 --- /dev/null +++ b/src/test/java/com/github/WeeiaEduTeam/InfinityFinanceAPI/transaction/TransactionUserServiceTest.java @@ -0,0 +1,140 @@ +package com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction; + +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUser; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.appuser.AppUserAdminService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.Category; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.category.CategoryService; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.role.Role; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.CreateTransactionDTO; +import com.github.WeeiaEduTeam.InfinityFinanceAPI.transaction.dto.TransactionDTO; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; +import org.springframework.data.domain.Sort; + +import javax.swing.border.TitledBorder; +import java.util.Collections; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +@Slf4j +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class TransactionUserServiceTest extends TransactionTestHelper { + + @InjectMocks + private TransactionUserService transactionUserService; + + @Mock + private TransactionAdminService transactionAdminService; + + @Mock + private AppUserAdminService appUserAdminService; + + @Mock + private TransactionRepository transactionRepository; + + @Mock + private CategoryService categoryService; + + @Test + @DisplayName("Should get all transactions for current logged user.") + void shouldGetAllTransactionsForLoggedUser() { + //given + given(appUserAdminService.getLoggedInUserId()).willReturn(1L); + given(transactionAdminService.getAllTransactionsForGivenUser(anyLong(), anyInt(), any(Sort.Direction.class), anyString())).willReturn(Collections.singletonList(transactionDTOTest)); + + //when + var transactions = transactionUserService.getAllTransactionsForLoggedUser(1, Sort.Direction.valueOf("ASC"), "id"); + + //then + var firstTransaction = transactions.get(0); + assertThat(firstTransaction, instanceOf(TransactionDTO.class)); + assertThat(firstTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(firstTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(firstTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(firstTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + @Test + @DisplayName("Should get all transactions with given category for current logged user.") + void shouldGetAllTransactionsWithCategoryForLoggedUser() { + //given + given(appUserAdminService.getLoggedInUserId()).willReturn(1L); + given(transactionAdminService.getAllTransactionsForGivenUserAndCategory(anyLong(), anyLong(), anyInt(), any(Sort.Direction.class), anyString())).willReturn(Collections.singletonList(transactionDTOTest)); + //when + var transactions = transactionUserService.getAllTransactionsForLoggedUserAndGivenCategory(1, 1, Sort.Direction.valueOf("ASC"), "id"); + + //then + var firstTransaction = transactions.get(0); + assertThat(firstTransaction, instanceOf(TransactionDTO.class)); + assertThat(firstTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(firstTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(firstTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(firstTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + @Test + @DisplayName("Should delete transaction and related category with no relations for logged user.") + void shouldDeleteTransactionByIdAndCategoryForLoggedUser() { + // given + given(transactionAdminService.getTransactionByIdAndByAppuserId(anyLong(), anyLong())).willReturn(transactionTest); + given(appUserAdminService.getLoggedInUserId()).willReturn(1L); + + //when + transactionUserService.deleteSingleTransactionForLoggedUser(transactionTest.getId()); + + // then + verify(transactionAdminService).deleteTransactionWithCategory(transactionTest); + } + + @Test + @DisplayName("Should create transaction for logged user with known category.") + void shouldCreateTransactionForLoggedUserWithKnownCategory() { + //given + given(appUserAdminService.getLoggedInUserId()).willReturn(TEST_ID); + given(transactionAdminService.createTransactionForGivenUser(anyLong(), any(CreateTransactionDTO.class))).willReturn(transactionDTOTest); + + //when + var savedTransaction = transactionUserService.createTransactionForLoggedUser(createTransactionDTOTest); + + //then + assertThat(savedTransaction, instanceOf(TransactionDTO.class)); + assertThat(savedTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(savedTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(savedTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(savedTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + } + + @Test + @DisplayName("Should replace transaction content for logged user.") + void shouldReplaceTransactionForLoggedUser() { + //given + given(appUserAdminService.getLoggedInUserId()).willReturn(1L); + given(transactionAdminService.replaceTransaction(anyLong(), anyLong(), any(CreateTransactionDTO.class))).willReturn(transactionDTOTest); + + //when + var savedTransaction = transactionUserService.replaceTransactionForLoggedUser(transactionTest.getAppuser().getId(), createTransactionDTOTest); + + //then + assertThat(savedTransaction, instanceOf(TransactionDTO.class)); + assertThat(savedTransaction, hasProperty("transactionType", equalTo(TEST_TRANSACTION_TYPE))); + assertThat(savedTransaction, hasProperty("value", equalTo(TEST_VALUE))); + assertThat(savedTransaction, hasProperty("quantity", equalTo(TEST_QUANTITY))); + assertThat(savedTransaction, hasProperty("categoryName", equalTo(TEST_CATEGORY_NAME))); + assertThat(savedTransaction, hasProperty("title", equalTo(TEST_TITLE))); + } +} \ No newline at end of file