Browse Source

first commit

master
Hariprasath S 1 year ago
commit
fc1b2be09b
  1. 2
      .gitattributes
  2. 33
      .gitignore
  3. 19
      .mvn/wrapper/maven-wrapper.properties
  4. 259
      mvnw
  5. 149
      mvnw.cmd
  6. 83
      pom.xml
  7. 13
      src/main/java/com/gcc/commissionerreviewII/CommissionerreviewIiApplication.java
  8. 53
      src/main/java/com/gcc/commissionerreviewII/configuration/DataSourceConfig.java
  9. 55
      src/main/java/com/gcc/commissionerreviewII/controller/EnforcementApiController.java
  10. 101
      src/main/java/com/gcc/commissionerreviewII/controller/EnforcementPendencyApiController.java
  11. 38
      src/main/java/com/gcc/commissionerreviewII/controller/MainController.java
  12. 77
      src/main/java/com/gcc/commissionerreviewII/controller/SofaBedCollectionApiController.java
  13. 769
      src/main/java/com/gcc/commissionerreviewII/service/EnforcementPendencyService.java
  14. 304
      src/main/java/com/gcc/commissionerreviewII/service/EnforcementService.java
  15. 621
      src/main/java/com/gcc/commissionerreviewII/service/SofaBedCollectionService.java
  16. 3
      src/main/resources/application.properties
  17. 919
      src/main/resources/templates/modules/enforcement/Zonewise.html
  18. 857
      src/main/resources/templates/modules/enforcement/form2pendency.html
  19. 857
      src/main/resources/templates/modules/enforcement/form3Pendency.html
  20. 796
      src/main/resources/templates/modules/enforcement/form7pendency.html
  21. 662
      src/main/resources/templates/modules/sofa_bed/zonewise.html
  22. 687
      src/main/resources/templates/modules/sofa_bed/zonewise1.html
  23. 13
      src/test/java/com/gcc/commissionerreviewII/CommissionerreviewIiApplicationTests.java

2
.gitattributes

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
.gitignore

@ -0,0 +1,33 @@
HELP.md
target/
.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

19
.mvn/wrapper/maven-wrapper.properties

@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

259
mvnw

@ -0,0 +1,259 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.2
#
# Optional ENV vars
# -----------------
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
# MVNW_REPOURL - repo url base for downloading maven distribution
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
native_path() { cygpath --path --windows "$1"; }
;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
if [ -n "${JAVA_HOME-}" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACCMD="$JAVA_HOME/jre/sh/javac"
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACCMD="$JAVA_HOME/bin/javac"
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
return 1
fi
fi
else
JAVACMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v java
)" || :
JAVACCMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v javac
)" || :
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
return 1
fi
fi
}
# hash string like Java String::hashCode
hash_string() {
str="${1:-}" h=0
while [ -n "$str" ]; do
char="${str%"${str#?}"}"
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
str="${str#?}"
done
printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
printf %s\\n "$1" >&2
exit 1
}
trim() {
# MWRAPPER-139:
# Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
# Needed for removing poorly interpreted newline sequences when running in more
# exotic environments such as mingw bash on Windows.
printf "%s" "${1}" | tr -d '[:space:]'
}
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
case "${key-}" in
distributionUrl) distributionUrl=$(trim "${value-}") ;;
distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
esac
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
*)
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
distributionPlatform=linux-amd64
;;
esac
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
trap clean HUP INT TERM EXIT
else
die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
distributionUrl="${distributionUrl%.zip}.tar.gz"
distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
verbose "Found wget ... using wget"
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
verbose "Found curl ... using curl"
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
verbose "Falling back to use Java to download"
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
cat >"$javaSource" <<-END
public class Downloader extends java.net.Authenticator
{
protected java.net.PasswordAuthentication getPasswordAuthentication()
{
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
}
public static void main( String[] args ) throws Exception
{
setDefault( new Downloader() );
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
}
}
END
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
verbose " - Compiling Downloader.java ..."
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
verbose " - Running Downloader.java ..."
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
distributionSha256Result=false
if [ "$MVN_CMD" = mvnd.sh ]; then
echo "Checksum validation is not supported for maven-mvnd." >&2
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
elif command -v sha256sum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
elif command -v shasum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
fi
if [ $distributionSha256Result = false ]; then
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
exit 1
fi
fi
# unzip and move
if command -v unzip >/dev/null; then
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"

149
mvnw.cmd

@ -0,0 +1,149 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

83
pom.xml

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gcc</groupId>
<artifactId>commissionerreviewII</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>commissionerreviewII</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version> <!-- or latest version -->
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

13
src/main/java/com/gcc/commissionerreviewII/CommissionerreviewIiApplication.java

@ -0,0 +1,13 @@
package com.gcc.commissionerreviewII;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CommissionerreviewIiApplication {
public static void main(String[] args) {
SpringApplication.run(CommissionerreviewIiApplication.class, args);
}
}

53
src/main/java/com/gcc/commissionerreviewII/configuration/DataSourceConfig.java

@ -0,0 +1,53 @@
package com.gcc.commissionerreviewII.configuration;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Configuration
public class DataSourceConfig {
@Configuration
public static class MyDataSourceConfig {
private static final String host = "localhost";
private static final String dbpassword = "root";
@Primary
@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;
}
@Bean(name = "mySqlDataSourceSofaBed")
public DataSource mySqlDataSourceSofaBed() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + host + "/domestic_waste_management");
dataSource.setUsername("root");
dataSource.setPassword(dbpassword);
return dataSource;
}
@Bean(name = "jdbcDomesticWasteTemplate")
public JdbcTemplate jdbcDomesticWasteTemplate(@Qualifier("mySqlDataSourceSofaBed") DataSource ds) {
return new JdbcTemplate(ds);
}
}
}

55
src/main/java/com/gcc/commissionerreviewII/controller/EnforcementApiController.java

@ -0,0 +1,55 @@
package com.gcc.commissionerreviewII.controller;
import java.util.List;
import java.util.Map;
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 com.gcc.commissionerreviewII.service.EnforcementService;
@RestController
@RequestMapping("/commissionerreview/api/enforcement")
public class EnforcementApiController {
@Autowired
private EnforcementService enforcementService;
@GetMapping("/getZoneWiseDetails")
public List<Map<String, Object>> getZonewisedetails()
{
return enforcementService.getzonewisedetails();
}
@GetMapping("/getWardWiseDetails")
public List<Map<String, Object>> getWardwisedetails(@RequestParam String zone)
{
return enforcementService.getwardwisedetails(zone);
}
@GetMapping("/getFormDetails")
public List<Map<String, Object>> getFormdetails(@RequestParam String ward,@RequestParam String zone,@RequestParam String formtype,@RequestParam String status)
{
return enforcementService.getformdetailswithzone(zone,ward,formtype,status);
}
@GetMapping("/getFormDetailsWithoutWard")
public List<Map<String, Object>> getFormdetailsWithoutWard(@RequestParam String zone,@RequestParam String formtype,@RequestParam String status)
{
return enforcementService.getformdetailswithoutward(zone,formtype,status);
}
@GetMapping("/getFormId")
public List<Map<String, Object>> getFormIddetails(@RequestParam String formid)
{
return enforcementService.getformiddetails(formid);
}
}

101
src/main/java/com/gcc/commissionerreviewII/controller/EnforcementPendencyApiController.java

@ -0,0 +1,101 @@
package com.gcc.commissionerreviewII.controller;
import java.util.List;
import java.util.Map;
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 com.gcc.commissionerreviewII.service.EnforcementPendencyService;
@RestController
@RequestMapping("/commissionerreview/api/pendency")
public class EnforcementPendencyApiController {
@Autowired
private EnforcementPendencyService enforcementPendencyService;
@GetMapping("/getZoneWisePendencyDetails")
public List<Map<String, Object>> getZoneWisePendencyDetails()
{
return enforcementPendencyService.getzonewisependencydetails();
}
@GetMapping("/getWardWisePendencyDetails")
public List<Map<String, Object>> getWardWisePendencyDetails(@RequestParam String zone)
{
return enforcementPendencyService.getwardwisependencydetails(zone);
}
@GetMapping("/getPendencyDetailReport")
public List<Map<String, Object>> getPendencyDetailReport(@RequestParam String zone,@RequestParam String status)
{
return enforcementPendencyService.getpendencydetailreport(zone,status);
}
@GetMapping("/getPendencyDetailReportByWard")
public List<Map<String, Object>> getPendencyDetailReportByWard(@RequestParam String zone,@RequestParam String status,@RequestParam String ward)
{
return enforcementPendencyService.getpendencydetailreportbyward(zone,status,ward);
}
// for form 3
@GetMapping("/getZoneWiseForm3PendencyDetails")
public List<Map<String, Object>> getZoneWiseForm3PendencyDetails()
{
return enforcementPendencyService.getZoneWiseForm3PendencyDetails();
}
@GetMapping("/getWardWiseForm3PendencyDetails")
public List<Map<String, Object>> getWardWiseForm3PendencyDetails(@RequestParam String zone)
{
return enforcementPendencyService.getWardWiseForm3PendencyDetails(zone);
}
@GetMapping("/getForm3PendencyDetailReport")
public List<Map<String, Object>> getForm3PendencyDetailReport(@RequestParam String zone,@RequestParam String status)
{
return enforcementPendencyService.getForm3PendencyDetailReport(zone,status);
}
@GetMapping("/getForm3PendencyDetailReportByWard")
public List<Map<String, Object>> getForm3PendencyDetailReportByWard(@RequestParam String zone,@RequestParam String status,@RequestParam String ward)
{
return enforcementPendencyService.getForm3PendencyDetailReportByWard(zone,status,ward);
}
// for form 7
@GetMapping("/getZoneWiseForm7PendencyDetails")
public List<Map<String, Object>> getZoneWiseForm7PendencyDetails() {
return enforcementPendencyService.getZoneWiseForm7PendencyDetails();
}
@GetMapping("/getWardWiseForm7PendencyDetails")
public List<Map<String, Object>> getWardWiseForm7PendencyDetails(@RequestParam String zone) {
return enforcementPendencyService.getWardWiseForm7PendencyDetails(zone);
}
@GetMapping("/getForm7PendencyDetailReportByZone")
public List<Map<String, Object>> getForm7PendencyDetailReportByZone(@RequestParam String zone, @RequestParam String status) {
return enforcementPendencyService.getForm7PendencyDetailReportByZone(zone, status);
}
@GetMapping("/getForm7PendencyDetailReportByWard")
public List<Map<String, Object>> getForm7PendencyDetailReportByWard(@RequestParam String zone, @RequestParam String status, @RequestParam String ward) {
return enforcementPendencyService.getForm7PendencyDetailReportByWard(zone, status, ward);
}
}

38
src/main/java/com/gcc/commissionerreviewII/controller/MainController.java

@ -0,0 +1,38 @@
package com.gcc.commissionerreviewII.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = {"/commissionerreview"})
public class MainController {
@GetMapping("/enforcement")
public String viewenforcementpage(Model model) {
return "modules/enforcement/Zonewise";
}
@GetMapping("/pendency")
public String viewpendencypage(Model model) {
return "modules/enforcement/form2pendency";
}
@GetMapping("/pendencyform3")
public String viewpendencypage2(Model model) {
return "modules/enforcement/form3Pendency";
}
@GetMapping("/pendencyform7")
public String viewform7pendencypage(Model model) {
return "modules/enforcement/form7pendency";
}
@GetMapping("/sofacollection")
public String sofaZoneReport(Model model) {
return "modules/sofa_bed/zonewise1";
}
}

77
src/main/java/com/gcc/commissionerreviewII/controller/SofaBedCollectionApiController.java

@ -0,0 +1,77 @@
package com.gcc.commissionerreviewII.controller;
import java.util.List;
import java.util.Map;
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 com.gcc.commissionerreviewII.service.SofaBedCollectionService;
@RestController
@RequestMapping("/commissionerreview/api/sofabedcollection")
public class SofaBedCollectionApiController {
@Autowired
private SofaBedCollectionService sofaBedCollectionService;
@GetMapping("/getZoneWiseDetails")
public Map<String, Object> getZonewisedetails()
{
return sofaBedCollectionService.getzonewisedetails();
}
@GetMapping("/getWardDetails")
public Map<String, Object> getWardDetails(@RequestParam String zone)
{
return sofaBedCollectionService.getwarddetails(zone);
}
@GetMapping("/getWardStatusDetails")
public Map<String, Object> getWardStatusDetails(@RequestParam String ward,@RequestParam String status)
{
return sofaBedCollectionService.getwardstatusdetails(ward,status);
}
// @GetMapping("/getZoneReport")
// public List<Map<String, Object>> getZoneReport(@RequestParam String fromDate,@RequestParam String toDate)
// {
// return sofaBedCollectionService.getZoneReport(fromDate,toDate);
// }
@GetMapping("/getZoneReport")
public List<Map<String, Object>> getZoneReport()
{
return sofaBedCollectionService.getZoneReport();
}
// @GetMapping("/getWardReport")
// public List<Map<String, Object>> getWardReport(@RequestParam String fromDate,@RequestParam String toDate,@RequestParam String zone)
// {
// return sofaBedCollectionService.getWardReport(fromDate,toDate,zone);
// }
@GetMapping("/getWardReport")
public List<Map<String, Object>> getWardReport(@RequestParam String zone)
{
return sofaBedCollectionService.getWardReport(zone);
}
// @GetMapping("/getWardStatusReport")
// public List<Map<String, Object>> getWardStatusDetails(@RequestParam String fromDate,@RequestParam String toDate,@RequestParam String ward,@RequestParam String status)
// {
// return sofaBedCollectionService.getWardStatusDetails(fromDate,toDate,ward,status);
// }
@GetMapping("/getWardStatusReport")
public List<Map<String, Object>> getWardStatusDetail(@RequestParam String ward,@RequestParam String status)
{
return sofaBedCollectionService.getWardStatusDetails(ward,status);
}
}

769
src/main/java/com/gcc/commissionerreviewII/service/EnforcementPendencyService.java

