diff --git a/.DS_Store b/.DS_Store index aeeafc9..ce801bf 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/src/.DS_Store b/src/.DS_Store index 41e38a8..59fd27f 100644 Binary files a/src/.DS_Store and b/src/.DS_Store differ diff --git a/src/main/.DS_Store b/src/main/.DS_Store index b615922..8917eec 100644 Binary files a/src/main/.DS_Store and b/src/main/.DS_Store differ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store index 7f15c6f..7cb0f92 100644 Binary files a/src/main/java/.DS_Store and b/src/main/java/.DS_Store differ diff --git a/src/main/java/in/.DS_Store b/src/main/java/in/.DS_Store index d9f03af..759d6a8 100644 Binary files a/src/main/java/in/.DS_Store and b/src/main/java/in/.DS_Store differ diff --git a/src/main/java/in/gov/.DS_Store b/src/main/java/in/gov/.DS_Store index 8a41121..8ab4984 100644 Binary files a/src/main/java/in/gov/.DS_Store and b/src/main/java/in/gov/.DS_Store differ diff --git a/src/main/java/in/gov/chennaicorporation/.DS_Store b/src/main/java/in/gov/chennaicorporation/.DS_Store index fb1ecce..4daeee7 100644 Binary files a/src/main/java/in/gov/chennaicorporation/.DS_Store and b/src/main/java/in/gov/chennaicorporation/.DS_Store differ diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/.DS_Store b/src/main/java/in/gov/chennaicorporation/gccoffice/.DS_Store index 339c739..8032700 100644 Binary files a/src/main/java/in/gov/chennaicorporation/gccoffice/.DS_Store and b/src/main/java/in/gov/chennaicorporation/gccoffice/.DS_Store differ diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/GccOfficeApplication.java b/src/main/java/in/gov/chennaicorporation/gccoffice/GccOfficeApplication.java index 161faf8..6f1730e 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/GccOfficeApplication.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/GccOfficeApplication.java @@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +//import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.ComponentScan; @EntityScan(basePackages = { @@ -16,8 +17,10 @@ import org.springframework.context.annotation.ComponentScan; "in.gov.chennaicorporation.gccoffice.garbagecollection" }) @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) +//@EnableDiscoveryClient public class GccOfficeApplication { public static void main(String[] args) { + //System.setProperty("spring.config.name", "gcc-portal"); SpringApplication.run(GccOfficeApplication.class, args); } } \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/AppConfig.java b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/AppConfig.java index afbc28b..819328f 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/AppConfig.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/AppConfig.java @@ -9,10 +9,12 @@ import org.springframework.web.client.RestTemplate; @Configuration public class AppConfig { - public String qrAssetFeedback = "http://localhost:8063"; + public String qrAssetFeedback = "http://117.232.67.158:8063"; public String mtm = "http://localhost:8060"; public String petRegistration = "http://117.232.67.158:8061"; - public String garbageCollection = "http://localhost:8067"; + public String garbageCollection = "http://117.232.67.158:8067"; + + public String gccappsMysqlPassword = "gccroot"; @Bean diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java index 8e07597..b228faa 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java @@ -13,6 +13,8 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; +import in.gov.chennaicorporation.gccoffice.configuration.AppConfig; + import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import java.util.Properties; @@ -20,6 +22,7 @@ import java.util.Properties; @Configuration @EnableTransactionManagement public class DataSourceConfig { + @Configuration @EnableTransactionManagement @EnableJpaRepositories( @@ -108,4 +111,14 @@ public class DataSourceConfig { return new JpaTransactionManager(taxEntityManagerFactory); } } + + @Bean(name = "oracleDataSource") + public DataSource oracleDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("oracle.jdbc.OracleDriver"); + dataSource.setUrl("jdbc:oracle:thin:@10.1.0.14:1521:chncorp"); + dataSource.setUsername("FAS"); + dataSource.setPassword("FAS"); + return dataSource; + } } \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java index 3e6bfe0..f649920 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java @@ -13,12 +13,14 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import in.gov.chennaicorporation.gccoffice.service.CustomUserDetailsService; +import in.gov.chennaicorporation.gccoffice.service.UserActivityService; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { private final CustomUserDetailsService customUserDetailsService; + @Autowired public SecurityConfig(CustomUserDetailsService customUserDetailsService) { @@ -29,7 +31,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { public void configure(WebSecurity web) throws Exception { web .ignoring() - .antMatchers("/static/**", "/assets/**", "/api/**","/images/**" ); + .antMatchers("/static/**", "/assets/**", "/api/**","/images/**","/gcc/static/**", "/gcc/assets/**", "/gcc/api/**","/gcc/images/**"); + //.antMatchers("/gcc/static/**", "/gcc/assets/**", "/gcc/api/**","/gcc/images/**"); //.antMatchers("/assets/**", "/css/**", "/js/**", "/images/**", "/fonts/**"); // Add the paths to your static resources here } @@ -41,23 +44,24 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { // Configure authorization (URL-based access control) @Override protected void configure(HttpSecurity http) throws Exception { + http .cors().and() // Enable CORS .csrf().disable() // Disable CSRF protection for simplicity (Enable if needed) .authorizeRequests() - .antMatchers("/error").permitAll() - .antMatchers("/login").permitAll() // Add the login URL - .antMatchers("/admin/**").hasRole("ADMIN") // Add the admin URLs - .antMatchers("/**").hasAnyRole("USER", "ADMIN") // Add other URLs + .antMatchers("/gcc/error").permitAll() + .antMatchers("/gcc/login").permitAll() // Add the login URL + .antMatchers("/gcc/admin/**").hasRole("ADMIN") // Add the admin URLs + .antMatchers("/gcc/**").hasAnyRole("USER", "ADMIN") // Add other URLs .and() .formLogin() - .loginPage("/login") // Customize the login page URL - .defaultSuccessUrl("/") // Include the success URL + .loginPage("/gcc/login") // Customize the login page URL + .defaultSuccessUrl("/gcc") // Include the success URL .permitAll() .and() .logout() - .logoutUrl("/logout") // Include the logout URL - .logoutSuccessUrl("/login") // Include the success logout URL + .logoutUrl("/gcc/logout") // Include the logout URL + .logoutSuccessUrl("/gcc/login") // Include the success logout URL .and() .sessionManagement() .sessionFixation() diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/ThymeleafConfig.java b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/ThymeleafConfig.java index b79d900..a48ddd7 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/ThymeleafConfig.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/ThymeleafConfig.java @@ -2,6 +2,7 @@ package in.gov.chennaicorporation.gccoffice.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.thymeleaf.spring5.SpringTemplateEngine; import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ITemplateResolver; @@ -17,4 +18,11 @@ public class ThymeleafConfig { templateResolver.setCacheable(false); // Disable template caching for development environment return templateResolver; } + + @Bean + public SpringTemplateEngine templateEngine() { + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + templateEngine.setTemplateResolver(templateResolver()); + return templateEngine; + } } diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java index 0717fc3..80dabd2 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java @@ -5,6 +5,7 @@ import java.nio.file.Paths; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -28,6 +29,8 @@ public class WebMvcConfig implements WebMvcConfigurer { private MenuItemRepository menuItemRepository; private SubMenuItemRepository subMenuItemRepository; + private final Environment environment; + @Autowired public WebMvcConfig( @Value("${file.upload.directory}") String uploadDirectory, @@ -36,7 +39,8 @@ public class WebMvcConfig implements WebMvcConfigurer { SubMenuItemAccessRepository subMenuItemAccessRepository, AppModuleRepository appModuleRepository, MenuItemRepository menuItemRepository, - SubMenuItemRepository subMenuItemRepository) { + SubMenuItemRepository subMenuItemRepository, + Environment environment) { this.uploadDirectory = uploadDirectory; this.appModuleAccessRepository = appModuleAccessRepository; this.menuItemAccessRepository = menuItemAccessRepository; @@ -44,6 +48,7 @@ public class WebMvcConfig implements WebMvcConfigurer { this.appModuleRepository = appModuleRepository; this.menuItemRepository = menuItemRepository; this.subMenuItemRepository = subMenuItemRepository; + this.environment = environment; } @Override @@ -55,7 +60,8 @@ public class WebMvcConfig implements WebMvcConfigurer { subMenuItemAccessRepository, appModuleRepository, menuItemRepository, - subMenuItemRepository)); + subMenuItemRepository, + environment)); } @Override diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/APIController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/APIController.java index 5284ec3..7508d0c 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/APIController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/APIController.java @@ -1,10 +1,337 @@ package in.gov.chennaicorporation.gccoffice.controller; +import java.util.List; +import java.util.Map; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import org.hibernate.dialect.identity.GetGeneratedKeysDelegate; +import org.springframework.beans.factory.annotation.Autowired; +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.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -@RequestMapping("/api") +import in.gov.chennaicorporation.gccoffice.entity.AppModuleAccessEntity; +import in.gov.chennaicorporation.gccoffice.entity.AppModuleEntity; +import in.gov.chennaicorporation.gccoffice.entity.AppUserEntity; +import in.gov.chennaicorporation.gccoffice.entity.MenuItemAccessEntity; +import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity; +import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity; +import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemEntity; +import in.gov.chennaicorporation.gccoffice.entity.UserActivityLog; +import in.gov.chennaicorporation.gccoffice.repository.AppModuleAccessRepository; +import in.gov.chennaicorporation.gccoffice.repository.AppModuleRepository; +import in.gov.chennaicorporation.gccoffice.repository.AppUserGroupRepository; +import in.gov.chennaicorporation.gccoffice.repository.AppUserRepository; +import in.gov.chennaicorporation.gccoffice.repository.MenuItemAccessRepository; +import in.gov.chennaicorporation.gccoffice.repository.MenuItemRepository; +import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemAccessRepository; +import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemRepository; +import in.gov.chennaicorporation.gccoffice.repository.UserActivityLogRepository; +import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; + +@RequestMapping("/gcc/api") @RestController public class APIController { + List getAppUserEntities; + @Autowired + private AppUserRepository appUserRepository; + + List getActivityLogs; + @Autowired + private UserActivityLogRepository userActivityLogRepository; + + List getAppModuleAccessEntities; + List getMenuItemAccessEntities; + List getSubMenuItemAccessEntities; + + @Autowired + private AppModuleAccessRepository appModuleAccessRepository; + @Autowired + private MenuItemAccessRepository menuItemAccessRepository; + @Autowired + private SubMenuItemAccessRepository subMenuItemAccessRepository; + + List getAppModuleEntities; + List getMenuItemEntities; + List getSubMenuItemEntities; + + @Autowired + private AppModuleRepository appModuleRepository; + @Autowired + private MenuItemRepository menuItemRepository; + @Autowired + private SubMenuItemRepository subMenuItemRepository; + + @Autowired + public APIController( + AppModuleRepository appModuleRepository, + MenuItemRepository menuItemRepository, + SubMenuItemRepository subMenuItemRepository, + AppModuleAccessRepository appModuleAccessRepository, + MenuItemAccessRepository menuItemAccessRepository, + SubMenuItemAccessRepository subMenuItemAccessRepository, + UserActivityLogRepository userActivityLogRepository) { + + this.appModuleRepository = appModuleRepository; + this.menuItemRepository = menuItemRepository; + this.subMenuItemRepository = subMenuItemRepository; + + this.appModuleAccessRepository = appModuleAccessRepository; + this.menuItemAccessRepository = menuItemAccessRepository; + this.subMenuItemAccessRepository = subMenuItemAccessRepository; + this.userActivityLogRepository = userActivityLogRepository; + + } + + @GetMapping(value="/getAccessTree") + public String getAccessTreeHTML(@RequestParam String groupId,@RequestParam String groupName) { + + getAppModuleEntities = appModuleRepository.showAll(); + + String accessHTML = ""; + String accessTableHTML = ""; + String MenuHTML = ""; + String isSelected = ""; + //String subMenuHTML = ""; + + String groupNameHTML = ""+groupName+""; + for (AppModuleEntity moduleName : getAppModuleEntities) { + + // ID to check + Integer desiredId = moduleName.getId(); + + // Check if the ID exists in the list of entities + getAppModuleAccessEntities = appModuleAccessRepository.findByAll(groupId,desiredId.toString()); + // Check Module Id Access + if (getAppModuleAccessEntities != null && !getAppModuleAccessEntities.isEmpty()) { isSelected = "checked"; } else { isSelected = ""; } + + accessHTML = accessHTML+"
  •  "; + + + getMenuItemEntities = menuItemRepository.getMenuItemByModuleId(moduleName.getId()); + + String subMenuHTML = ""; + for (MenuItemEntity menuItem : getMenuItemEntities) { + + String mmid = desiredId+"_"+menuItem.getId(); + // Check if the ID exists in the list of entities + getMenuItemAccessEntities = menuItemAccessRepository.findByAll(groupId, desiredId.toString(),menuItem.getId().toString()); + // Check Module Id Access + if (getMenuItemAccessEntities != null && !getMenuItemAccessEntities.isEmpty()) { isSelected = "checked"; } else { isSelected = ""; } + + if(menuItem.getHasSub()) { + + getSubMenuItemEntities = subMenuItemRepository.getSubMenuItemByMenuItemId(menuItem.getId()); + String subSubMenuHTML = ""; + for (SubMenuItemEntity subMenuItem : getSubMenuItemEntities) { + String isSelected2 = ""; + String smid = desiredId+"_"+menuItem.getId()+"_"+subMenuItem.getId(); + // Check if the ID exists in the list of entities + getSubMenuItemAccessEntities = subMenuItemAccessRepository.findByAll(groupId, desiredId.toString(),menuItem.getId().toString(),subMenuItem.getId().toString()); + // Check Module Id Access + if (getSubMenuItemAccessEntities != null && !getSubMenuItemAccessEntities.isEmpty()) { isSelected2 = "checked"; } else { isSelected2 = ""; } + + subSubMenuHTML = subSubMenuHTML+"
  •  
  • "; + } + if(subSubMenuHTML.equals("")) + { + subMenuHTML = subMenuHTML+"
  •  
  • "; + } + else { + subMenuHTML = subMenuHTML+"
  •  
      "+subSubMenuHTML+"
  • "; + } + + } + else { + subMenuHTML = subMenuHTML+"
  •  
  • "; + } + } + + accessHTML = accessHTML+"
      "+subMenuHTML+"
    "; + subMenuHTML = ""; + + } + + accessTableHTML = groupNameHTML+"
      "+accessHTML+"
    "; + + return accessTableHTML; + } + + @PostMapping("/saveGroupAccessData") + public String saveGroupAccessData(@RequestBody Map requestBody) { + @SuppressWarnings("unchecked") + List checkedData = (List) requestBody.get("checkedData"); + String groupId = (String) requestBody.get("groupId"); + String dataType[]= {"","", "module","menu","submenu"}; + if (groupId != null) { + System.out.println("groupid value: " + groupId); + + // Set isActive = false based on groupId + appModuleAccessRepository.updateActiveStatus(false,groupId); + menuItemAccessRepository.updateActiveStatus(false,groupId); + subMenuItemAccessRepository.updateActiveStatus(false,groupId); + + // Now update as per input data + if (checkedData != null) { + for (String data : checkedData) { + System.out.println(data); + + // m_x -> Module Value (moduleId) -> 2 + // mm_x_x -> Menu Value (moduleId,menuId) ->3 + // sm_x_x_x -> SubMenu Value (moduleId, menuId, submenuId) ->4 + + String[] dataValue = data.split("_"); + Integer dataLength = dataValue.length; + System.out.println(dataLength +" ==> "+dataType[dataLength]); + + if(dataValue.length==2) { // Module + // Check if the ID exists in the list of entities + getAppModuleAccessEntities = appModuleAccessRepository.findByAll(groupId, dataValue[1]); + if (getAppModuleAccessEntities != null && !getAppModuleAccessEntities.isEmpty()) { + appModuleAccessRepository.update(true,groupId,dataValue[1]); + } + else { + appModuleAccessRepository.insert(groupId,dataValue[1]); + } + } + else if(dataValue.length==3) { // Menu + // Check if the ID exists in the list of entities + getMenuItemAccessEntities = menuItemAccessRepository.findByAll(groupId, dataValue[1], dataValue[2]); + if (getMenuItemAccessEntities != null && !getMenuItemAccessEntities.isEmpty()) { + menuItemAccessRepository.update(true,groupId,dataValue[1],dataValue[2]); + } + else { + menuItemAccessRepository.insert(groupId,dataValue[1],dataValue[2]); + } + } + else if(dataValue.length==4) { // SubMenu + // Check if the ID exists in the list of entities + getSubMenuItemAccessEntities = subMenuItemAccessRepository.findByAll(groupId, dataValue[1], dataValue[2], dataValue[3]); + if (getSubMenuItemAccessEntities != null && !getSubMenuItemAccessEntities.isEmpty()) { + subMenuItemAccessRepository.update(true,groupId,dataValue[1],dataValue[2],dataValue[3]); + } + else { + subMenuItemAccessRepository.insert(groupId,dataValue[1],dataValue[2],dataValue[3]); + } + } + + } + } + + } + + return ""; + } + + @GetMapping(value="/getUserProfile") + public String getUserProfile(@RequestParam String userId) { + String userHtml =""; + String userProfileHtml =""; + String userProfileTimelineHtml =""; + getAppUserEntities = appUserRepository.showById(userId); + for (AppUserEntity appUserEntity : getAppUserEntities) { + + userProfileHtml = "" + + "
    " + + "
    " + + "
    " + + "
    " + + " \n" + + "

    "+appUserEntity.getUserid().getName()+"

    \n" + + "

    Front End Developer

    \n" + + "
    \n" + + "
    " + + "
    \n" + + "
    \n" + + " Email address \n" + + " "+appUserEntity.getUserid().getEmail()+" \n" + + " Phone\n" + + " "+appUserEntity.getUserid().getPhone()+" \n" + + " Role\n" + + " "+appUserEntity.getRoles()+"\n" + + " Access Group\n" + + " "+appUserEntity.getUsergroup_id().getName()+"\n" + + "
    \n" + + "
    \n" + + "
    "; + + userProfileTimelineHtml = "" + + "
    " + + "
    " + + " " + + "
    " + + "
    " + + userTimeLine(appUserEntity.getUserid().getUserid().toString(),appUserEntity.getUserid().getName(),"user.jpg") + + "
    " + + "
    " + + "
    " + + "
    "; + + userHtml ="
    " + userProfileHtml + userProfileTimelineHtml + "
    "; + + } + + return userHtml; + } + + + public String userTimeLine(String userid, String userName, String img) { + + + String userTimeLineHTML = ""; + + getActivityLogs = userActivityLogRepository.findByUserIdOrderByTimestampDesc(userid); + for (UserActivityLog userActivityLog : getActivityLogs) { + userTimeLineHTML += "" + + "
    " + + "
    " + + " user " + + "
    " + + "
    " + + "
    " + + " "+userName+" " + + " "+dateFormat(userActivityLog.getTimestamp().toString())+"" + + "
    " + + " "+userActivityLog.getActivityType() + + "
    " + + "
    " + + "
    " + + "

    "; + } + userTimeLineHTML = "" + + "
    " + + "
    " + + userTimeLineHTML + + "
    " + + "
    "; + + return userTimeLineHTML; + } + + + public String dateFormat(String timestampString) { + //String timestampString = "2023-12-28T16:21:24"; + LocalDateTime timestamp = LocalDateTime.parse(timestampString, DateTimeFormatter.ISO_DATE_TIME); + + // Define the desired date-time format + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a"); + + // Format the timestamp + String formattedTimestamp = timestamp.format(formatter); + + //System.out.println(formattedTimestamp); + return formattedTimestamp.toUpperCase(); + } } diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/AdminController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/AdminController.java new file mode 100644 index 0000000..f51252f --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/AdminController.java @@ -0,0 +1,167 @@ +package in.gov.chennaicorporation.gccoffice.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import in.gov.chennaicorporation.gccoffice.entity.AppModuleAccessEntity; +import in.gov.chennaicorporation.gccoffice.entity.AppModuleEntity; +import in.gov.chennaicorporation.gccoffice.entity.AppUserEntity; +import in.gov.chennaicorporation.gccoffice.entity.AppUserGroupEntity; +import in.gov.chennaicorporation.gccoffice.entity.MenuItemAccessEntity; +import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity; +import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity; +import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemEntity; +import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetCategory; +import in.gov.chennaicorporation.gccoffice.repository.AppModuleAccessRepository; +import in.gov.chennaicorporation.gccoffice.repository.AppModuleRepository; +import in.gov.chennaicorporation.gccoffice.repository.AppUserGroupRepository; +import in.gov.chennaicorporation.gccoffice.repository.AppUserRepository; +import in.gov.chennaicorporation.gccoffice.repository.MenuItemAccessRepository; +import in.gov.chennaicorporation.gccoffice.repository.MenuItemRepository; +import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemAccessRepository; +import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemRepository; +import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; + +@RequestMapping("/gcc/admin") +@Controller("gccAdminController") +public class AdminController { + private final LoginUserInfo loginUserInfo; + + private final AppUserRepository appUserRepository; + private final AppUserGroupRepository appUserGroupRepository; + + private final AppModuleRepository appModuleRepository; + private final MenuItemRepository menuItemRepository; + private final SubMenuItemRepository subMenuItemRepository; + + private final AppModuleAccessRepository appModuleAccessRepository; + private final MenuItemAccessRepository menuItemAccessRepository; + private final SubMenuItemAccessRepository subMenuItemAccessRepository; + + @Autowired + public AdminController(LoginUserInfo loginUserInfo, + AppUserRepository appUserRepository, + AppUserGroupRepository appUserGroupRepository, + AppModuleRepository appModuleRepository, + MenuItemRepository menuItemRepository, + SubMenuItemRepository subMenuItemRepository, + AppModuleAccessRepository appModuleAccessRepository, + MenuItemAccessRepository menuItemAccessRepository, + SubMenuItemAccessRepository subMenuItemAccessRepository) { + + this.loginUserInfo = loginUserInfo; + + this.appUserRepository = appUserRepository; + this.appUserGroupRepository = appUserGroupRepository; + + this.appModuleRepository = appModuleRepository; + this.menuItemRepository = menuItemRepository; + this.subMenuItemRepository = subMenuItemRepository; + + this.appModuleAccessRepository = appModuleAccessRepository; + this.menuItemAccessRepository = menuItemAccessRepository; + this.subMenuItemAccessRepository = subMenuItemAccessRepository; + + } + + @GetMapping({"", "/", "/index"}) + public String main(Model model) { + String userId = LoginUserInfo.getLoginUserId(); + if (userId != null && !userId.isEmpty()) { + System.out.println("String UserID: " + userId); + } + return "modules/admin/index"; + } + + @GetMapping("/user-list") + public String userList(Model model) { + model.addAttribute("userlist",getUser()); + return "modules/admin/user-list"; + } + + @GetMapping("/user-group-list") + public String userGroupList(Model model) { + model.addAttribute("userGroupList",getUserGroup()); + return "modules/admin/user-group-list"; + } + + @GetMapping("/user-group-access") + public String userGroupAccess(Model model) { + String accessTableHTML = getAccessTreeHTML(); + model.addAttribute("userGroupList",getUserGroup()); + model.addAttribute("accessHTML",accessTableHTML); + return "modules/admin/user-group-access"; + } + + + + //////////////////////////////////////// (Functions) //////////////////////////////////////// + + public List getUser() { + List appUserEntities; + appUserEntities = appUserRepository.showAll(); + return appUserEntities; + } + + public List getUserGroup() { + List appUserGroupEntities; + appUserGroupEntities = appUserGroupRepository.findAll(); + return appUserGroupEntities; + } + + public String getAccessTreeHTML() { + + List getAppModuleAccessEntities; + List getAppModuleEntities; + + getAppModuleEntities = appModuleRepository.showAll(); + + String accessHTML = ""; + String accessTableHTML = ""; + String MenuHTML = ""; + //String subMenuHTML = ""; + for (AppModuleEntity moduleName : getAppModuleEntities) { + + accessHTML = accessHTML+"
  •  "; + + List getMenuItems; + getMenuItems = menuItemRepository.getMenuItemByModuleId(moduleName.getId()); + + String subMenuHTML = ""; + for (MenuItemEntity menuItem : getMenuItems) { + + if(menuItem.getHasSub()) { + + List getMenuSubItems = subMenuItemRepository.getSubMenuItemByMenuItemId(menuItem.getId()); + String subSubMenuHTML = ""; + for (SubMenuItemEntity subMenuItem : getMenuSubItems) { + subSubMenuHTML = subSubMenuHTML+"
  • "; + } + if(subSubMenuHTML.equals("")) + { + subMenuHTML = subMenuHTML+"
  • "; + } + else { + subMenuHTML = subMenuHTML+"
    • "+subSubMenuHTML+"
  • "; + } + + } + else { + subMenuHTML = subMenuHTML+"
  • "; + } + } + + accessHTML = accessHTML+"
      "+subMenuHTML+"
    "; + subMenuHTML = ""; + } + + accessTableHTML = "
      "+accessHTML+"
    "; + + return accessTableHTML; + } +} diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MainController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MainController.java index 05db7ea..b707a06 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MainController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MainController.java @@ -4,10 +4,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; -//@RequestMapping("/mtmtest") +@RequestMapping("/gcc") @Controller("gccOfficeController") public class MainController { private final LoginUserInfo loginUserInfo; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MenuController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MenuController.java index a8c9a50..ec04aa5 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MenuController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/MenuController.java @@ -103,7 +103,7 @@ public class MenuController { List getMenuSubItems = subMenuItemRepository.getSubMenuItemByMenuItemId(menuItem.getId()); String subSubMenuHTML = ""; for (SubMenuItemEntity subMenuItem : getMenuSubItems) { - subSubMenuHTML = subSubMenuHTML+""+subMenuItem.getName()+""; + subSubMenuHTML = subSubMenuHTML+""+subMenuItem.getName()+""; } if(subSubMenuHTML.equals("")) { @@ -128,7 +128,7 @@ public class MenuController { List getMenuSubItems = subMenuItemRepository.getSubMenuItemByMenuItemIdAccess(menuItem.getId(),checkSubMenuId); String subSubMenuHTML = ""; for (SubMenuItemEntity subMenuItem : getMenuSubItems) { - subSubMenuHTML = subSubMenuHTML+""+subMenuItem.getName()+""; + subSubMenuHTML = subSubMenuHTML+""+subMenuItem.getName()+""; } subMenuHTML = subMenuHTML+"
    "+menuItem.getName()+"
    "+subSubMenuHTML+"
    "; } @@ -139,7 +139,7 @@ public class MenuController { } else { - subMenuHTML = subMenuHTML+""+menuItem.getName()+""; + subMenuHTML = subMenuHTML+""+menuItem.getName()+""; } } diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/login.java b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/login.java index 9ba4f02..e09a572 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/controller/login.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/controller/login.java @@ -3,8 +3,9 @@ package in.gov.chennaicorporation.gccoffice.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -//@RequestMapping("/mtmtest") -@Controller +import org.springframework.web.bind.annotation.RequestMapping; +@RequestMapping("/gcc") +@Controller("gccLoginController") public class login { @GetMapping("/login") public String home(Model model) { diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppModuleAccessEntity.java b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppModuleAccessEntity.java index fbb5f7b..46371b0 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppModuleAccessEntity.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppModuleAccessEntity.java @@ -2,6 +2,7 @@ package in.gov.chennaicorporation.gccoffice.entity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,11 +18,11 @@ public class AppModuleAccessEntity { @Column(name = "id",nullable = false) private Integer id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "usergroup_id", referencedColumnName = "id") private AppUserGroupEntity userGroupId; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "module_id", referencedColumnName = "id") private AppModuleEntity moduleId; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppUserEntity.java b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppUserEntity.java index 3cebdf0..b0d9d77 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppUserEntity.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/AppUserEntity.java @@ -2,6 +2,7 @@ package in.gov.chennaicorporation.gccoffice.entity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,11 +18,11 @@ public class AppUserEntity { @Column(name = "id",nullable = false) private Integer id; - @ManyToOne + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "userid", referencedColumnName = "userid") private UserInfoEntity userid; - @ManyToOne + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "usergroup_id", referencedColumnName = "id") private AppUserGroupEntity usergroup_id; @@ -51,6 +52,7 @@ public class AppUserEntity { } + public Integer getId() { return id; } diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemAccessEntity.java b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemAccessEntity.java index 57d70de..b91a08c 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemAccessEntity.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemAccessEntity.java @@ -2,6 +2,7 @@ package in.gov.chennaicorporation.gccoffice.entity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,11 +18,11 @@ public class MenuItemAccessEntity { @Column(name = "id",nullable = false) private Integer id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "usergroup_id", referencedColumnName = "id") private AppUserGroupEntity userGroupId; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "menuitem_id", referencedColumnName = "id") private MenuItemEntity menuItemId; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemEntity.java b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemEntity.java index b9712e4..9d86d68 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemEntity.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/MenuItemEntity.java @@ -2,6 +2,7 @@ package in.gov.chennaicorporation.gccoffice.entity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,7 +18,7 @@ public class MenuItemEntity { @Column(name = "id",nullable = false) private Integer id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "module_id", referencedColumnName = "id") private AppModuleEntity moduleId; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemAccessEntity.java b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemAccessEntity.java index 23ab229..5ce6560 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemAccessEntity.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemAccessEntity.java @@ -2,6 +2,7 @@ package in.gov.chennaicorporation.gccoffice.entity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,19 +18,19 @@ public class SubMenuItemAccessEntity { @Column(name = "id",nullable = false) private Integer id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "usergroup_id", referencedColumnName = "id") private AppUserGroupEntity userGroupId; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "submenuitem_id", referencedColumnName = "id") private SubMenuItemEntity subMenuItemId; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "module_id", referencedColumnName = "id") private AppModuleEntity moduleId; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "menuitem_id", referencedColumnName = "id") private MenuItemEntity menuItemId; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemEntity.java b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemEntity.java index c9f1add..fdcb04e 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemEntity.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/SubMenuItemEntity.java @@ -2,6 +2,7 @@ package in.gov.chennaicorporation.gccoffice.entity; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,11 +18,11 @@ public class SubMenuItemEntity { @Column(name = "id",nullable = false) private Integer id; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "module_id", referencedColumnName = "id") private AppModuleEntity moduleId; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "menuitem_id", referencedColumnName = "id") private MenuItemEntity menuItemId; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/entity/UserActivityLog.java b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/UserActivityLog.java new file mode 100644 index 0000000..aa986a1 --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/entity/UserActivityLog.java @@ -0,0 +1,56 @@ +package in.gov.chennaicorporation.gccoffice.entity; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Table(name = "user_activity_log") +public class UserActivityLog { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String userId; + + private String activityType; + + private LocalDateTime timestamp; + + public UserActivityLog() { + + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getActivityType() { + return activityType; + } + + public void setActivityType(String activityType) { + this.activityType = activityType; + } + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public void setTimestamp(LocalDateTime timestamp) { + this.timestamp = timestamp; + } + +} diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java b/src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java index e889fff..173e34e 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java @@ -1,6 +1,7 @@ package in.gov.chennaicorporation.gccoffice.interceptor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; @@ -45,6 +46,9 @@ public class AppInterceptor implements HandlerInterceptor { private AppModuleRepository appModuleRepository; private MenuItemRepository menuItemRepository; private SubMenuItemRepository subMenuItemRepository; + + private final Environment environment; + @Autowired public AppInterceptor(AppModuleAccessRepository appModuleAccessRepository, @@ -52,7 +56,8 @@ public class AppInterceptor implements HandlerInterceptor { SubMenuItemAccessRepository subMenuItemAccessRepository, AppModuleRepository appModuleRepository, MenuItemRepository menuItemRepository, - SubMenuItemRepository subMenuItemRepository) { + SubMenuItemRepository subMenuItemRepository, + Environment environment) { this.appModuleAccessRepository = appModuleAccessRepository; this.menuItemAccessRepository = menuItemAccessRepository; @@ -61,15 +66,17 @@ public class AppInterceptor implements HandlerInterceptor { this.appModuleRepository = appModuleRepository; this.menuItemRepository = menuItemRepository; this.subMenuItemRepository = subMenuItemRepository; + + this.environment = environment; } private boolean isLoginPage(HttpServletRequest request) { - RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/login"); + RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/gcc/login"); return loginPageMatcher.matches(request); } private boolean isErrorPage(HttpServletRequest request) { - RequestMatcher errorPageMatcher = new AntPathRequestMatcher("/error"); + RequestMatcher errorPageMatcher = new AntPathRequestMatcher("/gcc/error"); return errorPageMatcher.matches(request); } @@ -177,10 +184,16 @@ public class AppInterceptor implements HandlerInterceptor { } private boolean hasAccess(String path) { + + String userRole = LoginUserInfo.getUserRole(); + if (userRole != null && userRole.equals("ADMIN")) { + return true; + } + /* if(LoginUserInfo.getUserRole().equals("ADMIN")) { return true; } - + */ String url = removeLeadingSlash(path); System.out.println("Give URL : "+path+" After remove leading slash : "+url); @@ -197,7 +210,7 @@ public class AppInterceptor implements HandlerInterceptor { System.out.println(parts.length); - if(parts.length>0) { + if(parts.length>1) { int j=0; for (String part : parts) { System.out.println(j+") URL SPLIT: "+part); @@ -206,8 +219,8 @@ public class AppInterceptor implements HandlerInterceptor { String moduleName = ""; String menuName = ""; String subMenuName = ""; - if(parts.length==1) { // Check Only Module Access - moduleName = parts[0]; + if(parts.length==2) { // Check Only Module Access + moduleName = parts[1]; return hasModuleAccess(moduleName); } else if(parts.length==2) { // Check Module & Menu Access @@ -236,7 +249,9 @@ public class AppInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - + String assetsBaseUrl = environment.getProperty("assets.base-url"); + request.setAttribute("assetsBaseUrl", assetsBaseUrl); + if (!isLoginPage(request) && !isErrorPage(request) && !isfavicon(request)) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.isAuthenticated()) { @@ -244,10 +259,10 @@ public class AppInterceptor implements HandlerInterceptor { String contextPath = request.getContextPath(); String path = fullRequestURI.substring(contextPath.length()); if(!hasAccess(path)) { - Object principal = authentication.getPrincipal(); - UserDetails userDetails = (UserDetails) principal; + //Object principal = authentication.getPrincipal(); + //UserDetails userDetails = (UserDetails) principal; - System.out.println("1) Access Deny For --- " + userDetails.getAuthorities().toString()); + //System.out.println("1) Access Deny For --- " + userDetails.getAuthorities().toString()); // Redirect to the error page //response.sendRedirect(request.getContextPath() + "/error"); request.getRequestDispatcher("/error").forward(request, response); @@ -265,6 +280,9 @@ public class AppInterceptor implements HandlerInterceptor { // Check if the current request matches the login or error page URLs if (!isLoginPage(request) && !isErrorPage(request) && !isfavicon(request)) { if (modelAndView != null) { + String assetsBaseUrl = environment.getProperty("assets.base-url"); + request.setAttribute("assetsBaseUrl", assetsBaseUrl); + modelAndView.addObject("assetsBaseUrl", assetsBaseUrl); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.isAuthenticated()) { Object principal = authentication.getPrincipal(); diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/APIController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/APIController.java index f4e9a79..183d34f 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/APIController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/APIController.java @@ -13,7 +13,7 @@ import org.springframework.web.util.UriComponentsBuilder; import in.gov.chennaicorporation.gccoffice.configuration.AppConfig; -@RequestMapping("/api/mtm") +@RequestMapping("/gcc/api/mtm") @RestController("mtmapicontroller") public class APIController { private final RestTemplate restTemplate; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MainController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MainController.java index 271aabc..513703f 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MainController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MainController.java @@ -23,7 +23,7 @@ import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetQuestion; import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.Feedback; import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; -@RequestMapping("/mtm") +@RequestMapping("/gcc/mtm") @Controller("mtmController") public class MainController { diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MayorController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MayorController.java index 2a93d6f..f759fe0 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MayorController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MayorController.java @@ -19,7 +19,7 @@ import in.gov.chennaicorporation.gccoffice.mtm.data.Petition; import in.gov.chennaicorporation.gccoffice.mtm.data.PetitionComplaint; import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; -@RequestMapping("/mtm/mayor") +@RequestMapping("/gcc/mtm/mayor") @Controller("mtmMayorController") public class MayorController { diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/OfficerController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/OfficerController.java index 59ed38b..34c32f8 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/OfficerController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/OfficerController.java @@ -20,7 +20,7 @@ import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetParameterQu import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetQuestion; import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.Feedback; -@RequestMapping("/mtm/officer") +@RequestMapping("/gcc/mtm/officer") @Controller("mtmOfficerController") public class OfficerController { diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/APIController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/APIController.java new file mode 100644 index 0000000..dc8b568 --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/APIController.java @@ -0,0 +1,94 @@ +package in.gov.chennaicorporation.gccoffice.pgr.controller; + +import java.net.URLDecoder; +import java.io.UnsupportedEncodingException; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import in.gov.chennaicorporation.gccoffice.pgr.service.PGRCommon; +import in.gov.chennaicorporation.gccoffice.repository.UserActivityLogRepository; + +@RequestMapping("/gcc/api/pgr") +@RestController("pgrRest") +public class APIController { + + private PGRCommon pgrCommon; + + @Autowired + public APIController(PGRCommon pgrCommon) { + + this.pgrCommon = pgrCommon; + } + + @GetMapping(value="/getDepartments") + public List getDepartmentList() { + return pgrCommon.getDeaprtmentList(); + } + + @GetMapping(value="/getPendingComplaintCount") + public List getPendingComplaintCount() { + return pgrCommon.getPendingComplanitCount(); + } + + @GetMapping(value="/getZoneWisePendingComplaintCount") + public List getZoneWisePendingComplaintCount() { + return pgrCommon.getZoneWisePendingComplanitCount(); + } + + @GetMapping(value="/getZoneWiseReopenComplaintCount") + public List getZoneWiseReopenComplaintCount() { + return pgrCommon.getZoneWiseReopenComplanitCount(); + } + + @GetMapping(value="/getComplaintsList") + public List getComplaintsList() { + return pgrCommon.getComplaintsList(); + } + + @GetMapping(value="/getQaQcList") + public List getQaQcList() { + return pgrCommon.getQaQcList(); + } + + @GetMapping(value="/getZoneWiseComplaintCountList") + public List getZoneWiseComplaintList() { + return pgrCommon.getZoneWiseComplaintCountList(); + } + + @GetMapping(value="/getZoneWiseWithoutReopenComplaintList") + public List getZoneWiseWithoutReopenComplaintList() { + return pgrCommon.getZoneWiseWithoutReopenComplaintCountList(); + } + + @GetMapping(value="/getComplaintDetails") + public List getComplaintDetails(@RequestParam("complaintNumber") String complaintNumber) { + return pgrCommon.getComplaintDetails(complaintNumber); + } + + // For Sub Pages + @GetMapping(value="/getZoneWiseOfficerComplaintCountList") + public List getZoneWiseOfficerComplaintCountList(@RequestParam("deptid") String deptid, @RequestParam("complainttype") String complainttype) { + return pgrCommon.getZoneWiseOfficerComplaintCountList(deptid, complainttype); + } + + @GetMapping(value="/getZoneWiseOfficerComplaintList") + public List getZoneWiseOfficerComplaintList(@RequestParam("deptid") String deptid, @RequestParam("complainttype") String complainttype, @RequestParam("iduser") String iduser) { + return pgrCommon.getZoneWiseOfficerComplaintList(deptid, complainttype,iduser); + } + + @GetMapping(value="/getZoneWiseOfficerWithoutReopenComplaintCountList") + public List getZoneWiseOfficerWithoutReopenComplaintCountList(@RequestParam("deptid") String deptid, @RequestParam("complainttype") String complainttype) { + return pgrCommon.getZoneWiseOfficerWithoutReopenComplaintCountList(deptid, complainttype); + } + + @GetMapping(value="/getZoneWiseOfficerWithoutReopenComplaintList") + public List getZoneWiseOfficerWithoutReopenComplaintList(@RequestParam("deptid") String deptid, @RequestParam("complainttype") String complainttype, @RequestParam("iduser") String iduser) { + return pgrCommon.getZoneWiseOfficerWithoutReopenComplaintList(deptid, complainttype,iduser); + } + +} diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/MainController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/MainController.java new file mode 100644 index 0000000..c01e4dd --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/MainController.java @@ -0,0 +1,57 @@ +package in.gov.chennaicorporation.gccoffice.pgr.controller; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import in.gov.chennaicorporation.gccoffice.pgr.service.PGRCommon; +import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; + +@RequestMapping("/gcc/pgr") +@Controller("pgrController") +public class MainController { + private final LoginUserInfo loginUserInfo; + private final PGRCommon dashboards; + + @Autowired + public MainController(LoginUserInfo loginUserInfo, + PGRCommon dashboards) { + this.loginUserInfo = loginUserInfo; + this.dashboards = dashboards; + } + + @GetMapping({"", "/", "/index"}) + public String main(Model model) { + String userId = LoginUserInfo.getLoginUserId(); + if (userId != null && !userId.isEmpty()) { + System.out.println("String UserID: " + userId); + } + return "modules/pgr/index"; + } + + @GetMapping("/all-list") + public String allList(Model model) { + return "modules/pgr/all-list"; + } + + @GetMapping("/qa-qc-list") + public String qaqcList(Model model) { + return "modules/pgr/qa-qc-list"; + } + + @GetMapping("/zone-wise-with-reopen") + public String zoneWiseWithReopnList(Model model) { + return "modules/pgr/zone-wise-with-reopen"; + } + + @GetMapping("/zone-wise-without-reopen") + public String zoneWiseWithoutReopnList(Model model) { + return "modules/pgr/zone-wise-without-reopen"; + } +} diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/package-info.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/package-info.java new file mode 100644 index 0000000..da165f3 --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/controller/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.gccoffice.pgr.controller; \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/data/Departments.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/data/Departments.java new file mode 100644 index 0000000..8500d92 --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/data/Departments.java @@ -0,0 +1,35 @@ +package in.gov.chennaicorporation.gccoffice.pgr.data; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Departments { + + private String id; + private String name; + + @JsonCreator + public Departments( + @JsonProperty("id") String id, + @JsonProperty("name") String name + ) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/data/package-info.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/data/package-info.java new file mode 100644 index 0000000..d18fe0d --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/data/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.gccoffice.pgr.data; \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/package-info.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/package-info.java new file mode 100644 index 0000000..4ade4f9 --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.gccoffice.pgr; \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/service/PGRCommon.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/service/PGRCommon.java new file mode 100644 index 0000000..eee4e45 --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/service/PGRCommon.java @@ -0,0 +1,470 @@ +package in.gov.chennaicorporation.gccoffice.pgr.service; + +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; +import javax.transaction.Transactional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class PGRCommon { + private JdbcTemplate jdbcTemplate; + + @Autowired + public void setDataSource(@Qualifier("oracleDataSource") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + @Transactional + public List> getDeaprtmentList() { + + String SqlQuery = ""; + + SqlQuery="SELECT Distinct id_dept,dept_name " + + "FROM EG_DEPARTMENT@ERP " + + "WHERE NVL(dept_name, '0') NOT LIKE 'F%' AND dept_name IS NOT NULL " + + "ORDER BY id_dept"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneList() { + + String SqlQuery = ""; + + SqlQuery="SELECT Distinct id_dept,dept_name " + + "FROM EG_DEPARTMENT@ERP " + + "WHERE NVL(dept_name, '0') NOT LIKE 'F%' AND dept_name IS NOT NULL AND (id_dept >= 32 AND id_dept <= 46)" + + "ORDER BY id_dept"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getPendingComplanitCount() { + + String SqlQuery = ""; + + SqlQuery = "SELECT c.dept_name, a.deptid, a.days_90, a.days_90_pen, a.days_90_reopen, " + + "a.days_61_90, a.days_61_90_pen, a.days_61_90_reopen, " + + "a.days_31_60, a.days_31_60_pen, a.days_31_60_reopen, " + + "a.days_16_30, a.days_16_30_pen, a.days_16_30_reopen, " + + "a.days_0_15, a.days_0_15_pen, a.days_0_15_reopen, " + + "a.Total, a.Total_pen, a.Total_reopen " + + "FROM ( " + + "SELECT " + + "a.deptid, " + + "nvl(sum(case when sysdate - a.complaintdate > 90 then 1 end), '0') AS days_90, " + + "nvl(sum(case when sysdate - a.complaintdate > 90 AND b.COMPLAINTSTATUSID IN (2, 3, 4) then 1 end), '0') AS days_90_pen, " + + "nvl(sum(case when sysdate - a.complaintdate > 90 AND b.COMPLAINTSTATUSID IN (9) then 1 end), '0') AS days_90_reopen, " + + "nvl(sum(case when sysdate - a.complaintdate > 60 AND sysdate - a.complaintdate <= 90 then 1 end), '0') AS days_61_90, " + + "nvl(sum(case when sysdate - a.complaintdate > 60 AND sysdate - a.complaintdate <= 90 AND b.COMPLAINTSTATUSID IN (2, 3, 4) then 1 end), '0') AS days_61_90_pen, " + + "nvl(sum(case when sysdate - a.complaintdate > 60 AND sysdate - a.complaintdate <= 90 AND b.COMPLAINTSTATUSID IN (9) then 1 end), '0') AS days_61_90_reopen, " + + "nvl(sum(case when sysdate - a.complaintdate > 30 AND sysdate - a.complaintdate <= 60 then 1 end), '0') AS days_31_60, " + + "nvl(sum(case when sysdate - a.complaintdate > 30 AND sysdate - a.complaintdate <= 60 AND b.COMPLAINTSTATUSID IN (2, 3, 4) then 1 end), '0') AS days_31_60_pen, " + + "nvl(sum(case when sysdate - a.complaintdate > 30 AND sysdate - a.complaintdate <= 60 AND b.COMPLAINTSTATUSID IN (9) then 1 end), '0') AS days_31_60_reopen, " + + "nvl(sum(case when sysdate - a.complaintdate > 15 AND sysdate - a.complaintdate <= 30 then 1 end), '0') AS days_16_30, " + + "nvl(sum(case when sysdate - a.complaintdate > 15 AND sysdate - a.complaintdate <= 30 AND b.COMPLAINTSTATUSID IN (2, 3, 4) then 1 end), '0') AS days_16_30_pen, " + + "nvl(sum(case when sysdate - a.complaintdate > 15 AND sysdate - a.complaintdate <= 30 AND b.COMPLAINTSTATUSID IN (9) then 1 end), '0') AS days_16_30_reopen, " + + "nvl(sum(case when sysdate - a.complaintdate > 0 AND sysdate - a.complaintdate <= 15 then 1 end), '0') AS days_0_15, " + + "nvl(sum(case when sysdate - a.complaintdate > 0 AND sysdate - a.complaintdate <= 15 AND b.COMPLAINTSTATUSID IN (2, 3, 4) then 1 end), '0') AS days_0_15_pen, " + + "nvl(sum(case when sysdate - a.complaintdate > 0 AND sysdate - a.complaintdate <= 15 AND b.COMPLAINTSTATUSID IN (9) then 1 end), '0') AS days_0_15_reopen, " + + "nvl(count(*), '0') AS Total, " + + "nvl(count(case when b.COMPLAINTSTATUSID IN (2, 3, 4) then 1 end), '0') AS Total_pen, " + + "nvl(count(case when b.COMPLAINTSTATUSID IN (9) then 1 end), '0') AS Total_reopen " + + "FROM eggr_complaintdetails@erp a, eggr_redressaldetails@erp b " + + "WHERE a.complaintid = b.complaintid "; + //25-oct-2010 + SqlQuery += " AND a.complaintdate >= '25-oct-2010' GROUP BY a.deptid) a, EG_DEPARTMENT@ERP c " + + "WHERE a.deptid = c.id_dept AND (NVL(DEPT_NAME, 0) NOT LIKE 'F%' AND DEPT_NAME IS NOT NULL)"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneWisePendingComplanitCount() { + + String SqlQuery = ""; + + SqlQuery = "SELECT deptid, DEPT_NAME" + + ", NVL(SUM(CASE WHEN complainttype IN (52,146) THEN 1 END), 0) AS NonBURSTLT" + + ", NVL(SUM(CASE WHEN complainttype IN (1,97) THEN 1 END), 0) AS REOFGAR" + + ", NVL(SUM(CASE WHEN complainttype IN (22,32,57,59,70,113,114,130,145) THEN 1 END), 0) AS ROAD" + + ", NVL(SUM(CASE WHEN complainttype IN (18,118) THEN 1 END), 0) AS MOSQUITE" + + ", NVL(SUM(CASE WHEN complainttype IN (69,138) THEN 1 END), 0) AS WATER" + + ", NVL(SUM(CASE WHEN complainttype IN (7,99) THEN 1 END), 0) AS REOFDEB" + + ", NVL(SUM(CASE WHEN complainttype IN (71,152) THEN 1 END), 0) AS TREE" + + ", NVL(SUM(CASE WHEN complainttype IN (19,119) THEN 1 END), 0) AS DOGS" + + ", NVL(SUM(CASE WHEN complainttype IN (75,181) THEN 1 END), 0) AS ENCMTN" + + ", NVL(SUM(CASE WHEN complainttype IN (58,112) THEN 1 END), 0) AS POT" + + ", NVL(SUM(CASE WHEN complainttype IN (43,166) THEN 1 END), 0) AS PTAX" + + ", NVL(SUM(CASE WHEN complainttype NOT IN (52,146,1,97,22,32,57,59,70,113,114,130,145,18,118,69,138,7,99,71,152,19,119,75,181,58,112,43,166) THEN 1 END), 0) AS OTHERS" + + ", COUNT(*) AS Total FROM " + + "eggr_complaintdetails@erp a" + + ", eggr_redressaldetails@erp b" + + ", EG_DEPARTMENT@ERP c " + + "WHERE a.complaintdate >= '01-apr-2009' " + + "AND a.complaintid = b.complaintid " + + "AND b.COMPLAINTSTATUSID IN (2,3,4,9) " + + "AND a.deptid = c.id_dept " + + "AND (NVL(DEPT_NAME, 0) NOT LIKE 'F%' " + + "AND DEPT_NAME IS NOT NULL) " + + "GROUP BY a.deptid,c.DEPT_NAME ORDER BY a.deptid"; + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneWiseReopenComplanitCount() { + + String SqlQuery = ""; + + SqlQuery = "SELECT deptid, DEPT_NAME" + + ", NVL(SUM(CASE WHEN complainttype IN (52,146) THEN 1 END), 0) AS NonBURSTLT" + + ", NVL(SUM(CASE WHEN complainttype IN (1,97) THEN 1 END), 0) AS REOFGAR" + + ", NVL(SUM(CASE WHEN complainttype IN (22,32,57,59,70,113,114,130,145) THEN 1 END), 0) AS ROAD" + + ", NVL(SUM(CASE WHEN complainttype IN (18,118) THEN 1 END), 0) AS MOSQUITE" + + ", NVL(SUM(CASE WHEN complainttype IN (69,138) THEN 1 END), 0) AS WATER" + + ", NVL(SUM(CASE WHEN complainttype IN (7,99) THEN 1 END), 0) AS REOFDEB" + + ", NVL(SUM(CASE WHEN complainttype IN (71,152) THEN 1 END), 0) AS TREE" + + ", NVL(SUM(CASE WHEN complainttype IN (19,119) THEN 1 END), 0) AS DOGS" + + ", NVL(SUM(CASE WHEN complainttype IN (75,181) THEN 1 END), 0) AS ENCMTN" + + ", NVL(SUM(CASE WHEN complainttype IN (58,112) THEN 1 END), 0) AS POT" + + ", NVL(SUM(CASE WHEN complainttype IN (43,166) THEN 1 END), 0) AS PTAX" + + ", NVL(SUM(CASE WHEN complainttype NOT IN (52,146,1,97,22,32,57,59,70,113,114,130,145,18,118,69,138,7,99,71,152,19,119,75,181,58,112,43,166) THEN 1 END), 0) AS OTHERS" + + ", COUNT(*) AS Total FROM " + + "eggr_complaintdetails@erp a" + + ", eggr_redressaldetails@erp b" + + ", EG_DEPARTMENT@ERP c " + + "WHERE a.complaintdate >= '01-apr-2009' " + + "AND a.complaintid = b.complaintid " + + "AND b.COMPLAINTSTATUSID IN (9) " + + "AND a.deptid = c.id_dept " + + "AND (NVL(DEPT_NAME, 0) NOT LIKE 'F%' " + + "AND DEPT_NAME IS NOT NULL) " + + "GROUP BY a.deptid,c.DEPT_NAME ORDER BY a.deptid"; + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getComplaintsList() { + + String SqlQuery = ""; + + SqlQuery ="SELECT z.name AS zone_name, " + + " dn.name AS division_name, " + + " location.name AS location, " + + " d.dept_name, " + + " TO_CHAR(cd.complaintdate, 'dd-mm-yyyy') AS COMPDATE, " + + " TO_CHAR(cd.complaintdate, 'HH24:MI:SS') AS Time, " + + " cs.statusname AS status, " + + " usr.user_name, " + + " cd.complaintnumber, " + + " COALESCE(ct.complainttypename, 'Unspecified') AS complainttypename, " + + " cg.complaintgroupname " + + "FROM eggr_complaintdetails@erp cd " + + "INNER JOIN eggr_redressaldetails@erp rd ON cd.complaintid = rd.complaintid " + + "INNER JOIN eggr_complaintstatus@erp cs ON rd.complaintstatusid = cs.complaintstatusid " + + "INNER JOIN eggr_complainttypes@erp ct ON TRIM(cd.complainttype) = ct.complainttypeid " + + "INNER JOIN eg_user@erp usr ON rd.redressalofficerid = usr.id_user " + + "INNER JOIN eg_department@erp d ON cd.deptid = d.id_dept " + + "INNER JOIN eggr_complaintgroup@erp cg ON cg.id_complaintgroup = ct.complaintgroup_id " + + "INNER JOIN eg_boundary@erp dn ON dn.id_bndry = cd.bndry " + + "INNER JOIN eg_boundary@erp z ON dn.parent = z.id_bndry " + + "INNER JOIN eg_boundary@ERP location ON location.id_bndry = cd.locbndryid " + + "WHERE (cd.deptid IS NULL OR (cd.deptid < 21 OR cd.deptid > 30)) " + + " AND cd.complaintdate >= TO_DATE('2024-02-23', 'yyyy-MM-dd') " + + " AND cd.complaintdate < (TO_DATE('2024-02-23', 'yyyy-MM-dd') + 1) " + + "ORDER BY zone_name, division_name, cd.complaintdate" + + ""; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getQaQcList() { + + String SqlQuery = ""; + + SqlQuery ="select cd.COMPLAINTNUMBER, " + + "dep.DEPT_NAME,ct.COMPLAINTTYPENAME, " + + "TO_CHAR(cd.COMPLAINTDATE,'DD-MM-RRRR') COMPLAINTDATE, " + + "TO_CHAR(cd.COMPLAINTDATE,'HH:MI:SS AM') COMPLAINTTIME, " + + "cd.COMPLAINTDETAILS,cd.COMPLAINANTFIRSTNAME, " + + "cd.MOBILENUMBER AS COMPLAINANTMOBILENUMBER, usr.USER_NAME, usr.extrafield2 as Mobile_number, " + + "TO_CHAR(c.compl_date,'DD-MM-RRRR HH:MI:SS AM') as COMPLAINTCOMPLETIONDATE, DECODE ( qa.STATUS,null,'Not Attended','Attended') STATUS " + + "from EGGR_COMPLAINTDETAILS@erp cd , " + + "eg_department@erp dep, " + + "EGGR_COMPLAINTTYPES@erp ct, " + + "eg_user@erp usr, " + + "eggr_qams_store@erp qa, " + + "EGGR_REDRESSALDETAILS@erp rd, " + + "(SELECT c.redressalid, MAX(c.TIMESTAMP) compl_date " + + "FROM eggr_status_tracker@erp c,eggr_redressaldetails@ERP d " + + "WHERE c.statusid in(5,10) " + + "AND TRUNC(c.TIMESTAMP) between TO_DATE('2024-02-23', 'yyyy-MM-dd') and TO_DATE('2024-02-24', 'yyyy-MM-dd') " + + "AND d.COMPLAINTSTATUSID in(5,10) " + + "AND d.REDRESSALID=c.redressalid " + + "GROUP BY c.redressalid) c " + + "where cd.DEPTID=dep.ID_DEPT " + + "and cd.COMPLAINTTYPE=ct.COMPLAINTTYPEID " + + "AND rd.COMPLAINTID =cd.COMPLAINTID " + + "AND rd.REDRESSALOFFICERID =usr.id_user " + + "and qa.FDBK_OBJ_REF =cd.COMPLAINTID(+) " + + "and rd.COMPLAINTSTATUSID not in(2,3,4,9) and rd.redressalid=c.redressalid(+) and " + + "TRUNC(cd.COMPLAINTDATE) between TO_DATE('2024-02-23', 'yyyy-MM-dd') and TO_DATE('2024-02-24', 'yyyy-MM-dd') " + + "order by dept_name"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneWiseComplaintCountList() { + + String SqlQuery = ""; + + SqlQuery ="select * from (SELECT deptid , " + + "nvl(sum( case when complainttype in (52,146) then 1 end),0) as \"NonBURSTLT\" , " + + "nvl(sum( case when complainttype in (1,97) then 1 end),0) as \"REOFGAR\" ," + + "nvl(sum( case when complainttype in (22,32,57,59,70,113,114,130,145) then 1 end),0) as \"ROAD\" ," + + "nvl(sum( case when complainttype in (18,118) then 1 end),0) as \"MOSQUITE\" , " + + "nvl(sum( case when complainttype in (69,138) then 1 end),0) as \"WATER\" , " + + "nvl(sum( case when complainttype in (7,99) then 1 end),0) as \"REOFDEB\" ," + + "nvl(sum( case when complainttype in (71,152) then 1 end),0) as \"TREE\" , " + + "nvl(sum( case when complainttype in (19,119) then 1 end),0) as \"DOGS\" , " + + "nvl(sum( case when complainttype in (75,181) then 1 end),0) as \"ENCMTN\" ," + + "nvl(sum( case when complainttype in (58,112) then 1 end),0) as \"POT\" , " + + "nvl(sum( case when complainttype in (43,166) then 1 end),0) as \"PTAX\" , " + + "nvl(sum( case when complainttype not in (52,1,22,32,57,59,70,18,69,7,71,19,75,58,43,146,97,113,114,130,145,118,138,99,152,119,181,112,166) then 1 end),0) as \"OTHERS\" , " + + "COUNT(*) Total FROM eggr_complaintdetails@erp a, eggr_redressaldetails@erp b " + + "WHERE a.complaintid=b.complaintid " + + "and b.COMPLAINTSTATUSID IN(2,3,4,9) " + + "group by a.deptid ) a " + + "inner join EG_DEPARTMENT@ERP c on a.deptid=c.id_dept " + + "left outer join ( SELECT deptid , " + + "nvl(sum( case when sysdate-complaintdate>90 and b.COMPLAINTSTATUSID IN(2,3,4,9) then 1 end),'0') as days_90_pen , " + + "nvl(sum( case when sysdate-complaintdate>60 and sysdate-complaintdate<=90 and b.COMPLAINTSTATUSID IN(2,3,4,9) then 1 end),'0') as days_61_90_pen ," + + "nvl(sum( case when sysdate-complaintdate>30 and sysdate-complaintdate<=60 and b.COMPLAINTSTATUSID IN(2,3,4,9) then 1 end),'0') as days_31_60_pen , " + + "nvl(sum( case when sysdate-complaintdate>15 and sysdate-complaintdate<=30 and b.COMPLAINTSTATUSID IN(2,3,4,9) then 1 end),'0') as days_16_30_pen , " + + "nvl(sum( case when sysdate-complaintdate<=15 and b.COMPLAINTSTATUSID IN(2,3,4,9) then 1 end),'0') as days_0_15_pen , " + + "nvl(count(case when b.COMPLAINTSTATUSID IN(2,3,4,9) then 1 end),'0') as Total_pen " + + "FROM eggr_complaintdetails@erp a, eggr_redressaldetails@erp b " + + " WHERE a.complaintid=b.complaintid " + + "AND EXISTS (SELECT 1 FROM EG_DEPARTMENT@ERP c " + + "WHERE a.deptid = c.id_dept " + + "AND (NVL(c.id_dept, 0) NOT LIKE 'F%' " + + "AND c.id_dept IS NOT NULL)) group by a.deptid ) d on d.deptid=c.id_dept " + + "where (NVL(DEPT_NAME,0) NOT LIKE 'F%' AND DEPT_NAME IS NOT NULL) AND (a.deptid>=32 AND a.deptid<=46)" + + "order by a.deptid"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneWiseOfficerComplaintCountList(String deptid, String complainttype) { + + String SqlQuery = ""; + String where_1=""; + if(!complainttype.equals("all")) { + where_1 = "and cd.complainttype in ("+complainttype+") "; + } + + SqlQuery ="Select c.dept_name,a.iduser,a.user_name,nvl(b.extrafield2,' ') MOBILENO,a.nos,a.deptid from " + + "(SELECT cd.deptid, u.user_name, COUNT (cd.complaintid) nos, max(u.id_user) iduser " + + "FROM eggr_complaintdetails@erp cd, eggr_redressaldetails@erp rd, eg_user@erp u " + + "WHERE cd.complaintid = rd.complaintid " + + "AND rd.redressalofficerid = u.id_user and complaintdate >= '25-oct-2010' " + + "and rd.COMPLAINTSTATUSID IN(2,3,4,9) " + + where_1 +"" + + "AND cd.deptid = "+deptid+" " + + "GROUP BY cd.deptid, u.user_name " + + "ORDER BY cd.deptid,u.user_name) a , eg_user@erp b,eg_department@erp c " + + "where a.deptid="+deptid+" AND(a.deptid=c.id_dept(+) and a.user_name=b.user_name ) " + + "order by c.dept_name,a.user_name"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneWiseOfficerComplaintList(String deptid, String complainttype, String redressalofficerid) { + + String SqlQuery = ""; + String where_1=""; + if(!complainttype.equals("all")) { + where_1 = "and a.complainttype in ("+complainttype+") "; + } + + SqlQuery ="SELECT a.*, NVL(TO_CHAR(a.complaintdate, 'dd-mm-rrrr'), ' ') compdate,c.DEPT_NAME, u.user_name, ct.COMPLAINTTYPEName " + + "FROM eggr_complaintdetails@erp a, " + + "EG_DEPARTMENT@ERP c, " + + "eggr_redressaldetails@erp b, " + + "eg_user@erp u, " + + "EGGR_COMPLAINTTYPES@erp ct " + + "WHERE a.deptid = c.id_dept " + + "AND a.complainttype = ct.COMPLAINTTYPEID " + + "AND (NVL(DEPT_NAME, '0') NOT LIKE 'F%' AND DEPT_NAME IS NOT NULL) AND a.complaintid = b.complaintid " + + "AND complaintdate >= TO_DATE('25-Oct-2010', 'DD-Mon-YYYY') " + + "AND u.id_user = b.redressalofficerid " + + "AND b.COMPLAINTSTATUSID IN (2, 3, 4, 9) " + + where_1 +"" + + "AND a.deptid = "+deptid+" " + + "AND b.redressalofficerid = "+redressalofficerid+" " + + "ORDER BY user_name, a.complaintdate"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + + return result; + } + + + @Transactional + public List> getZoneWiseWithoutReopenComplaintCountList() { + + String SqlQuery = ""; + + SqlQuery ="select * from (SELECT deptid , " + + "nvl(sum( case when complainttype in (52,146) then 1 end),0) as \"NonBURSTLT\" , " + + "nvl(sum( case when complainttype in (1,97) then 1 end),0) as \"REOFGAR\" ," + + "nvl(sum( case when complainttype in (22,32,57,59,70,113,114,130,145) then 1 end),0) as \"ROAD\" ," + + "nvl(sum( case when complainttype in (18,118) then 1 end),0) as \"MOSQUITE\" , " + + "nvl(sum( case when complainttype in (69,138) then 1 end),0) as \"WATER\" , " + + "nvl(sum( case when complainttype in (7,99) then 1 end),0) as \"REOFDEB\" ," + + "nvl(sum( case when complainttype in (71,152) then 1 end),0) as \"TREE\" , " + + "nvl(sum( case when complainttype in (19,119) then 1 end),0) as \"DOGS\" , " + + "nvl(sum( case when complainttype in (75,181) then 1 end),0) as \"ENCMTN\" ," + + "nvl(sum( case when complainttype in (58,112) then 1 end),0) as \"POT\" , " + + "nvl(sum( case when complainttype in (43,166) then 1 end),0) as \"PTAX\" , " + + "nvl(sum( case when complainttype not in (52,1,22,32,57,59,70,18,69,7,71,19,75,58,43,146,97,113,114,130,145,118,138,99,152,119,181,112,166) then 1 end),0) as \"OTHERS\" , " + + "COUNT(*) Total FROM eggr_complaintdetails@erp a, eggr_redressaldetails@erp b " + + "WHERE a.complaintid=b.complaintid " + + "and b.COMPLAINTSTATUSID IN(2,3,4) " + + "group by a.deptid ) a " + + "inner join EG_DEPARTMENT@ERP c on a.deptid=c.id_dept " + + "left outer join ( SELECT deptid , " + + "nvl(sum( case when sysdate-complaintdate>90 and b.COMPLAINTSTATUSID IN(2,3,4) then 1 end),'0') as days_90_pen , " + + "nvl(sum( case when sysdate-complaintdate>60 and sysdate-complaintdate<=90 and b.COMPLAINTSTATUSID IN(2,3,4) then 1 end),'0') as days_61_90_pen ," + + "nvl(sum( case when sysdate-complaintdate>30 and sysdate-complaintdate<=60 and b.COMPLAINTSTATUSID IN(2,3,4) then 1 end),'0') as days_31_60_pen , " + + "nvl(sum( case when sysdate-complaintdate>15 and sysdate-complaintdate<=30 and b.COMPLAINTSTATUSID IN(2,3,4) then 1 end),'0') as days_16_30_pen , " + + "nvl(sum( case when sysdate-complaintdate<=15 and b.COMPLAINTSTATUSID IN(2,3,4) then 1 end),'0') as days_0_15_pen , " + + "nvl(count(case when b.COMPLAINTSTATUSID IN(2,3,4) then 1 end),'0') as Total_pen " + + "FROM eggr_complaintdetails@erp a, eggr_redressaldetails@erp b " + + " WHERE a.complaintid=b.complaintid " + + "AND EXISTS (SELECT 1 FROM EG_DEPARTMENT@ERP c " + + "WHERE a.deptid = c.id_dept " + + "AND (NVL(c.id_dept, 0) NOT LIKE 'F%' " + + "AND c.id_dept IS NOT NULL)) group by a.deptid ) d on d.deptid=c.id_dept " + + "where (NVL(DEPT_NAME,0) NOT LIKE 'F%' AND DEPT_NAME IS NOT NULL) AND (a.deptid>=32 AND a.deptid<=46)" + + "order by a.deptid"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneWiseOfficerWithoutReopenComplaintCountList(String deptid, String complainttype) { + + String SqlQuery = ""; + String where_1=""; + if(!complainttype.equals("all")) { + where_1 = "and cd.complainttype in ("+complainttype+") "; + } + + SqlQuery ="Select c.dept_name,a.iduser,a.user_name,nvl(b.extrafield2,' ') MOBILENO,a.nos,a.deptid from " + + "(SELECT cd.deptid, u.user_name, COUNT (cd.complaintid) nos, max(u.id_user) iduser " + + "FROM eggr_complaintdetails@erp cd, eggr_redressaldetails@erp rd, eg_user@erp u " + + "WHERE cd.complaintid = rd.complaintid " + + "AND rd.redressalofficerid = u.id_user and complaintdate >= '25-oct-2010' " + + "and rd.COMPLAINTSTATUSID IN(2,3,4) " + + where_1 +"" + + "AND cd.deptid = "+deptid+" " + + "GROUP BY cd.deptid, u.user_name " + + "ORDER BY cd.deptid,u.user_name) a , eg_user@erp b,eg_department@erp c " + + "where a.deptid="+deptid+" AND(a.deptid=c.id_dept(+) and a.user_name=b.user_name ) " + + "order by c.dept_name,a.user_name"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + @Transactional + public List> getZoneWiseOfficerWithoutReopenComplaintList(String deptid, String complainttype, String redressalofficerid) { + + String SqlQuery = ""; + String where_1=""; + if(!complainttype.equals("all")) { + where_1 = "and a.complainttype in ("+complainttype+") "; + } + + SqlQuery ="SELECT a.*, NVL(TO_CHAR(a.complaintdate, 'dd-mm-rrrr'), ' ') compdate,c.DEPT_NAME, u.user_name, ct.COMPLAINTTYPEName " + + "FROM eggr_complaintdetails@erp a, " + + "EG_DEPARTMENT@ERP c, " + + "eggr_redressaldetails@erp b, " + + "eg_user@erp u, " + + "EGGR_COMPLAINTTYPES@erp ct " + + "WHERE a.deptid = c.id_dept " + + "AND a.complainttype = ct.COMPLAINTTYPEID " + + "AND (NVL(DEPT_NAME, '0') NOT LIKE 'F%' AND DEPT_NAME IS NOT NULL) AND a.complaintid = b.complaintid " + + "AND complaintdate >= TO_DATE('25-Oct-2010', 'DD-Mon-YYYY') " + + "AND u.id_user = b.redressalofficerid " + + "AND b.COMPLAINTSTATUSID IN (2, 3, 4) " + + where_1 +"" + + "AND a.deptid = "+deptid+" " + + "AND b.redressalofficerid = "+redressalofficerid+" " + + "ORDER BY user_name, a.complaintdate"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + + return result; + } + + @Transactional + public List> getComplaintDetails(String complaintNumber) { + + String SqlQuery = ""; + + SqlQuery ="SELECT a.*, NVL(TO_CHAR(a.complaintdate, 'dd-mm-rrrr'), ' ') compdate,c.DEPT_NAME, u.user_name, ct.COMPLAINTTYPEName " + + "FROM eggr_complaintdetails@erp a, " + + "EG_DEPARTMENT@ERP c, " + + "eggr_redressaldetails@erp b, " + + "eg_user@erp u, " + + "EGGR_COMPLAINTTYPES@erp ct " + + "WHERE a.deptid = c.id_dept " + + "AND a.complainttype = ct.COMPLAINTTYPEID " + + "AND (NVL(DEPT_NAME, '0') NOT LIKE 'F%' AND DEPT_NAME IS NOT NULL) AND a.complaintid = b.complaintid " + + "AND complaintdate >= TO_DATE('25-Oct-2010', 'DD-Mon-YYYY') " + + "AND u.id_user = b.redressalofficerid " + + "AND a.COMPLAINTNUMBER = '"+complaintNumber+"' " + + "ORDER BY user_name, a.complaintdate"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + + // Iterate over the result list + for (Map row : result) { + // Iterate over each key-value pair in the map + for (Map.Entry entry : row.entrySet()) { + // Check if the value is null + if (entry.getValue() == null) { + // If the value is null, replace it with an empty string + entry.setValue(""); + } + } + } + + return result; + } + +} diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/service/package-info.java b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/service/package-info.java new file mode 100644 index 0000000..b928b6f --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/pgr/service/package-info.java @@ -0,0 +1 @@ +package in.gov.chennaicorporation.gccoffice.pgr.service; \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/APIController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/APIController.java index a0afaf7..6ba4401 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/APIController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/APIController.java @@ -17,7 +17,7 @@ import org.springframework.web.client.RestTemplate; import in.gov.chennaicorporation.gccoffice.configuration.AppConfig; -@RequestMapping("/api/qrfeedback") +@RequestMapping("/gcc/api/qrfeedback") @RestController("qrassetfeedbackcontroller") public class APIController { private final RestTemplate restTemplate; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/MainController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/MainController.java index f839b6b..7b2b19e 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/MainController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/qrassetfeedback/controller/MainController.java @@ -20,7 +20,7 @@ import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetParameterQu import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetQuestion; import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.Feedback; -@RequestMapping("/qrfeedback") +@RequestMapping("/gcc/qrfeedback") @Controller("qrAssetFeedbackController") public class MainController { diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java index 4736ec2..b86b2ff 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java @@ -5,6 +5,7 @@ import java.util.List; import javax.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -23,4 +24,17 @@ public interface AppModuleAccessRepository extends JpaRepository findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id); + + @Modifying + @Query(value = "INSERT INTO `modules_access`(`module_id`, `usergroup_id`) VALUES (:module_id,:usergroup_id)", nativeQuery = true) + void insert(@Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id); + + @Modifying + @Query(value = "UPDATE `modules_access` SET `isactive`=:isactive WHERE `module_id`=:module_id AND `usergroup_id`=:usergroup_id", nativeQuery = true) + void update(@Param("isactive") Boolean isactive, @Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id); + + @Modifying + @Query(value = "UPDATE `modules_access` SET `isactive`=:isactive WHERE `usergroup_id`=:usergroup_id", nativeQuery = true) + void updateActiveStatus(@Param("isactive") Boolean isactive, @Param("usergroup_id") String usergroup_id); + } \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppUserGroupRepository.java b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppUserGroupRepository.java new file mode 100644 index 0000000..f8e1acf --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppUserGroupRepository.java @@ -0,0 +1,17 @@ +package in.gov.chennaicorporation.gccoffice.repository; + +import javax.transaction.Transactional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import in.gov.chennaicorporation.gccoffice.entity.AppUserEntity; +import in.gov.chennaicorporation.gccoffice.entity.AppUserGroupEntity; + +@Repository +@Transactional +public interface AppUserGroupRepository extends JpaRepository{ + @Query(value = "SELECT LAST_INSERT_ID()", nativeQuery = true) + Integer getLastInsertedId(); +} \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppUserRepository.java b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppUserRepository.java index 0d2c4c4..06ce20c 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppUserRepository.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppUserRepository.java @@ -1,5 +1,7 @@ package in.gov.chennaicorporation.gccoffice.repository; +import java.util.List; + import javax.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,6 +9,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import in.gov.chennaicorporation.gccoffice.entity.AppUserEntity; +import in.gov.chennaicorporation.gccoffice.taxcollection.entity.TaxCollectionRequestEntity; @Repository @Transactional @@ -14,5 +17,11 @@ public interface AppUserRepository extends JpaRepository @Query(value = "SELECT LAST_INSERT_ID()", nativeQuery = true) Integer getLastInsertedId(); + @Query(value = "SELECT * FROM `appusers`", nativeQuery = true) + List showAll(); + + @Query(value = "SELECT * FROM `appusers` WHERE (id=:userId AND `isdelete`=0)", nativeQuery = true) + List showById(String userId); + AppUserEntity findByUsername(String username); } \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java index a96050a..bc7fa10 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java @@ -5,6 +5,7 @@ import java.util.List; import javax.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -26,4 +27,16 @@ public interface MenuItemAccessRepository extends JpaRepository findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id); + + @Modifying + @Query(value = "INSERT INTO `menuitem_access`(`menuitem_id`, `module_id`, `usergroup_id`) VALUES (:menuitem_id,:module_id,:usergroup_id)", nativeQuery = true) + void insert(@Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id, @Param("menuitem_id") String menuitem_id); + + @Modifying + @Query(value = "UPDATE `menuitem_access` SET `isactive`=:isactive WHERE `module_id`=:module_id AND `usergroup_id`=:usergroup_id AND `menuitem_id`=:menuitem_id", nativeQuery = true) + void update(@Param("isactive") Boolean isactive, @Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id); + + @Modifying + @Query(value = "UPDATE `menuitem_access` SET `isactive`=:isactive WHERE `usergroup_id`=:usergroup_id", nativeQuery = true) + void updateActiveStatus(@Param("isactive") Boolean isactive, @Param("usergroup_id") String usergroup_id); } \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java index fbc6564..63a8a32 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java @@ -5,6 +5,7 @@ import java.util.List; import javax.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -29,4 +30,16 @@ public interface SubMenuItemAccessRepository extends JpaRepository findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id,@Param("submenuitem_id") String submenuitem_id); + @Modifying + @Query(value = "INSERT INTO `submenuitem_access`(`submenuitem_id`, `menuitem_id`, `module_id`, `usergroup_id`) VALUES (:submenuitem_id, :menuitem_id, :module_id, :usergroup_id)", nativeQuery = true) + void insert(@Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id, @Param("menuitem_id") String menuitem_id, @Param("submenuitem_id") String submenuitem_id); + + @Modifying + @Query(value = "UPDATE `submenuitem_access` SET `isactive`=:isactive WHERE `module_id`=:module_id AND `usergroup_id`=:usergroup_id AND `menuitem_id`=:menuitem_id AND `submenuitem_id`=:submenuitem_id", nativeQuery = true) + void update(@Param("isactive") Boolean isactive, @Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id, @Param("menuitem_id") String menuitem_id, @Param("submenuitem_id") String submenuitem_id); + + @Modifying + @Query(value = "UPDATE `submenuitem_access` SET `isactive`=:isactive WHERE `usergroup_id`=:usergroup_id", nativeQuery = true) + void updateActiveStatus(@Param("isactive") Boolean isactive, @Param("usergroup_id") String usergroup_id); + } \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/repository/UserActivityLogRepository.java b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/UserActivityLogRepository.java new file mode 100644 index 0000000..48406cc --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/repository/UserActivityLogRepository.java @@ -0,0 +1,16 @@ +package in.gov.chennaicorporation.gccoffice.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import in.gov.chennaicorporation.gccoffice.entity.UserActivityLog; + +import java.util.List; + +import javax.transaction.Transactional; + +@Repository +@Transactional +public interface UserActivityLogRepository extends JpaRepository { + List findByUserIdOrderByTimestampDesc(String userId); +} \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/service/CustomUserDetailsService.java b/src/main/java/in/gov/chennaicorporation/gccoffice/service/CustomUserDetailsService.java index 01d38ce..b5a3819 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/service/CustomUserDetailsService.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/service/CustomUserDetailsService.java @@ -19,18 +19,23 @@ import in.gov.chennaicorporation.gccoffice.repository.AppUserRepository; public class CustomUserDetailsService implements UserDetailsService { private final AppUserRepository appUserRepository; + private final UserActivityService userActivityService; @Autowired - public CustomUserDetailsService(AppUserRepository appUserRepository) { + public CustomUserDetailsService(AppUserRepository appUserRepository,UserActivityService userActivityService ) { this.appUserRepository = appUserRepository; + this.userActivityService = userActivityService; } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { AppUserEntity appUserEntity = appUserRepository.findByUsername(username); - System.out.println(username); + + userActivityService.logUserActivity("0", "Trying to Login with Username: " + username); + //System.out.println(username); if (appUserEntity == null) { - System.out.println("User not found"); + //System.out.println("User not found"); + userActivityService.logUserActivity("0","User (" + username +") not found"); throw new UsernameNotFoundException("User not found"); } /* @@ -46,7 +51,7 @@ public class CustomUserDetailsService implements UserDetailsService { // Ensure that the role starts with "ROLE_" if (!userRole.startsWith("ROLE_")) { userRole = "ROLE_" + userRole; - System.out.println("User Role: "+userRole); + //System.out.println("User Role: "+userRole); } // Create a SimpleGrantedAuthority for the user role SimpleGrantedAuthority authority = new SimpleGrantedAuthority(userRole); @@ -70,6 +75,11 @@ public class CustomUserDetailsService implements UserDetailsService { ) ); + userActivityService.logUserActivity(appUserEntity.getUserid().getUserid().toString(), "Login Success:
    Username: "+appUserEntity.getUsername() + +"
    Role: "+appUserEntity.getRoles().toString() + +"
    Access Group: "+appUserEntity.getUsergroup_id().getName() + +"
    Access Group ID: "+appUserEntity.getUsergroup_id().getId()); + return userDetails; } } diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/service/UserActivityService.java b/src/main/java/in/gov/chennaicorporation/gccoffice/service/UserActivityService.java new file mode 100644 index 0000000..3f11b1f --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/service/UserActivityService.java @@ -0,0 +1,29 @@ +package in.gov.chennaicorporation.gccoffice.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import in.gov.chennaicorporation.gccoffice.entity.UserActivityLog; +import in.gov.chennaicorporation.gccoffice.repository.UserActivityLogRepository; + +import java.time.LocalDateTime; + +@Service +public class UserActivityService { + + private final UserActivityLogRepository userActivityLogRepository; + + @Autowired + public UserActivityService(UserActivityLogRepository userActivityLogRepository) { + this.userActivityLogRepository = userActivityLogRepository; + } + + public void logUserActivity(String userId, String activityType) { + UserActivityLog userActivityLog = new UserActivityLog(); + userActivityLog.setUserId(userId); + userActivityLog.setActivityType(activityType); + userActivityLog.setTimestamp(LocalDateTime.now()); + + userActivityLogRepository.save(userActivityLog); + } +} \ No newline at end of file diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/service/UserActivityTimelineService.java b/src/main/java/in/gov/chennaicorporation/gccoffice/service/UserActivityTimelineService.java new file mode 100644 index 0000000..08d352d --- /dev/null +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/service/UserActivityTimelineService.java @@ -0,0 +1,25 @@ +package in.gov.chennaicorporation.gccoffice.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import in.gov.chennaicorporation.gccoffice.entity.UserActivityLog; +import in.gov.chennaicorporation.gccoffice.repository.UserActivityLogRepository; + +import java.util.List; + +@Service +public class UserActivityTimelineService { + + private final UserActivityLogRepository userActivityLogRepository; + + @Autowired + public UserActivityTimelineService(UserActivityLogRepository userActivityLogRepository) { + this.userActivityLogRepository = userActivityLogRepository; + } + + public List getUserActivityTimeline(String userId) { + return userActivityLogRepository.findByUserIdOrderByTimestampDesc(userId); + } +} + diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/MainController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/MainController.java index a881fad..4ef86a9 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/MainController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/MainController.java @@ -21,7 +21,7 @@ import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; import in.gov.chennaicorporation.gccoffice.taxcollection.entity.TaxCollectionRequestEntity; import in.gov.chennaicorporation.gccoffice.taxcollection.repository.TaxCollectionRequestRepository; -@RequestMapping("/taxcollection") +@RequestMapping("/gcc/taxcollection") @Controller("taxCollectionController") public class MainController { @@ -45,7 +45,7 @@ public class MainController { } @GetMapping("/request-create") - public String category(Model model) { + public String CreateRequest(Model model) { String LoginUserId = LoginUserInfo.getLoginUserId(); model.addAttribute("LoginUserId",LoginUserId); List taxCollectionRequestEntities = taxCollectionRequestRepository.showAll(); @@ -53,6 +53,15 @@ public class MainController { return "modules/taxcollection/request-create"; } + @GetMapping("/request-list") + public String RequestList(Model model) { + String LoginUserId = LoginUserInfo.getLoginUserId(); + model.addAttribute("LoginUserId",LoginUserId); + List taxCollectionRequestEntities = taxCollectionRequestRepository.showAll(); + model.addAttribute("taxCollectionRequestEntities",taxCollectionRequestEntities); + return "modules/taxcollection/request-list"; + } + @GetMapping("/showimage") public String showimage(Model model) { return "modules/taxcollection/request-create"; diff --git a/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/TaxCollectionRestController.java b/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/TaxCollectionRestController.java index 34b1cdd..ee3034e 100644 --- a/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/TaxCollectionRestController.java +++ b/src/main/java/in/gov/chennaicorporation/gccoffice/taxcollection/controller/TaxCollectionRestController.java @@ -30,7 +30,7 @@ import in.gov.chennaicorporation.gccoffice.taxcollection.entity.TaxCollectionReq import in.gov.chennaicorporation.gccoffice.taxcollection.repository.TaxCollectionRequestRepository; import in.gov.chennaicorporation.gccoffice.taxcollection.service.TaxCollectionService; -@RequestMapping("/api/taxcollection") +@RequestMapping("/gcc/api/taxcollection") @RestController("taxCollectionRestController") public class TaxCollectionRestController { @@ -118,6 +118,7 @@ public class TaxCollectionRestController { taxCollectionRequestEntity.setcDate(cdate.toString()); taxCollectionRequestEntity.setIsActive(true); taxCollectionRequestEntity.setIsDelete(false); + taxCollectionRequestEntity.setStatus("open"); Integer lastinsertid = taxCollectionService.saveTaxCollectionRequest(taxCollectionRequestEntity); return "Success"; } diff --git a/src/main/resources/.DS_Store b/src/main/resources/.DS_Store index cdfabfd..e2e5a62 100644 Binary files a/src/main/resources/.DS_Store and b/src/main/resources/.DS_Store differ diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 0000000..e999929 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1 @@ +assets.base-url=/assets/ \ No newline at end of file diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties new file mode 100644 index 0000000..964a916 --- /dev/null +++ b/src/main/resources/application-production.properties @@ -0,0 +1 @@ +assets.base-url=/gcc/assets/ \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5786757..eb978c2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,15 +1,29 @@ +spring.profiles.active=local +#spring.profiles.active=production +#For Server production +#assets.base-url=/gcc/assets/ +#For local test +#assets.base-url=/assets/ + +# Spring properties +spring.application.name=gcc-portal + +# Discovery Server Access +#eureka.client.serviceUrl.defaultZone=http://localhost:8061/eureka/ + +# HTTP Server server.port = 8064 #server.servlet.context-path=/gccoffice server.error.include-stacktrace= on_param # Hibernate logging -#logging.level.org.hibernate.SQL=DEBUG -#logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +logging.level.org.hibernate.SQL=DEBUG +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # Enable CORS globally for all endpoints spring.webmvc.cors.enabled=true # Comma-separated list of allowed origins -spring.webmvc.cors.allowed-origins=http://gccservices.chennaicorporation.gov.in,http://chennaicorporation.gov.in,http://117.232.67.158 +spring.webmvc.cors.allowed-origins=http://gccservices.chennaicorporation.gov.in:8064,http://chennaicorporation.gov.in:8064,http://117.232.67.158:8064,http://localhost:8064 # Comma-separated list of allowed HTTP methods spring.webmvc.cors.allowed-methods=GET,POST,PUT,DELETE @@ -22,7 +36,7 @@ spring.webmvc.cors.max-age=3600 server.servlet.session.tracking-modes=COOKIE -#server.servlet.session.cookie.domain=.chennaicorporation.gov.in +#server.servlet.session.cookie.domain=chennaicorporation.gov.in #logging.level.root=DEBUG @@ -30,7 +44,10 @@ file.upload.directory=${user.dir}/gccoffice_uploads server.address=0.0.0.0 -server.servlet.session.timeout: 5m -server.servlet.session.cookie.name: MYSESSIONID -server.servlet.session.cookie.max-age: 10m +server.servlet.session.timeout=-1 +server.servlet.session.cookie.name= GCCONEPORTALSESSION +server.servlet.session.cookie.max-age= -1 +#server.servlet.session.timeout:5m +#server.servlet.session.cookie.name: MYSESSIONID +#server.servlet.session.cookie.max-age: 10m diff --git a/src/main/resources/static/.DS_Store b/src/main/resources/static/.DS_Store index fc36538..7976c95 100644 Binary files a/src/main/resources/static/.DS_Store and b/src/main/resources/static/.DS_Store differ diff --git a/src/main/resources/static/assets/.DS_Store b/src/main/resources/static/assets/.DS_Store index e3f4180..f7c17a6 100644 Binary files a/src/main/resources/static/assets/.DS_Store and b/src/main/resources/static/assets/.DS_Store differ diff --git a/src/main/resources/static/assets/images/hi_robo.gif b/src/main/resources/static/assets/images/hi_robo.gif new file mode 100644 index 0000000..b2d1943 Binary files /dev/null and b/src/main/resources/static/assets/images/hi_robo.gif differ diff --git a/src/main/resources/static/assets/images/search_ani.gif b/src/main/resources/static/assets/images/search_ani.gif new file mode 100644 index 0000000..945f048 Binary files /dev/null and b/src/main/resources/static/assets/images/search_ani.gif differ diff --git a/src/main/resources/static/assets/node_modules/datatable/DataTables-1.13.6/css/jquery.dataTables.min.css b/src/main/resources/static/assets/node_modules/datatable/DataTables-1.13.6/css/jquery.dataTables.min.css index ad59f84..fea7c5e 100644 --- a/src/main/resources/static/assets/node_modules/datatable/DataTables-1.13.6/css/jquery.dataTables.min.css +++ b/src/main/resources/static/assets/node_modules/datatable/DataTables-1.13.6/css/jquery.dataTables.min.css @@ -1 +1 @@ -:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0, 0, 0, 0.5);content:"►"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"▼"}html.dark table.dataTable td.dt-control:before{color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255, 255, 255, 0.5)}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border>tbody>tr>th,table.dataTable.row-border>tbody>tr>td,table.dataTable.display>tbody>tr>th,table.dataTable.display>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border>tbody>tr:first-child>th,table.dataTable.row-border>tbody>tr:first-child>td,table.dataTable.display>tbody>tr:first-child>th,table.dataTable.display>tbody>tr:first-child>td{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0262ef}table.dataTable.cell-border>tbody>tr>th,table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr>th:first-child,table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr:first-child>th,table.dataTable.cell-border>tbody>tr:first-child>td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 1) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.954)}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.947)}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.962)}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(0, 0, 0, 0.05);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.05)), color-stop(100%, rgba(0, 0, 0, 0.05)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89, 91, 94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89, 91, 94)}html.dark table.dataTable.row-border>tbody>tr>th,html.dark table.dataTable.row-border>tbody>tr>td,html.dark table.dataTable.display>tbody>tr>th,html.dark table.dataTable.display>tbody>tr>td{border-top:1px solid rgb(64, 67, 70)}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0257d5}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64, 67, 70);border-right:1px solid rgb(64, 67, 70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64, 67, 70)}html.dark .dataTables_wrapper .dataTables_filter input,html.dark .dataTables_wrapper .dataTables_length select{border:1px solid rgba(255, 255, 255, 0.2);background-color:var(--dt-html-background)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{border:1px solid rgb(89, 91, 94);background:rgba(255, 255, 255, 0.15)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{color:#666 !important}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:hover{border:1px solid rgb(53, 53, 53);background:rgb(53, 53, 53)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:active{background:#3a3a3a} +:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0, 0, 0, 0.5);content:"►"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"\25BC"}html.dark table.dataTable td.dt-control:before{color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255, 255, 255, 0.5)}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"\25B2";content:"\25B2"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"\25BC";content:"\25BC"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border>tbody>tr>th,table.dataTable.row-border>tbody>tr>td,table.dataTable.display>tbody>tr>th,table.dataTable.display>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border>tbody>tr:first-child>th,table.dataTable.row-border>tbody>tr:first-child>td,table.dataTable.display>tbody>tr:first-child>th,table.dataTable.display>tbody>tr:first-child>td{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0262ef}table.dataTable.cell-border>tbody>tr>th,table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr>th:first-child,table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr:first-child>th,table.dataTable.cell-border>tbody>tr:first-child>td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 1) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.954)}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.947)}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.962)}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(0, 0, 0, 0.05);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.05)), color-stop(100%, rgba(0, 0, 0, 0.05)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89, 91, 94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89, 91, 94)}html.dark table.dataTable.row-border>tbody>tr>th,html.dark table.dataTable.row-border>tbody>tr>td,html.dark table.dataTable.display>tbody>tr>th,html.dark table.dataTable.display>tbody>tr>td{border-top:1px solid rgb(64, 67, 70)}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0257d5}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64, 67, 70);border-right:1px solid rgb(64, 67, 70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64, 67, 70)}html.dark .dataTables_wrapper .dataTables_filter input,html.dark .dataTables_wrapper .dataTables_length select{border:1px solid rgba(255, 255, 255, 0.2);background-color:var(--dt-html-background)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{border:1px solid rgb(89, 91, 94);background:rgba(255, 255, 255, 0.15)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{color:#666 !important}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:hover{border:1px solid rgb(53, 53, 53);background:rgb(53, 53, 53)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:active{background:#3a3a3a} diff --git a/src/main/resources/templates/.DS_Store b/src/main/resources/templates/.DS_Store index cff074d..95be7a2 100644 Binary files a/src/main/resources/templates/.DS_Store and b/src/main/resources/templates/.DS_Store differ diff --git a/src/main/resources/templates/error-403.html b/src/main/resources/templates/error-403.html index 171394e..fcc3892 100644 --- a/src/main/resources/templates/error-403.html +++ b/src/main/resources/templates/error-403.html @@ -13,13 +13,13 @@
    - +
    - Greater Chennai Corporation + Greater Chennai Corporation

    Greater Chennai Corporation

    diff --git a/src/main/resources/templates/error-404.html b/src/main/resources/templates/error-404.html index 3d8da64..0386cbd 100644 --- a/src/main/resources/templates/error-404.html +++ b/src/main/resources/templates/error-404.html @@ -13,13 +13,13 @@
    - +
    - Greater Chennai Corporation + Greater Chennai Corporation

    Greater Chennai Corporation

    diff --git a/src/main/resources/templates/error-500.html b/src/main/resources/templates/error-500.html index 9e37ed0..340e9e2 100644 --- a/src/main/resources/templates/error-500.html +++ b/src/main/resources/templates/error-500.html @@ -13,13 +13,13 @@
    - +
    - Greater Chennai Corporation + Greater Chennai Corporation

    Greater Chennai Corporation

    diff --git a/src/main/resources/templates/fragments/modules/admin/modal-box.html b/src/main/resources/templates/fragments/modules/admin/modal-box.html new file mode 100644 index 0000000..864f74d --- /dev/null +++ b/src/main/resources/templates/fragments/modules/admin/modal-box.html @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/fragments/modules/base/head.html b/src/main/resources/templates/fragments/modules/base/head.html index 00b8658..6dc4c4a 100644 --- a/src/main/resources/templates/fragments/modules/base/head.html +++ b/src/main/resources/templates/fragments/modules/base/head.html @@ -7,37 +7,40 @@ + + - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - + + \ No newline at end of file diff --git a/src/main/resources/templates/fragments/modules/base/header.html b/src/main/resources/templates/fragments/modules/base/header.html index ea2dcf2..eab64c3 100644 --- a/src/main/resources/templates/fragments/modules/base/header.html +++ b/src/main/resources/templates/fragments/modules/base/header.html @@ -29,7 +29,7 @@ - + Steve Smith @@ -71,7 +71,7 @@