@ -0,0 +1,769 @@
package com.gcc.commissionerreviewII.service;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
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 EnforcementPendencyService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("oracleDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getzonewisependencydetails() {
String sql =
"WITH latest_form1 AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MAX(id) AS max_id\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype = 'Form 1'\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ "),\r\n"
+ "form1_data AS (\r\n"
+ " SELECT \r\n"
+ " a.form_parentid,\r\n"
+ " a.approveddate AS form1_date,\r\n"
+ " zone.name AS zone\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp a\r\n"
+ " JOIN latest_form1 lf ON a.id = lf.max_id\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ "),\r\n"
+ "form2_data AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MIN(approveddate) AS form2_date\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype = 'Form 2'\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ ")\r\n"
+ "SELECT \r\n"
+ " f1.zone,\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f2.form2_date IS NULL AND f1.form1_date <= SYSDATE - 7 \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Form 2 Not Initiated\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f2.form2_date is not null and f2.form2_date > f1.form1_date + INTERVAL '7' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Form 2 Initiated After 7 Days\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f2.form2_date is not null and f2.form2_date <= f1.form1_date + INTERVAL '7' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Form 2 Initiated Within 7 Days\"\r\n"
+ "\r\n"
+ "FROM \r\n"
+ " form1_data f1\r\n"
+ "LEFT JOIN \r\n"
+ " form2_data f2 ON f1.form_parentid = f2.form_parentid\r\n"
+ "GROUP BY \r\n"
+ " f1.zone\r\n"
+ "ORDER BY \r\n"
+ " f1.zone";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getwardwisependencydetails(String zone) {
System.out.println("openZoneModal.."+zone);
String sql =
"WITH latest_form1 AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MAX(id) AS max_id\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype = 'Form 1'\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ "),\r\n"
+ "form1_data AS (\r\n"
+ " SELECT \r\n"
+ " a.form_parentid,\r\n"
+ " a.approveddate AS form1_date,\r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp a\r\n"
+ " JOIN latest_form1 lf ON a.id = lf.max_id\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ " WHERE zone.name = ? \r\n"
+ "),\r\n"
+ "form2_data AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MIN(approveddate) AS form2_date\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype = 'Form 2'\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ ")\r\n"
+ "SELECT \r\n"
+ " f1.ward,\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f2.form2_date IS NULL AND f1.form1_date <= SYSDATE - 7 \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Form 2 Not Initiated\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f2.form2_date > f1.form1_date + INTERVAL '7' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Form 2 Initiated After 7 Days\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f2.form2_date <= f1.form1_date + INTERVAL '7' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Form 2 Initiated Within 7 Days\"\r\n"
+ "\r\n"
+ "FROM \r\n"
+ " form1_data f1\r\n"
+ "LEFT JOIN \r\n"
+ " form2_data f2 ON f1.form_parentid = f2.form_parentid\r\n"
+ "GROUP BY \r\n"
+ " f1.ward\r\n"
+ "ORDER BY \r\n"
+ " f1.ward";
return jdbcTemplate.queryForList(sql, zone );
}
public List<Map<String, Object>> getpendencydetailreport(String zone,String status) {
String sql = "SELECT * FROM \r\n"
+ "(SELECT \r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward,\r\n"
+ " addr.formid,\r\n"
+ " addr.applicant_name,\r\n"
+ " addr.area,\r\n"
+ " addr.address,\r\n"
+ " addr.pincode,\r\n"
+ " CASE \r\n"
+ " WHEN f2.form2_date IS NULL AND f1.form1_date <= SYSDATE - 7 THEN 'Form 2 Not Initiated'\r\n"
+ " WHEN f2.form2_date IS NULL AND f1.form1_date > SYSDATE - 7 THEN 'Form 2 Not Yet Due'\r\n"
+ " WHEN f2.form2_date > f1.form1_date + INTERVAL '7' DAY THEN 'Form 2 Initiated After 7 Days'\r\n"
+ " WHEN f2.form2_date <= f1.form1_date + INTERVAL '7' DAY THEN 'Form 2 Initiated Within 7 Days'\r\n"
+ " END AS form2_status\r\n"
+ "FROM \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form1_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 1'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f1\r\n"
+ "LEFT JOIN \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form2_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 2'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f2 ON f2.form_parentid = f1.form_parentid\r\n"
+ "JOIN \r\n"
+ " EGBPA_FORM_RULES@erp a ON a.form_parentid = f1.form_parentid\r\n"
+ "JOIN \r\n"
+ " eg_wf_states@erp b ON a.state_id = b.id\r\n"
+ "JOIN \r\n"
+ " eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ "JOIN \r\n"
+ " eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ "LEFT JOIN \r\n"
+ " EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = f1.form_parentid\r\n"
+ "WHERE \r\n"
+ " a.id = (\r\n"
+ " SELECT MAX(id) \r\n"
+ " FROM EGBPA_FORM_RULES@erp \r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype = 'Form 1'\r\n"
+ " )"
+ " AND a.formtype = 'Form 1' "
+ " AND zone.name = ? "
+ " ORDER BY CASE "
+ " WHEN f2.form2_date IS NULL AND f1.form1_date <= SYSDATE - 7 THEN 1 "
+ " WHEN f2.form2_date IS NULL AND f1.form1_date > SYSDATE - 7 THEN 2 "
+ " WHEN f2.form2_date > f1.form1_date + INTERVAL '7' DAY THEN 3 "
+ " WHEN f2.form2_date <= f1.form1_date + INTERVAL '7' DAY THEN 4 "
+ " ELSE 5 "
+ " END "
+ ") "
+ "WHERE FORM2_STATUS = ? ";
return jdbcTemplate.queryForList(sql,zone,status);
}
public List<Map<String, Object>> getpendencydetailreportbyward(String zone, String status, String ward) {
String sql = "SELECT * FROM \r\n"
+ "(SELECT \r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward,\r\n"
+ " addr.formid,\r\n"
+ " addr.applicant_name,\r\n"
+ " addr.area,\r\n"
+ " addr.address,\r\n"
+ " addr.pincode,\r\n"
+ " CASE \r\n"
+ " WHEN f2.form2_date IS NULL AND f1.form1_date <= SYSDATE - 7 THEN 'Form 2 Not Initiated'\r\n"
+ " WHEN f2.form2_date IS NULL AND f1.form1_date > SYSDATE - 7 THEN 'Form 2 Not Yet Due'\r\n"
+ " WHEN f2.form2_date > f1.form1_date + INTERVAL '7' DAY THEN 'Form 2 Initiated After 7 Days'\r\n"
+ " WHEN f2.form2_date <= f1.form1_date + INTERVAL '7' DAY THEN 'Form 2 Initiated Within 7 Days'\r\n"
+ " END AS form2_status\r\n"
+ "FROM \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form1_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 1'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f1\r\n"
+ "LEFT JOIN \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form2_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 2'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f2 ON f2.form_parentid = f1.form_parentid\r\n"
+ "JOIN \r\n"
+ " EGBPA_FORM_RULES@erp a ON a.form_parentid = f1.form_parentid\r\n"
+ "JOIN \r\n"
+ " eg_wf_states@erp b ON a.state_id = b.id\r\n"
+ "JOIN \r\n"
+ " eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ "JOIN \r\n"
+ " eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ "LEFT JOIN \r\n"
+ " EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = f1.form_parentid\r\n"
+ "WHERE \r\n"
+ " a.id = (\r\n"
+ " SELECT MAX(id) \r\n"
+ " FROM EGBPA_FORM_RULES@erp \r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype = 'Form 1'\r\n"
+ " )"
+ " AND a.formtype = 'Form 1' "
+ " AND zone.name = ? "
+ " AND ward.name = ? "
+ " ORDER BY CASE "
+ " WHEN f2.form2_date IS NULL AND f1.form1_date <= SYSDATE - 7 THEN 1 "
+ " WHEN f2.form2_date IS NULL AND f1.form1_date > SYSDATE - 7 THEN 2 "
+ " WHEN f2.form2_date > f1.form1_date + INTERVAL '7' DAY THEN 3 "
+ " WHEN f2.form2_date <= f1.form1_date + INTERVAL '7' DAY THEN 4 "
+ " ELSE 5 "
+ " END "
+ ") "
+ "WHERE FORM2_STATUS = ? ";
return jdbcTemplate.queryForList(sql,zone,ward,status);
}
//////////////////////////////////////////////////////////////////////
public List<Map<String, Object>> getZoneWiseForm3PendencyDetails() {
String sql = "WITH latest_form2 AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MAX(id) AS max_id\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype = 'Form 2'\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ "),\r\n"
+ "form2_data AS (\r\n"
+ " SELECT \r\n"
+ " a.form_parentid,\r\n"
+ " a.approveddate AS form2_date,\r\n"
+ " zone.name AS zone\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp a\r\n"
+ " JOIN latest_form2 lf ON a.id = lf.max_id\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ "),\r\n"
+ "form3_4_data AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MIN(approveddate) AS form3_4_date\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ ")\r\n"
+ "\r\n"
+ "SELECT \r\n"
+ " f2.zone,\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date <= SYSDATE - 15 \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Not Initiated\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f34.form3_4_date > f2.form2_date + INTERVAL '15' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"After 15 Days\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f34.form3_4_date <= f2.form2_date + INTERVAL '15' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Within 15 Days\"\r\n"
+ "\r\n"
+ "FROM \r\n"
+ " form2_data f2\r\n"
+ "LEFT JOIN \r\n"
+ " form3_4_data f34 ON f2.form_parentid = f34.form_parentid\r\n"
+ "GROUP BY \r\n"
+ " f2.zone\r\n"
+ "ORDER BY \r\n"
+ " f2.zone";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getWardWiseForm3PendencyDetails(String zone) {
String sql="WITH latest_form2 AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MAX(id) AS max_id\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype = 'Form 2'\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ "),\r\n"
+ "form2_data AS (\r\n"
+ " SELECT \r\n"
+ " a.form_parentid,\r\n"
+ " a.approveddate AS form2_date,\r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp a\r\n"
+ " JOIN latest_form2 lf ON a.id = lf.max_id\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ "),\r\n"
+ "form3_4_data AS (\r\n"
+ " SELECT \r\n"
+ " form_parentid,\r\n"
+ " MIN(approveddate) AS form3_4_date\r\n"
+ " FROM \r\n"
+ " EGBPA_FORM_RULES@erp\r\n"
+ " WHERE \r\n"
+ " formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY \r\n"
+ " form_parentid\r\n"
+ ")\r\n"
+ "\r\n"
+ "SELECT \r\n"
+ " f2.zone,\r\n"
+ " f2.ward,\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date <= SYSDATE - 15 \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Not Initiated\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f34.form3_4_date > f2.form2_date + INTERVAL '15' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"After 15 Days\",\r\n"
+ " \r\n"
+ " COUNT(CASE \r\n"
+ " WHEN f34.form3_4_date <= f2.form2_date + INTERVAL '15' DAY \r\n"
+ " THEN 1 \r\n"
+ " END) AS \"Within 15 Days\"\r\n"
+ "\r\n"
+ "FROM \r\n"
+ " form2_data f2\r\n"
+ "LEFT JOIN \r\n"
+ " form3_4_data f34 ON f2.form_parentid = f34.form_parentid\r\n"
+ "WHERE \r\n"
+ " f2.zone = ? \r\n"
+ "GROUP BY \r\n"
+ " f2.zone, f2.ward\r\n"
+ "ORDER BY \r\n"
+ " f2.zone, f2.ward";
return jdbcTemplate.queryForList(sql,zone);
}
public List<Map<String, Object>> getForm3PendencyDetailReport(String zone, String status) {
String sql="SELECT * FROM \r\n"
+ "(\r\n"
+ " SELECT \r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward,\r\n"
+ " addr.formid,\r\n"
+ " addr.applicant_name,\r\n"
+ " addr.area,\r\n"
+ " addr.address,\r\n"
+ " addr.pincode,\r\n"
+ " \r\n"
+ " CASE \r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date <= SYSDATE - 15 THEN 'Form 3/4 Not Initiated'\r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date > SYSDATE - 15 THEN 'Form 3/4 Not Yet Due'\r\n"
+ " WHEN f34.form3_4_date > f2.form2_date + INTERVAL '15' DAY THEN 'Form 3/4 Initiated After 15 Days'\r\n"
+ " WHEN f34.form3_4_date <= f2.form2_date + INTERVAL '15' DAY THEN 'Form 3/4 Initiated Within 15 Days'\r\n"
+ " ELSE 'Unknown Status'\r\n"
+ " END AS form3_4_status\r\n"
+ "\r\n"
+ " FROM \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form2_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 2'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f2\r\n"
+ " LEFT JOIN \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form3_4_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f34 ON f34.form_parentid = f2.form_parentid\r\n"
+ "\r\n"
+ " JOIN \r\n"
+ " EGBPA_FORM_RULES@erp a ON a.form_parentid = f2.form_parentid\r\n"
+ " JOIN \r\n"
+ " eg_wf_states@erp b ON a.state_id = b.id\r\n"
+ " JOIN \r\n"
+ " eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " JOIN \r\n"
+ " eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ " LEFT JOIN \r\n"
+ " EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = f2.form_parentid\r\n"
+ "\r\n"
+ " WHERE \r\n"
+ " a.id = (\r\n"
+ " SELECT MAX(id) \r\n"
+ " FROM EGBPA_FORM_RULES@erp \r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype = 'Form 2'\r\n"
+ " )\r\n"
+ " AND a.formtype = 'Form 2'\r\n"
+ " AND zone.name = ? -- Change to your required zone\r\n"
+ "\r\n"
+ " ORDER BY \r\n"
+ " CASE \r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date <= SYSDATE - 15 THEN 1\r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date > SYSDATE - 15 THEN 2\r\n"
+ " WHEN f34.form3_4_date > f2.form2_date + INTERVAL '15' DAY THEN 3\r\n"
+ " WHEN f34.form3_4_date <= f2.form2_date + INTERVAL '15' DAY THEN 4\r\n"
+ " ELSE 5\r\n"
+ " END\r\n"
+ ")\r\n"
+ "WHERE form3_4_status = ? ";
return jdbcTemplate.queryForList(sql,zone,status);
}
public List<Map<String, Object>> getForm3PendencyDetailReportByWard(String zone, String status, String ward) {
String sql="SELECT * FROM \r\n"
+ "(\r\n"
+ " SELECT \r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward,\r\n"
+ " addr.formid,\r\n"
+ " addr.applicant_name,\r\n"
+ " addr.area,\r\n"
+ " addr.address,\r\n"
+ " addr.pincode,\r\n"
+ " \r\n"
+ " CASE \r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date <= SYSDATE - 15 THEN 'Form 3/4 Not Initiated'\r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date > SYSDATE - 15 THEN 'Form 3/4 Not Yet Due'\r\n"
+ " WHEN f34.form3_4_date > f2.form2_date + INTERVAL '15' DAY THEN 'Form 3/4 Initiated After 15 Days'\r\n"
+ " WHEN f34.form3_4_date <= f2.form2_date + INTERVAL '15' DAY THEN 'Form 3/4 Initiated Within 15 Days'\r\n"
+ " ELSE 'Unknown Status'\r\n"
+ " END AS form3_4_status\r\n"
+ "\r\n"
+ " FROM \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form2_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 2'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f2\r\n"
+ " LEFT JOIN \r\n"
+ " (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form3_4_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f34 ON f34.form_parentid = f2.form_parentid\r\n"
+ "\r\n"
+ " JOIN \r\n"
+ " EGBPA_FORM_RULES@erp a ON a.form_parentid = f2.form_parentid\r\n"
+ " JOIN \r\n"
+ " eg_wf_states@erp b ON a.state_id = b.id\r\n"
+ " JOIN \r\n"
+ " eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " JOIN \r\n"
+ " eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ " LEFT JOIN \r\n"
+ " EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = f2.form_parentid\r\n"
+ "\r\n"
+ " WHERE \r\n"
+ " a.id = (\r\n"
+ " SELECT MAX(id) \r\n"
+ " FROM EGBPA_FORM_RULES@erp \r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype = 'Form 2'\r\n"
+ " )\r\n"
+ " AND a.formtype = 'Form 2'\r\n"
+ " AND zone.name = ? -- Change to your required zone\r\n"
+ " AND ward.name = ? \r\n"
+ "\r\n"
+ " ORDER BY \r\n"
+ " CASE \r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date <= SYSDATE - 15 THEN 1\r\n"
+ " WHEN f34.form3_4_date IS NULL AND f2.form2_date > SYSDATE - 15 THEN 2\r\n"
+ " WHEN f34.form3_4_date > f2.form2_date + INTERVAL '15' DAY THEN 3\r\n"
+ " WHEN f34.form3_4_date <= f2.form2_date + INTERVAL '15' DAY THEN 4\r\n"
+ " ELSE 5\r\n"
+ " END\r\n"
+ ")\r\n"
+ "WHERE form3_4_status = ?";
return jdbcTemplate.queryForList(sql,zone,ward,status);
}
//////////////////////////////////////////////////////////////////////////////////
public List<Map<String, Object>> getZoneWiseForm7PendencyDetails() {
String sql = "WITH latest_form3_4 AS (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form3_4_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY form_parentid\r\n"
+ "),\r\n"
+ "latest_form7 AS (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form7_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 7'\r\n"
+ " GROUP BY form_parentid\r\n"
+ "),\r\n"
+ "combined_data AS (\r\n"
+ " SELECT\r\n"
+ " f3_4.form_parentid,\r\n"
+ " f3_4.form3_4_date,\r\n"
+ " f7.form7_date\r\n"
+ " FROM latest_form3_4 f3_4\r\n"
+ " LEFT JOIN latest_form7 f7 ON f3_4.form_parentid = f7.form_parentid\r\n"
+ "),\r\n"
+ "zone_data AS (\r\n"
+ " SELECT\r\n"
+ " a.zoneid,\r\n"
+ " zone.name AS zone,\r\n"
+ " cd.form3_4_date,\r\n"
+ " cd.form7_date\r\n"
+ " FROM combined_data cd\r\n"
+ " JOIN EGBPA_FORM_RULES@erp a ON a.form_parentid = cd.form_parentid AND a.formtype IN ('Form 3', 'Form 4')\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " WHERE a.id = (\r\n"
+ " SELECT MAX(id) \r\n"
+ " FROM EGBPA_FORM_RULES@erp \r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype IN ('Form 3', 'Form 4')\r\n"
+ " )\r\n"
+ ")\r\n"
+ "SELECT\r\n"
+ " zone,\r\n"
+ " COUNT(CASE WHEN form7_date IS NULL AND form3_4_date <= SYSDATE - 30 THEN 1 END) AS \"F7 Not Initiated After 30 Days\",\r\n"
+ " COUNT(CASE WHEN form7_date > form3_4_date + INTERVAL '30' DAY THEN 1 END) AS \"F7 Initiated After 30 Days\",\r\n"
+ " COUNT(CASE WHEN form7_date IS NOT NULL AND form7_date <= form3_4_date + INTERVAL '30' DAY THEN 1 END) AS \"F7 Initiated Within 30 Days\"\r\n"
+ "FROM zone_data\r\n"
+ "GROUP BY zone\r\n"
+ "ORDER BY zone";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getWardWiseForm7PendencyDetails(String zone) {
String sql = "WITH form3_4 AS (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form3_4_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY form_parentid\r\n"
+ "),\r\n"
+ "form7 AS (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form7_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 7'\r\n"
+ " GROUP BY form_parentid\r\n"
+ "),\r\n"
+ "combined AS (\r\n"
+ " SELECT\r\n"
+ " f34.form_parentid,\r\n"
+ " f34.form3_4_date,\r\n"
+ " f7.form7_date\r\n"
+ " FROM form3_4 f34\r\n"
+ " LEFT JOIN form7 f7 ON f34.form_parentid = f7.form_parentid\r\n"
+ "),\r\n"
+ "ward_data AS (\r\n"
+ " SELECT\r\n"
+ " ward.name AS ward,\r\n"
+ " zone.name AS zone,\r\n"
+ " c.form3_4_date,\r\n"
+ " c.form7_date\r\n"
+ " FROM combined c\r\n"
+ " JOIN EGBPA_FORM_RULES@erp a ON a.form_parentid = c.form_parentid\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ " WHERE a.id = (\r\n"
+ " SELECT MAX(id) FROM EGBPA_FORM_RULES@erp \r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype IN ('Form 3', 'Form 4')\r\n"
+ " )\r\n"
+ " AND a.formtype IN ('Form 3', 'Form 4')\r\n"
+ " AND zone.name = ? \r\n"
+ ")\r\n"
+ "SELECT\r\n"
+ " ward,\r\n"
+ " COUNT(CASE WHEN form7_date IS NULL AND form3_4_date <= SYSDATE - 30 THEN 1 END) AS \"F7 Not Initiated After 30 Days\",\r\n"
+ " COUNT(CASE WHEN form7_date > form3_4_date + INTERVAL '30' DAY THEN 1 END) AS \"F7 Initiated After 30 Days\",\r\n"
+ " COUNT(CASE WHEN form7_date IS NOT NULL AND form7_date <= form3_4_date + INTERVAL '30' DAY THEN 1 END) AS \"F7 Initiated Within 30 Days\"\r\n"
+ "FROM ward_data\r\n"
+ "GROUP BY ward\r\n"
+ "ORDER BY ward";
return jdbcTemplate.queryForList(sql, zone);
}
public List<Map<String, Object>> getForm7PendencyDetailReportByZone(String zone, String status) {
String sql = "SELECT *\r\n"
+ "FROM (\r\n"
+ " SELECT \r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward,\r\n"
+ " addr.formid,\r\n"
+ " addr.applicant_name,\r\n"
+ " addr.area,\r\n"
+ " addr.address,\r\n"
+ " addr.pincode,\r\n"
+ " f34.form3_4_date,\r\n"
+ " f7.form7_date,\r\n"
+ " CASE \r\n"
+ " WHEN f7.form7_date IS NULL AND f34.form3_4_date <= SYSDATE - 30 THEN 'Form 7 Not Initiated After 30 Days'\r\n"
+ " WHEN f7.form7_date IS NULL AND f34.form3_4_date > SYSDATE - 30 THEN 'Form 7 Not Yet Due'\r\n"
+ " WHEN f7.form7_date > f34.form3_4_date + INTERVAL '30' DAY THEN 'Form 7 Initiated After 30 Days'\r\n"
+ " WHEN f7.form7_date <= f34.form3_4_date + INTERVAL '30' DAY THEN 'Form 7 Initiated Within 30 Days'\r\n"
+ " ELSE 'Unknown'\r\n"
+ " END AS form7_status\r\n"
+ " FROM (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form3_4_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f34\r\n"
+ " LEFT JOIN (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form7_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 7'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f7 ON f34.form_parentid = f7.form_parentid\r\n"
+ " JOIN EGBPA_FORM_RULES@erp a ON a.form_parentid = f34.form_parentid\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = f34.form_parentid\r\n"
+ " WHERE a.id = (\r\n"
+ " SELECT MAX(id)\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype IN ('Form 3', 'Form 4')\r\n"
+ " )\r\n"
+ " AND a.formtype IN ('Form 3', 'Form 4')" +
" AND zone.name = ? " +
" ) " +
"WHERE form7_status = ? "+
" ORDER BY form7_status, form3_4_date" ;
return jdbcTemplate.queryForList(sql, zone, status);
}
public List<Map<String, Object>> getForm7PendencyDetailReportByWard(String zone, String status, String ward) {
String sql = "SELECT *\r\n"
+ "FROM (\r\n"
+ " SELECT \r\n"
+ " zone.name AS zone,\r\n"
+ " ward.name AS ward,\r\n"
+ " addr.formid,\r\n"
+ " addr.applicant_name,\r\n"
+ " addr.area,\r\n"
+ " addr.address,\r\n"
+ " addr.pincode,\r\n"
+ " f34.form3_4_date,\r\n"
+ " f7.form7_date,\r\n"
+ " CASE \r\n"
+ " WHEN f7.form7_date IS NULL AND f34.form3_4_date <= SYSDATE - 30 THEN 'Form 7 Not Initiated After 30 Days'\r\n"
+ " WHEN f7.form7_date IS NULL AND f34.form3_4_date > SYSDATE - 30 THEN 'Form 7 Not Yet Due'\r\n"
+ " WHEN f7.form7_date > f34.form3_4_date + INTERVAL '30' DAY THEN 'Form 7 Initiated After 30 Days'\r\n"
+ " WHEN f7.form7_date <= f34.form3_4_date + INTERVAL '30' DAY THEN 'Form 7 Initiated Within 30 Days'\r\n"
+ " ELSE 'Unknown'\r\n"
+ " END AS form7_status\r\n"
+ " FROM (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form3_4_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype IN ('Form 3', 'Form 4')\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f34\r\n"
+ " LEFT JOIN (\r\n"
+ " SELECT form_parentid, MIN(approveddate) AS form7_date\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE formtype = 'Form 7'\r\n"
+ " GROUP BY form_parentid\r\n"
+ " ) f7 ON f34.form_parentid = f7.form_parentid\r\n"
+ " JOIN EGBPA_FORM_RULES@erp a ON a.form_parentid = f34.form_parentid\r\n"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid\r\n"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid\r\n"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = f34.form_parentid\r\n"
+ " WHERE a.id = (\r\n"
+ " SELECT MAX(id)\r\n"
+ " FROM EGBPA_FORM_RULES@erp\r\n"
+ " WHERE form_parentid = a.form_parentid AND formtype IN ('Form 3', 'Form 4')\r\n"
+ " )\r\n"
+ " AND a.formtype IN ('Form 3', 'Form 4')" +
" AND zone.name = ? " +
" AND ward.name = ? " +
") " +
"WHERE form7_status = ? "+
"ORDER BY form7_status, form3_4_date ";
;
return jdbcTemplate.queryForList(sql, zone, ward, status);
}
}

304
src/main/java/com/gcc/commissionerreviewII/service/EnforcementService.java

@ -0,0 +1,304 @@
package com.gcc.commissionerreviewII.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class EnforcementService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("oracleDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getzonewisedetails()
{
String sql="select zone.name zone,\r\n"
+ "sum(case when formtype='Form 1' then 1 else 0 end) form1_recieved,\r\n"
+ "sum(case when formtype='Form 1' and b.value!='END' then 1 else 0 end) form1_inprogress,\r\n"
+ "sum(case when formtype='Form 1' and b.value='END' then 1 else 0 end) form1_completed,\r\n"
+ "sum(case when formtype='Form 2' then 1 else 0 end) form2_recieved,\r\n"
+ "sum(case when formtype='Form 2' and b.value!='END' then 1 else 0 end) form2_inprogress,\r\n"
+ "sum(case when formtype='Form 2' and b.value='END' then 1 else 0 end) form2_completed,\r\n"
+ "sum(case when formtype='Form 3' then 1 else 0 end) form3_recieved,\r\n"
+ "sum(case when formtype='Form 3' and b.value!='END' then 1 else 0 end) form3_inprogress,\r\n"
+ "sum(case when formtype='Form 3' and b.value='END' then 1 else 0 end) form3_completed,\r\n"
+ "sum(case when formtype='Form 4' then 1 else 0 end) form4_recieved,\r\n"
+ "sum(case when formtype='Form 4' and b.value!='END' then 1 else 0 end) form4_inprogress,\r\n"
+ "sum(case when formtype='Form 4' and b.value='END' then 1 else 0 end) form4_completed,\r\n"
+ "sum(case when formtype='Form 5' then 1 else 0 end) form5_recieved,\r\n"
+ "sum(case when formtype='Form 5' and b.value!='END' then 1 else 0 end) form5_inprogress,\r\n"
+ "sum(case when formtype='Form 5' and b.value='END' then 1 else 0 end) form5_completed,\r\n"
+ "sum(case when formtype='Form 6' then 1 else 0 end) form6_recieved,\r\n"
+ "sum(case when formtype='Form 6' and b.value!='END' then 1 else 0 end) form6_inprogress,\r\n"
+ "sum(case when formtype='Form 6' and b.value='END' then 1 else 0 end) form6_completed,\r\n"
+ "sum(case when formtype='Form 7' then 1 else 0 end) form7_recieved,\r\n"
+ "sum(case when formtype='Form 7' and b.value!='END' then 1 else 0 end) form7_inprogress,\r\n"
+ "sum(case when formtype='Form 7' and b.value='END' then 1 else 0 end) form7_completed\r\n"
+ "from EGBPA_FORM_RULES@erp a,eg_wf_states@erp b,eg_boundary@erp zone\r\n"
+ "where a.state_id=b.id and zone.id_bndry=a.zoneid and\r\n"
+ " a.id = (SELECT MAX(id) FROM EGBPA_FORM_RULES@erp WHERE form_parentid = a.form_parentid)\r\n"
+ "group by zone.name order by name";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getwardwisedetails(String zone)
{
String sql="select zone.name zone,ward.name ward,\r\n"
+ "sum(case when formtype='Form 1' then 1 else 0 end) form1_recieved,\r\n"
+ "sum(case when formtype='Form 1' and b.value!='END' then 1 else 0 end) form1_inprogress,\r\n"
+ "sum(case when formtype='Form 1' and b.value='END' then 1 else 0 end) form1_completed,\r\n"
+ "sum(case when formtype='Form 2' then 1 else 0 end) form2_recieved,\r\n"
+ "sum(case when formtype='Form 2' and b.value!='END' then 1 else 0 end) form2_inprogress,\r\n"
+ "sum(case when formtype='Form 2' and b.value='END' then 1 else 0 end) form2_completed,\r\n"
+ "sum(case when formtype='Form 3' then 1 else 0 end) form3_recieved,\r\n"
+ "sum(case when formtype='Form 3' and b.value!='END' then 1 else 0 end) form3_inprogress,\r\n"
+ "sum(case when formtype='Form 3' and b.value='END' then 1 else 0 end) form3_completed,\r\n"
+ "sum(case when formtype='Form 4' then 1 else 0 end) form4_recieved,\r\n"
+ "sum(case when formtype='Form 4' and b.value!='END' then 1 else 0 end) form4_inprogress,\r\n"
+ "sum(case when formtype='Form 4' and b.value='END' then 1 else 0 end) form4_completed,\r\n"
+ "sum(case when formtype='Form 5' then 1 else 0 end) form5_recieved,\r\n"
+ "sum(case when formtype='Form 5' and b.value!='END' then 1 else 0 end) form5_inprogress,\r\n"
+ "sum(case when formtype='Form 5' and b.value='END' then 1 else 0 end) form5_completed,\r\n"
+ "sum(case when formtype='Form 6' then 1 else 0 end) form6_recieved,\r\n"
+ "sum(case when formtype='Form 6' and b.value!='END' then 1 else 0 end) form6_inprogress,\r\n"
+ "sum(case when formtype='Form 6' and b.value='END' then 1 else 0 end) form6_completed,\r\n"
+ "sum(case when formtype='Form 7' then 1 else 0 end) form7_recieved,\r\n"
+ "sum(case when formtype='Form 7' and b.value!='END' then 1 else 0 end) form7_inprogress,\r\n"
+ "sum(case when formtype='Form 7' and b.value='END' then 1 else 0 end) form7_completed\r\n"
+ "from EGBPA_FORM_RULES@erp a,eg_wf_states@erp b,eg_boundary@erp zone,eg_boundary@erp ward\r\n"
+ "where a.state_id=b.id and zone.id_bndry=a.zoneid and ward.id_bndry=a.wardid and\r\n"
+ " a.id = (SELECT MAX(id) FROM EGBPA_FORM_RULES@erp WHERE form_parentid = a.form_parentid) and zone.name=? \r\n"
+ "group by zone.name,ward.name order by zone.name,ward.name";
return jdbcTemplate.queryForList(sql,zone);
}
public List<Map<String, Object>> getformdetailswithzone(String zone, String ward, String formtype, String status) {
String sql="";
List<Map<String, Object>> result = new ArrayList<>();;
if("Received".equalsIgnoreCase(status)) {
sql="SELECT "
+ " zone.name zone,ward.name ward,"
+ " addr.applicant_name,"
+ " addr.formid,"
+ " addr.area,"
+ " addr.address,"
+ " addr.pincode "
+ "FROM"
+ " EGBPA_FORM_RULES@erp a"
+ " JOIN eg_wf_states@erp b ON a.state_id = b.id"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = a.form_parentid "
+ "WHERE"
+ " a.id = ("
+ " SELECT MAX(id)"
+ " FROM EGBPA_FORM_RULES@erp"
+ " WHERE form_parentid = a.form_parentid"
+ " )"
+ " AND a.formtype = ? "
+ " AND zone.name = ? "
+ " AND ward.name = ? ";
result = jdbcTemplate.queryForList(sql, formtype, zone, ward);
}
if("Inprogress".equalsIgnoreCase(status)) {
sql="SELECT"
+ " zone.name zone,ward.name ward,"
+ " addr.applicant_name,"
+ " addr.formid,"
+ " addr.area,"
+ " addr.address,"
+ " addr.pincode "
+ "FROM"
+ " EGBPA_FORM_RULES@erp a"
+ " JOIN eg_wf_states@erp b ON a.state_id = b.id"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = a.form_parentid"
+ " WHERE"
+ " a.id = ("
+ " SELECT MAX(id)"
+ " FROM EGBPA_FORM_RULES@erp"
+ " WHERE form_parentid = a.form_parentid"
+ " )"
+ " AND a.formtype = ?"
+ " AND zone.name = ?"
+ " AND ward.name = ?"
+ " and formtype=? and b.value!='END'";
result=jdbcTemplate.queryForList(sql,formtype,zone,ward,formtype);
}
if("Completed".equalsIgnoreCase(status)) {
sql="SELECT"
+ " zone.name zone,ward.name ward,"
+ " addr.applicant_name,"
+ " addr.formid,"
+ " addr.area,"
+ " addr.address,"
+ " addr.pincode "
+ "FROM "
+ " EGBPA_FORM_RULES@erp a"
+ " JOIN eg_wf_states@erp b ON a.state_id = b.id"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = a.form_parentid "
+ "WHERE"
+ " a.id = ("
+ " SELECT MAX(id)"
+ " FROM EGBPA_FORM_RULES@erp"
+ " WHERE form_parentid = a.form_parentid"
+ " )"
+ " AND a.formtype = ? "
+ " AND zone.name = ? "
+ " AND ward.name = ? "
+ " and formtype=? and b.value='END'";
result=jdbcTemplate.queryForList(sql,formtype,zone,ward,formtype);
}
return result;
}
public List<Map<String, Object>> getformiddetails(String formid) {
String sql="SELECT"
+ " m.ENCLOSEMENTNAME,"
+ " TO_CHAR(f.CREATEDDATE, 'YYYY/MM/DD HH24:MI') || ' 00:00:00.0' AS cdate,"
+ " 'https://erp.chennaicorporation.gov.in/bpa/search/registrationForm!viewFile.action?formParentId=' || d.FORMID ||"
+ " CHR(38) || 'fileName=' || d.DOCNAME ||"
+ " CHR(38) || 'contentType=' || d.DOCTYPE ||"
+ " CHR(38) || 'fileCreatedDate=' || TO_CHAR(f.CREATEDDATE, 'YYYY-MM-DD') || ' 00:00:00.0' AS fileUrl"
+ " FROM"
+ " EGBPA_FORM_ENCLOSEMENT_DET@erp d "
+ "INNER JOIN "
+ " EGBPA_FORM_ENCLOSEMENT@erp m ON d.TYPEID = m.ID "
+ "INNER JOIN"
+ " EGBPA_FORM_RULES@erp f ON f.ID = d.APPID "
+ "WHERE"
+ " d.FORMID = ? "
+ "ORDER BY"
+ " m.FORMTYPE DESC";
return jdbcTemplate.queryForList(sql,formid);
}
public List<Map<String, Object>> getformdetailswithoutward(String zone, String formtype, String status) {
String sql="";
List<Map<String, Object>> result = new ArrayList<>();;
if("Received".equalsIgnoreCase(status)) {
sql="SELECT "
+ " zone.name zone,ward.name ward,"
+ " addr.applicant_name,"
+ " addr.formid,"
+ " addr.area,"
+ " addr.address,"
+ " addr.pincode "
+ "FROM"
+ " EGBPA_FORM_RULES@erp a"
+ " JOIN eg_wf_states@erp b ON a.state_id = b.id"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = a.form_parentid "
+ "WHERE"
+ " a.id = ("
+ " SELECT MAX(id)"
+ " FROM EGBPA_FORM_RULES@erp"
+ " WHERE form_parentid = a.form_parentid"
+ " )"
+ " AND a.formtype = ? "
+ " AND zone.name = ? "
+" ORDER BY ward.name";
result = jdbcTemplate.queryForList(sql, formtype, zone);
}
if("Inprogress".equalsIgnoreCase(status)) {
sql="SELECT"
+ " zone.name zone,ward.name ward,"
+ " addr.applicant_name,"
+ " addr.formid,"
+ " addr.area,"
+ " addr.address,"
+ " addr.pincode, "
+ "FROM"
+ " EGBPA_FORM_RULES@erp a"
+ " JOIN eg_wf_states@erp b ON a.state_id = b.id"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = a.form_parentid"
+ " WHERE"
+ " a.id = ("
+ " SELECT MAX(id)"
+ " FROM EGBPA_FORM_RULES@erp"
+ " WHERE form_parentid = a.form_parentid"
+ " )"
+ " AND a.formtype = ?"
+ " AND zone.name = ?"
+ " and formtype=? and b.value!='END'"
+" ORDER BY ward.name";
result=jdbcTemplate.queryForList(sql,formtype,zone,formtype);
}
if("Completed".equalsIgnoreCase(status)) {
sql="SELECT"
+ " zone.name zone,ward.name ward,"
+ " addr.applicant_name,"
+ " addr.formid,"
+ " addr.area,"
+ " addr.address,"
+ " addr.pincode, "
+ "'https://erp.chennaicorporation.gov.in/bpa/search/registrationForm!printRule.action?appId='||id as notice_url"
+ " FROM "
+ " EGBPA_FORM_RULES@erp a"
+ " JOIN eg_wf_states@erp b ON a.state_id = b.id"
+ " JOIN eg_boundary@erp zone ON zone.id_bndry = a.zoneid"
+ " JOIN eg_boundary@erp ward ON ward.id_bndry = a.wardid"
+ " LEFT JOIN EGBPA_ENF_APP_ADDRESS@erp addr ON addr.formid = a.form_parentid "
+ "WHERE"
+ " a.id = ("
+ " SELECT MAX(id)"
+ " FROM EGBPA_FORM_RULES@erp"
+ " WHERE form_parentid = a.form_parentid"
+ " )"
+ " AND a.formtype = ? "
+ " AND zone.name = ? "
+ " and formtype=? and b.value='END'"
+" ORDER BY ward.name";
result=jdbcTemplate.queryForList(sql,formtype,zone,formtype);
}
return result;
}
}

621
src/main/java/com/gcc/commissionerreviewII/service/SofaBedCollectionService.java

@ -0,0 +1,621 @@
package com.gcc.commissionerreviewII.service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@Service
public class SofaBedCollectionService {
@Autowired
@Qualifier("jdbcDomesticWasteTemplate")
private JdbcTemplate jdbcDomesticWasteTemplate;
public Map<String, Object> getzonewisedetails() {
Map<String, Object> response = new HashMap<>();
try {
// Formatter for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// Fixed start date
String formattedStartDate = "03-10-2025";
// Current date as end date
String formattedEndDate = LocalDate.now().format(outputFormat);
String apiUrl ="https://gccservices.in/gccofficialapp/api/domesticwaste/getZoneReport?fromDate="+formattedStartDate+"&toDate="+formattedEndDate;
System.out.println("apiUrl=" + apiUrl);
// Call the external API
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> apiResponse = restTemplate.getForEntity(apiUrl, String.class);
if (apiResponse.getStatusCode().is2xxSuccessful() && apiResponse.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
// Parse full JSON
JsonNode rootNode = mapper.readTree(apiResponse.getBody());
if (rootNode.isArray() && rootNode.size() > 0) {
JsonNode firstObject = rootNode.get(0); // Get first object
JsonNode reportNode = firstObject.path("data");
if (reportNode.isMissingNode() || !reportNode.isArray() || reportNode.size() == 0) {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
} else {
// Convert JSON array → List<Map<String, Object>>
List<Map<String, Object>> reportList = mapper.convertValue(
reportNode,
new TypeReference<List<Map<String, Object>>>() {}
);
response.put("status", "success");
response.put("data", reportList);
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
public Map<String, Object> getwarddetails(String zone) {
Map<String, Object> response = new HashMap<>();
try {
// Formatter for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// Fixed start date
String formattedStartDate = "03-10-2025";
// Current date as end date
String formattedEndDate = LocalDate.now().format(outputFormat);
String apiUrl ="https://gccservices.in/gccofficialapp/api/domesticwaste/getWardReport?fromDate="+formattedStartDate+"&toDate="+formattedEndDate+"&zone="+zone;
System.out.println("apiUrl=" + apiUrl);
// Call the external API
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> apiResponse = restTemplate.getForEntity(apiUrl, String.class);
if (apiResponse.getStatusCode().is2xxSuccessful() && apiResponse.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
// Parse full JSON
JsonNode rootNode = mapper.readTree(apiResponse.getBody());
if (rootNode.isArray() && rootNode.size() > 0) {
JsonNode firstObject = rootNode.get(0); // Get first object
JsonNode reportNode = firstObject.path("data");
if (reportNode.isMissingNode() || !reportNode.isArray() || reportNode.size() == 0) {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
} else {
// Convert JSON array → List<Map<String, Object>>
List<Map<String, Object>> reportList = mapper.convertValue(
reportNode,
new TypeReference<List<Map<String, Object>>>() {}
);
response.put("status", "success");
response.put("data", reportList);
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
public Map<String, Object> getwardstatusdetails(String ward, String status) {
Map<String, Object> response = new HashMap<>();
try {
// Formatter for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// Fixed start date
String formattedStartDate = "03-10-2025";
// Current date as end date
String formattedEndDate = LocalDate.now().format(outputFormat);
String apiUrl="https://gccservices.in/gccofficialapp/api/domesticwaste/getWardStatusDetails?fromDate="+formattedStartDate+"&toDate="+formattedEndDate+"&ward="+ward+"&status="+status;
System.out.println("apiUrl=" + apiUrl);
// Call the external API
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> apiResponse = restTemplate.getForEntity(apiUrl, String.class);
if (apiResponse.getStatusCode().is2xxSuccessful() && apiResponse.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
// Parse full JSON
JsonNode rootNode = mapper.readTree(apiResponse.getBody());
if (rootNode.isArray() && rootNode.size() > 0) {
JsonNode firstObject = rootNode.get(0); // Get first object
JsonNode reportNode = firstObject.path("data");
if (reportNode.isMissingNode() || !reportNode.isArray() || reportNode.size() == 0) {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
} else {
// Convert JSON array → List<Map<String, Object>>
List<Map<String, Object>> reportList = mapper.convertValue(
reportNode,
new TypeReference<List<Map<String, Object>>>() {}
);
response.put("status", "success");
response.put("data", reportList);
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
//yogi
@Transactional(readOnly = true)
public List<Map<String, Object>> getZoneReport() {
String sql = """
WITH date_limits AS (
SELECT
DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY) AS week_start,
DATE_ADD(DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY), INTERVAL 7 DAY) AS week_end
)
SELECT
COALESCE(ur.zone, 'TOTAL') AS zone,
COUNT(*) AS total_request,
-- Requests created this week
SUM(CASE WHEN ur.cdate >= d.week_start AND ur.cdate < d.week_end THEN 1 ELSE 0 END) AS this_week_requests,
-- Older requests
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END) AS older_requests,
-- Status-based counts
SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed,
SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel,
SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel,
-- Pending = older_requests - (completed + cancels)
(
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END)
- SUM(CASE WHEN ur.status IN (2,4,5) THEN 1 ELSE 0 END)
) AS pending
FROM
user_request_table ur
CROSS JOIN date_limits d
WHERE
ur.is_active = 1
AND ur.is_delete = 0
GROUP BY
ur.zone WITH ROLLUP
ORDER BY
CASE WHEN ur.zone IS NULL THEN 999 ELSE ur.zone END;
""";
List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql);
Map<String, Object> response = new LinkedHashMap<>();
response.put("status", "Success");
response.put("message", "Zone-wise Report (All Dates)");
response.put("data", reportList);
return Collections.singletonList(response);
}
// @Transactional
// public List<Map<String, Object>> getZoneReport(String fromDate, String toDate) {
// String sql = """
// WITH date_limits AS (
// SELECT
// STR_TO_DATE(?, '%d-%m-%Y') AS start_date,
// STR_TO_DATE(?, '%d-%m-%Y') AS end_date,
// DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY) AS week_start,
// DATE_ADD(DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY), INTERVAL 7 DAY) AS week_end
// )
// SELECT
// COALESCE(ur.zone, 'TOTAL') AS zone,
// COUNT(*) AS total_request,
// -- Requests created this week
// SUM(CASE WHEN ur.cdate >= d.week_start AND ur.cdate < d.week_end THEN 1 ELSE 0 END) AS this_week_requests,
// -- Older requests
// SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END) AS older_requests,
// -- Status-based counts
// SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed,
// SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel,
// SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel,
// -- Pending = older_requests - (completed + cancels)
// (
// SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END)
// - SUM(CASE WHEN ur.status IN (2,4,5) THEN 1 ELSE 0 END)
// ) AS pending
// FROM
// user_request_table ur
// CROSS JOIN date_limits d
// WHERE
// ur.is_active = 1
// AND ur.is_delete = 0
// AND ur.cdate BETWEEN d.start_date AND d.end_date
// GROUP BY
// ur.zone WITH ROLLUP
// ORDER BY
// CASE WHEN ur.zone IS NULL THEN 999 ELSE ur.zone END;
// """;
// List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, fromDate, toDate);
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "Success");
// response.put("message", "Zone-wise Report");
// response.put("data", reportList);
// return Collections.singletonList(response);
// }
// @Transactional(readOnly = true)
// public List<Map<String, Object>> getWardReport(String fromDate, String toDate, String zone) {
// String sql =
// "("
// + " SELECT "
// + " ur.division AS division, "
// + " COUNT(*) AS total_request, "
// + " SUM(CASE WHEN ur.status = 1 THEN 1 ELSE 0 END) AS open, "
// + " SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed, "
// + " SUM(CASE WHEN ur.status = 3 THEN 1 ELSE 0 END) AS pending, "
// + " SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel, "
// + " SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel "
// + " FROM user_request_table ur "
// + " WHERE ur.is_active = 1 AND ur.is_delete = 0 AND ur.zone = ? "
// + " GROUP BY ur.division "
// + ") "
// + "UNION ALL "
// + "("
// + " SELECT "
// + " 'TOTAL' AS division, "
// + " COUNT(*) AS total_request, "
// + " SUM(CASE WHEN ur.status = 1 THEN 1 ELSE 0 END) AS open, "
// + " SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed, "
// + " SUM(CASE WHEN ur.status = 3 THEN 1 ELSE 0 END) AS pending, "
// + " SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel, "
// + " SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel "
// + " FROM user_request_table ur "
// + " WHERE ur.is_active = 1 AND ur.is_delete = 0 AND ur.zone = ? "
// + ") "
// + "ORDER BY "
// + " CASE WHEN division = 'TOTAL' THEN 999 ELSE CAST(division AS UNSIGNED) END";
// List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, zone, zone);
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "Success");
// response.put("message", "Ward-wise Report");
// response.put("data", reportList);
// return Collections.singletonList(response);
// }
@Transactional(readOnly = true)
public List<Map<String, Object>> getWardReport(String zone) {
String sql = """
WITH date_limits AS (
SELECT
DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY) AS week_start,
DATE_ADD(DATE_SUB(CURDATE(), INTERVAL (DAYOFWEEK(CURDATE()) - 1) DAY), INTERVAL 7 DAY) AS week_end
)
SELECT
COALESCE(ur.division, 'TOTAL') AS division,
COUNT(*) AS total_request,
-- Requests created this week
SUM(CASE WHEN ur.cdate >= d.week_start AND ur.cdate < d.week_end THEN 1 ELSE 0 END) AS this_week_requests,
-- Older requests
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END) AS older_requests,
-- Status-based counts
SUM(CASE WHEN ur.status = 2 THEN 1 ELSE 0 END) AS completed,
SUM(CASE WHEN ur.status = 4 THEN 1 ELSE 0 END) AS user_cancel,
SUM(CASE WHEN ur.status = 5 THEN 1 ELSE 0 END) AS officer_cancel,
-- Pending = older_requests - (completed + cancels)
(
SUM(CASE WHEN ur.cdate < d.week_start THEN 1 ELSE 0 END)
- SUM(CASE WHEN ur.status IN (2,4,5) THEN 1 ELSE 0 END)
) AS pending
FROM
user_request_table ur
CROSS JOIN date_limits d
WHERE
ur.is_active = 1
AND ur.is_delete = 0
AND ur.zone = ?
GROUP BY
ur.division WITH ROLLUP
ORDER BY
CASE WHEN ur.division IS NULL THEN 999 ELSE CAST(ur.division AS UNSIGNED) END;
""";
List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, zone);
Map<String, Object> response = new LinkedHashMap<>();
response.put("status", "Success");
response.put("message", "Ward-wise Report with Weekly and Pending Breakdown");
response.put("data", reportList);
return Collections.singletonList(response);
}
// @Transactional(readOnly = true)
// public List<Map<String, Object>> getWardStatusDetails(
// String fromDate, String toDate,
// String ward, String status) {
// // ✅ Base URL for images
// String fileBaseUrl = "https://gccservices.in"; // or your configured value
// // ✅ SQL query with ward + status filters
// String sql =
// "SELECT " +
// " u.id, u.request_id, u.user_name, u.mobile, u.address, " +
// " u.latitude, u.longitude, u.zone, u.division, u.street_name, " +
// " u.quantity AS main_quantity, u.remarks, " +
// " CONCAT('" + fileBaseUrl + "/gccofficialapp/files', u.image_url) AS image_url, " +
// " DATE_FORMAT(u.cdate, '%d-%m-%Y') AS cdate, " +
// " sm.status_master AS status, " +
// " DATE_FORMAT(u.close_date, '%d-%m-%Y') AS close_date, " +
// " CONCAT('" + fileBaseUrl + "/gccofficialapp/files', u.officer_upload_url) AS officer_upload_url, " +
// " im.item_name, itm.quantity " +
// "FROM user_request_table u " +
// "LEFT JOIN items itm ON u.id = itm.req_table_id " +
// "LEFT JOIN item_master im ON itm.iteam_id = im.id AND im.is_active = 1 " +
// "LEFT JOIN status_master sm ON sm.id = u.status AND sm.is_active = 1 AND sm.is_delete = 0 " +
// "WHERE u.is_active = 1 AND u.is_delete = 0 " +
// " AND u.division = ? " +
// " AND u.status = ? " +
// "ORDER BY u.cdate DESC";
// // ✅ Execute query
// List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(sql, ward, status);
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "Success");
// response.put("message", "Ward-status-wise - Report");
// response.put("data", reportList);
// return Collections.singletonList(response);
// //return groupRequestsWithItems(reportList);
// }
@Transactional(readOnly = true)
public List<Map<String, Object>> getWardStatusDetails(String ward, String status) {
// ✅ Base URL for images (you can move to application.properties later)
String fileBaseUrl = "https://gccservices.in";
// ✅ SQL query using only ward + status
String sql = """
SELECT
u.id,
u.request_id,
u.user_name,
u.mobile,
u.address,
u.latitude,
u.longitude,
u.zone,
u.division,
u.street_name,
u.quantity AS main_quantity,
u.remarks,
CONCAT(?, u.image_url) AS image_url,
DATE_FORMAT(u.cdate, '%d-%m-%Y') AS cdate,
sm.status_master AS status,
DATE_FORMAT(u.close_date, '%d-%m-%Y') AS close_date,
CONCAT(?, u.officer_upload_url) AS officer_upload_url,
itm.iteam_id,
im.item_name,
itm.quantity
FROM user_request_table u
LEFT JOIN items itm ON u.id = itm.req_table_id
LEFT JOIN item_master im ON itm.iteam_id = im.id AND im.is_active = 1
LEFT JOIN status_master sm ON sm.id = u.status AND sm.is_active = 1 AND sm.is_delete = 0
WHERE
u.is_active = 1
AND u.is_delete = 0
AND u.division = ?
AND u.status = ?
ORDER BY u.cdate DESC
""";
// ✅ Execute query
List<Map<String, Object>> reportList = jdbcDomesticWasteTemplate.queryForList(
sql,
fileBaseUrl + "/gccofficialapp/files",
fileBaseUrl + "/gccofficialapp/files",
ward,
status
);
Map<Integer, Map<String, Object>> groupedMap = new LinkedHashMap<>();
for (Map<String, Object> row : reportList) {
Integer id = (Integer) row.get("id");
Map<String, Object> item = null;
if (row.get("item_name") != null) {
item = new LinkedHashMap<>();
item.put("item_name", row.get("item_name"));
item.put("quantity", row.get("quantity"));
}
if (groupedMap.containsKey(id)) {
if (item != null) {
((List<Map<String, Object>>) groupedMap.get(id).get("items")).add(item);
}
} else {
Map<String, Object> newEntry = new LinkedHashMap<>();
newEntry.put("id", id);
newEntry.put("request_id", row.get("request_id"));
newEntry.put("user_name", row.get("user_name"));
newEntry.put("mobile", row.get("mobile"));
newEntry.put("address", row.get("address"));
newEntry.put("latitude", row.get("latitude"));
newEntry.put("longitude", row.get("longitude"));
newEntry.put("zone", row.get("zone"));
newEntry.put("division", row.get("division"));
newEntry.put("street_name", row.get("street_name"));
newEntry.put("main_quantity", row.get("main_quantity"));
newEntry.put("remarks", row.get("remarks"));
newEntry.put("image_url", row.get("image_url"));
newEntry.put("cdate", row.get("cdate"));
newEntry.put("is_active", row.get("is_active"));
newEntry.put("is_delete", row.get("is_delete"));
newEntry.put("street_id", row.get("street_id"));
newEntry.put("status", row.get("status")); // Now this is human-readable
newEntry.put("is_app", row.get("is_app"));
newEntry.put("close_date", row.get("close_date"));
newEntry.put("officer_upload_url", row.get("officer_upload_url"));
List<Map<String, Object>> items = new ArrayList<>();
if (item != null) {
items.add(item);
}
newEntry.put("items", items);
groupedMap.put(id, newEntry);
}
}
// ✅ Wrap response
Map<String, Object> response = new LinkedHashMap<>();
response.put("status", "Success");
response.put("message", "Ward-status-wise Report");
response.put("data", groupedMap.values());
return Collections.singletonList(response);
}
}

3
src/main/resources/application.properties

@ -0,0 +1,3 @@
spring.application.name=commissionerreviewII
server.port=8075

919
src/main/resources/templates/modules/enforcement/Zonewise.html

@ -0,0 +1,919 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Enforcement Zonewise Report Summary</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- DataTables CSS -->
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet"/>
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet"/>
<style>
table.dataTable th, table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th{
background-color: #003366 !important;
color: white;
}
.dataTables_wrapper .dt-buttons {
margin-bottom: 10px;
}
.dataTables_filter {
margin-bottom: 25px; /* adjust as needed */
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
}
#zoneDetailsTable_wrapper .dataTables_scrollBody {
border: none !important;
}
#zoneDetailsTable td, #zoneDetailsTable th {
vertical-align: middle;
text-align: center;
white-space: nowrap;
}
</style>
</head>
<body>
<div class="page-header-title">
<h4>Enforcement - Zonewise Report</h4>
</div>
<div id="opSummaryTable" style="display: block;" class="container">
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th rowspan="2" class="text-center">ZONE</th>
<th colspan="3" class="text-center">NOTICE 1</th>
<th colspan="3" class="text-center">NOTICE 2</th>
<th colspan="3" class="text-center">NOTICE 3</th>
<th colspan="3" class="text-center">NOTICE 4</th>
<th colspan="3" class="text-center">NOTICE 5</th>
<th colspan="3" class="text-center">NOTICE 6</th>
<th colspan="3" class="text-center">NOTICE 7</th>
</tr>
<tr>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<div class="modal fade" id="zoneDetailsModal" tabindex="-1" aria-labelledby="zoneDetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="zoneModalTitle">Zone Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="WardDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th rowspan="2" class="text-center">WARD</th>
<th colspan="3" class="text-center">NOTICE 1</th>
<th colspan="3" class="text-center">NOTICE 2</th>
<th colspan="3" class="text-center">NOTICE 3</th>
<th colspan="3" class="text-center">NOTICE 4</th>
<th colspan="3" class="text-center">NOTICE 5</th>
<th colspan="3" class="text-center">NOTICE 6</th>
<th colspan="3" class="text-center">NOTICE 7</th>
</tr>
<tr>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
<th class="text-center">Generated </th>
<th class="text-center">Inprogress</th>
<th class="text-center">Issued </th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="DetailsModal" tabindex="-1" aria-labelledby="DetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="DeatilsModalTitle">Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="DetailsDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ZONE</th>
<th class="text-center">WARD</th>
<th class="text-center">APPLICANT NAME</th>
<th class="text-center">ADDRESS</th>
<th class="text-center">AREA</th>
<th class="text-center">PINCODE</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="ApplicantDetailsModal" tabindex="-1" aria-labelledby="ApplicantDetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Enforcement Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="FormDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ENCLOSEMENT NAME</th>
<th class="text-center">DATE</th>
<th class="text-center">FILE URL</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="pageLoader" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p>
</div>
</div>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function () {
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/enforcement/getZoneWiseDetails',
method: 'GET',
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array:", response);
let table = $('#ZoneOpDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{
data: 'ZONE',
title: 'Zone',
render: function (data, type, row, meta) {
const serial = meta.row + 1;
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${serial}</a>`;
}
},
...[
'FORM1_RECIEVED', 'FORM1_INPROGRESS', 'FORM1_COMPLETED',
'FORM2_RECIEVED', 'FORM2_INPROGRESS', 'FORM2_COMPLETED',
'FORM3_RECIEVED', 'FORM3_INPROGRESS', 'FORM3_COMPLETED',
'FORM4_RECIEVED', 'FORM4_INPROGRESS', 'FORM4_COMPLETED',
'FORM5_RECIEVED', 'FORM5_INPROGRESS', 'FORM5_COMPLETED',
'FORM6_RECIEVED', 'FORM6_INPROGRESS', 'FORM6_COMPLETED',
'FORM7_RECIEVED', 'FORM7_INPROGRESS', 'FORM7_COMPLETED'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('zoneclickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: 'auto',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
const formTypeMap1 = {
1: "Form 1", 2: "Form 1", 3: "Form 1",
4: "Form 2", 5: "Form 2", 6: "Form 2",
7: "Form 3", 8: "Form 3", 9: "Form 3",
10: "Form 4",11: "Form 4",12: "Form 4",
13: "Form 5",14: "Form 5",15: "Form 5",
16: "Form 6",17: "Form 6",18: "Form 6",
19: "Form 7",20: "Form 7",21: "Form 7"
};
const statusMap1 = {
0: "Received", 1: "Inprogress", 2: "Completed"
};
// Add click listener on table body cells
$('#ZoneOpDatatable tbody').off('click').on('click', 'td.zoneclickable-cell', function () {
$('#pageLoader').show();
const table1 = $('#ZoneOpDatatable').DataTable();
const cellIndex1 = table1.cell(this).index(); // { row: x, column: y }
const columnIndex1 = cellIndex1.column;
// Ignore clicks on the first column (WARD)
if (columnIndex1 === 0) return;
const rowData1 = table1.row(cellIndex1.row).data();
const zone1 = rowData1['ZONE'];
// Calculate form type and status
const formType1 = formTypeMap1[columnIndex1];
const positionInSet1 = (columnIndex1 - 1) % 3; // 0,1,2 for each formtype
const status1 = statusMap1[positionInSet1];
console.log("Clicked on -> Zone:", zone1, "| FormType:", formType1, "| Status:", status1);
openZoneDetails(zone1,formType1,status1);
});
}
else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
// alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
$('#DetailsDatatable tbody').off('click').on('click', '.applicant-name', function () {
const formId = $(this).data('formid');
openApplicantModal(formId);
});
});
function openZoneDetails(zone1,formType1,status1){
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/enforcement/getFormDetailsWithoutWard',
method: 'GET',
data: {
zone: zone1,
formtype: formType1,
status: status1
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0){
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{ data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME',
render: function (data, type, row) {
return `<span class="applicant-name" data-formid="${row.FORMID}" style="color: blue; text-decoration: underline; cursor: pointer;">${data}</span>`;
}
},
{ data: 'AREA' },
{ data: 'ADDRESS' },
{ data: 'PINCODE' },
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement '+status1 +' Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openZoneModal(zoneCode) {
console.log("Opening modal for zone:", zoneCode);
$('#pageLoader').show();
// Set data in modal (example)
$('#zoneModalTitle').text('Zone ' + zoneCode.replace("N", "") + ' Enforcement Details');
$.ajax({
url: '/commissionerreview/api/enforcement/getWardWiseDetails',
method: 'GET',
data:{zone:zoneCode},
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array:", response);
let table = $('#WardDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{
data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
...[
'FORM1_RECIEVED', 'FORM1_INPROGRESS', 'FORM1_COMPLETED',
'FORM2_RECIEVED', 'FORM2_INPROGRESS', 'FORM2_COMPLETED',
'FORM3_RECIEVED', 'FORM3_INPROGRESS', 'FORM3_COMPLETED',
'FORM4_RECIEVED', 'FORM4_INPROGRESS', 'FORM4_COMPLETED',
'FORM5_RECIEVED', 'FORM5_INPROGRESS', 'FORM5_COMPLETED',
'FORM6_RECIEVED', 'FORM6_INPROGRESS', 'FORM6_COMPLETED',
'FORM7_RECIEVED', 'FORM7_INPROGRESS', 'FORM7_COMPLETED'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('clickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#zoneDetailsModal').modal('show');
}
else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
const formTypeMap = {
1: "Form 1", 2: "Form 1", 3: "Form 1",
4: "Form 2", 5: "Form 2", 6: "Form 2",
7: "Form 3", 8: "Form 3", 9: "Form 3",
10: "Form 4",11: "Form 4",12: "Form 4",
13: "Form 5",14: "Form 5",15: "Form 5",
16: "Form 6",17: "Form 6",18: "Form 6",
19: "Form 7",20: "Form 7",21: "Form 7"
};
const statusMap = {
0: "Received", 1: "Inprogress", 2: "Completed"
};
// Add click listener on table body cells
$('#WardDatatable tbody').off('click').on('click', 'td.clickable-cell', function () {
$('#pageLoader').show();
const table = $('#WardDatatable').DataTable();
const cellIndex = table.cell(this).index(); // { row: x, column: y }
const columnIndex = cellIndex.column;
// Ignore clicks on the first column (WARD)
if (columnIndex === 0) return;
const rowData = table.row(cellIndex.row).data();
const ward = rowData['WARD'];
const zone = zoneCode;
// Calculate form type and status
const formType = formTypeMap[columnIndex];
const positionInSet = (columnIndex - 1) % 3; // 0,1,2 for each formtype
const status = statusMap[positionInSet];
console.log("Clicked on -> Ward:", ward, "| Zone:", zone, "| FormType:", formType, "| Status:", status);
openWardDetails(ward,zone,formType,status);
});
}
function openWardDetails(ward,zone,formType,status){
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/enforcement/getFormDetails',
method: 'GET',
data: {
ward: ward,
zone: zone,
formtype: formType,
status: status
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0){
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{ data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME',
render: function (data, type, row) {
return `<span class="applicant-name" data-formid="${row.FORMID}" style="color: blue; text-decoration: underline; cursor: pointer;">${data}</span>`;
}
},
{ data: 'AREA' },
{ data: 'ADDRESS' },
{ data: 'PINCODE' },
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement '+status +' Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openApplicantModal(formId) {
console.log("Opening modal for FORMID:", formId);
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/enforcement/getFormId',
method: 'GET',
data:{formid:formId},
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array:", response);
let table = $('#FormDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ENCLOSEMENTNAME' },
{
data: 'CDATE',
render: function (data, type, row) {
if (!data) return '';
let parts = data.split(' ')[0].split('/'); // ["2025", "05", "27"]
if (parts.length === 3) {
return `${parts[2]}/${parts[1]}/${parts[0]}`; // 27/05/2025
}
return data; // fallback
}
},
{
data: 'FILEURL',
render: function (data, type, row) {
return `<button class="btn btn-primary btn-sm btn-view" data-url="${data}">View</button>`;
},
className: 'text-center'
},
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#FormDatatable').off('click').on('click', '.btn-view', function () {
var fileUrl = $(this).data('url');
if (fileUrl) {
window.open(fileUrl, '_blank'); // Open in new tab
} else {
Swal.fire({
icon: 'warning',
title: 'Missing File URL',
text: 'No file URL provided.',
showConfirmButton: true
});
}
});
$('#ApplicantDetailsModal').modal('show');
$('#ApplicantDetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
</script>
</body>
</html>

857
src/main/resources/templates/modules/enforcement/form2pendency.html

@ -0,0 +1,857 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Enforcement Zonewise Report Summary</title>
<!-- Bootstrap 5 CSS -->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
rel="stylesheet">
<!-- DataTables CSS -->
<link
href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css"
rel="stylesheet" />
<link
href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css"
rel="stylesheet" />
<style>
table.dataTable th, table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th {
background-color: #003366 !important;
color: white;
}
.dataTables_wrapper .dt-buttons {
margin-bottom: 10px;
}
.dataTables_filter {
margin-bottom: 25px; /* adjust as needed */
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
}
#zoneDetailsTable_wrapper .dataTables_scrollBody {
border: none !important;
}
#zoneDetailsTable td, #zoneDetailsTable th {
vertical-align: middle;
text-align: center;
white-space: nowrap;
}
</style>
</head>
<body>
<div class="page-header-title">
<h4>Pendency - Notice 2 Zonewise Report</h4>
</div>
<div id="opSummaryTable" style="display: block;" class="container">
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ZONE</th>
<th class="text-center">Notice 2 Not Initiated</th>
<th class="text-center">Notice 2 Initiated After 7 Days</th>
<th class="text-center">Notice 2 Initiated Within 7 Days</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="modal fade" id="zoneDetailsModal" tabindex="-1"
aria-labelledby="zoneDetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="zoneModalTitle">Pendency Ward-Wise Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="WardDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">WARD</th>
<th class="text-center">NOTICE 2 NOT INITIATED</th>
<th class="text-center">NOTICE 2 INITIATED
AFTER 7 DAYS</th>
<th class="text-center">NOTICE 2 INITIATED
WITHIN 7 DAYS</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="DetailsModal" tabindex="-1"
aria-labelledby="DetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="DeatilsModalTitle">Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="DetailsDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ZONE</th>
<th class="text-center">WARD</th>
<th class="text-center">APPLICANT NAME</th>
<th class="text-center">ADDRESS</th>
<th class="text-center">AREA</th>
<th class="text-center">PINCODE</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="ApplicantDetailsModal" tabindex="-1"
aria-labelledby="ApplicantDetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Enforcement Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="FormDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ENCLOSEMENT NAME</th>
<th class="text-center">DATE</th>
<th class="text-center">FILE URL</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="pageLoader"
style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div
style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status"
style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please
wait...</p>
</div>
</div>
<!-- Scripts -->
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<script
src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function () {
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/pendency/getZoneWisePendencyDetails',
method: 'GET',
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array:", response);
let table = $('#ZoneOpDatatable').DataTable({
destroy: true,
autoWidth: false,
info: true,
data: response, // using response directly
columns: [
{
data: 'ZONE',
title: 'Zone',
render: function (data, type, row, meta) {
const serial = meta.row + 1;
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${serial}</a>`;
}
},
...[
'Form 2 Not Initiated', 'Form 2 Initiated After 7 Days', 'Form 2 Initiated Within 7 Days'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('zoneclickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: 'auto',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
const formTypeMap1 = {
1: "Form 2 Not Initiated",
2: "Form 2 Initiated After 7 Days",
3: "Form 2 Initiated Within 7 Days"
};
// Add click listener on table body cells
$('#ZoneOpDatatable tbody').off('click').on('click', 'td.zoneclickable-cell', function () {
$('#pageLoader').show();
const table1 = $('#ZoneOpDatatable').DataTable();
const cellIndex1 = table1.cell(this).index(); // { row: x, column: y }
const columnIndex1 = cellIndex1.column;
// Ignore clicks on the first column (WARD)
if (columnIndex1 === 0) return;
const rowData1 = table1.row(cellIndex1.row).data();
const zone1 = rowData1['ZONE'];
// Calculate form type and status
const formType1 = formTypeMap1[columnIndex1];
console.log("Clicked on -> Zone:", zone1, "| FormType:", formType1);
openZoneDetails(zone1,formType1);
});
}
else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
// alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
$('#DetailsDatatable tbody').off('click').on('click', '.applicant-name', function () {
const formId = $(this).data('formid');
openApplicantModal(formId);
});
});
function openZoneDetails(zone,formType){
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/pendency/getPendencyDetailReport',
method: 'GET',
data: {
zone: zone,
status: formType
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0){
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{ data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME'
},
{ data: 'AREA' },
{ data: 'ADDRESS' },
{ data: 'PINCODE' },
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement Pendency Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openZoneModal(zoneCode) {
console.log("Opening modal for zone:", zoneCode);
$('#pageLoader').show();
// Set data in modal (example)
$('#zoneModalTitle').text('Zone ' + zoneCode.replace("N", "") + ' Pendency Details');
$.ajax({
url: '/commissionerreview/api/pendency/getWardWisePendencyDetails',
method: 'GET',
data:{zone:zoneCode},
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array ward:", response);
let table = $('#WardDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{
data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
...[
'Form 2 Not Initiated', 'Form 2 Initiated After 7 Days', 'Form 2 Initiated Within 7 Days'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('clickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#zoneDetailsModal').modal('show');
$('#zoneDetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
const formTypeMap = {
1: "Form 2 Not Initiated",
2: "Form 2 Initiated After 7 Days",
3: "Form 2 Initiated Within 7 Days"
};
// Add click listener on table body cells
$('#WardDatatable tbody').off('click').on('click', 'td.clickable-cell', function () {
$('#pageLoader').show();
const table = $('#WardDatatable').DataTable();
const cellIndex = table.cell(this).index(); // { row: x, column: y }
const columnIndex = cellIndex.column;
// Ignore clicks on the first column (WARD)
if (columnIndex === 0) return;
const rowData = table.row(cellIndex.row).data();
const ward = rowData['WARD'];
const zone = zoneCode;
// Calculate form type and status
const formType = formTypeMap[columnIndex];
console.log("Clicked on -> Ward:", ward, "| Zone:", zone, "| FormType:", formType);
openWardDetails(ward,zone,formType);
});
}
function openWardDetails(ward,zone,formType){
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/pendency/getPendencyDetailReportByWard',
method: 'GET',
data: {
ward: ward,
zone: zone,
status: formType
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0){
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{ data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME'
},
{ data: 'AREA' },
{ data: 'ADDRESS' },
{ data: 'PINCODE' },
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement Pendency Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openApplicantModal(formId) {
console.log("Opening modal for FORMID:", formId);
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/enforcement/getFormId',
method: 'GET',
data:{formid:formId},
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array:", response);
let table = $('#FormDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ENCLOSEMENTNAME' },
{
data: 'CDATE',
render: function (data, type, row) {
if (!data) return '';
let parts = data.split(' ')[0].split('/'); // ["2025", "05", "27"]
if (parts.length === 3) {
return `${parts[2]}/${parts[1]}/${parts[0]}`; // 27/05/2025
}
return data; // fallback
}
},
{
data: 'FILEURL',
render: function (data, type, row) {
return `<button class="btn btn-primary btn-sm btn-view" data-url="${data}">View</button>`;
},
className: 'text-center'
},
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#FormDatatable').off('click').on('click', '.btn-view', function () {
var fileUrl = $(this).data('url');
if (fileUrl) {
window.open(fileUrl, '_blank'); // Open in new tab
} else {
Swal.fire({
icon: 'warning',
title: 'Missing File URL',
text: 'No file URL provided.',
showConfirmButton: true
});
}
});
$('#ApplicantDetailsModal').modal('show');
$('#ApplicantDetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
</script>
</body>
</html>

857
src/main/resources/templates/modules/enforcement/form3Pendency.html

@ -0,0 +1,857 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Enforcement Pendency Zone wise Report Summary</title>
<!-- Bootstrap 5 CSS -->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
rel="stylesheet">
<!-- DataTables CSS -->
<link
href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css"
rel="stylesheet" />
<link
href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css"
rel="stylesheet" />
<style>
table.dataTable th, table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th {
background-color: #003366 !important;
color: white;
}
.dataTables_wrapper .dt-buttons {
margin-bottom: 10px;
}
.dataTables_filter {
margin-bottom: 25px; /* adjust as needed */
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
}
#zoneDetailsTable_wrapper .dataTables_scrollBody {
border: none !important;
}
#zoneDetailsTable td, #zoneDetailsTable th {
vertical-align: middle;
text-align: center;
white-space: nowrap;
}
</style>
</head>
<body>
<div class="page-header-title">
<h4>Pendency - Notice 3 and 4 Zone wise Report</h4>
</div>
<div id="opSummaryTable" style="display: block;" class="container">
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ZONE</th>
<th class="text-center">Notice 3 Not Initiated</th>
<th class="text-center">Notice 3 Initiated After 7 Days</th>
<th class="text-center">Notice 3 Initiated Within 7 Days</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="modal fade" id="zoneDetailsModal" tabindex="-1"
aria-labelledby="zoneDetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="zoneModalTitle">Pendency Ward-Wise Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="WardDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">WARD</th>
<th class="text-center">NOTICE 3 NOT INITIATED</th>
<th class="text-center">NOTICE 3 INITIATED
AFTER 7 DAYS</th>
<th class="text-center">NOTICE 3 INITIATED
WITHIN 7 DAYS</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="DetailsModal" tabindex="-1"
aria-labelledby="DetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="DeatilsModalTitle">Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="DetailsDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ZONE</th>
<th class="text-center">WARD</th>
<th class="text-center">APPLICANT NAME</th>
<th class="text-center">ADDRESS</th>
<th class="text-center">AREA</th>
<th class="text-center">PINCODE</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="ApplicantDetailsModal" tabindex="-1"
aria-labelledby="ApplicantDetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Enforcement Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="FormDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ENCLOSEMENT NAME</th>
<th class="text-center">DATE</th>
<th class="text-center">FILE URL</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="pageLoader"
style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div
style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status"
style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please
wait...</p>
</div>
</div>
<!-- Scripts -->
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<script
src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function () {
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/pendency/getZoneWiseForm3PendencyDetails',
method: 'GET',
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array:", response);
let table = $('#ZoneOpDatatable').DataTable({
destroy: true,
autoWidth: false,
info: true,
data: response, // using response directly
columns: [
{
data: 'ZONE',
title: 'Zone',
render: function (data, type, row, meta) {
const serial = meta.row + 1;
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${serial}</a>`;
}
},
...[
'Not Initiated', 'After 15 Days', 'Within 15 Days'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('zoneclickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: 'auto',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
const formTypeMap1 = {
1: "Form 3/4 Not Initiated",
2: "Form 3/4 Initiated After 15 Days",
3: "Form 3/4 Initiated Within 15 Days"
};
// Add click listener on table body cells
$('#ZoneOpDatatable tbody').off('click').on('click', 'td.zoneclickable-cell', function () {
$('#pageLoader').show();
const table1 = $('#ZoneOpDatatable').DataTable();
const cellIndex1 = table1.cell(this).index(); // { row: x, column: y }
const columnIndex1 = cellIndex1.column;
// Ignore clicks on the first column (WARD)
if (columnIndex1 === 0) return;
const rowData1 = table1.row(cellIndex1.row).data();
const zone1 = rowData1['ZONE'];
// Calculate form type and status
const formType1 = formTypeMap1[columnIndex1];
console.log("Clicked on -> Zone:", zone1, "| FormType:", formType1);
openZoneDetails(zone1,formType1);
});
}
else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
// alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
$('#DetailsDatatable tbody').off('click').on('click', '.applicant-name', function () {
const formId = $(this).data('formid');
openApplicantModal(formId);
});
});
function openZoneDetails(zone,formType){
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/pendency/getForm3PendencyDetailReport',
method: 'GET',
data: {
zone: zone,
status: formType
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0){
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{ data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME'
},
{ data: 'AREA' },
{ data: 'ADDRESS' },
{ data: 'PINCODE' },
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement Form 3 Pendency Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openZoneModal(zoneCode) {
console.log("Opening modal for zone:", zoneCode);
$('#pageLoader').show();
// Set data in modal (example)
$('#zoneModalTitle').text('Zone ' + zoneCode.replace("N", "") + ' Pendency Details');
$.ajax({
url: '/commissionerreview/api/pendency/getWardWiseForm3PendencyDetails',
method: 'GET',
data:{zone:zoneCode},
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array ward:", response);
let table = $('#WardDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{
data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
...[
'Not Initiated', 'After 15 Days', 'Within 15 Days'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('clickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#zoneDetailsModal').modal('show');
$('#zoneDetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
const formTypeMap = {
1: "Form 3/4 Not Initiated",
2: "Form 3/4 Initiated After 15 Days",
3: "Form 3/4 Initiated Within 15 Days"
};
// Add click listener on table body cells
$('#WardDatatable tbody').off('click').on('click', 'td.clickable-cell', function () {
$('#pageLoader').show();
const table = $('#WardDatatable').DataTable();
const cellIndex = table.cell(this).index(); // { row: x, column: y }
const columnIndex = cellIndex.column;
// Ignore clicks on the first column (WARD)
if (columnIndex === 0) return;
const rowData = table.row(cellIndex.row).data();
const ward = rowData['WARD'];
const zone = zoneCode;
// Calculate form type and status
const formType = formTypeMap[columnIndex];
console.log("Clicked on -> Ward:", ward, "| Zone:", zone, "| FormType:", formType);
openWardDetails(ward,zone,formType);
});
}
function openWardDetails(ward,zone,formType){
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/pendency/getForm3PendencyDetailReportByWard',
method: 'GET',
data: {
ward: ward,
zone: zone,
status: formType
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0){
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{ data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME'
},
{ data: 'AREA' },
{ data: 'ADDRESS' },
{ data: 'PINCODE' },
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement Form 3 Pendency Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openApplicantModal(formId) {
console.log("Opening modal for FORMID:", formId);
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/enforcement/getFormId',
method: 'GET',
data:{formid:formId},
success: function(response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0){
console.log("Details Array:", response);
let table = $('#FormDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{ data: 'ENCLOSEMENTNAME' },
{
data: 'CDATE',
render: function (data, type, row) {
if (!data) return '';
let parts = data.split(' ')[0].split('/'); // ["2025", "05", "27"]
if (parts.length === 3) {
return `${parts[2]}/${parts[1]}/${parts[0]}`; // 27/05/2025
}
return data; // fallback
}
},
{
data: 'FILEURL',
render: function (data, type, row) {
return `<button class="btn btn-primary btn-sm btn-view" data-url="${data}">View</button>`;
},
className: 'text-center'
},
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#FormDatatable').off('click').on('click', '.btn-view', function () {
var fileUrl = $(this).data('url');
if (fileUrl) {
window.open(fileUrl, '_blank'); // Open in new tab
} else {
Swal.fire({
icon: 'warning',
title: 'Missing File URL',
text: 'No file URL provided.',
showConfirmButton: true
});
}
});
$('#ApplicantDetailsModal').modal('show');
$('#ApplicantDetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust();
});
}
else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
</script>
</body>
</html>

796
src/main/resources/templates/modules/enforcement/form7pendency.html

@ -0,0 +1,796 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Enforcement Pendency Zone wise Report Summary</title>
<!-- Bootstrap 5 CSS -->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
rel="stylesheet">
<!-- DataTables CSS -->
<link
href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css"
rel="stylesheet"/>
<link
href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css"
rel="stylesheet"/>
<style>
table.dataTable th, table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th {
background-color: #003366 !important;
color: white;
}
.dataTables_wrapper .dt-buttons {
margin-bottom: 10px;
}
.dataTables_filter {
margin-bottom: 25px; /* adjust as needed */
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
}
#zoneDetailsTable_wrapper .dataTables_scrollBody {
border: none !important;
}
#zoneDetailsTable td, #zoneDetailsTable th {
vertical-align: middle;
text-align: center;
white-space: nowrap;
}
</style>
</head>
<body>
<div class="page-header-title">
<h4>Pendency - Notice 7 Zone wise Report</h4>
</div>
<div id="opSummaryTable" style="display: block;" class="container">
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ZONE</th>
<th class="text-center">Notice 7 Not Initiated After 30 Days</th>
<th class="text-center">Notice 7 Initiated After 30 Days</th>
<th class="text-center">Notice 7 Initiated Within 30 Days</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="modal fade" id="zoneDetailsModal" tabindex="-1"
aria-labelledby="zoneDetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="zoneModalTitle">Pendency Ward-Wise Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="WardDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">WARD</th>
<th class="text-center">Notice 7 Not Initiated After 30 Days</th>
<th class="text-center">Notice 7 Initiated After 30 Days</th>
<th class="text-center">Notice 7 Initiated Within 30 Days</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="DetailsModal" tabindex="-1"
aria-labelledby="DetailsLabel" aria-hidden="true">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="DeatilsModalTitle">Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="DetailsDatatable"
class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">ZONE</th>
<th class="text-center">WARD</th>
<th class="text-center">APPLICANT NAME</th>
<th class="text-center">ADDRESS</th>
<th class="text-center">AREA</th>
<th class="text-center">PINCODE</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div id="pageLoader"
style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div
style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status"
style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please
wait...</p>
</div>
</div>
<!-- Scripts -->
<script
src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<script
src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
<script
src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).ready(function () {
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/pendency/getZoneWiseForm7PendencyDetails',
method: 'GET',
success: function (response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0) {
console.log("Details Array:", response);
let table = $('#ZoneOpDatatable').DataTable({
destroy: true,
autoWidth: false,
info: true,
data: response, // using response directly
columns: [
{
data: 'ZONE',
title: 'Zone',
render: function (data, type, row, meta) {
const serial = meta.row + 1;
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${serial}</a>`;
}
},
...[
'F7 Not Initiated After 30 Days', 'F7 Initiated After 30 Days', 'F7 Initiated Within 30 Days'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('zoneclickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: 'auto',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
const formTypeMap1 = {
1: "Form 7 Not Initiated After 30 Days",
2: "Form 7 Initiated After 30 Days",
3: "Form 7 Initiated Within 30 Days"
};
// Add click listener on table body cells
$('#ZoneOpDatatable tbody').off('click').on('click', 'td.zoneclickable-cell', function () {
$('#pageLoader').show();
const table1 = $('#ZoneOpDatatable').DataTable();
const cellIndex1 = table1.cell(this).index(); // { row: x, column: y }
const columnIndex1 = cellIndex1.column;
// Ignore clicks on the first column (WARD)
if (columnIndex1 === 0) return;
const rowData1 = table1.row(cellIndex1.row).data();
const zone1 = rowData1['ZONE'];
// Calculate form type and status
const formType1 = formTypeMap1[columnIndex1];
console.log("Clicked on -> Zone:", zone1, "| FormType:", formType1);
openZoneDetails(zone1, formType1);
});
} else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
} else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
// alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
$('#DetailsDatatable tbody').off('click').on('click', '.applicant-name', function () {
const formId = $(this).data('formid');
openApplicantModal(formId);
});
});
function openZoneDetails(zone, formType) {
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/pendency/getForm7PendencyDetailReportByZone',
method: 'GET',
data: {
zone: zone,
status: formType
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0) {
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{
data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME'
},
{data: 'AREA'},
{data: 'ADDRESS'},
{data: 'PINCODE'},
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement Form 7 Pendency Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({visible: true, api: true}).columns.adjust();
});
} else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
} else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openZoneModal(zoneCode) {
console.log("Opening modal for zone:", zoneCode);
$('#pageLoader').show();
// Set data in modal (example)
$('#zoneModalTitle').text('Zone ' + zoneCode.replace("N", "") + ' Pendency Details');
$.ajax({
url: '/commissionerreview/api/pendency/getWardWiseForm7PendencyDetails',
method: 'GET',
data: {zone: zoneCode},
success: function (response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0) {
console.log("Details Array ward:", response);
let table = $('#WardDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{
data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
...[
'F7 Not Initiated After 30 Days', 'F7 Initiated After 30 Days', 'F7 Initiated Within 30 Days'
].map(field => ({
data: field,
createdCell: function (td, cellData) {
if (parseInt(cellData) > 0) {
$(td).css({
color: 'blue',
textDecoration: 'underline',
cursor: 'pointer'
});
$(td).addClass('clickable-cell');
}
}
}))
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#zoneDetailsModal').modal('show');
$('#zoneDetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({visible: true, api: true}).columns.adjust();
});
} else if (Array.isArray(response) && response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
} else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
const formTypeMap = {
1: "Form 7 Not Initiated After 30 Days",
2: "Form 7 Initiated After 30 Days",
3: "Form 7 Initiated Within 30 Days"
};
// Add click listener on table body cells
$('#WardDatatable tbody').off('click').on('click', 'td.clickable-cell', function () {
$('#pageLoader').show();
const table = $('#WardDatatable').DataTable();
const cellIndex = table.cell(this).index(); // { row: x, column: y }
const columnIndex = cellIndex.column;
// Ignore clicks on the first column (WARD)
if (columnIndex === 0) return;
const rowData = table.row(cellIndex.row).data();
const ward = rowData['WARD'];
const zone = zoneCode;
// Calculate form type and status
const formType = formTypeMap[columnIndex];
console.log("Clicked on -> Ward:", ward, "| Zone:", zone, "| FormType:", formType);
openWardDetails(ward, zone, formType);
});
}
function openWardDetails(ward, zone, formType) {
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/pendency/getForm7PendencyDetailReportByWard',
method: 'GET',
data: {
ward: ward,
zone: zone,
status: formType
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if (Array.isArray(response) && response.length > 0) {
let table = $('#DetailsDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{
data: 'ZONE',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'WARD',
render: function (data, type, row) {
return data ? data.replace("N", "") : '';
}
},
{
data: 'APPLICANT_NAME'
},
{data: 'AREA'},
{data: 'ADDRESS'},
{data: 'PINCODE'},
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: true,
searching: false,
ordering: false
});
$('#DeatilsModalTitle').text('Enforcement Form 7 Pendency Details');
$('#DetailsModal').modal('show');
$('#DetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({visible: true, api: true}).columns.adjust();
});
} else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
} else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openApplicantModal(formId) {
console.log("Opening modal for FORMID:", formId);
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/enforcement/getFormId',
method: 'GET',
data: {formid: formId},
success: function (response) {
$('#pageLoader').hide();
if (Array.isArray(response) && response.length > 0) {
console.log("Details Array:", response);
let table = $('#FormDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response, // using response directly
columns: [
{data: 'ENCLOSEMENTNAME'},
{
data: 'CDATE',
render: function (data, type, row) {
if (!data) return '';
let parts = data.split(' ')[0].split('/'); // ["2025", "05", "27"]
if (parts.length === 3) {
return `${parts[2]}/${parts[1]}/${parts[0]}`; // 27/05/2025
}
return data; // fallback
}
},
{
data: 'FILEURL',
render: function (data, type, row) {
return `<button class="btn btn-primary btn-sm btn-view" data-url="${data}">View</button>`;
},
className: 'text-center'
},
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
$('#FormDatatable').off('click').on('click', '.btn-view', function () {
var fileUrl = $(this).data('url');
if (fileUrl) {
window.open(fileUrl, '_blank'); // Open in new tab
} else {
Swal.fire({
icon: 'warning',
title: 'Missing File URL',
text: 'No file URL provided.',
showConfirmButton: true
});
}
});
$('#ApplicantDetailsModal').modal('show');
$('#ApplicantDetailsModal').on('shown.bs.modal', function () {
$.fn.dataTable.tables({visible: true, api: true}).columns.adjust();
});
} else if (response.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
} else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
</script>
</body>
</html>

662
src/main/resources/templates/modules/sofa_bed/zonewise.html

@ -0,0 +1,662 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Sofa Bed collection Zonewise Report Summary</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- DataTables CSS -->
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet"/>
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet"/>
<style>
table.dataTable th, table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th{
background-color: #003366 !important;
color: white;
}
.dataTables_wrapper .dt-buttons {
margin-bottom: 10px;
}
.dataTables_filter {
margin-bottom: 25px; /* adjust as needed */
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
}
#zoneDetailsTable_wrapper .dataTables_scrollBody {
border: none !important;
}
#zoneDetailsTable td, #zoneDetailsTable th {
vertical-align: middle;
text-align: center;
white-space: nowrap;
}
#DetailsModal .modal-body{
max-height: 70vh;
overflow-y: auto;
}
</style>
</head>
<body>
<div class="page-header-title">
<h4>Sofa and Bed Collection - Zonewise Report</h4>
</div>
<div id="opSummaryTable" style="display: block;" class="container">
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">Zone</th>
<th class="text-center">Total Request</th>
<th class="text-center">This week</th>
<th class="text-center">Completed</th>
<th class="text-center">User Cancelled </th>
<th class="text-center">Officer Cancelled</th>
<th class="text-center">Over The week</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<div class="modal fade" id="zoneDetailsModal" tabindex="-1" aria-labelledby="zoneDetailsLabel" aria-hidden="true" data-bs-keyboard="false" data-bs-backdrop="static">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="zoneModalTitle">Zone Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="WardDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">Ward </th>
<th class="text-center">Total Request</th>
<th class="text-center">This week</th>
<th class="text-center">Completed</th>
<th class="text-center">User Cancelled </th>
<th class="text-center">Officer Cancelled</th>
<th class="text-center">Over The week</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="DetailsModal" tabindex="-1" aria-labelledby="DetailsLabel" aria-hidden="true" data-bs-keyboard="false" data-bs-backdrop="static">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="DeatilsModalTitle">Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="detailscontent">
</div>
</div>
</div>
</div>
<!-- Image Modal -->
<div class="modal fade" id="imageModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-body text-center p-0">
<img id="modalImage" src="" class="img-fluid" alt="Preview" style="max-height: 80vh;"/>
</div>
</div>
</div>
</div>
<div id="pageLoader" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p>
</div>
</div>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).on('click', '.preview-img', function() {
const src = $(this).attr('src');
$('#modalImage').attr('src', src);
$('#imageModal').modal('show');
});
$(document).ready(function () {
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/sofabedcollection/getZoneWiseDetails',
method: 'GET',
success: function(response) {
$('#pageLoader').hide();
if (response.status === "success") {
if (Array.isArray(response.data) && response.data.length > 0) {
console.log("Details Array:", response);
let table = $('#ZoneOpDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response.data, // using response directly
columns: [
{
data: 'zone',
render: function (data, type, row) {
// Skip last row
if (row === response.data[response.data.length - 1]) {
return data; // just plain text
} else {
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${data}</a>`;
}
}
},
{ data: 'total_request', defaultContent: '-', className: 'text-center' },
{ data: 'open', defaultContent: '-', className: 'text-center' },
{ data: 'completed', defaultContent: '-', className: 'text-center' },
{ data: 'user_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'officer_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'pending', defaultContent: '-', className: 'text-center' }
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: 'auto',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
}
else if(Array.isArray(response.data) && response.data.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Error',
showConfirmButton: true,
timer: 3000
});
}
}
else if(response.status === "nodata") {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
// alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
$('#zoneDetailsModal').on('shown.bs.modal', function () {
if ($.fn.DataTable.isDataTable('#WardDatatable')) {
let questionDatatable = $('#WardDatatable').DataTable();
questionDatatable.columns.adjust().draw();
}
});
});
function openZoneModal(zoneCode) {
console.log("Opening modal for zone:", zoneCode);
$('#pageLoader').show();
// Set data in modal (example)
$('#zoneModalTitle').text('Zone ' + zoneCode + ' Details');
$.ajax({
url: '/commissionerreview/api/sofabedcollection/getWardDetails',
method: 'GET',
data:{zone:zoneCode},
success: function(response) {
$('#pageLoader').hide();
if (response.status === "success") {
if (Array.isArray(response.data) && response.data.length > 0){
console.log("Details Array:", response);
let table = $('#WardDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: response.data, // using response directly
columns: [
{ data: 'division', defaultContent: '-', className: 'text-center' },
{ data: 'total_request', defaultContent: '-', className: 'text-center' },
{ data: 'open', defaultContent: '-', className: 'text-center' },
{ data: 'completed', defaultContent: '-', className: 'text-center' },
{ data: 'user_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'officer_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'pending', defaultContent: '-', className: 'text-center' }
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false,
createdRow: function (row, data, dataIndex) {
// Skip last row
if (dataIndex === response.data.length - 1) {
return;
}
const clickableCols = ['open', 'completed', 'user_cancel', 'officer_cancel', 'pending'];
clickableCols.forEach((col, index) => {
const value = parseInt(data[col]);
if (!isNaN(value) && value > 0) {
$('td:eq(' + (index + 2) + ')', row).css({
'color': '#007bff',
'text-decoration': 'underline',
'cursor': 'pointer'
});
}
});
}
});
$('#zoneDetailsModal').modal('show');
}
else if (Array.isArray(response.data) && response.data.length === 0){
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else{
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
}
else if (response.status === "nodata") {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
// Attach click handler after DataTable initialization
$('#WardDatatable tbody').off('click').on('click', 'td', function () {
let table = $('#WardDatatable').DataTable();
let rowData = table.row($(this).closest('tr')).data();
let columnIndex = table.cell(this).index().column;
// Define column-to-status mapping (based on your requirement)
const columnMap = {
2: 1, // open
3: 2, // completed
6: 3, // pending
4: 4, // user_cancel
5: 5 // officer_cancel
};
// Get column name using column index
let columnName = table.column(columnIndex).dataSrc();
// If clicked column is one of the target columns
if (columnMap[columnIndex]) {
let status = columnMap[columnIndex];
let value = rowData[columnName];
let division = rowData['division'];
// Proceed only if value > 0
if (parseInt(value) > 0) {
openWardDetails(division, status);
}
}
});
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openWardDetails(division, status){
console.log("division:",division," status:",status);
// Optional: show in a modal or send AJAX
$.ajax({
url: '/commissionerreview/api/sofabedcollection/getWardStatusDetails',
method: 'GET',
data: {
ward: division,
status: status
},
success: function (response) {
$('#pageLoader').hide();
console.log("Details:", response);
if(response.status === "success"){
let modalBody = $("#detailscontent");
modalBody.empty(); // Clear previous content
if (Array.isArray(response.data) && response.data.length > 0){
response.data.forEach(item => {
// Create a container div for each record
let streetDiv = $('<div class="mb-4 p-3 border rounded shadow-sm bg-light"></div>');
// Info section (2 columns layout)
let infoHtml = `
<div class="container-fluid">
<div class="row mb-2">
<div class="col-md-4"><strong>Zone:</strong> ${item.zone || '-'}</div>
<div class="col-md-4"><strong>Ward:</strong> ${item.division || '-'}</div>
<div class="col-md-4"><strong>Request ID:</strong> ${item.request_id || '-'}</div>
</div>
<div class="row mb-2">
<div class="col-md-4"><strong>User Name:</strong> ${item.user_name || '-'}</div>
<div class="col-md-4"><strong>Status:</strong> ${item.status || '-'}</div>
<div class="col-md-4"><strong>Mobile Number:</strong> ${item.mobile || '-'}</div>
</div>
<div class="row mb-2">
<div class="col-md-8"><strong>Address:</strong> ${item.address || '-'}</div>
<div class="col-md-4"><strong>Created Date:</strong> ${item.cdate || '-'}</div>
</div>
</div>
`;
streetDiv.append(infoHtml);
// 🧾 Items section (as divs)
let itemsHtml = `
<div class="mt-3">
<p><strong>Items:</strong></p>
${
Array.isArray(item.items) && item.items.length > 0
? item.items.map((it, idx) => `
<div class="d-flex flex-wrap border rounded p-2 mb-2 ">
<div class="flex-fill"><strong>Item ${idx + 1}:</strong> ${it.item_name || '-'}</div>
<div class="flex-fill"><strong>Quantity:</strong> ${it.quantity ?? '-'}</div>
</div>
`).join("")
: `<p class="text-muted">No items available.</p>`
}
</div>
`;
streetDiv.append(itemsHtml);
// Image section
let imagesHtml = `
<hr>
<div class="mt-2" style="text-align:center;">
<p><strong>Image:</strong></p>
${
item.image_url
? (() => {
// Handle multiple comma-separated images
return item.image_url.split(",").map(img => {
let trimmed = img.trim();
return `
<img src="${trimmed}"
alt="Image"
class="img-thumbnail me-2 mb-2 preview-img"
style="width: 250px; height: 200px; object-fit: contain; cursor: pointer;"
data-bs-toggle="modal"
data-bs-target="#imageModal"
/>
`;
}).join("");
})()
: `<p class="text-muted">No images available.</p>`
}
</div>
`;
streetDiv.append(imagesHtml);
modalBody.append(streetDiv);
});
$('#DeatilsModalTitle').text('Division '+division +' Details');
$('#DetailsModal').modal('show');
}
else if (Array.isArray(response.data) && response.data.length === 0){
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else{
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
}
else if (response.status === "nodata") {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
</script>
</body>
</html>

687
src/main/resources/templates/modules/sofa_bed/zonewise1.html

@ -0,0 +1,687 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Sofa Bed collection Zonewise Report Summary</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- DataTables CSS -->
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet"/>
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet"/>
<style>
table.dataTable th, table.dataTable td {
text-align: center;
vertical-align: middle;
border: 1px solid #000;
}
table.dataTable th{
background-color: #003366 !important;
color: white;
}
.dataTables_wrapper .dt-buttons {
margin-bottom: 10px;
}
.dataTables_filter {
margin-bottom: 25px; /* adjust as needed */
}
.page-header-title h4 {
margin: 20px 0;
text-align: center;
}
#zoneDetailsTable_wrapper .dataTables_scrollBody {
border: none !important;
}
#zoneDetailsTable td, #zoneDetailsTable th {
vertical-align: middle;
text-align: center;
white-space: nowrap;
}
#DetailsModal .modal-body{
max-height: 70vh;
overflow-y: auto;
}
</style>
</head>
<body>
<div class="page-header-title">
<h4>Sofa and Bed Collection - Zonewise Report</h4>
</div>
<div id="opSummaryTable" style="display: block;" class="container">
<table id="ZoneOpDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">Zone</th>
<th class="text-center">Total Request</th>
<th class="text-center">This week Requests</th>
<th class="text-center">Older Requests</th>
<th class="text-center">Completed</th>
<th class="text-center">User Cancelled </th>
<th class="text-center">Officer Cancelled</th>
<th class="text-center">Pending</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
<div class="modal fade" id="zoneDetailsModal" tabindex="-1" aria-labelledby="zoneDetailsLabel" aria-hidden="true" data-bs-keyboard="false" data-bs-backdrop="static">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="zoneModalTitle">Zone Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table id="WardDatatable" class="table table-striped table-bordered display nowrap w-100">
<thead>
<tr>
<th class="text-center">Ward </th>
<th class="text-center">Total Request</th>
<th class="text-center">This Week Request</th>
<th class="text-center">Older Requests</th>
<th class="text-center">Completed</th>
<th class="text-center">User Cancelled </th>
<th class="text-center">Officer Cancelled</th>
<th class="text-center">Pending</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="DetailsModal" tabindex="-1" aria-labelledby="DetailsLabel" aria-hidden="true" data-bs-keyboard="false" data-bs-backdrop="static">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="DeatilsModalTitle">Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="detailscontent">
</div>
</div>
</div>
</div>
<!-- Image Modal -->
<div class="modal fade" id="imageModal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-lg" role="document">
<div class="modal-content">
<div class="modal-body text-center p-0">
<img id="modalImage" src="" class="img-fluid" alt="Preview" style="max-height: 80vh;"/>
</div>
</div>
</div>
</div>
<div id="pageLoader" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
<div style="position: relative; top: 50%; transform: translateY(-50%);">
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
<span class="sr-only"></span>
</div>
<!-- Add the 'Please wait' text below the spinner -->
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p>
</div>
</div>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<!-- DataTables JS -->
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.36/vfs_fonts.js"></script>
<!-- SweetAlert -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
$(document).on('click', '.preview-img', function() {
const src = $(this).attr('src');
$('#modalImage').attr('src', src);
$('#imageModal').modal('show');
});
$(document).ready(function () {
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/sofabedcollection/getZoneReport',
method: 'GET',
success: function(response) {
// Safely extract data whether it's an array or an object
var res = Array.isArray(response) ? response[0] : response;
console.log("Response:", res);
$('#pageLoader').hide();
if (res.status === "Success") {
if (Array.isArray(res.data) && res.data.length > 0) {
console.log("Details Array:", response);
let table = $('#ZoneOpDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: res.data, // using response directly
columns: [
{
data: 'zone',
render: function (data, type, row) {
// Skip last row
if (row === res.data[res.data.length - 1]) {
return data; // just plain text
} else {
return `<a href="#" onclick="openZoneModal('${data}')" style="text-decoration: underline;">${data}</a>`;
}
}
},
{ data: 'total_request', defaultContent: '-', className: 'text-center' },
{ data: 'this_week_requests', defaultContent: '-', className: 'text-center' },
{ data: 'older_requests', defaultContent: '-', className: 'text-center' },
{ data: 'completed', defaultContent: '-', className: 'text-center' },
{ data: 'user_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'officer_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'pending', defaultContent: '-', className: 'text-center' }
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: 'auto',
scrollX: true,
responsive: false,
searching: false,
ordering: false
});
}
else if(Array.isArray(res.data) && res.data.length === 0) {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Error',
showConfirmButton: true,
timer: 3000
});
}
}
else if(res.status === "nodata") {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: res.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
// alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
$('#zoneDetailsModal').on('shown.bs.modal', function () {
if ($.fn.DataTable.isDataTable('#WardDatatable')) {
let questionDatatable = $('#WardDatatable').DataTable();
questionDatatable.columns.adjust().draw();
}
});
});
function openZoneModal(zoneCode) {
console.log("Opening modal for zone:", zoneCode);
$('#pageLoader').show();
// Set data in modal (example)
$('#zoneModalTitle').text('Zone ' + zoneCode + ' Details');
$.ajax({
url: '/commissionerreview/api/sofabedcollection/getWardReport',
method: 'GET',
data:{zone:zoneCode},
success: function(response) {
var res = Array.isArray(response) ? response[0] : response;
console.log("Response:", res);
$('#pageLoader').hide();
if (res.status === "Success") {
if (Array.isArray(res.data) && res.data.length > 0){
console.log("Details Array:", response);
let table = $('#WardDatatable').DataTable({
destroy: true,
autoWidth: true,
info: true,
data: res.data, // using response directly
columns: [
{ data: 'division', defaultContent: '-', className: 'text-center' },
{ data: 'total_request', defaultContent: '-', className: 'text-center' },
{ data: 'this_week_requests', defaultContent: '-', className: 'text-center' },
{ data: 'older_requests', defaultContent: '-', className: 'text-center' },
{ data: 'completed', defaultContent: '-', className: 'text-center' },
{ data: 'user_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'officer_cancel', defaultContent: '-', className: 'text-center' },
{ data: 'pending', defaultContent: '-', className: 'text-center' }
],
dom: 'frtip',
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '400px',
scrollX: true,
responsive: false,
searching: false,
ordering: false,
createdRow: function (row, data, dataIndex) {
if (dataIndex === res.data.length - 1) return;
const clickableCols = ['this_week_requests', 'completed', 'user_cancel', 'officer_cancel'];
clickableCols.forEach((col) => {
const value = parseInt(data[col]);
if (!isNaN(value) && value > 0) {
const colIndex = {
this_week_requests: 2,
completed: 4,
user_cancel: 5,
officer_cancel: 6
}[col];
$('td:eq(' + colIndex + ')', row).css({
'color': '#007bff',
'text-decoration': 'underline',
'cursor': 'pointer'
});
}
});
}
});
$('#zoneDetailsModal').modal('show');
}
else if (Array.isArray(res.data) && res.data.length === 0){
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else{
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: res.message,
showConfirmButton: true,
timer: 3000
});
}
}
else if (res.status === "nodata") {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: res.message,
showConfirmButton: true,
timer: 3000
});
}
// Attach click handler after DataTable initialization
$('#WardDatatable tbody').off('click').on('click', 'td', function () {
let table = $('#WardDatatable').DataTable();
let rowData = table.row($(this).closest('tr')).data();
let columnIndex = table.cell(this).index().column;
// Define column-to-status mapping (based on your requirement)
const columnMap = {
2: 1, // open
4: 2, // completed
5: 4, // user_cancel
6: 5 // officer_cancel
};
// Get column name using column index
let columnName = table.column(columnIndex).dataSrc();
// If clicked column is one of the target columns
if (columnMap[columnIndex]) {
let status = columnMap[columnIndex];
let value = rowData[columnName];
let division = rowData['division'];
// Proceed only if value > 0
if (parseInt(value) > 0) {
openWardDetails(division, status);
}
}
});
},
error: function(xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
function openWardDetails(division, status){
console.log("division:",division," status:",status);
// Optional: show in a modal or send AJAX
$('#pageLoader').show();
$.ajax({
url: '/commissionerreview/api/sofabedcollection/getWardStatusReport',
method: 'GET',
data: {
ward: division,
status: status
},
success: function (response) {
$('#pageLoader').hide();
var res = Array.isArray(response) ? response[0] : response;
//console.log("Response:", res);
$('#pageLoader').hide();
console.log("Details:", res);
if(res.status === "Success"){
let modalBody = $("#detailscontent");
modalBody.empty(); // Clear previous content
if (Array.isArray(res.data) && res.data.length > 0){
res.data.forEach(item => {
// Create a container div for each record
let streetDiv = $('<div class="mb-4 p-3 border rounded shadow-sm bg-light"></div>');
// Info section (2 columns layout)
let infoHtml = `
<div class="container-fluid">
<div class="row mb-2">
<div class="col-md-4"><strong>Zone:</strong> ${item.zone || '-'}</div>
<div class="col-md-4"><strong>Ward:</strong> ${item.division || '-'}</div>
<div class="col-md-4"><strong>Request ID:</strong> ${item.request_id || '-'}</div>
</div>
<div class="row mb-2">
<div class="col-md-4"><strong>User Name:</strong> ${item.user_name || '-'}</div>
<div class="col-md-4"><strong>Status:</strong> ${item.status || '-'}</div>
<div class="col-md-4"><strong>Mobile Number:</strong> ${item.mobile || '-'}</div>
</div>
<div class="row mb-2">
<div class="col-md-8"><strong>Address:</strong> ${item.address || '-'}</div>
<div class="col-md-4"><strong>Created Date:</strong> ${item.cdate || '-'}</div>
</div>
</div>
`;
streetDiv.append(infoHtml);
// 🧾 Items section (as divs)
let itemsHtml = `
<div class="mt-3">
<p><strong>Items:</strong></p>
${
Array.isArray(item.items) && item.items.length > 0
? item.items.map((it, idx) => `
<div class="d-flex flex-wrap border rounded p-2 mb-2 ">
<div class="flex-fill"><strong>Item ${idx + 1}:</strong> ${it.item_name || '-'}</div>
<div class="flex-fill"><strong>Quantity:</strong> ${it.quantity ?? '-'}</div>
</div>
`).join("")
: `<p class="text-muted">No items available.</p>`
}
</div>
`;
streetDiv.append(itemsHtml);
// Image section
let imagesHtml = `
<hr>
<div class="mt-2" style="text-align:center;">
<p><strong>Image:</strong></p>
${
item.image_url
? (() => {
// Handle multiple comma-separated images
return item.image_url.split(",").map(img => {
let trimmed = img.trim();
return `
<img src="${trimmed}"
alt="Image"
class="img-thumbnail me-2 mb-2 preview-img"
style="width: 250px; height: 200px; object-fit: contain; cursor: pointer;"
data-bs-toggle="modal"
data-bs-target="#imageModal"
/>
`;
}).join("");
})()
: `<p class="text-muted">No images available.</p>`
}
</div>
`;
streetDiv.append(imagesHtml);
modalBody.append(streetDiv);
});
$('#DeatilsModalTitle').text('Division '+division +' Details');
$('#DetailsModal').modal('show');
}
else if (Array.isArray(res.data) && res.data.length === 0){
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else{
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
showConfirmButton: true,
timer: 3000
});
}
}
else if (res.status === "nodata") {
$('#pageLoader').hide();
//alert("No data available.");
Swal.fire({
icon: 'info',
title: 'No Data',
text: 'No data available.',
showConfirmButton: true,
timer: 3000
});
}
else {
$('#pageLoader').hide();
//alert("Error: " + response.message);
Swal.fire({
icon: 'error',
title: 'Error',
text: res.message,
showConfirmButton: true,
timer: 3000
});
}
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
//alert("Request failed: " + error);
Swal.fire({
icon: 'error',
title: 'Error',
text: error,
showConfirmButton: true,
timer: 3000
});
}
});
}
</script>
</body>
</html>

13
src/test/java/com/gcc/commissionerreviewII/CommissionerreviewIiApplicationTests.java

@ -0,0 +1,13 @@
package com.gcc.commissionerreviewII;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class CommissionerreviewIiApplicationTests {
@Test
void contextLoads() {
}
}
Loading…
Cancel
Save