Browse Source

Whatsapp Governance - Rest API Services - Initial Commit

master
KaNi-04 4 months ago
commit
49c50b94b2
  1. 33
      .gitignore
  2. 259
      mvnw
  3. 149
      mvnw.cmd
  4. 94
      pom.xml
  5. 13
      src/main/java/com/gcc/restapiservices/RestapiservicesApplication.java
  6. 885
      src/main/java/com/gcc/restapiservices/birthanddeath/controller/BirthApiController.java
  7. 121
      src/main/java/com/gcc/restapiservices/birthanddeath/controller/ChildNameInclusionController.java
  8. 440
      src/main/java/com/gcc/restapiservices/birthanddeath/controller/DeathApiController.java
  9. 1095
      src/main/java/com/gcc/restapiservices/birthanddeath/service/BirthCertificateService.java
  10. 420
      src/main/java/com/gcc/restapiservices/birthanddeath/service/ChildNameInclusionService.java
  11. 789
      src/main/java/com/gcc/restapiservices/birthanddeath/service/DeathCertificateService.java
  12. 244
      src/main/java/com/gcc/restapiservices/cdwaste/controller/ApiController.java
  13. 157
      src/main/java/com/gcc/restapiservices/cdwaste/controller/DropDownApiController.java
  14. 70
      src/main/java/com/gcc/restapiservices/cdwaste/service/DropDownService.java
  15. 354
      src/main/java/com/gcc/restapiservices/cdwaste/service/RequestService.java
  16. 44
      src/main/java/com/gcc/restapiservices/cdwaste/util/ApiResponseUtil.java
  17. 35
      src/main/java/com/gcc/restapiservices/cdwaste/util/DateTimeUtil.java
  18. 96
      src/main/java/com/gcc/restapiservices/communityHall/configuration/PaymentConfig.java
  19. 95
      src/main/java/com/gcc/restapiservices/communityHall/controller/ReportController.java
  20. 992
      src/main/java/com/gcc/restapiservices/communityHall/controller/communityHallController.java
  21. 198
      src/main/java/com/gcc/restapiservices/communityHall/dto/PaymentWebhookPayload.java
  22. 83
      src/main/java/com/gcc/restapiservices/communityHall/dto/TransactionData.java
  23. 73
      src/main/java/com/gcc/restapiservices/communityHall/dto/TransactionRefundResponse.java
  24. 536
      src/main/java/com/gcc/restapiservices/communityHall/service/CHPaymentService.java
  25. 162
      src/main/java/com/gcc/restapiservices/communityHall/service/ReportService.java
  26. 41
      src/main/java/com/gcc/restapiservices/communityHall/service/WhatsappMsgServiceImpl.java
  27. 864
      src/main/java/com/gcc/restapiservices/communityHall/service/communityHallService.java
  28. 63
      src/main/java/com/gcc/restapiservices/communityHall/util/EncryptionUtils.java
  29. 37
      src/main/java/com/gcc/restapiservices/communityHall/util/TransactionNumberGenerator.java
  30. 64
      src/main/java/com/gcc/restapiservices/configuration/AppConfig.java
  31. 201
      src/main/java/com/gcc/restapiservices/configuration/DataSourceConfig.java
  32. 11
      src/main/java/com/gcc/restapiservices/coworkspace/constants/AppConstants.java
  33. 49
      src/main/java/com/gcc/restapiservices/coworkspace/controller/ApiResponse.java
  34. 389
      src/main/java/com/gcc/restapiservices/coworkspace/controller/CoworkspaceApiController.java
  35. 44
      src/main/java/com/gcc/restapiservices/coworkspace/exception/GlobalExceptionHandler.java
  36. 7
      src/main/java/com/gcc/restapiservices/coworkspace/exception/NoSlotAvailable.java
  37. 38
      src/main/java/com/gcc/restapiservices/coworkspace/service/AmountConfigService.java
  38. 33
      src/main/java/com/gcc/restapiservices/coworkspace/service/CalendarService.java
  39. 1447
      src/main/java/com/gcc/restapiservices/coworkspace/service/CoworkspaceApiService.java
  40. 193
      src/main/java/com/gcc/restapiservices/coworkspace/service/PaymentService.java
  41. 69
      src/main/java/com/gcc/restapiservices/coworkspace/service/SMSService.java
  42. 102
      src/main/java/com/gcc/restapiservices/coworkspace/service/WhatsAppService.java
  43. 264
      src/main/java/com/gcc/restapiservices/crslogs/controller/CrsLogsApiController.java
  44. 80
      src/main/java/com/gcc/restapiservices/crslogs/service/CrsLogsService.java
  45. 127
      src/main/java/com/gcc/restapiservices/feedback/controller/FeedbackController.java
  46. 125
      src/main/java/com/gcc/restapiservices/feedback/service/FeedbackService.java
  47. 108
      src/main/java/com/gcc/restapiservices/nearbyservices/controller/LocationController.java
  48. 94
      src/main/java/com/gcc/restapiservices/nearbyservices/controller/NearByController.java
  49. 633
      src/main/java/com/gcc/restapiservices/nearbyservices/service/NearByService.java
  50. 11
      src/main/java/com/gcc/restapiservices/petregistration/constants/AppConstants.java
  51. 76
      src/main/java/com/gcc/restapiservices/petregistration/controller/PetController.java
  52. 757
      src/main/java/com/gcc/restapiservices/petregistration/controller/PetRegistrationApiController.java
  53. 32
      src/main/java/com/gcc/restapiservices/petregistration/controller/SMSController.java
  54. 949
      src/main/java/com/gcc/restapiservices/petregistration/service/PetRegistrationApiService.java
  55. 603
      src/main/java/com/gcc/restapiservices/petregistration/service/PetSMSService.java
  56. 46
      src/main/java/com/gcc/restapiservices/petregistration/util/ApiResponseUtil.java
  57. 35
      src/main/java/com/gcc/restapiservices/petregistration/util/DateTimeUtil.java
  58. 324
      src/main/java/com/gcc/restapiservices/propertytax/controller/PropertyTaxOtpController.java
  59. 313
      src/main/java/com/gcc/restapiservices/propertytax/service/PropertyTaxOtpService.java
  60. 126
      src/main/java/com/gcc/restapiservices/servicesPdf/controller/ServicePdfController.java
  61. 47
      src/main/java/com/gcc/restapiservices/servicesPdf/service/ServicePdfService.java
  62. 59
      src/main/java/com/gcc/restapiservices/swimmingpool/constants/AppConfig.java
  63. 14
      src/main/java/com/gcc/restapiservices/swimmingpool/constants/AppConstants.java
  64. 380
      src/main/java/com/gcc/restapiservices/swimmingpool/controller/PoolApiController.java
  65. 485
      src/main/java/com/gcc/restapiservices/swimmingpool/controller/SwimmingPoolApiController.java
  66. 525
      src/main/java/com/gcc/restapiservices/swimmingpool/service/PoolService.java
  67. 778
      src/main/java/com/gcc/restapiservices/swimmingpool/service/SwimmingPoolService.java
  68. 49
      src/main/java/com/gcc/restapiservices/swimmingpool/util/ApiResponse.java
  69. 42
      src/main/java/com/gcc/restapiservices/townplanning/controller/BuildingApprovalApiController.java
  70. 53
      src/main/java/com/gcc/restapiservices/townplanning/service/BuildingApprovalService.java
  71. 96
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/configuration/VPHPaymentConfig.java
  72. 992
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/controller/VPHHallController.java
  73. 198
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/dto/PaymentWebhookPayload.java
  74. 83
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/dto/TransactionData.java
  75. 73
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/dto/TransactionRefundResponse.java
  76. 536
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/service/VPHPaymentService.java
  77. 41
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/service/WhatsappMsgService.java
  78. 849
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/service/victoriaHallService.java
  79. 63
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/util/VPHEncryptionUtils.java
  80. 37
      src/main/java/com/gcc/restapiservices/victoriaHallBooking/util/VPHTransactionNumberGenerator.java
  81. 36
      src/main/resources/application-dev.properties
  82. 46
      src/main/resources/application-prod.properties
  83. 3
      src/main/resources/application.properties
  84. 15
      src/main/resources/paymentConfig.properties

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/

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"

94
pom.xml

@ -0,0 +1,94 @@
<?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.3.4</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.gcc</groupId>
<artifactId>restapiservices</artifactId>
<version></version>
<name>restapiservices</name>
<description>GCC restapiservices</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version> <!-- you can use the latest version -->
</dependency>
<dependency>
<groupId>com.razorpay</groupId>
<artifactId>razorpay-java</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</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/restapiservices/RestapiservicesApplication.java

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

885
src/main/java/com/gcc/restapiservices/birthanddeath/controller/BirthApiController.java

@ -0,0 +1,885 @@
package com.gcc.restapiservices.birthanddeath.controller;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
// import com.gcc.restapiservices.birthanddeath.service.BirthCertificateService;
import com.gcc.restapiservices.configuration.AppConfig;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@RequestMapping("/gccrestservices/api/birth-certificate")
@RestController
public class BirthApiController {
// @Autowired
// private BirthCertificateService birthCertificateService;
@Autowired
private AppConfig appConfig;
// // old from local db
// @PostMapping("/by-registration")
// public ResponseEntity<?> getByRegistration(@RequestParam("registration_number") String regNo) {
// try {
// // Validate presence
// if (regNo == null || regNo.trim().isEmpty()) {
// Map<String, Object> error = new LinkedHashMap<>();
// error.put("status", "invalid_request");
// error.put("message", "Registration number is required");
// error.put("status_code", 400);
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
// }
// String formattedRegNo = regNo.trim().toUpperCase();
// // Map<String, Object> result =
// // birthCertificateService.getByRegistrationNumber(regNo);
// Map<String, Object> result = birthCertificateService.getBirthByRegistrationNumber(formattedRegNo);
// if (result.containsKey("certificate_details")) {
// // Check for empty pdf_url and set message if needed
// Object pdfUrl = result.get("pdf_url");
// if (pdfUrl == null || pdfUrl.toString().isEmpty()) {
// result.put("message", "Awaiting for eSign");
// } else {
// result.put("message", "Record fetched successfully");
// }
// result.put("status", "success");
// result.put("status_code", 200);
// return ResponseEntity.ok(result);
// } else {
// return ResponseEntity.ok(result);
// }
// } catch (EmptyResultDataAccessException ex) {
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "not_found");
// response.put("message",
// "no data found for given registration number.Please ensure registration number is exactly as on the certificate.");
// response.put("status_code", 404);
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
// } catch (Exception ex) {
// ex.printStackTrace();
// Map<String, Object> error = new LinkedHashMap<>();
// error.put("status", "error");
// error.put("message", "An unexpected error occurred " + ex);
// error.put("status_code", 500);
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
// }
// }
// @PostMapping("/by-mobile")
// public ResponseEntity<?> getByMobile(@RequestParam(value = "mobile_number") String mobile) {
// try {
// // Validate presence
// if (mobile == null || mobile.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_request", "message",
// "Mobile number is required", "status_code", 400));
// }
// mobile = mobile.trim();
// // Validate format: 10 digits
// if (!mobile.matches("^\\d{10}$")) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "Invalid mobile number format. Expected: 10-digit number", "status_code", 400));
// }
// // List<Map<String, Object>> results =
// // birthCertificateService.getByMobile(mobile);
// List<Map<String, Object>> results = birthCertificateService.getBirthByMobile(mobile);
// //System.out.println("results mobile " + results);
// if (results.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of("status", "not_found", "message",
// "No records found for the given mobile number or some other district", "status_code", 404));
// }
// // Inject status and status_code into each record
// List<Map<String, Object>> finalResults = new ArrayList<>();
// for (Map<String, Object> record : results) {
// if(record.get("pdf_url") == null || record.get("pdf_url").toString().isEmpty()) {
// record.put("message", "Awaiting for eSign");
// } else {
// record.put("message", "Record fetched successfully");
// }
// record.put("status", "success");
// record.put("status_code", 200);
// finalResults.add(record);
// }
// return ResponseEntity.ok(finalResults);
// } catch (Exception ex) {
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
// @PostMapping("/by-details")
// public ResponseEntity<?> getBirthDetailsMysql(@RequestParam(name = "incident_date") String dob,
// @RequestParam(name = "gender") String gender, @RequestParam(name = "father_name") String fatherName,
// @RequestParam(name = "mother_name") String motherName,
// @RequestParam(required = false, name = "child_name") String childName) {
// Map<String, Object> error = new LinkedHashMap<>();
// // Validate
// List<String> missing = new ArrayList<>();
// if (dob == null || dob.trim().isEmpty())
// missing.add("birth_date");
// if (fatherName == null || fatherName.trim().isEmpty())
// missing.add("father_name");
// if (motherName == null || motherName.trim().isEmpty())
// missing.add("mother_name");
// if (gender == null || gender.trim().isEmpty())
// missing.add("gender");
// if (!missing.isEmpty()) {
// error.put("status", "invalid_request");
// error.put("message", "Missing required fields: " + String.join(", ", missing));
// error.put("status_code", 400);
// return ResponseEntity.badRequest().body(error);
// }
// String formattedDob;
// // ✅ Format gender like "Male"/"Female" to "M"/"F"
// String formattedGender = formatGender(gender);
// try {
// DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// DateTimeFormatter oracleFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// LocalDate incidentDate = LocalDate.parse(dob.trim(), inputFormat);
// LocalDate today = LocalDate.now();
// if (incidentDate.isAfter(today)) {
// return ResponseEntity.badRequest().body(Map.of("status", "future_date_not_allowed", "message",
// "incident_date cannot be a future date", "status_code", 400));
// }
// formattedDob = LocalDate.parse(dob.trim(), inputFormat).format(oracleFormat);
// } catch (DateTimeParseException e) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "incident_date must be in yyyy-MM-dd format", "status_code", 400));
// }
// try {
// // System.out.println("DOB : " + formattedDob);
// // System.out.println("Father : " + fatherName);
// // System.out.println("Mother : " + motherName);
// // System.out.println("Gender : " + formattedGender);
// // System.out.println("Child : " + (childName != null ? childName : "[EMPTY]"));
// Map<String, Object> result = birthCertificateService.getByDetailsOracleOldAndNew(formattedDob, fatherName,
// motherName, childName, formattedGender);
// if (result == null || result.isEmpty() || "not_found".equals(result.get("status"))) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of("status", "not_found", "message",
// "No matching birth certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404));
// }
// result.put("status_code", 200);
// result.put("message", "Record fetched successfully");
// return ResponseEntity.ok(result);
// } catch (Exception ex) {
// ex.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
/* ///////////////// otp configuration ///////////////////// */
@GetMapping(value = "/sendOTP")
public String sendOtp(HttpServletRequest request, @RequestParam String mobile) {
// Create an ObjectMapper instance
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> response = new HashMap<>();
String MobileNo = mobile;
System.out.print("\n MobileNo---:" + mobile);
Random rand = new Random();
int otp = rand.nextInt(90000) + 10000;
System.out.print("\n otp---:" + otp);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy%20HH:mm");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now));
String generatedToken = "Welcome to GCC! Your OTP for Birth and Death Certificate login is " + otp;
String key = "pfTEYN6H";
String urlString = appConfig.getGetOtpUrl() + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + generatedToken + "&entityid=1401572690000011081&templateid=1407174687453240990";
System.out.print("\n urlString---: " + urlString);
String bodyMessage = "";
if (mobile == null || mobile.trim().isEmpty()) {
throw new IllegalArgumentException("Mobile number is required");
}
// Validate mobile number is exactly 10 digits
if (!mobile.matches("\\d{10}")) {
throw new IllegalArgumentException("Mobile number must be exactly 10 digits");
}
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(urlString, String.class);
ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
// Add mobileNo and otp to the response JSON
jsonResponse.put("MobileNo", MobileNo);
jsonResponse.put("otp", otp);
bodyMessage = jsonResponse.toString();
System.out.println("\n bodyMessage" + bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: " + e);
bodyMessage = "Error";
}
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
return bodyMessage;
}
// Helper method for 400 error
// private ResponseEntity<Map<String, Object>> badRequest(String message) {
// Map<String, Object> error = new LinkedHashMap<>();
// error.put("status", "invalid_request");
// error.put("message", message);
// error.put("status_code", 400);
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
// }
// public static String formatGender(String gender) {
// if (gender == null)
// return null;
// gender = gender.trim().toLowerCase();
// if (gender.equals("male")) {
// return "M";
// } else if (gender.equals("female")) {
// return "F";
// } else {
// // Fallback: capitalize first letter only
// return gender.substring(0, 1).toUpperCase() + gender.substring(1);
// }
// }
// /// dizo
// // Child Name Inclusion Send OTP
// @PostMapping("/ciotp")
// public ResponseEntity<JsonNode> sendCiOtp(@RequestParam("MOB") String MOB,
// @RequestParam(value = "ServiceID", defaultValue = "CI") String ServiceID) {
// ObjectMapper mapper = new ObjectMapper();
// try {
// // 🔒 Validate mobile number
// if (MOB == null || MOB.trim().isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter the Mobile No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// if (!MOB.matches("\\d{10}")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter a valid 10-digit Mobile No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // ✅ Prepare JSON payload for service
// ObjectNode payload = mapper.createObjectNode();
// payload.put("MOB", MOB);
// // ✅ Call service
// JsonNode externalResponse = birthCertificateService.sendCiOtp(ServiceID, payload.toString());
// // ❌ Handle missing OTP
// if (externalResponse == null || !externalResponse.has("OTP")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Failed to send OTP");
// error.put("Mobile", MOB);
// error.put("ResultStatus", "False");
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
// }
// // ✅ Success response
// ObjectNode success = mapper.createObjectNode();
// success.put("Message", "Sending Success");
// success.put("Mobile", MOB);
// success.put("OTP", externalResponse.get("OTP").asText());
// success.put("ResultStatus", "True");
// return ResponseEntity.ok(success);
// } catch (Exception e) {
// e.printStackTrace();
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Server Error");
// error.put("ResultStatus", "False");
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
// }
// }
// // Child Name Inclusion Register
// @PostMapping("/ciRegisterData")
// public ResponseEntity<JsonNode> ciRegisterData(@RequestParam String MOB, @RequestParam String OTP,
// @RequestParam String REGNO, @RequestParam(required = false, defaultValue = "CI") String ISBD) {
// ObjectMapper mapper = new ObjectMapper();
// try {
// // 🔒 Validate mobile number
// if (MOB == null || MOB.trim().isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter the Mobile No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// if (!MOB.matches("\\d{10}")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter a valid 10-digit Mobile No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // 🔒 Validate OTP
// if (OTP == null || OTP.trim().isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter OTP");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // 🔒 Validate REGNO
// if (REGNO == null || REGNO.trim().isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter REG No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // ✅ Create SetInput payload
// ObjectNode payload = mapper.createObjectNode();
// payload.put("MOB", MOB);
// payload.put("OTP", OTP);
// payload.put("REGNO", REGNO);
// payload.put("ISBD", ISBD); // optional
// // ✅ Call external service
// JsonNode externalResponse = birthCertificateService.CiRegisterData("CI", payload.toString());
// // ❌ Handle failure
// if (externalResponse == null || !externalResponse.has("ResultStatus")
// || !"True".equalsIgnoreCase(externalResponse.get("ResultStatus").asText())) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Failed to fetch birth certificate data");
// error.put("Mobile", MOB);
// error.put("ResultStatus", "False");
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
// }
// // ✅ Add default DeclarationForm value to the response
// if (externalResponse instanceof ObjectNode) {
// ((ObjectNode) externalResponse).put("DeclarationForm",
// "https://chennaicorporation.gov.in/images/Name%20Declaration%20Form.pdf");
// }
// return ResponseEntity.ok(externalResponse);
// } catch (Exception e) {
// e.printStackTrace();
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Server Error");
// error.put("ResultStatus", "False");
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
// }
// }
// // Child Name Inclusion Name Added To submit
// @PostMapping("/saveCiName")
// public ResponseEntity<JsonNode> saveCiName(@RequestParam String MOB, @RequestParam String REGNO,
// @RequestParam String ISBD, @RequestParam String PAR_ID, @RequestParam String PAR_DCL,
// @RequestParam("AFFT_LTR") MultipartFile afftLtrFile,
// @RequestParam("PAR_ID_SIGN") MultipartFile paridsignFile,
// @RequestParam("PAR_DCL_SIGN") MultipartFile pardecsignFile, @RequestParam("DOB_Doc") MultipartFile dobFile,
// // @RequestParam("ANY_Doc") MultipartFile anyotherFile,
// @RequestParam String DOB, @RequestParam String CHILD_NAME) {
// ObjectMapper mapper = new ObjectMapper();
// try {
// // Validate mobile number
// if (MOB == null || MOB.trim().isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter the Mobile No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// if (!MOB.matches("\\d{10}")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Enter a valid 10-digit Mobile No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // Validate REGNO
// if (REGNO == null || REGNO.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please fill the REG No");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // Validate PAR_ID
// if (PAR_ID == null || PAR_ID.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please fill the PAR_ID");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // Validate PAR_DCL
// if (PAR_DCL == null || PAR_DCL.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please fill the PAR_DCL");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // Validate DOB
// if (DOB == null || DOB.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please fill the DOB");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // Validate CHILD_NAME
// if (CHILD_NAME == null || CHILD_NAME.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please fill the CHILD_NAME");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// // Validate AFFT_LTR and convert PDF file to Base64
// if (afftLtrFile == null || afftLtrFile.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please upload AFFIDAVIT LETTER File");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// if (!afftLtrFile.getOriginalFilename().toLowerCase().endsWith(".pdf")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Only PDF file is allowed for AFFIDAVIT LETTER File");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// byte[] fileBytes = afftLtrFile.getBytes();
// String afftLtrBase64 = Base64.getEncoder().encodeToString(fileBytes);
// // Validate PAR_ID_SIGN and convert PDF file to Base64
// if (paridsignFile == null || paridsignFile.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please upload PARENT ID SIGN File");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// if (!paridsignFile.getOriginalFilename().toLowerCase().endsWith(".pdf")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Only PDF file is allowed for PARENT ID SIGN File");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// byte[] paridfileBytes = paridsignFile.getBytes();
// String paridsignBase64 = Base64.getEncoder().encodeToString(paridfileBytes);
// // Validate PAR_DCL_SIGN and convert PDF file to Base64
// if (pardecsignFile == null || pardecsignFile.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please upload PARENT DECLARATION SIGN File");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// if (!pardecsignFile.getOriginalFilename().toLowerCase().endsWith(".pdf")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Only PDF file is allowed for PARENT DECLARATION SIGN File");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// byte[] pardclfileBytes = pardecsignFile.getBytes();
// String pardclsignBase64 = Base64.getEncoder().encodeToString(pardclfileBytes);
// // Validate DOB_Doc and convert PDF file to Base64
// if (dobFile == null || dobFile.isEmpty()) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Please upload DOB CERTIFICATE");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// if (!dobFile.getOriginalFilename().toLowerCase().endsWith(".pdf")) {
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Only PDF file is allowed for DOB CERTIFICATE");
// error.put("ResultStatus", "False");
// return ResponseEntity.badRequest().body(error);
// }
// byte[] dobfileBytes = dobFile.getBytes();
// String dobBase64 = Base64.getEncoder().encodeToString(dobfileBytes);
// // Validate ANY_Doc and convert PDF file to Base64
// // if (anyotherFile == null || anyotherFile.isEmpty() ) {
// // ObjectNode error = mapper.createObjectNode();
// // error.put("Message", "Please upload ANY OTHER DOCUMENT File");
// // error.put("ResultStatus", "False");
// // return ResponseEntity.badRequest().body(error);
// // }
// //
// // if (!anyotherFile.getOriginalFilename().toLowerCase().endsWith(".pdf")) {
// // ObjectNode error = mapper.createObjectNode();
// // error.put("Message", "Only PDF file is allowed for ANY OTHER DOCUMENT File");
// // error.put("ResultStatus", "False");
// // return ResponseEntity.badRequest().body(error);
// // }
// //
// // byte[] anyotherfileBytes = anyotherFile.getBytes();
// // String anyotherBase64 = Base64.getEncoder().encodeToString(anyotherfileBytes);
// // Construct SetInput JSON
// ObjectNode payload = mapper.createObjectNode();
// payload.put("MOB", MOB);
// payload.put("REGNO", REGNO);
// payload.put("ISBD", ISBD);
// payload.put("PAR_ID", PAR_ID);
// payload.put("PAR_DCL", PAR_DCL);
// payload.put("AFFT_LTR", afftLtrBase64);
// payload.put("PAR_ID_SIGN", paridsignBase64);
// payload.put("PAR_DCL_SIGN", pardclsignBase64);
// payload.put("DOB_Doc", dobBase64);
// // payload.put("ANY_Doc", anyotherBase64);
// payload.put("DOB", DOB);
// payload.put("CHILD_NAME", CHILD_NAME);
// // Send to external service
// JsonNode externalResponse = birthCertificateService.saveCiName(payload);
// // Prepare cleaned response
// ObjectNode cleanResponse = mapper.createObjectNode();
// cleanResponse.put("Message", externalResponse.path("Message").asText());
// cleanResponse.put("Mobile", externalResponse.path("Mobile").asText());
// cleanResponse.put("ResultStatus", externalResponse.path("ResultStatus").asText());
// return ResponseEntity.ok(cleanResponse);
// } catch (Exception e) {
// e.printStackTrace();
// ObjectNode error = mapper.createObjectNode();
// error.put("Message", "Server Error");
// error.put("ResultStatus", "False");
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
// }
// }
// // added by hariprasath
// @PostMapping("/by-detailsnew")
// public ResponseEntity<?> getBirthDetailsMysqlnew(@RequestParam(name = "incident_date") String dob,
// @RequestParam(name = "gender") String gender, @RequestParam(name = "father_name") String fatherName,
// @RequestParam(name = "mother_name") String motherName,
// @RequestParam(required = false, name = "child_name") String childName) {
// Map<String, Object> error = new LinkedHashMap<>();
// // Validate
// List<String> missing = new ArrayList<>();
// if (dob == null || dob.trim().isEmpty())
// missing.add("incident_date");
// if (fatherName == null || fatherName.trim().isEmpty())
// missing.add("father_name");
// if (motherName == null || motherName.trim().isEmpty())
// missing.add("mother_name");
// if (gender == null || gender.trim().isEmpty())
// missing.add("gender");
// if (!missing.isEmpty()) {
// error.put("status", "invalid_request");
// error.put("message", "Missing required fields: " + String.join(", ", missing));
// error.put("status_code", 400);
// return ResponseEntity.badRequest().body(error);
// }
// String formattedDob;
// String formattedGender = formatGender(gender);
// try {
// DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// DateTimeFormatter oracleFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// LocalDate incidentDate = LocalDate.parse(dob.trim(), inputFormat);
// LocalDate today = LocalDate.now();
// if (incidentDate.isAfter(today)) {
// return ResponseEntity.badRequest().body(Map.of("status", "future_date_not_allowed", "message",
// "incident_date cannot be a future date", "status_code", 400));
// }
// formattedDob = LocalDate.parse(dob.trim(), inputFormat).format(oracleFormat);
// } catch (DateTimeParseException e) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "incident_date must be in yyyy-MM-dd format", "status_code", 400));
// }
// try {
// Map<String, Object> result = birthCertificateService.getByNewDetailsOracleOldAndNew(formattedDob,
// fatherName, motherName, childName, formattedGender);
// if (result == null || result.isEmpty() || "not_found".equals(result.get("status"))) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
// }
// //System.out.println("result===="+result);
// Object certDetailsObj = result.get("certificate_details");
// if (certDetailsObj instanceof List<?>) {
// List<?> certDetailsList = (List<?>) certDetailsObj;
// for (Object certObj : certDetailsList) {
// if (certObj instanceof Map<?, ?>) {
// Map<String, Object> certMap = (Map<String, Object>) certObj;
// Object pdfUrlObj = certMap.get("pdf_url");
// if (pdfUrlObj == null || pdfUrlObj.toString().trim().isEmpty()) {
// certMap.put("message", "Awaiting for eSign");
// } else {
// certMap.put("message", "Record fetched successfully");
// }
// }
// }
// }
// result.put("status_code", 200);
// return ResponseEntity.ok(result);
// } catch (Exception ex) {
// ex.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
// // added by yoganandhan for web crslogs
// @PostMapping("/by-detailsnewforWeb")
// public ResponseEntity<?> getBirthDetailsMysqlnewforWeb(@RequestParam(name = "incident_date") String dob,
// @RequestParam(name = "gender") String gender, @RequestParam(required = false,name = "father_name") String fatherName,
// @RequestParam(required = false, name = "mother_name") String motherName,
// @RequestParam(required = false, name = "child_name") String childName) {
// Map<String, Object> error = new LinkedHashMap<>();
// // Validate
// List<String> missing = new ArrayList<>();
// if (dob == null || dob.trim().isEmpty())
// missing.add("incident_date");
// if (gender == null || gender.trim().isEmpty())
// missing.add("gender");
// if (!missing.isEmpty()) {
// error.put("status", "invalid_request");
// error.put("message", "Missing required fields: " + String.join(", ", missing));
// error.put("status_code", 400);
// return ResponseEntity.badRequest().body(error);
// }
// String formattedDob;
// String formattedGender = formatGender(gender);
// try {
// DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// DateTimeFormatter oracleFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// LocalDate incidentDate = LocalDate.parse(dob.trim(), inputFormat);
// LocalDate today = LocalDate.now();
// if (incidentDate.isAfter(today)) {
// return ResponseEntity.badRequest().body(Map.of("status", "future_date_not_allowed", "message",
// "incident_date cannot be a future date", "status_code", 400));
// }
// formattedDob = LocalDate.parse(dob.trim(), inputFormat).format(oracleFormat);
// } catch (DateTimeParseException e) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "incident_date must be in yyyy-MM-dd format", "status_code", 400));
// }
// try {
// Map<String, Object> result = birthCertificateService.getByNewDetailsOracleOldAndNewForWeb(formattedDob,
// fatherName, motherName, childName, formattedGender);
// if (result == null || result.isEmpty() || "not_found".equals(result.get("status"))) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
// }
// //System.out.println("result===="+result);
// Object certDetailsObj = result.get("certificate_details");
// if (certDetailsObj instanceof List<?>) {
// List<?> certDetailsList = (List<?>) certDetailsObj;
// for (Object certObj : certDetailsList) {
// if (certObj instanceof Map<?, ?>) {
// Map<String, Object> certMap = (Map<String, Object>) certObj;
// Object pdfUrlObj = certMap.get("pdf_url");
// if (pdfUrlObj == null || pdfUrlObj.toString().trim().isEmpty()) {
// certMap.put("message", "Awaiting for eSign");
// } else {
// certMap.put("message", "Record fetched successfully");
// }
// }
// }
// }
// result.put("status_code", 200);
// return ResponseEntity.ok(result);
// } catch (Exception ex) {
// ex.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
// //add by yogi for all adoption child details to get
// @GetMapping("/alladoptionbirthdetails")
// public ResponseEntity<Map<String, Object>> getAllAdoptionBirthDetails() {
// List<Map<String, Object>> result = birthCertificateService.getAllAdoptionBirthDetails();
// if (result.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND)
// .body(Map.of(
// "status", "not_found",
// "message", "No adoption birth records found.",
// "status_code", 404
// ));
// }
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "count", result.size(),
// "data", result
// ));
// }
// @GetMapping("/getolddetails")
// public ResponseEntity<Map<String, Object>> getoldDetails(String dob, String gender) {
// // Pass the date of death to the service
// List<Map<String, Object>> result = birthCertificateService.getOldBirthDetails(dob,gender);
// if (result.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND)
// .body(Map.of(
// "status", "not_found",
// "message", "No death records found for the given date.",
// "status_code", 404
// ));
// }
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "count", result.size(),
// "data", result
// ));
// }
// @GetMapping("/getolddetailsstatic")
// public ResponseEntity<Map<String, Object>> getOldBirthDetailsStatic() {
// // Pass the date of death to the service
// Map<String, Object> result = birthCertificateService.getOldBirthDetailsStatic();
// if (result.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND)
// .body(Map.of(
// "status", "not_found",
// "message", "No death records found for the given date.",
// "status_code", 404
// ));
// }
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "count", result.size(),
// "data", result
// ));
// }
}

121
src/main/java/com/gcc/restapiservices/birthanddeath/controller/ChildNameInclusionController.java

@ -0,0 +1,121 @@
// package com.gcc.restapiservices.birthanddeath.controller;
// import com.gcc.restapiservices.birthanddeath.service.ChildNameInclusionService;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.http.ResponseEntity;
// import org.springframework.web.bind.annotation.*;
// import org.springframework.web.multipart.MultipartFile;
// import java.io.IOException;
// import java.nio.file.Files;
// import java.nio.file.Path;
// import java.nio.file.Paths;
// import java.nio.file.StandardCopyOption;
// import java.util.HashMap;
// import java.util.List;
// import java.util.Map;
// @RequestMapping("/gccrestservices/api/childnameinclusion")
// @RestController
// public class ChildNameInclusionController {
// private ChildNameInclusionService childNameInclusionService;
// @Autowired
// public ChildNameInclusionController(ChildNameInclusionService childNameInclusionService) {
// this.childNameInclusionService = childNameInclusionService;
// }
// @GetMapping("/getByRegNo")
// public Map<String, Object> getByRegNo(@RequestParam String regNo, @RequestParam String mobile) {
// return childNameInclusionService.getByRegNo(regNo, mobile);
// }
// @GetMapping("/getDetailsByMobNo")
// public Map<String,Object> getDetailsByMobNo(@RequestParam String mobile){
// return childNameInclusionService.getDetailsByMobNo(mobile);
// }
// // @PostMapping("/save")
// // public ResponseEntity<Map<String, Object>> saveBirthDeath(
// // @RequestParam Map<String, String> formFields,
// // @RequestParam("fle_par_dcl") MultipartFile fleParDcl,
// // @RequestParam("fle_par_id") MultipartFile fleParId,
// // @RequestParam("fle_afft_ltr") MultipartFile fleAfftLtr,
// // @RequestParam("fle_dob") MultipartFile fleDob
// // ) {
// // Map<String, Object> response = new HashMap<>();
// // try {
// // // ✅ Required text fields
// // String[] requiredTextFields = {
// // "reg_no", "isBD", "txt_mob", "rd_birth_corr", "m_child"
// // };
// // for (String field : requiredTextFields) {
// // if (!formFields.containsKey(field) || formFields.get(field).trim().isEmpty()) {
// // response.put("statusCode", 400);
// // response.put("message", "Missing or empty required field: " + field);
// // return ResponseEntity.badRequest().body(response);
// // }
// // }
// //
// // // ✅ Validate files
// // checkFileRequired(fleParDcl, "fle_par_dcl");
// // checkFileRequired(fleParId, "fle_par_id");
// // checkFileRequired(fleAfftLtr, "fle_afft_ltr");
// // checkFileRequired(fleDob, "fle_dob");
// //
// // // ✅ Build files map for service
// // Map<String, MultipartFile> filesMap = new HashMap<>();
// // filesMap.put("fle_par_dcl", fleParDcl);
// // filesMap.put("fle_par_id", fleParId);
// // filesMap.put("fle_afft_ltr", fleAfftLtr);
// // filesMap.put("fle_dob", fleDob);
// //
// // // ✅ Call service with BOTH parameters
// // String ackNo = childNameInclusionService.saveChildNameInclusion(formFields, filesMap);
// //
// // response.put("statusCode", 200);
// // response.put("message", "Your request for birth child name inclusion has been received successfully");
// // response.put("acknowledgementNumber", ackNo);
// // return ResponseEntity.ok(response);
// //
// // } catch (IOException e) {
// // response.put("statusCode", 400);
// // response.put("message", "File saving error: " + e.getMessage());
// // return ResponseEntity.badRequest().body(response);
// // } catch (IllegalArgumentException e) {
// // response.put("statusCode", 400);
// // response.put("message", e.getMessage());
// // return ResponseEntity.badRequest().body(response);
// // } catch (Exception e) {
// // response.put("statusCode", 500);
// // response.put("message", "Server error: " + e.getMessage());
// // return ResponseEntity.status(500).body(response);
// // }
// // }
// //
// // private void checkFileRequired(MultipartFile file, String name) {
// // if (file == null || file.isEmpty()) {
// // throw new IllegalArgumentException("Missing required file: " + name);
// // }
// // }
// //
// //
// //
// //
// //
// // private String saveFileLocally(MultipartFile file, String regNo) throws IOException {
// // String uploadDir = System.getProperty("user.dir") + "/uploads/" + regNo;
// // Files.createDirectories(Paths.get(uploadDir));
// //
// // String fileName = System.currentTimeMillis() + "_" + file.getOriginalFilename();
// // Path filePath = Paths.get(uploadDir, fileName);
// //
// // Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);
// //
// // // returning relative path for DB storage
// // return "/uploads/" + regNo + "/" + fileName;
// // }
// }

440
src/main/java/com/gcc/restapiservices/birthanddeath/controller/DeathApiController.java

@ -0,0 +1,440 @@
// package com.gcc.restapiservices.birthanddeath.controller;
// import java.time.LocalDate;
// import java.time.format.DateTimeFormatter;
// import java.time.format.DateTimeParseException;
// import java.util.ArrayList;
// import java.util.LinkedHashMap;
// import java.util.List;
// import java.util.Map;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.dao.EmptyResultDataAccessException;
// import org.springframework.http.HttpStatus;
// import org.springframework.http.ResponseEntity;
// import org.springframework.web.bind.annotation.GetMapping;
// import org.springframework.web.bind.annotation.PostMapping;
// import org.springframework.web.bind.annotation.RequestMapping;
// import org.springframework.web.bind.annotation.RequestParam;
// import org.springframework.web.bind.annotation.RestController;
// import com.gcc.restapiservices.birthanddeath.service.DeathCertificateService;
// @RequestMapping("/gccrestservices/api/death-certificate")
// @RestController
// public class DeathApiController {
// @Autowired
// private DeathCertificateService deathCertificateService;
// @PostMapping("/by-registration")
// public ResponseEntity<?> getByRegistration(@RequestParam("registration_number") String regNo) {
// try {
// // Validate presence
// if (regNo == null || regNo.trim().isEmpty()) {
// Map<String, Object> error = new LinkedHashMap<>();
// error.put("status", "invalid_request");
// error.put("message", "Registration number is required");
// error.put("status_code", 400);
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
// }
// // Map<String, Object> result =
// // deathCertificateService.getByRegistrationNumber(regNo);
// String formattedRegNo = regNo.trim().toUpperCase();
// Map<String, Object> result = deathCertificateService.getDeathByRegistrationNumber(formattedRegNo);
// // Inject status and status code into response
// if (result.containsKey("certificate_details")) {
// Object pdfUrl = result.get("pdf_url");
// if (pdfUrl == null || pdfUrl.toString().isEmpty()) {
// result.put("message", "Awaiting for eSign");
// } else {
// result.put("message", "Record fetched successfully");
// }
// result.put("status", "success");
// result.put("status_code", 200);
// //result.put("message", "Record fetched successfully");
// return ResponseEntity.ok(result);
// } else {
// return ResponseEntity.ok(result);
// }
// } catch (EmptyResultDataAccessException ex) {
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "not_found");
// response.put("message", "no data found for given registration number");
// response.put("status_code", 404);
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
// } catch (Exception ex) {
// Map<String, Object> error = new LinkedHashMap<>();
// error.put("status", "error");
// error.put("message", "An unexpected error occurred " + ex);
// error.put("status_code", 500);
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
// }
// }
// @PostMapping("/by-mobile")
// public ResponseEntity<?> getByMobile(@RequestParam(value = "mobile_number") String mobile) {
// try {
// // Validate presence
// if (mobile == null || mobile.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_request", "message",
// "Mobile number is required", "status_code", 400));
// }
// mobile = mobile.trim();
// // Validate format: 10 digits
// if (!mobile.matches("^\\d{10}$")) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "Invalid mobile number format. Expected: 10-digit number", "status_code", 400));
// }
// List<Map<String, Object>> results = deathCertificateService.getByMobile(mobile);
// // List<Map<String, Object>> results =
// // deathCertificateService.getDeathByMobile(mobile.trim());
// if (results.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of("status", "not_found", "message",
// "No records found for the given mobile number", "status_code", 404));
// }
// // Inject status and status_code into each record
// List<Map<String, Object>> finalResults = new ArrayList<>();
// for (Map<String, Object> record : results) {
// if(record.get("pdf_url") == null || record.get("pdf_url").toString().isEmpty()) {
// record.put("message", "Awaiting for eSign");
// } else {
// record.put("message", "Record fetched successfully");
// }
// record.put("status", "success");
// record.put("status_code", 200);
// finalResults.add(record);
// }
// return ResponseEntity.ok(finalResults);
// } catch (Exception ex) {
// ex.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
// // oracle working
// @PostMapping("/by-details")
// public ResponseEntity<?> getDeathDetailsOracle(@RequestParam(name = "incident_date") String dod,
// @RequestParam(name = "gender") String gender, @RequestParam(name = "father_name") String fatherName,
// @RequestParam(name = "mother_name") String motherName,
// @RequestParam(required = false, name = "person_name") String personName) {
// Map<String, Object> error = new LinkedHashMap<>();
// // Validate required fields
// List<String> missing = new ArrayList<>();
// if (dod == null || dod.trim().isEmpty())
// missing.add("death_date");
// if (fatherName == null || fatherName.trim().isEmpty())
// missing.add("father_name");
// if (motherName == null || motherName.trim().isEmpty())
// missing.add("mother_name");
// if (gender == null || gender.trim().isEmpty())
// missing.add("gender");
// if (!missing.isEmpty()) {
// error.put("status", "invalid_request");
// error.put("message", "Missing required fields: " + String.join(", ", missing));
// error.put("status_code", 400);
// return ResponseEntity.badRequest().body(error);
// }
// // ✅ Format gender like "Male"/"Female" to "M"/"F"
// String formattedGender = formatGender(gender);
// // ✅ Format DoD to dd-MM-yyyy for Oracle
// String formattedDod;
// try {
// DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// DateTimeFormatter oracleFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// formattedDod = LocalDate.parse(dod.trim(), inputFormat).format(oracleFormat);
// LocalDate incidentDate = LocalDate.parse(dod.trim(), inputFormat);
// LocalDate today = LocalDate.now();
// if (incidentDate.isAfter(today)) {
// return ResponseEntity.badRequest().body(Map.of("status", "future_date_not_allowed", "message",
// "incident_date cannot be a future date", "status_code", 400));
// }
// } catch (DateTimeParseException e) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "incident_date must be in yyyy-MM-dd format", "status_code", 400));
// }
// try {
// // System.out.println("📥 DOD : " + formattedDod);
// // System.out.println("📥 Father : " + fatherName);
// // System.out.println("📥 Mother : " + motherName);
// // System.out.println("📥 Gender : " + formattedGender);
// // System.out.println("📥 Person : " + (personName != null ? personName : "[EMPTY]"));
// Map<String, Object> result = deathCertificateService.getByDetailsOracleOldAndNewForDeath(formattedDod,
// fatherName, motherName, personName, formattedGender);
// if (result.isEmpty() || "not_found".equals(result.get("status"))) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of("status", "not_found", "message",
// "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404));
// }
// result.put("status_code", 200);
// result.put("message", "Record fetched successfully");
// return ResponseEntity.ok(result);
// } catch (Exception ex) {
// ex.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
// // Helper method for 400 error
// private ResponseEntity<Map<String, Object>> badRequest(String message) {
// Map<String, Object> error = new LinkedHashMap<>();
// error.put("status", "invalid_request");
// error.put("message", message);
// error.put("status_code", 400);
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
// }
// public static String formatGender(String gender) {
// if (gender == null)
// return null;
// gender = gender.trim().toLowerCase();
// if (gender.equals("male")) {
// return "M";
// } else if (gender.equals("female")) {
// return "F";
// } else {
// // Fallback: capitalize first letter
// return gender.substring(0, 1).toUpperCase() + gender.substring(1);
// }
// }
// // added by hariprasath
// @PostMapping("/by-detailsnew")
// public ResponseEntity<?> getDeathDetailsOraclenew(@RequestParam(name = "incident_date") String dod,
// @RequestParam(name = "gender") String gender, @RequestParam(name = "father_name") String fatherName,
// @RequestParam(name = "mother_name") String motherName,
// @RequestParam(required = false, name = "person_name") String personName) {
// Map<String, Object> error = new LinkedHashMap<>();
// // Validate required fields
// List<String> missing = new ArrayList<>();
// if (dod == null || dod.trim().isEmpty())
// missing.add("incident_date");
// if (fatherName == null || fatherName.trim().isEmpty())
// missing.add("father_name");
// if (motherName == null || motherName.trim().isEmpty())
// missing.add("mother_name");
// if (gender == null || gender.trim().isEmpty())
// missing.add("gender");
// if (!missing.isEmpty()) {
// error.put("status", "invalid_request");
// error.put("message", "Missing required fields: " + String.join(", ", missing));
// error.put("status_code", 400);
// return ResponseEntity.badRequest().body(error);
// }
// // ✅ Format gender like "Male"/"Female" to "M"/"F"
// String formattedGender = formatGender(gender);
// // ✅ Format DoD to dd-MM-yyyy for Oracle
// String formattedDod;
// try {
// DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// DateTimeFormatter oracleFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// formattedDod = LocalDate.parse(dod.trim(), inputFormat).format(oracleFormat);
// LocalDate incidentDate = LocalDate.parse(dod.trim(), inputFormat);
// LocalDate today = LocalDate.now();
// if (incidentDate.isAfter(today)) {
// return ResponseEntity.badRequest().body(Map.of("status", "future_date_not_allowed", "message",
// "incident_date cannot be a future date", "status_code", 400));
// }
// } catch (DateTimeParseException e) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "incident_date must be in yyyy-MM-dd format", "status_code", 400));
// }
// try {
// Map<String, Object> result = deathCertificateService.getBynewDetailsOracleOldAndNewForDeath(formattedDod,
// fatherName, motherName, personName, formattedGender);
// if (result.isEmpty() || "not_found".equals(result.get("status"))) {
// // return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of(
// // "status", "not_found",
// // "message", "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// // "status_code", 404
// // ));
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
// }
// Object certDetailsObj = result.get("certificate_details");
// if (certDetailsObj instanceof List<?>) {
// List<?> certDetailsList = (List<?>) certDetailsObj;
// for (Object certObj : certDetailsList) {
// if (certObj instanceof Map<?, ?>) {
// Map<String, Object> certMap = (Map<String, Object>) certObj;
// Object pdfUrlObj = certMap.get("pdf_url");
// if (pdfUrlObj == null || pdfUrlObj.toString().trim().isEmpty()) {
// certMap.put("message", "Awaiting for eSign");
// } else {
// certMap.put("message", "Record fetched successfully");
// }
// }
// }
// }
// result.put("status_code", 200);
// //result.put("message", "Record fetched successfully");
// return ResponseEntity.ok(result);
// } catch (Exception ex) {
// ex.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
// // added by yogi for web crslogs
// @PostMapping("/by-detailsnewforWeb")
// public ResponseEntity<?> getDeathDetailsOraclenewforWeb(@RequestParam(name = "incident_date") String dod,
// @RequestParam(name = "gender") String gender, @RequestParam(required = false,name = "father_name") String fatherName,
// @RequestParam(required = false, name = "mother_name") String motherName,
// @RequestParam(required = false, name = "person_name") String personName) {
// Map<String, Object> error = new LinkedHashMap<>();
// // Validate required fields
// List<String> missing = new ArrayList<>();
// if (dod == null || dod.trim().isEmpty())
// missing.add("incident_date");
// if (gender == null || gender.trim().isEmpty())
// missing.add("gender");
// if (!missing.isEmpty()) {
// error.put("status", "invalid_request");
// error.put("message", "Missing required fields: " + String.join(", ", missing));
// error.put("status_code", 400);
// return ResponseEntity.badRequest().body(error);
// }
// // ✅ Format gender like "Male"/"Female" to "M"/"F"
// String formattedGender = formatGender(gender);
// // ✅ Format DoD to dd-MM-yyyy for Oracle
// String formattedDod;
// try {
// DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// DateTimeFormatter oracleFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
// formattedDod = LocalDate.parse(dod.trim(), inputFormat).format(oracleFormat);
// LocalDate incidentDate = LocalDate.parse(dod.trim(), inputFormat);
// LocalDate today = LocalDate.now();
// if (incidentDate.isAfter(today)) {
// return ResponseEntity.badRequest().body(Map.of("status", "future_date_not_allowed", "message",
// "incident_date cannot be a future date", "status_code", 400));
// }
// } catch (DateTimeParseException e) {
// return ResponseEntity.badRequest().body(Map.of("status", "invalid_format", "message",
// "incident_date must be in yyyy-MM-dd format", "status_code", 400));
// }
// try {
// Map<String, Object> result = deathCertificateService.getBynewDetailsOracleOldAndNewForWeb(formattedDod,
// fatherName, motherName, personName, formattedGender);
// if (result.isEmpty() || "not_found".equals(result.get("status"))) {
// // return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of(
// // "status", "not_found",
// // "message", "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// // "status_code", 404
// // ));
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
// }
// //System.out.println(" " + dod + " " + fatherName + " " + motherName + " " + personName);
// //System.out.println("deathdetails:" + result);
// Object certDetailsObj = result.get("certificate_details");
// if (certDetailsObj instanceof List<?>) {
// List<?> certDetailsList = (List<?>) certDetailsObj;
// for (Object certObj : certDetailsList) {
// if (certObj instanceof Map<?, ?>) {
// Map<String, Object> certMap = (Map<String, Object>) certObj;
// Object pdfUrlObj = certMap.get("pdf_url");
// if (pdfUrlObj == null || pdfUrlObj.toString().trim().isEmpty()) {
// certMap.put("message", "Awaiting for eSign");
// } else {
// certMap.put("message", "Record fetched successfully");
// }
// }
// }
// }
// //System.out.println("deathdetailscontroller:" + result);
// result.put("status_code", 200);
// //result.put("message", "Record fetched successfully");
// return ResponseEntity.ok(result);
// } catch (Exception ex) {
// ex.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("status", "error", "message",
// "An unexpected error occurred: " + ex.getMessage(), "status_code", 500));
// }
// }
// // old details for testing
// @GetMapping("/getolddetails")
// public ResponseEntity<Map<String, Object>> getoldDetails(String dod, String gender) {
// // Pass the date of death to the service
// List<Map<String, Object>> result = deathCertificateService.getOldDeathDetails(dod,gender);
// if (result.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND)
// .body(Map.of(
// "status", "not_found",
// "message", "No death records found for the given date.",
// "status_code", 404
// ));
// }
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "count", result.size(),
// "data", result
// ));
// }
// }

1095
src/main/java/com/gcc/restapiservices/birthanddeath/service/BirthCertificateService.java
File diff suppressed because it is too large
View File

420
src/main/java/com/gcc/restapiservices/birthanddeath/service/ChildNameInclusionService.java

@ -0,0 +1,420 @@
// package com.gcc.restapiservices.birthanddeath.service;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.beans.factory.annotation.Qualifier;
// import org.springframework.dao.DataAccessException;
// import org.springframework.jdbc.core.JdbcTemplate;
// import org.springframework.stereotype.Service;
// import org.springframework.web.multipart.MultipartFile;
// import javax.sql.DataSource;
// import java.io.File;
// import java.io.IOException;
// import java.nio.file.Files;
// import java.nio.file.Path;
// import java.nio.file.Paths;
// import java.nio.file.StandardCopyOption;
// import java.util.HashMap;
// import java.util.List;
// import java.util.Map;
// @Service
// public class ChildNameInclusionService {
// private JdbcTemplate jdbcTemplate;
// @Autowired
// public ChildNameInclusionService(JdbcTemplate jdbcTemplate) {
// this.jdbcTemplate = jdbcTemplate;
// }
// // private final RestTemplate restTemplate;
// // public ChildNameInclusionService(@Qualifier("sslBypassRestTemplate") RestTemplate restTemplate) {
// // this.restTemplate = restTemplate;
// // }
// //birth and death new live db connection
// @Autowired
// @Qualifier("oracleBirthNewDataSourceItCell")
// private DataSource newBirthDataSource;
// //birth and death old live db connection
// @Autowired
// @Qualifier("oracleBirthOldDataSourceItCell")
// private DataSource oldBirthDataSource;
// public Map<String, Object> getByRegNo(String regNo, String mobile) {
// JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// JdbcTemplate oldJdbc = new JdbcTemplate(oldBirthDataSource);
// Map<String, Object> response = new HashMap<>();
// Map<String, Object> result = new HashMap<>();
// if (regNo.isEmpty() || regNo == null) {
// result.put("Message", "Please provide Registration Number");
// response.put("Response", result);
// return response;
// }
// String newSql = "Select case when ceil (months_between(sysdate,date_of_birth)/12)>=5 then 1 else 0 end age_5," +
// " (select zone_code||'-'||zone_name from tbl_zone z where z.zone_id=x.zone_id) zone_name, " +
// " (select division_name from tbl_division d where d.divison_id=x.divison_id) division_name, " +
// " to_char(DATE_OF_BIRTH,'dd/mm/yyyy') DATE_OF_BIRTH , TO_CHAR(CREATED_DATE,'DD/MM/RRRR') CREATED_DATE, NVL(SEX,' ') SEX ," +
// " nvl(CHILD_NAME,' ') CHILD_NAME , nvl(FATHER_NAME,' ') FATHER_NAME , nvl(MOTHER_NAME,' ') MOTHER_NAME, nvl(FATH_MOB_NO, ' ') FATH_MOB_NO, nvl(MOTH_MOB_NO, ' ') MOTH_MOB_NO, " +
// " nvl(X.PERMANENT_ADDRESS1,' ') ||' '|| nvl(X.PERMANENT_ADDRESS2,' ') ||' '|| " +
// " case when nvl(X.PERMANENT_ADDRESS3,'NULL') not like 'NULL%' then X.PERMANENT_ADDRESS3 else ' ' end ||' '|| replace( " +
// " (CASE WHEN trim(X.PERMTBLDGNO) IS NOT NULL THEN X.PERMTBLDGNO ||', ' ELSE ' ' END || " +
// " CASE WHEN trim(X.PERMTHOUSENO) IS NOT NULL THEN X.PERMTHOUSENO ||', ' ELSE ' 'END || " +
// "CASE WHEN INSTR(X.PERMTADDR1,'_')>=0 THEN SUBSTR(X.PERMTADDR1,1,INSTR(X.PERMTADDR1,'_')-1)||', ' ELSE X.PERMTADDR1||', ' END|| " +
// " CASE WHEN nvl(X.PERMTVLG,'NL') not in ('NL','NULL_NULL') THEN X.PERMTVLG ||', ' ELSE '' END || " +
// " CASE WHEN INSTR(X.PERMTADDR1,'_')>=0 THEN SUBSTR(X.PERMTADDR1,INSTR(X.PERMTADDR1,'_')+1)||', ' ELSE X.PERMTADDR1||', ' END || " +
// " CASE WHEN INSTR(X.PERMTSUBDIST,'_')>0 THEN SUBSTR(X.PERMTSUBDIST,1,INSTR(X.PERMTSUBDIST,'_')-1) ELSE X.PERMTSUBDIST END ||', '|| " +
// " CASE WHEN INSTR(X.PERMTDIST,'_')>0 THEN SUBSTR(X.PERMTDIST,1,INSTR(X.PERMTDIST,'_')-1) ELSE X.PERMTDIST END ||', '|| " +
// " CASE WHEN X.PERMTSTATE IS NOT NULL THEN X.PERMTSTATE ELSE ' ' END || " +
// " CASE WHEN TO_CHAR(X.PERMTPIN) IS NOT NULL THEN '-'||X.PERMTPIN ||' ' ELSE ' 'END),', ', ', ') || " +
// " case nvl(X.PERMANENT_PIN,'0') when '0' then ' ' else ' '||X.PERMANENT_PIN end PERM_ADDR, " +
// " CASE WHEN X.PARENTBLDGNO IS NOT NULL THEN X.PARENTBLDGNO||', ' ELSE ' ' END || " +
// " CASE WHEN X.PARENTHOUSENO IS NOT NULL THEN X.PARENTHOUSENO||', ' ELSE ' ' END || " +
// " CASE WHEN nvl(X.PARENTADDRESS,'_') not in ('_','NULL_NULL') THEN nvl(substr(X.PARENTADDRESS,1,instr(X.PARENTADDRESS,'_')-1),' ') ||' , ' ELSE ' ' END || " +
// " CASE WHEN X.PARENTVLG IS NOT NULL THEN X.PARENTVLG||', ' ELSE ' ' END || " +
// " CASE WHEN nvl(X.PARENTADDRESS,'_') not in ('_','NULL_NULL') THEN nvl(substr(X.PARENTADDRESS,instr(X.PARENTADDRESS,'_')+1),' ') ||' , ' ELSE ' ' END || " +
// " CASE WHEN INSTR(X.PARENTSUBDIST,'_') >0 THEN SUBSTR(X.PARENTSUBDIST,1,INSTR(X.PARENTSUBDIST,'_')-1 ) ELSE X.PARENTSUBDIST END ||', '||" +
// " CASE WHEN INSTR(X.PARENTDIST,'_') >0 THEN SUBSTR(X.PARENTDIST,1,INSTR(X.PARENTDIST,'_')-1 ) ELSE X.PARENTDIST END ||', '|| " +
// " CASE WHEN X.PARENTSTATE IS NOT NULL AND X.PARENTSTATE IN ('1','2') THEN X.PARENTSTATE ELSE X.PARENTSTATE END || " +
// " nvl(X.CURRENT_ADDRESS1,' ') ||' '||nvl(X.CURRENT_ADDRESS2,' ') ||' '||nvl(X.CURRENT_ADDRESS3,' ') ||' '|| nvl(X.cnt_name,' ') ||' '|| " +
// " CASE WHEN PARENTPIN IS NOT NULL THEN '- '|| PARENTPIN ELSE ' ' END currentAddress ," +
// " CASE WHEN BIRTH_PLACE !=1 THEN " +
// " BIRTH_PLACE||' '||PLACE_OF_BIRTH_ADD1||' '||PLACE_OF_BIRTH_ADD2||' '||PLACE_OF_BIRTH_ADD3||' '||PLACE_OF_BIRTH_PIN " +
// " ELSE " +
// " (SELECT HOSPITAL_NAME||chr(13) ||HOSPITAL_ADDRESS1||' '||HOSPITAL_ADDRESS2||' ' ||HOSPITAL_ADDRESS3||' '||HOSPITAL_PIN " +
// " FROM TBL_HOSPITAL H WHERE H.HOSPITAL_ID=X.HOSPITAL_ID) END PLACE_BIRTH ,'COC' COC " +
// " from TBL_BIRTH_DETAILS X where registration_number= ? and child_name is null " +
// " and zone_id between 501 and 515 ";
// String oldSql = "Select case when ceil (months_between(sysdate,date_of_birth)/12)>=5 then 1 else 0 end age_5," +
// " (select zone_code||'-'||zone_name from tbl_zone z where z.zone_id=x.zone_id) zone_name, " +
// " (select division_name from tbl_division d where d.divison_id=x.divison_id) division_name, " +
// " to_char(DATE_OF_BIRTH,'dd/mm/yyyy') DATE_OF_BIRTH , TO_CHAR(CREATED_DATE,'DD/MM/RRRR') CREATED_DATE, NVL(SEX,' ') SEX ," +
// " nvl(CHILD_NAME,' ') CHILD_NAME , nvl(FATHER_NAME,' ') FATHER_NAME , nvl(MOTHER_NAME,' ') MOTHER_NAME, registration_number, " +
// " nvl(PERMANENT_ADDRESS1,' ') ||'<br>'||nvl(PERMANENT_ADDRESS2,' ')||'<br>' || " +
// " nvl(PERMANENT_ADDRESS3,' ')||'-' || PERMANENT_PIN PERM_ADDR, " +
// " " +
// " nvl(CURRENT_ADDRESS1,' ') ||'<br>'||nvl(CURRENT_ADDRESS2,' ')||'<br>' || " +
// " nvl(CURRENT_ADDRESS3,' ')||'-' || CURRENT_PIN PERM_ADDR, " +
// " " +
// " CASE WHEN BIRTH_PLACE !=1 THEN " +
// " BIRTH_PLACE||' '||PLACE_OF_BIRTH_ADD1||' '||PLACE_OF_BIRTH_ADD2||' '||PLACE_OF_BIRTH_ADD3||' '||PLACE_OF_BIRTH_PIN " +
// " ELSE " +
// " (SELECT HOSPITAL_NAME||chr(13) ||HOSPITAL_ADDRESS1||' '||HOSPITAL_ADDRESS2||' ' ||HOSPITAL_ADDRESS3||' '||HOSPITAL_PIN " +
// " FROM TBL_HOSPITAL H WHERE H.HOSPITAL_ID=X.HOSPITAL_ID) END PLACE_BIRTH ,'COC' COC " +
// " from TBL_BIRTH_DETAILS X where registration_number= ? and " +
// " zone_id between 54 and 68 and child_name is null ";
// try {
// System.out.println("check 12");
// List<Map<String, Object>> newResults = newJdbc.queryForList(newSql, regNo);
// System.out.println("check 11");
// // System.out.println("mob no.."+newResults.get("FATH_MOB_NO")+"\n"+newResults.get("MOTH_MOB_NO")+"\nsize:"+newResults.size());
// if (!newResults.isEmpty()) {
// System.out.println("check 1");
// String father = (newResults.get(0).get("FATH_MOB_NO") != null && !newResults.get(0).get("FATH_MOB_NO").toString().trim().isEmpty())
// ? newResults.get(0).get("FATH_MOB_NO").toString().trim()
// : "";
// String mother = (newResults.get(0).get("MOTH_MOB_NO") != null && !newResults.get(0).get("MOTH_MOB_NO").toString().trim().isEmpty())
// ? newResults.get(0).get("MOTH_MOB_NO").toString().trim()
// : "";
// if (mobile.equalsIgnoreCase(father) || mobile.equalsIgnoreCase(mother) || father.isEmpty() || mother.isEmpty()) {
// result.put("Status", "Sucess");
// result.put("Status Code", 200);
// result.put("Message", "Child Data fetched successfully");
// result.put("Data", newResults);
// response.put("Response", result);
// return response;
// } else {
// result.put("Message", "Kindly check through your registered mobile number");
// response.put("Response", result);
// return response;
// }
// }
// List<Map<String, Object>> oldResults = oldJdbc.queryForList(oldSql, regNo);
// // List<Map<String, Object>> oldResults = oldJdbc.queryForList(oldSql);
// if (!oldResults.isEmpty()) {
// result.put("Status", "Sucess");
// result.put("Status Code", 200);
// result.put("Message", "Child Data fetched successfully");
// result.put("Data", oldResults);
// response.put("Response", result);
// return response;
// }
// if (newResults.isEmpty() && oldResults.isEmpty()) {
// result.put("Status", "Not Found");
// result.put("Message", "Child Data Not Found");
// result.put("Status Code", 404);
// response.put("Response", result);
// return response;
// }
// } catch (Exception e) {
// e.printStackTrace();
// result.put("Status", "Error");
// result.put("Message", "Error in fetching Child Data :" + e);
// result.put("Status Code", 500);
// response.put("Response", result);
// }
// return response;
// }
// public Map<String, Object> getDetailsByMobNo(String mobile) {
// JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// JdbcTemplate oldJdbc = new JdbcTemplate(oldBirthDataSource);
// Map<String, Object> response = new HashMap<>();
// Map<String, Object> result = new HashMap<>();
// if (mobile.isEmpty() || mobile == null) {
// result.put("Message", "Please provide Registration Number");
// response.put("Response", result);
// return response;
// }
// String newSql = "Select case when ceil (months_between(sysdate,date_of_birth)/12)>=5 then 1 else 0 end age_5," +
// " (select zone_code||'-'||zone_name from tbl_zone z where z.zone_id=x.zone_id) zone_name, " +
// " (select division_name from tbl_division d where d.divison_id=x.divison_id) division_name, " +
// " to_char(DATE_OF_BIRTH,'dd/mm/yyyy') DATE_OF_BIRTH , TO_CHAR(CREATED_DATE,'DD/MM/RRRR') CREATED_DATE, NVL(SEX,' ') SEX ," +
// " nvl(CHILD_NAME,' ') CHILD_NAME , nvl(FATHER_NAME,' ') FATHER_NAME , nvl(MOTHER_NAME,' ') MOTHER_NAME, nvl(FATH_MOB_NO, ' ') FATH_MOB_NO, nvl(MOTH_MOB_NO, ' ') MOTH_MOB_NO, " +
// " nvl(X.PERMANENT_ADDRESS1,' ') ||' '|| nvl(X.PERMANENT_ADDRESS2,' ') ||' '|| " +
// " case when nvl(X.PERMANENT_ADDRESS3,'NULL') not like 'NULL%' then X.PERMANENT_ADDRESS3 else ' ' end ||' '|| replace( " +
// " (CASE WHEN trim(X.PERMTBLDGNO) IS NOT NULL THEN X.PERMTBLDGNO ||', ' ELSE ' ' END || " +
// " CASE WHEN trim(X.PERMTHOUSENO) IS NOT NULL THEN X.PERMTHOUSENO ||', ' ELSE ' 'END || " +
// " CASE WHEN INSTR(X.PERMTADDR1,'_')>=0 THEN SUBSTR(X.PERMTADDR1,1,INSTR(X.PERMTADDR1,'_')-1)||', ' ELSE X.PERMTADDR1||', ' END|| " +
// " CASE WHEN nvl(X.PERMTVLG,'NL') not in ('NL','NULL_NULL') THEN X.PERMTVLG ||', ' ELSE '' END || " +
// " CASE WHEN INSTR(X.PERMTADDR1,'_')>=0 THEN SUBSTR(X.PERMTADDR1,INSTR(X.PERMTADDR1,'_')+1)||', ' ELSE X.PERMTADDR1||', ' END || " +
// " CASE WHEN INSTR(X.PERMTSUBDIST,'_')>0 THEN SUBSTR(X.PERMTSUBDIST,1,INSTR(X.PERMTSUBDIST,'_')-1) ELSE X.PERMTSUBDIST END ||', '|| " +
// " CASE WHEN INSTR(X.PERMTDIST,'_')>0 THEN SUBSTR(X.PERMTDIST,1,INSTR(X.PERMTDIST,'_')-1) ELSE X.PERMTDIST END ||', '|| " +
// " CASE WHEN X.PERMTSTATE IS NOT NULL THEN X.PERMTSTATE ELSE ' ' END || " +
// " CASE WHEN TO_CHAR(X.PERMTPIN) IS NOT NULL THEN '-'||X.PERMTPIN ||' ' ELSE ' 'END),', ', ', ') || " +
// " case nvl(X.PERMANENT_PIN,'0') when '0' then ' ' else ' '||X.PERMANENT_PIN end PERM_ADDR, " +
// " " +
// " CASE WHEN X.PARENTBLDGNO IS NOT NULL THEN X.PARENTBLDGNO||', ' ELSE ' ' END || " +
// " CASE WHEN X.PARENTHOUSENO IS NOT NULL THEN X.PARENTHOUSENO||', ' ELSE ' ' END || " +
// " CASE WHEN nvl(X.PARENTADDRESS,'_') not in ('_','NULL_NULL') THEN nvl(substr(X.PARENTADDRESS,1,instr(X.PARENTADDRESS,'_')-1),' ') ||' , ' ELSE ' ' END || " +
// " CASE WHEN X.PARENTVLG IS NOT NULL THEN X.PARENTVLG||', ' ELSE ' ' END || " +
// " CASE WHEN nvl(X.PARENTADDRESS,'_') not in ('_','NULL_NULL') THEN nvl(substr(X.PARENTADDRESS,instr(X.PARENTADDRESS,'_')+1),' ') ||' , ' ELSE ' ' END || " +
// " CASE WHEN INSTR(X.PARENTSUBDIST,'_') >0 THEN SUBSTR(X.PARENTSUBDIST,1,INSTR(X.PARENTSUBDIST,'_')-1 ) ELSE X.PARENTSUBDIST END ||', '||" +
// " CASE WHEN INSTR(X.PARENTDIST,'_') >0 THEN SUBSTR(X.PARENTDIST,1,INSTR(X.PARENTDIST,'_')-1 ) ELSE X.PARENTDIST END ||', '|| " +
// " CASE WHEN X.PARENTSTATE IS NOT NULL AND X.PARENTSTATE IN ('1','2') THEN X.PARENTSTATE ELSE X.PARENTSTATE END || " +
// " nvl(X.CURRENT_ADDRESS1,' ') ||' '||nvl(X.CURRENT_ADDRESS2,' ') ||' '||nvl(X.CURRENT_ADDRESS3,' ') ||' '|| nvl(X.cnt_name,' ') ||' '|| " +
// " CASE WHEN PARENTPIN IS NOT NULL THEN '- '|| PARENTPIN ELSE ' ' END currentAddress ," +
// " " +
// " " +
// " CASE WHEN BIRTH_PLACE !=1 THEN " +
// " BIRTH_PLACE||' '||PLACE_OF_BIRTH_ADD1||' '||PLACE_OF_BIRTH_ADD2||' '||PLACE_OF_BIRTH_ADD3||' '||PLACE_OF_BIRTH_PIN " +
// " ELSE " +
// " (SELECT HOSPITAL_NAME||chr(13) ||HOSPITAL_ADDRESS1||' '||HOSPITAL_ADDRESS2||' ' ||HOSPITAL_ADDRESS3||' '||HOSPITAL_PIN " +
// " FROM TBL_HOSPITAL H WHERE H.HOSPITAL_ID=X.HOSPITAL_ID) END PLACE_BIRTH ,'COC' COC " +
// " from TBL_BIRTH_DETAILS X where child_name is null and (FATH_MOB_NO= ? OR MOTH_MOB_NO = ?) " +
// " and zone_id between 501 and 515 ";
// try {
// List<Map<String, Object>> newResults = newJdbc.queryForList(newSql, mobile, mobile);
// if (!newResults.isEmpty()) {
// result.put("Status", "Sucess");
// result.put("Status Code", 200);
// result.put("Message", "Child Data fetched successfully");
// result.put("Data", newResults);
// response.put("Response", result);
// } else {
// result.put("Status", "Not Found");
// result.put("Message", "Child Data Not Found");
// result.put("Status Code", 404);
// response.put("Response", result);
// }
// } catch (DataAccessException e) {
// e.printStackTrace();
// result.put("Status", "Error");
// result.put("Message", "Error in fetching Child Data :" + e);
// result.put("Status Code", 500);
// response.put("Response", result);
// }
// return response;
// }
// // public String saveChildNameInclusion(Map<String, String> formFields,
// // Map<String, MultipartFile> files) throws IOException {
// //
// // JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// //
// // // 1. Get sequence values
// // Map<String, Object> seqData = newJdbc.queryForMap(
// // "SELECT birth_death_tn.file_seq.NEXTVAL AS stg_id, birth_death_tn.id.NEXTVAL AS id FROM dual"
// // );
// // String stagId = seqData.get("stg_id").toString();
// // String sId = seqData.get("id").toString();
// //
// // // 2. Handle file uploads
// // if (files != null) {
// // for (Map.Entry<String, MultipartFile> entry : files.entrySet()) {
// // MultipartFile file = entry.getValue();
// // if (!file.isEmpty()) {
// // if (file.getSize() > MAX_FILE_SIZE) {
// // throw new IOException("File size exceeds 4MB: " + entry.getKey());
// // }
// // String originalFileName = file.getOriginalFilename();
// // String ext = originalFileName.substring(originalFileName.lastIndexOf(".") + 1).toLowerCase();
// // if (!ext.equals("jpg") && !ext.equals("jpeg") && !ext.equals("pdf")) {
// // throw new IOException("Invalid file type for: " + entry.getKey());
// // }
// // String newFileName = stagId + "_" + originalFileName;
// // File dest = new File(FILE_PATH, newFileName);
// // file.transferTo(dest);
// // formFields.put(entry.getKey(), newFileName);
// // }
// // }
// // }
// //
// // // 3. Insert into main table
// // String insertCtzn = """
// // INSERT INTO birth_death_tn.tbl_birth_death_corr_ctzn
// // (id, reg_no, isBD, txt_mob, s_user_id, cr_date, ack_no, status, rd_birth_corr)
// // VALUES (?, ?, ?, ?, ?, SYSDATE, NULL, 'P', ?)
// // """;
// // newJdbc.update(insertCtzn,
// // sId,
// // formFields.get("reg_no"),
// // formFields.get("isBD"),
// // formFields.get("txt_mob"),
// // "0",
// // formFields.get("rd_birth_corr")
// // );
// //
// // // 4. Insert into birth correction table
// // String insertBirth = """
// // INSERT INTO birth_death_tn.tbl_birth_corr_fle
// // (id, fle_par_dcl, fle_par_id, fle_afft_ltr, fle_dob, m_child)
// // VALUES (?, ?, ?, ?, ?, ?)
// // """;
// // newJdbc.update(insertBirth,
// // sId,
// // formFields.get("fle_par_dcl"),
// // formFields.get("fle_par_id"),
// // formFields.get("fle_afft_ltr"),
// // formFields.get("fle_dob"),
// // formFields.get("m_child")
// // );
// //
// // // 5. Generate and update acknowledgement number
// // String ackNo = "P/" + formFields.get("isBD") + "/" + sId;
// // newJdbc.update(
// // "UPDATE birth_death_tn.tbl_birth_death_corr_ctzn SET ack_no=? WHERE id=?",
// // ackNo, sId
// // );
// //
// // return ackNo;
// // }
// //
// // public String saveChildNameInclusion(Map<String, String> formFields,
// // Map<String, MultipartFile> files) throws IOException {
// //
// // JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// //
// // // 1. Get sequence values
// // Map<String, Object> seqData = newJdbc.queryForMap(
// // "SELECT birth_death_tn.file_seq.NEXTVAL AS stg_id, birth_death_tn.id.NEXTVAL AS id FROM dual"
// // );
// // String stagId = seqData.get("stg_id").toString();
// // String sId = seqData.get("id").toString();
// //
// // // 2. Folder mapping for each file field
// // Map<String, String> folderMapping = Map.of(
// // "fle_par_dcl", "parentDeclarations",
// // "fle_par_id", "parentIDs",
// // "fle_afft_ltr", "affidavitLetters",
// // "fle_dob", "dobProofs"
// // );
// //
// // // 3. Handle file uploads
// // if (files != null) {
// // for (Map.Entry<String, MultipartFile> entry : files.entrySet()) {
// // MultipartFile file = entry.getValue();
// // String fieldName = entry.getKey();
// //
// // if (!file.isEmpty()) {
// // if (file.getSize() > MAX_FILE_SIZE) {
// // throw new IOException("File size exceeds 4MB: " + fieldName);
// // }
// //
// // String originalFileName = file.getOriginalFilename();
// // String ext = originalFileName.substring(originalFileName.lastIndexOf(".") + 1).toLowerCase();
// // if (!ext.equals("jpg") && !ext.equals("jpeg") && !ext.equals("pdf")) {
// // throw new IOException("Invalid file type for: " + fieldName);
// // }
// //
// // // Determine folder for the file
// // String folderName = folderMapping.getOrDefault(fieldName, "misc");
// // String uploadDir = System.getProperty("user.dir") + "/uploads/childname/" + folderName;
// // Files.createDirectories(Paths.get(uploadDir));
// //
// // // Create new file name
// // String newFileName = stagId + "_" + originalFileName;
// // Path filePath = Paths.get(uploadDir, newFileName);
// //
// // // Save file locally
// // Files.copy(file.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING);
// //
// // // Store relative path in DB
// // String relativePath = "/uploads/childname/" + folderName + "/" + newFileName;
// // formFields.put(fieldName, relativePath);
// // }
// // }
// // }
// //
// // // 4. Insert into main table
// //// String insertCtzn = """
// //// INSERT INTO tbl_birth_death_corr_ctzn
// //// (id, reg_no, isbd, mob, s_user_id, cdate, ack_no, status, corr)
// //// VALUES (tbl_birth_death_corr_ctzn_seq.NEXTVAL, ?, ?, ?, ?, SYSDATE, NULL, 'P', ?)
// ////""";
// ////
// //// newJdbc.update(insertCtzn,
// //// formFields.get("reg_no"), // reg_no
// //// formFields.get("isbd"), // isbd
// //// formFields.get("mob"), // mob
// //// "0", // s_user_id
// //// formFields.get("corr") // corr
// //// );
// //
// //
// //
// //
// // // 5. Insert into birth correction table
// // String insertBirth = """
// // INSERT INTO tbl_birth_corr_fle
// // (id, fle_par_dcl, fle_par_id, fle_afft_ltr, fle_dob, m_child)
// // VALUES (?, ?, ?, ?, ?, ?)
// // """;
// // newJdbc.update(insertBirth,
// // sId,
// // formFields.get("fle_par_dcl"),
// // formFields.get("fle_par_id"),
// // formFields.get("fle_afft_ltr"),
// // formFields.get("fle_dob"),
// // formFields.get("m_child")
// // );
// //
// // // 6. Generate and update acknowledgement number
// // String ackNo = "P/" + formFields.get("isBD") + "/" + sId;
// // newJdbc.update(
// // "UPDATE birth_death_tn.tbl_birth_death_corr_ctzn SET ack_no=? WHERE id=?",
// // ackNo, sId
// // );
// //
// // return ackNo;
// // }
// }

789
src/main/java/com/gcc/restapiservices/birthanddeath/service/DeathCertificateService.java

@ -0,0 +1,789 @@
// package com.gcc.restapiservices.birthanddeath.service;
// import java.time.LocalDate;
// import java.time.ZoneId;
// import java.time.format.DateTimeFormatter;
// import java.util.ArrayList;
// import java.util.Comparator;
// 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.dao.EmptyResultDataAccessException;
// import org.springframework.http.HttpStatus;
// import org.springframework.http.ResponseEntity;
// import org.springframework.jdbc.core.JdbcTemplate;
// import org.springframework.stereotype.Service;
// import org.springframework.web.bind.annotation.GetMapping;
// @Service
// public class DeathCertificateService {
// private JdbcTemplate jdbcTemplate;
// // MYSQL CONNECTION
// // @Autowired
// // public void setDataSource(@Qualifier("mysqlGccRestServicesDataSource") DataSource dataSource) {
// // this.jdbcTemplate = new JdbcTemplate(dataSource);
// // }
// // ORACLE CONNECTION
// // @Autowired
// // public void setDataSource(@Qualifier("oracleDataSourceItCell") DataSource dataSource) {
// // this.jdbcTemplate = new JdbcTemplate(dataSource);
// // }
// @Autowired
// @Qualifier("oracleBirthNewDataSourceItCell")
// private DataSource newBirthDataSource;
// @Autowired
// @Qualifier("oracleBirthOldDataSourceItCell")
// private DataSource oldBirthDataSource;
// // old local db
// private static final String SELECT_FIELDS = """
// regno, person_name, dod, gender, father_name, mother_name, english_url
// """;
// public Map<String, Object> getByRegistrationNumber(String regNo) {
// String sql = "SELECT " + SELECT_FIELDS + " FROM death_certificates WHERE regno = ?";
// return formatResult(jdbcTemplate.queryForMap(sql, regNo));
// }
// // records from live db field names and tables
// private static final String DEATH_SELECT_FIELDS = """
// REGISTRATION_NUMBER AS regno, DATE_OF_DEATH AS dod, SEX AS gender,
// FATHER_NAME AS father_name, MOTHER_NAME AS mother_name, PERSON_NAME AS person_name, '' AS english_url
// """;
// private static final String eSign_CERTIFICATE_URL_PREFIX = "http://gccapp.chennaicorporation.gov.in/birth_death_tn/CORPBIRTHTAMIL/esign/";
// private static final String CERTIFICATE_URL_PREFIX = "http://gccapp.chennaicorporation.gov.in/birth_death_tn/CORPBIRTHTAMIL/GccDeathCertAvail.jsp?RegNo=";
// private static final String OLD_CERTIFICATE_URL_PREFIX="https://chennaicorporation.gov.in/online-civic-services/deathCertificate.do?do=DeathCertificate&registrationNumber=";
// private static final String CRS_CERTIFICATE_URL_PREFIX="https://chennaicorporation.gov.in/online-civic-services/deathCertificateCRS.do?do=DeathCertificate&registrationNumber=";
// public Map<String, Object> getDeathByRegistrationNumber(String regNo) {
// JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// JdbcTemplate oldJdbc = new JdbcTemplate(oldBirthDataSource);
// // Query new schema
// String newSql = """
// SELECT
// dd.REGISTRATION_NUMBER AS regno,
// TO_CHAR(dd.DATE_OF_DEATH , 'DD-MM-YYYY') AS dod,
// TO_CHAR(dd.created_date , 'DD-MM-YYYY') AS created_date,
// dd.SEX AS gender,
// dd.FATHER_NAME AS father_name,
// dd.MOTHER_NAME AS mother_name,
// dd.PERSON_NAME AS person_name,
// CASE
// WHEN (dd.verified_date >= TO_DATE('2019-06-19', 'YYYY-MM-DD')
// OR dd.registration_date >= TO_DATE('2019-06-01', 'YYYY-MM-DD')) THEN 1
// ELSE 0
// END AS reg_val,
// NVL(bec.status, 'NA') AS status,
// bec.cert_file
// FROM tbl_death_details dd
// LEFT JOIN tbl_birth_esign_cert bec ON bec.reg_no = dd.REGISTRATION_NUMBER
// WHERE dd.ZONE_ID IN (501,502,503,504,505,506,507,508,509,510,511,512,513,514,515)
// AND dd.REGISTRATION_NUMBER = ?
// AND ROWNUM = 1
// """;
// List<Map<String, Object>> newResults = newJdbc.queryForList(newSql, regNo);
// if (!newResults.isEmpty()) {
// return formatResult(newResults.get(0));
// }
// // Query old schema if not found in new
// String oldSql = """
// SELECT
// ddo.REGISTRATION_NUMBER AS regno,
// TO_CHAR(ddo.DATE_OF_DEATH, 'DD-MM-YYYY') AS dod,
// TO_CHAR(ddo.created_date , 'DD-MM-YYYY') AS created_date,
// ddo.SEX AS gender,
// ddo.FATHER_NAME AS father_name,
// ddo.MOTHER_NAME AS mother_name,
// ddo.PERSON_NAME AS person_name,
// CASE
// WHEN (ddo.verified_date < TO_DATE('2019-06-19', 'YYYY-MM-DD')) THEN 1
// ELSE 0
// END AS reg_val,
// NVL(beco.status, 'NA') AS status,
// beco.cert_file
// FROM tbl_death_details ddo
// LEFT JOIN tbl_birth_esign_cert beco
// ON (beco.reg_no = ddo.REGISTRATION_NUMBER
// OR beco.reg_no = 'GCC_D_' || ddo.REGISTRATION_NUMBER)
// WHERE ddo.REGISTRATION_NUMBER = ?
// AND ROWNUM = 1
// """;
// List<Map<String, Object>> oldResults = oldJdbc.queryForList(oldSql, regNo);
// if (!oldResults.isEmpty()) {
// return formatResult(oldResults.get(0));
// }
// // return Map.of("status", "not_found", "message", "No record found for the
// // given registration number");
// Map<String, Object> notFound = new LinkedHashMap<>();
// notFound.put("status", "not_found");
// notFound.put("message",
// "No record found for the given registration number.Please ensure registration number is exactly as on the certificate.");
// notFound.put("status_code", 404);
// return notFound;
// }
// //
// // public List<Map<String, Object>> getDeathByMobile(String mobile) {
// // String sql = "SELECT " + DEATH_SELECT_FIELDS +
// // " FROM tbl_death_details WHERE FATH_MOB_NO = ? OR MOTH_MOB_NO = ? " ;
// // List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, mobile, mobile);
// // return results.stream().map(this::formatResult).toList();
// // }
// public List<Map<String, Object>> getByMobile(String mobile) {
// JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// String sql = """
// SELECT
// dd.REGISTRATION_NUMBER AS regno,
// TO_CHAR(dd.DATE_OF_DEATH , 'DD-MM-YYYY') AS dod,
// TO_CHAR(dd.created_date , 'DD-MM-YYYY') AS created_date,
// dd.SEX AS gender,
// dd.FATHER_NAME AS father_name,
// dd.MOTHER_NAME AS mother_name,
// dd.PERSON_NAME AS person_name,
// CASE
// WHEN (dd.verified_date >= TO_DATE('2019-06-19', 'YYYY-MM-DD')
// OR dd.registration_date >= TO_DATE('2019-06-01', 'YYYY-MM-DD')) THEN 1
// ELSE 0
// END AS reg_val,
// NVL(bec.status, 'NA') AS status,
// bec.cert_file
// FROM tbl_death_details dd
// LEFT JOIN tbl_birth_esign_cert bec ON bec.reg_no = dd.REGISTRATION_NUMBER
// WHERE dd.ZONE_ID IN (501,502,503,504,505,506,507,508,509,510,511,512,513,514,515)
// AND dd.FATH_MOB_NO = ? OR dd.MOTH_MOB_NO = ?
// """;
// List<Map<String, Object>> results = newJdbc.queryForList(sql, mobile, mobile);
// return results.stream().map(this::formatResult).toList();
// }
// public Map<String, Object> getByDetailsOracleOldAndNewForDeath(String dod, String father, String mother,
// String person, String gender) {
// JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// JdbcTemplate oldJdbc = new JdbcTemplate(oldBirthDataSource);
// // Prepare query and params for NEW data
// StringBuilder newSql = new StringBuilder("""
// SELECT
// dd.REGISTRATION_NUMBER AS regno,
// dd.DATE_OF_DEATH AS dod,
// dd.SEX AS gender,
// dd.FATHER_NAME AS father_name,
// dd.MOTHER_NAME AS mother_name,
// dd.PERSON_NAME AS person_name,
// CASE
// WHEN (dd.verified_date >= TO_DATE('19-06-2019', 'DD-MM-YYYY')
// OR dd.registration_date >= TO_DATE('01-06-2019', 'DD-MM-YYYY')) THEN 1
// ELSE 0
// END AS reg_val,
// NVL(dec.status, 'NA') AS status,
// dec.cert_file
// FROM tbl_death_details dd
// LEFT JOIN tbl_birth_esign_cert dec ON dec.reg_no = dd.REGISTRATION_NUMBER
// WHERE dd.ZONE_ID IN (501,502,503,504,505,506,507,508,509,510,511,512,513,514,515)
// AND TRIM(UPPER(dd.FATHER_NAME)) = ?
// AND TRIM(UPPER(dd.MOTHER_NAME)) = ?
// AND TRIM(UPPER(dd.SEX)) = ?
// """);
// List<Object> newParams = new ArrayList<>();
// newParams.add(father.toUpperCase().trim());
// newParams.add(mother.toUpperCase().trim());
// newParams.add(gender.toUpperCase().trim());
// if (person != null && !person.trim().isEmpty()) {
// newSql.append(" AND TRIM(UPPER(dd.PERSON_NAME)) = ? ");
// newParams.add(person.toUpperCase().trim());
// }
// if (dod != null && !dod.trim().isEmpty()) {
// newSql.append(" AND TRUNC(dd.DATE_OF_DEATH) = TO_DATE(?, 'DD-MM-YYYY') ");
// newParams.add(dod.trim());
// }
// newSql.append(" AND ROWNUM = 1");
// // Try fetching from NEW data
// try {
// Map<String, Object> result = newJdbc.queryForMap(newSql.toString(), newParams.toArray());
// return formatResult(result);
// } catch (EmptyResultDataAccessException e) {
// // Fallback to OLD data
// }
// // Prepare query and params for OLD data
// StringBuilder oldSql = new StringBuilder("""
// SELECT
// ddo.REGISTRATION_NUMBER AS regno,
// ddo.DATE_OF_DEATH AS dod,
// ddo.SEX AS gender,
// ddo.FATHER_NAME AS father_name,
// ddo.MOTHER_NAME AS mother_name,
// ddo.PERSON_NAME AS person_name,
// CASE
// WHEN (ddo.verified_date < TO_DATE('2019-06-19', 'YYYY-MM-DD')) THEN 1
// ELSE 0
// END AS reg_val,
// NVL(deco.status, 'NA') AS status,
// deco.cert_file
// FROM tbl_death_details ddo
// LEFT JOIN tbl_birth_esign_cert deco ON deco.reg_no = ddo.REGISTRATION_NUMBER
// WHERE TRIM(UPPER(ddo.FATHER_NAME)) = ?
// AND TRIM(UPPER(ddo.MOTHER_NAME)) = ?
// AND TRIM(UPPER(ddo.SEX)) = ?
// """);
// List<Object> oldParams = new ArrayList<>();
// oldParams.add(father.toUpperCase().trim());
// oldParams.add(mother.toUpperCase().trim());
// oldParams.add(gender.toUpperCase().trim());
// if (person != null && !person.trim().isEmpty()) {
// oldSql.append(" AND TRIM(UPPER(ddo.PERSON_NAME)) = ? ");
// oldParams.add(person.toUpperCase().trim());
// }
// if (dod != null && !dod.trim().isEmpty()) {
// oldSql.append(" AND TRUNC(ddo.DATE_OF_DEATH) = TO_DATE(?, 'DD-MM-YYYY') ");
// oldParams.add(dod.trim());
// }
// oldSql.append(" AND ROWNUM = 1");
// try {
// Map<String, Object> result = oldJdbc.queryForMap(oldSql.toString(), oldParams.toArray());
// return formatResult(result);
// } catch (EmptyResultDataAccessException e) {
// return Map.of("status", "not_found", "message",
// "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404);
// } catch (Exception e) {
// // Return "not_found" with message instead of throwing exception
// return Map.of("status", "not_found", "message",
// "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404);
// }
// }
// // oracle
// private Map<String, Object> formatResult(Map<String, Object> row) {
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "success");
// // System.out.println("row="+row);
// Map<String, Object> deathresponse = new LinkedHashMap<>();
// // birthresponse.put("name", row.get("child_name"));
// deathresponse.put("regno", row.get("regno") != null ? row.get("regno").toString() : "");
// deathresponse.put("name", row.get("person_name") != null ? row.get("person_name").toString() : " ");
// deathresponse.put("dod", row.get("dod")!= null ? row.get("dod").toString() : "" );
// String gender = row.get("gender") != null ? row.get("gender").toString().trim().toUpperCase() : "";
// if ("M".equals(gender)) {
// deathresponse.put("gender", "Male");
// } else if ("F".equals(gender)) {
// deathresponse.put("gender", "FeMale");
// } else if( "G".equals(gender)) {
// deathresponse.put("gender", "Transgender");
// }else {
// deathresponse.put("gender", "other");
// }
// deathresponse.put("father_name", row.get("father_name"));
// deathresponse.put("mother_name", row.get("mother_name"));
// response.put("certificate_details", deathresponse);
// String regNo = row.get("regno") != null ? row.get("regno").toString() : "";
// //System.out.println("regNo " + regNo);
// Integer regVal = row.get("reg_val") instanceof Number ? ((Number) row.get("reg_val")).intValue() : 0;
// String status = String.valueOf(row.getOrDefault("status", "NA"));
// String certFile = row.get("cert_file") != null ? row.get("cert_file").toString() : "";
// String createdDateStr = (row.get("created_date") != null) ? row.get("created_date").toString().trim() : "";
// //System.out.println("certFile=" + certFile);
// // Build PDF URL if valid
// String pdfUrl = "";
// if ("S".equalsIgnoreCase(status)) {
// pdfUrl = eSign_CERTIFICATE_URL_PREFIX + certFile;
// }
// else if ("P".equalsIgnoreCase(status)) {
// pdfUrl = "";
// if (!createdDateStr.isEmpty()) {
// try {
// LocalDate createdDate = LocalDate.parse(createdDateStr, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
// if (createdDate.isBefore(LocalDate.of(2012, 1, 1))) {
// pdfUrl = OLD_CERTIFICATE_URL_PREFIX + regNo;
// } else {
// pdfUrl = ""; // newer pending — no link
// }
// } catch (Exception e) {
// pdfUrl = ""; // fallback
// }
// }
// }
// else {
// if (!createdDateStr.isEmpty()) {
// try {
// LocalDate createdDate = LocalDate.parse(createdDateStr, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
// if (createdDate.isAfter(LocalDate.of(2018, 1, 1))) {
// pdfUrl = OLD_CERTIFICATE_URL_PREFIX + regNo;
// } else {
// pdfUrl = OLD_CERTIFICATE_URL_PREFIX + regNo;
// }
// } catch (Exception e) {
// pdfUrl = ""; // fallback
// }
// }
// }
// response.put("pdf_url", pdfUrl);
// if (pdfUrl == null || pdfUrl.isEmpty()) {
// response.put("message", "Awaiting for eSign");
// }
// return response;
// }
// // added by hariprasath
// public Map<String, Object> getBynewDetailsOracleOldAndNewForDeath(String dod, String father, String mother,
// String person, String gender) {
// JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// JdbcTemplate oldJdbc = new JdbcTemplate(oldBirthDataSource);
// // Prepare query and params for NEW data
// StringBuilder newSql = new StringBuilder("""
// SELECT
// dd.REGISTRATION_NUMBER AS regno,
// TO_CHAR(dd.DATE_OF_DEATH , 'DD-MM-YYYY') AS dod,
// TO_CHAR(dd.created_date , 'DD-MM-YYYY') AS created_date,
// dd.SEX AS gender,
// dd.FATHER_NAME AS father_name,
// dd.MOTHER_NAME AS mother_name,
// dd.PERSON_NAME AS person_name,
// CASE
// WHEN (dd.verified_date >= TO_DATE('19-06-2019', 'DD-MM-YYYY')
// OR dd.registration_date >= TO_DATE('01-06-2019', 'DD-MM-YYYY')) THEN 1
// ELSE 0
// END AS reg_val,
// NVL(dec.status, 'NA') AS status,
// dec.cert_file
// FROM tbl_death_details dd
// LEFT JOIN tbl_birth_esign_cert dec ON dec.reg_no = dd.REGISTRATION_NUMBER
// WHERE dd.ZONE_ID IN (501,502,503,504,505,506,507,508,509,510,511,512,513,514,515)
// AND TRIM(UPPER(dd.SEX)) = ?
// AND UPPER(dd.FATHER_NAME) LIKE ?
// AND UPPER(dd.MOTHER_NAME) LIKE ?
// """);
// List<Object> newParams = new ArrayList<>();
// newParams.add(gender.toUpperCase().trim());
// newParams.add("%" + father.toUpperCase().trim() + "%");
// newParams.add("%" + mother.toUpperCase().trim() + "%");
// if (person != null && !person.trim().isEmpty()) {
// newSql.append(" AND UPPER(dd.PERSON_NAME) LIKE ? ");
// newParams.add("%" + person.toUpperCase().trim() + "%");
// }
// if (dod != null && !dod.trim().isEmpty()) {
// newSql.append(" AND dd.DATE_OF_DEATH = TO_DATE(?, 'DD-MM-YYYY') ");
// newParams.add(dod.trim());
// }
// // Try fetching from NEW data
// try {
// List<Map<String, Object>> result = newJdbc.queryForList(newSql.toString(), newParams.toArray());
// if (!result.isEmpty()) {
// return formatResultnew(result);
// }
// } catch (EmptyResultDataAccessException e) {
// // Fallback to OLD data
// }
// // Prepare query and params for OLD data
// StringBuilder oldSql = new StringBuilder("""
// SELECT
// ddo.REGISTRATION_NUMBER AS regno,
// TO_CHAR(ddo.DATE_OF_DEATH , 'DD-MM-YYYY') AS dod,
// TO_CHAR(ddo.created_date , 'DD-MM-YYYY') AS created_date,
// ddo.FATHER_NAME AS father_name,
// ddo.MOTHER_NAME AS mother_name,
// ddo.PERSON_NAME AS person_name,
// CASE
// WHEN (ddo.verified_date < TO_DATE('2019-06-19', 'YYYY-MM-DD')) THEN 1
// ELSE 0
// END AS reg_val,
// NVL(deco.status, 'NA') AS status,
// deco.cert_file
// FROM tbl_death_details ddo
// LEFT JOIN tbl_birth_esign_cert deco
// ON (deco.reg_no = ddo.REGISTRATION_NUMBER
// OR deco.reg_no = 'GCC_D_' || ddo.REGISTRATION_NUMBER)
// WHERE TRIM(UPPER(ddo.SEX)) = ?
// AND UPPER(ddo.FATHER_NAME) LIKE ?
// AND UPPER(ddo.MOTHER_NAME) LIKE ?
// """);
// List<Object> oldParams = new ArrayList<>();
// oldParams.add(gender.toUpperCase().trim());
// oldParams.add("%" + father.toUpperCase().trim() + "%");
// oldParams.add("%" + mother.toUpperCase().trim() + "%");
// if (person != null && !person.trim().isEmpty()) {
// oldSql.append(" AND UPPER(ddo.PERSON_NAME) LIKE ? ");
// oldParams.add("%" + person.toUpperCase().trim() + "%");
// }
// if (dod != null && !dod.trim().isEmpty()) {
// oldSql.append(" AND ddo.DATE_OF_DEATH = TO_DATE(?, 'DD-MM-YYYY') ");
// oldParams.add(dod.trim());
// }
// // oldSql.append(" AND ROWNUM = 1");
// try {
// List<Map<String, Object>> result = oldJdbc.queryForList(oldSql.toString(), oldParams.toArray());
// if (!result.isEmpty()) {
// return formatResultnew(result);
// }
// } catch (EmptyResultDataAccessException e) {
// return Map.of("status", "not_found", "message",
// "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404);
// } catch (Exception e) {
// // Return "not_found" with message instead of throwing exception
// return Map.of("status", "not_found", "message",
// "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404);
// }
// return Map.of("status", "not_found", "message",
// "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404);
// }
// private Map<String, Object> formatResultnew(List<Map<String, Object>> rows) {
// //System.out.println("row1="+rows);
// if (rows == null || rows.isEmpty()) {
// return Map.of("status", "not_found", "message",
// "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404);
// }
// Map<String, Object> response = new LinkedHashMap<>();
// response.put("status", "success");
// List<Map<String, Object>> certificateDetailsList = new ArrayList<>();
// for (Map<String, Object> row : rows) {
// Map<String, Object> deathresponse = new LinkedHashMap<>();
// deathresponse.put("regno", row.get("regno") != null ? row.get("regno").toString() : "");
// deathresponse.put("name", row.get("person_name") != null ? row.get("person_name").toString() : " ");
// deathresponse.put("dod", row.get("dod"));
// // ---- Gender ----
// String gender = row.get("gender") != null ? row.get("gender").toString().trim().toUpperCase() : "";
// if ("M".equals(gender)) {
// deathresponse.put("gender", "Male");
// } else if ("F".equals(gender)) {
// deathresponse.put("gender", "Female");
// } else if( "G".equals(gender)) {
// deathresponse.put("gender", "Transgender");
// }else {
// deathresponse.put("gender", "other");
// }
// deathresponse.put("father_name", row.get("father_name"));
// deathresponse.put("mother_name", row.get("mother_name"));
// deathresponse.put("status",row.get("status"));
// String regNo = row.get("regno") != null ? row.get("regno").toString() : "";
// //System.out.println("regNo " + regNo);
// Integer regVal = row.get("reg_val") instanceof Number ? ((Number) row.get("reg_val")).intValue() : 0;
// String status = String.valueOf(row.getOrDefault("status", "NA"));
// String certFile = row.get("cert_file") != null ? row.get("cert_file").toString() : "";
// String createdDateStr = (row.get("created_date") != null) ? row.get("created_date").toString().trim() : "";
// //System.out.println("certFile=" + certFile);
// // Build PDF URL if valid
// String pdfUrl ="";
// if ("S".equalsIgnoreCase(status)) {
// pdfUrl = eSign_CERTIFICATE_URL_PREFIX + certFile;
// }
// else if ("P".equalsIgnoreCase(status)) {
// if (!createdDateStr.isEmpty()) {
// try {
// LocalDate createdDate = LocalDate.parse(createdDateStr, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
// if (createdDate.isBefore(LocalDate.of(2012, 1, 1))) {
// pdfUrl = OLD_CERTIFICATE_URL_PREFIX + regNo;
// } else {
// pdfUrl = ""; // newer pending — no link
// }
// } catch (Exception e) {
// pdfUrl = ""; // fallback
// }
// }
// }else {
// if (!createdDateStr.isEmpty()) {
// try {
// LocalDate createdDate = LocalDate.parse(createdDateStr, DateTimeFormatter.ofPattern("dd-MM-yyyy"));
// if (createdDate.isAfter(LocalDate.of(2018, 1, 1))) {
// //pdfUrl = CRS_CERTIFICATE_URL_PREFIX + regNo;
// pdfUrl = OLD_CERTIFICATE_URL_PREFIX + regNo;
// } else {
// pdfUrl = OLD_CERTIFICATE_URL_PREFIX + regNo;
// }
// } catch (Exception e) {
// pdfUrl = ""; // fallback
// }
// }
// }
// deathresponse.put("pdf_url", pdfUrl);
// // add this row to the list
// certificateDetailsList.add(deathresponse);
// }
// response.put("certificate_details", certificateDetailsList);
// return response;
// }
// // added by yogi for web
// public Map<String, Object> getBynewDetailsOracleOldAndNewForWeb(
// String dod, String father, String mother, String person, String gender) {
// JdbcTemplate newJdbc = new JdbcTemplate(newBirthDataSource);
// JdbcTemplate oldJdbc = new JdbcTemplate(oldBirthDataSource);
// // Normalize inputs
// String upperFather = (father != null && !father.isBlank()) ? father.trim().toUpperCase() : "";
// String upperMother = (mother != null && !mother.isBlank()) ? mother.trim().toUpperCase() : "";
// String upperGender = (gender != null && !gender.isBlank()) ? gender.trim().toUpperCase() : "";
// String upperPerson = (person != null && !person.isBlank()) ? person.trim().toUpperCase() : "";
// String trimmedDod = (dod != null && !dod.trim().isEmpty()) ? dod.trim() : null;
// // ---------- Combined result list ----------
// List<Map<String, Object>> combinedResults = new ArrayList<>();
// // ---------- NEW ----------
// StringBuilder newSql = new StringBuilder("""
// SELECT
// dd.REGISTRATION_NUMBER AS regno,
// TO_CHAR(dd.DATE_OF_DEATH, 'DD-MM-YYYY') AS dod,
// TO_CHAR(dd.created_date , 'DD-MM-YYYY') AS created_date,
// dd.SEX AS gender,
// NVL(dd.FATHER_NAME,' ') AS father_name,
// NVL(dd.MOTHER_NAME,' ') AS mother_name,
// NVL(dd.PERSON_NAME,' ') AS person_name,
// CASE
// WHEN (dd.verified_date >= TO_DATE('19-06-2019', 'DD-MM-YYYY')
// OR dd.registration_date >= TO_DATE('01-06-2019', 'DD-MM-YYYY')
// OR dd.created_date >= TO_DATE('01-06-2019', 'DD-MM-YYYY'))
// THEN 1 ELSE 0
// END AS reg_val,
// NVL(dec.status,'NA') AS status,
// dec.cert_file
// FROM tbl_death_details dd
// LEFT JOIN tbl_birth_esign_cert dec
// ON dec.reg_no = dd.REGISTRATION_NUMBER
// WHERE dd.ZONE_ID IN (501,502,503,504,505,506,507,508,509,510,511,512,513,514,515)
// AND TRIM(UPPER(dd.SEX)) = ?
// """);
// List<Object> params = new ArrayList<>();
// params.add(upperGender);
// if (!upperFather.isEmpty()) {
// newSql.append(" AND UPPER(dd.FATHER_NAME) LIKE ? ");
// params.add("%" + upperFather + "%");
// }
// if (!upperMother.isEmpty()) {
// newSql.append(" AND UPPER(dd.MOTHER_NAME) LIKE ? ");
// params.add("%" + upperMother + "%");
// }
// if (!upperPerson.isEmpty()) {
// newSql.append(" AND UPPER(dd.PERSON_NAME) LIKE ? ");
// params.add("%" + upperPerson + "%");
// }
// if (trimmedDod != null) {
// newSql.append(" AND TRUNC(dd.DATE_OF_DEATH) = TO_DATE(?, 'DD-MM-YYYY') ");
// params.add(trimmedDod);
// }
// newSql.append(" ORDER BY dd.PERSON_NAME ");
// try {
// //System.out.println("New SQL => " + newSql);
// //System.out.println("Params => " + params);
// List<Map<String, Object>> newresult = newJdbc.queryForList(newSql.toString(), params.toArray());
// if (!newresult.isEmpty()) {
// // return formatResultnew(result);
// combinedResults.addAll(newresult);
// }
// } catch (Exception e) {
// throw new RuntimeException("Error querying new death table", e);
// }
// // ---------- OLD ----------
// StringBuilder oldSql = new StringBuilder("""
// SELECT
// bdo.REGISTRATION_NUMBER AS regno,
// TO_CHAR(bdo.DATE_OF_DEATH, 'DD-MM-YYYY') AS dod,
// TO_CHAR(bdo.created_date , 'DD-MM-YYYY') AS created_date,
// bdo.SEX AS gender,
// NVL(bdo.FATHER_NAME,' ') AS father_name,
// NVL(bdo.MOTHER_NAME,' ') AS mother_name,
// NVL(bdo.PERSON_NAME,' ') AS person_name,
// CASE
// WHEN bdo.verified_date < TO_DATE('19-06-2019', 'DD-MM-YYYY')
// THEN 1 ELSE 0
// END AS reg_val,
// NVL(beco.status,'NA') AS status,
// beco.cert_file,
// Z.ZONE_CODE || '-' || Z.ZONE_NAME AS zone_name,
// Y.DIVISION_NAME AS division_name,
// bdo.hospital_id
// FROM TBL_DEATH_DETAILS bdo
// JOIN TBL_ZONE Z ON bdo.ZONE_ID = Z.ZONE_ID
// JOIN TBL_DIVISION Y ON bdo.DIVISON_ID = Y.DIVISON_ID
// LEFT JOIN TBL_BIRTH_ESIGN_CERT beco
// ON (beco.reg_no = bdo.REGISTRATION_NUMBER
// OR beco.reg_no = 'GCC_D_' || bdo.REGISTRATION_NUMBER)
// WHERE TRIM(UPPER(bdo.SEX)) = ?
// """);
// List<Object> oldParams = new ArrayList<>();
// oldParams.add(upperGender);
// if (!upperFather.isEmpty()) {
// oldSql.append(" AND UPPER(bdo.FATHER_NAME) LIKE ? ");
// oldParams.add("%" + upperFather + "%");
// }
// if (!upperMother.isEmpty()) {
// oldSql.append(" AND UPPER(bdo.MOTHER_NAME) LIKE ? ");
// oldParams.add("%" + upperMother + "%");
// }
// if (!upperPerson.isEmpty()) {
// oldSql.append(" AND UPPER(bdo.PERSON_NAME) LIKE ? ");
// oldParams.add("%" + upperPerson + "%");
// }
// if (trimmedDod != null) {
// oldSql.append(" AND bdo.DATE_OF_DEATH = TO_DATE(?, 'DD-MM-YYYY') ");
// oldParams.add(trimmedDod);
// }
// oldSql.append(" ORDER BY bdo.PERSON_NAME ");
// try {
// //System.out.println("Old SQL => " + oldSql);
// //System.out.println("Params => " + oldParams);
// List<Map<String, Object>> oldResult = oldJdbc.queryForList(oldSql.toString(), oldParams.toArray());
// if (!oldResult.isEmpty()) {
// //return formatResultnew(oldResult);
// combinedResults.addAll(oldResult);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// if(!combinedResults.isEmpty()){
// combinedResults.sort(Comparator.comparing(m -> String.valueOf(m.get("person_name"))));
// return formatResultnew(combinedResults);
// }
// return Map.of(
// "status", "not_found",
// "message", "No matching death certificate found. Please ensure names and date are exactly as on the certificate.",
// "status_code", 404
// );
// }
// public List<Map<String, Object>> getOldDeathDetails(String dod, String gender) {
// JdbcTemplate oldJdbc = new JdbcTemplate(oldBirthDataSource);
// String sql = """
// SELECT
// Z.ZONE_CODE || '-' || Z.ZONE_NAME AS zone_name,
// Y.DIVISION_NAME AS division_name,
// bdo.hospital_id,
// TO_CHAR(bdo.DATE_OF_DEATH, 'yyyy-mm-dd') AS date_of_death,
// bdo.SEX AS sex,
// NVL(bdo.PERSON_NAME,' ') AS person_name,
// bdo.REGISTRATION_NUMBER AS regno,
// CASE
// WHEN bdo.verified_date < TO_DATE('19-06-2019', 'DD-MM-YYYY') THEN 1
// ELSE 0
// END AS reg_val,
// beco.status AS status,
// beco.cert_file
// FROM TBL_DEATH_DETAILS bdo
// JOIN TBL_ZONE Z ON bdo.ZONE_ID = Z.ZONE_ID
// JOIN TBL_DIVISION Y ON bdo.DIVISON_ID = Y.DIVISON_ID
// LEFT JOIN TBL_BIRTH_ESIGN_CERT beco
// ON (beco.reg_no = bdo.REGISTRATION_NUMBER
// OR beco.reg_no = 'GCC_D_' || bdo.REGISTRATION_NUMBER)
// WHERE TRIM(UPPER(bdo.SEX)) = ?
// AND TRUNC(bdo.DATE_OF_DEATH) = TO_DATE(?, 'DD-MM-YYYY')
// ORDER BY bdo.PERSON_NAME
// """;
// //System.out.println("Executing SQL:\n" + sql);
// //System.out.println("Parameters - gender: " + gender + ", dod: " + dod);
// // Pass parameters to query
// List<Map<String, Object>> result = oldJdbc.queryForList(sql, gender.toUpperCase(), dod);
// //System.out.println("Result size: " + result.size());
// return result;
// }
// }

244
src/main/java/com/gcc/restapiservices/cdwaste/controller/ApiController.java

@ -0,0 +1,244 @@
package com.gcc.restapiservices.cdwaste.controller;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.gcc.restapiservices.cdwaste.service.RequestService;
import com.gcc.restapiservices.cdwaste.util.ApiResponseUtil;
import com.gcc.restapiservices.configuration.AppConfig;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@RestController
@RequestMapping("/gccrestservices/dumpregistration/api")
public class ApiController {
@Autowired
private RequestService requestService ;
@Autowired
private AppConfig appConfig;
@PostMapping("/savedetails")
public ResponseEntity<?> saveWasteCollection(
@RequestParam("name") String name,
@RequestParam("mobileNumber") String mobileNumber,
@RequestParam("zone") String zone,
@RequestParam("ward") String ward,
@RequestParam("doorNumber") String doorNumber,
@RequestParam("streetName") String streetName,
@RequestParam("area") String area,
@RequestParam("city") String city,
@RequestParam("pincode") String pincode,
@RequestParam("wasteType") String wasteType,
@RequestParam("wasteQuantity") String wasteQuantity,
@RequestParam("vehicleType") String vehicleType,
@RequestParam(value = "dumpLocation", required = false,defaultValue = "100") String dumpLocation,
@RequestParam("dump") MultipartFile wasteImage) {
try {
int waste_Type = Integer.parseInt(wasteType);
int waste_Quantity = Integer.parseInt(wasteQuantity);
int vehicle_Type = Integer.parseInt(vehicleType);
int dump_Location = Integer.parseInt(dumpLocation);
String refId = requestService.saveWasteCollection(name, mobileNumber, zone, ward, doorNumber, streetName, area, city,
pincode, waste_Type, waste_Quantity, vehicle_Type, dump_Location, wasteImage);
if ("error".equalsIgnoreCase(refId)) {
return ApiResponseUtil.error("Something went wrong while saving", HttpStatus.INTERNAL_SERVER_ERROR);
}
Map<String, Object> data = new HashMap<>();
data.put("referenceId", refId);
return ApiResponseUtil.success(data, "Waste collection request saved successfully");
} catch (Exception e) {
e.printStackTrace();
return ApiResponseUtil.error("Error saving data: " + e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
@GetMapping(value = "/sendOTP")
public String sendOtp(HttpServletRequest request, @RequestParam String mobile) {
// Create an ObjectMapper instance
//ObjectMapper objectMapper = new ObjectMapper();
// Check if mobile number is already registered
//List<WasteRegistration> registrations = wasteregistrationrepo.findByMobileNo(mobile);
// Create a response map
Map<String, Object> response = new HashMap<>();
// if (registrations.isEmpty()) {
// // If mobile number is not registered
// response.put("status", "NOT_REGISTERED");
// response.put("mobile", mobile); // Return the mobile number
// try {
// return objectMapper.writeValueAsString(response); // Use the instance to convert map to JSON string
// } catch (Exception e) {
// // Handle JSON conversion error
// return "{\"status\": \"ERROR\", \"message\": \"Could not convert response to JSON.\"}";
// }
// }
String MobileNo=mobile;
System.out.print("\n MobileNo---:"+mobile);
Random rand = new Random();
int otp = rand.nextInt(90000) + 10000;
// int otp= 22222;
System.out.print("\n otp---:"+otp);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy%20HH:mm");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now));
//String generatedToken = "Welcome to GCC! Your OTP for C%26D waste collectors Registration process is "+otp;
//String generatedToken = "Welcome to GCC "+otp+" is your OTP for gcc QR System";
String generatedToken = "Welcome to GCC! Your OTP for C and D waste collectors Registration process is " + otp;
// String key="qxg4mklD";
String key="pfTEYN6H";
String urlString= appConfig.getGetOtpUrl()+"from=GCCCRP&key="+key+"&sender=GCCCRP&to="+MobileNo+"&body="+generatedToken+"&entityid=1401572690000011081&templateid=1407172967243483268";
//String urlString = "https://tmegov.onex-aura.com/api/sms?from=GCCCRP&key=pfTEYN6H&sender=GCCCRP&to=9360777472&body=Welcome%20to%20GCC!%20Your%20OTP%20for%20C%26D%20waste%20collectors%20Registration%20process%20is%20"+otp+"&entityid=1401572690000011081&templateid=1407172959127552127";
//String urlString= appConfig.getGetOtpUrl()+"from=GCCCRP&key="+key+"&sender=GCCCRP&to="+MobileNo+"&body="+generatedToken+"&entityid=1401572690000011081&templateid=1407168250479102852";
// String urlString=appConfig.getGetOtpUrl()+"user=GCCtrans&authkey=92kOC1RBGBIws&sender=GCCCRP&mobile="+MobileNo+"&text="+generatedToken+"&rpt=1&summary=1&output=json&entityid=1401572690000011081&templateid=1407168250479102852";
System.out.print("\n urlString---: "+urlString);
String bodyMessage = "";
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(urlString, String.class);
// Using Jackson ObjectMapper to parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
// Add mobileNo and otp to the response JSON
jsonResponse.put("MobileNo", MobileNo);
jsonResponse.put("otp", otp);
// Convert the updated JSON object back to string
bodyMessage = jsonResponse.toString();
// bodyMessage=Response;
System.out.println("\n bodyMessage"+bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: "+e);
bodyMessage = "Error";
}
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
return bodyMessage;
}
@GetMapping(value = "/verifyOTP")
public String verifyOtp(HttpServletRequest request, @RequestParam String otp) {
HttpSession session = request.getSession();
try {
Integer session_otp = (Integer) session.getAttribute("otp");
System.out.println("session_otp---:" + session_otp);
Integer entered_otp = Integer.parseInt(otp);
if (session_otp != null && session_otp.equals(entered_otp)) {
System.out.println("Entered OTP Correct");
session.setAttribute("verifiedotp", "success");
return "Success";
} else {
System.out.println("Incorrect OTP. Please enter correct OTPs.");
session.setAttribute("verifiedotp", "error");
return "Error";
}
} catch (NumberFormatException e) {
System.out.println("Invalid OTP format: " + otp);
return "Error";
} catch (Exception e) {
System.out.println("Error verifying OTP: " + e.getMessage());
return "Error";
}
}
// get the request details by mobile number
@GetMapping("/requestlistbymobileno")
public ResponseEntity<?> getRequestDetailsByMobileNo(@RequestParam String mobileNo) {
try {
List<Map<String, Object>> responseList = requestService.getRequestDetailsList(mobileNo);
if (responseList == null || responseList.isEmpty()) {
return ApiResponseUtil.notFound("No requests found for this mobile number.");
}
return ApiResponseUtil.success(responseList, "Request list fetched successfully.");
} catch (Exception e) {
e.printStackTrace();
return ApiResponseUtil.error("Failed to fetch data: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// get the request details by ref-id
@GetMapping("/requestlistbyrefid")
public ResponseEntity<?> getRequestDetailsByRefId(@RequestParam String refId) {
try {
List<Map<String, Object>> responseList = requestService.getRequestDetailsListByRefId(refId);
if (responseList == null || responseList.isEmpty()) {
return ApiResponseUtil.notFound("No requests found for this Ref ID.");
}
return ApiResponseUtil.success(responseList, "Request list fetched successfully.");
} catch (Exception e) {
e.printStackTrace();
return ApiResponseUtil.error("Failed to fetch data: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

157
src/main/java/com/gcc/restapiservices/cdwaste/controller/DropDownApiController.java

@ -0,0 +1,157 @@
package com.gcc.restapiservices.cdwaste.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.gcc.restapiservices.cdwaste.service.DropDownService;
import com.gcc.restapiservices.cdwaste.util.ApiResponseUtil;
@RestController
@RequestMapping("/gccrestservices/dropdown/api")
public class DropDownApiController {
@Autowired
private DropDownService dropDownService;
@GetMapping("/wastetypes")
public ResponseEntity<?> getwastetypes() {
List<Map<String, Object>> result = dropDownService.getwastetypes();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/wastequantity")
public ResponseEntity<?> getwastequantity() {
List<Map<String, Object>> result = dropDownService.getwastequantity();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/locations")
public ResponseEntity<?> getlocations(@RequestParam("quantityId") int quantityId) {
List<Map<String, Object>> result = dropDownService.getlocations(quantityId);
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/vehicletypes")
public ResponseEntity<?> getvehicletypes(@RequestParam("quantityId") int quantityId) {
List<Map<String, Object>> result = dropDownService.getvehicletypes(quantityId);
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/wastecollectionscharges")
public ResponseEntity<List<Map<String, Object>>> getwastecolectionscharges() {
List<Map<String, Object>> result = dropDownService.getwastecolectionscharges();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/zone")
public ResponseEntity<List<Map<String, Object>>> getallzone() {
List<Map<String, Object>> result = dropDownService.getZonesList();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/wardbyzone")
public ResponseEntity<List<Map<String, Object>>> getwardbyzone(@RequestParam int zoneId) {
List<Map<String, Object>> result = dropDownService.getWardListByZone(zoneId);
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

70
src/main/java/com/gcc/restapiservices/cdwaste/service/DropDownService.java

@ -0,0 +1,70 @@
package com.gcc.restapiservices.cdwaste.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 DropDownService {
@Autowired
public void setDataSource(@Qualifier("mysqlCdWasteDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
private JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> getwastetypes() {
String sql = " SELECT id,waste_type FROM waste_type_master where is_active = 1 AND is_delete=0 " ;
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getwastequantity() {
String sql = " SELECT id,quantity FROM quantity_master where is_active = 1 AND is_delete = 0 " ;
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getlocations(int quantityId) {
String sql = "SELECT id,location FROM dumping_location where quantity_id = ? ";
return jdbcTemplate.queryForList(sql, quantityId);
}
public List<Map<String, Object>> getvehicletypes(int quantityId) {
String sql = "SELECT id,vehicle_name FROM vehicle_master where quantity_id = ? ";
return jdbcTemplate.queryForList(sql,quantityId);
}
public List<Map<String, Object>> getwastecolectionscharges() {
String sql = "SELECT id,amount_type,amount FROM waste_collection_charges where is_active = 1 AND is_delete = 0 ";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getZonesList() {
String sql = " SELECT id,zone_name from zones where is_active = 1 ";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getWardListByZone(int zoneId) {
String sql = "SELECT id, ward_name FROM wards WHERE zone_id = ? AND is_active = 1 AND is_delete = 0 ";
return jdbcTemplate.queryForList(sql, zoneId);
}
}

354
src/main/java/com/gcc/restapiservices/cdwaste/service/RequestService.java

@ -0,0 +1,354 @@
package com.gcc.restapiservices.cdwaste.service;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.SecureRandom;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gcc.restapiservices.cdwaste.util.DateTimeUtil;
import com.gcc.restapiservices.configuration.AppConfig;
@Service
public class RequestService {
@Autowired
private Environment environment;
@Autowired
private AppConfig appConfig;
@Autowired
public void setDataSource(@Qualifier("mysqlCdWasteDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
private JdbcTemplate jdbcTemplate;
private String fileBaseUrl;
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int STRING_LENGTH = 15;
private static final Random RANDOM = new SecureRandom();
public RequestService(RestTemplate restTemplate, AppConfig appConfig, ObjectMapper objectMapper,
Environment environment) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
this.environment = environment;
this.objectMapper = objectMapper;
this.fileBaseUrl = environment.getProperty("fileBaseUrl");
}
@Autowired
private final ObjectMapper objectMapper;
@Autowired
private RestTemplate restTemplate;
public String saveWasteCollection(String name, String mobileNumber, String zone, String ward, String doorNumber,
String streetName, String area, String city, String pincode, int wasteType, int wasteQuantity,
int vehicleType, int dumpLocation, MultipartFile wasteImage) throws IOException {
String paymentstatus = "PENDING";
String uploadImgUrl = null;
int isMobile = 2;
String sql = "INSERT INTO waste_collectors_request "
+ "(name, mobile_no, zone, ward, door_number,street_name,area,city,pincode,waste_type_id, waste_quantity_id, vehicle_id, payment_status, upload_image_url,dump_location_id,is_mobile) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
int result = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, name);
ps.setString(2, mobileNumber);
ps.setString(3, zone);
ps.setString(4, ward);
ps.setString(5, doorNumber);
ps.setString(6, streetName);
ps.setString(7, area);
ps.setString(8, city);
ps.setString(9, pincode);
ps.setInt(10, wasteType);
ps.setInt(11, wasteQuantity);
ps.setInt(12, vehicleType);
ps.setString(13, paymentstatus);
ps.setString(14, null); // placeholder for image URL
// 👇 move this logic inside the lambda
if (vehicleType != 1 && dumpLocation > 0) {
ps.setInt(15, dumpLocation);
} else {
ps.setInt(15, 100); // Default value
}
ps.setInt(16, isMobile);
return ps;
}, keyHolder);
if (result > 0) {
int generatedId = keyHolder.getKey().intValue();
String prefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String refId = prefix + generatedId;
// Save the file and build the file path (relative or just file name)
if (wasteImage != null && !wasteImage.isEmpty()) {
uploadImgUrl = saveFile(wasteImage);
System.out.println("uploadImgUrl...." + uploadImgUrl);
// Update the upload_image_url column
String updateSql = "UPDATE waste_collectors_request SET upload_image_url = ? WHERE id = ?";
jdbcTemplate.update(updateSql, uploadImgUrl, generatedId);
}
// Update reference ID (assuming it's another column in the same table)
if (updaterefId(refId, generatedId)) {
sendrequestraisedWhatsappMessage(refId, mobileNumber);
}
System.out.println("wasteQuantity" + wasteQuantity);
System.out.println("vehicleId" + vehicleType);
System.out.println("result" + result);
if ((wasteQuantity == 1 || wasteQuantity == 2) && (vehicleType == 1 || vehicleType == 4) && result > 0) {
String fullAddress = doorNumber + "," + streetName + "," + area + "," + city + "," + pincode;
System.out.println("fullAddress" + fullAddress);
callGccWasteApi(zone, ward, fullAddress, refId, wasteQuantity, wasteType, wasteImage);
System.out.println("hiiii");
}
return refId;
}
return "error";
}
public void callGccWasteApi(String zone, String ward, String fulladdress, String refId, int wasteQuantity,
int wasteType, MultipartFile dump) {
System.out.println("inside the method");
String url = "https://gccservices.in/gccofficialapp/c_dwaste/api/saveUserWaste";
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
String tonage = "";
if (wasteQuantity == 1) {
tonage = "Less Than 1 Ton";
} else if (wasteQuantity == 2) {
tonage = "1 Ton to 20 Ton";
} else {
tonage = "Unknown Tonage";
}
body.add("zone", zone);
body.add("ward", ward);
body.add("address", fulladdress);
body.add("ref_id", refId);
System.out.println("tonage....." + tonage);
body.add("tonage", tonage);
body.add("wastetype", wasteType);
try {
ByteArrayResource fileAsResource = new ByteArrayResource(dump.getBytes()) {
@Override
public String getFilename() {
return dump.getOriginalFilename(); // Provide a file name
}
};
body.add("file", fileAsResource);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
System.out.println("GCC API response: " + response.getBody());
} catch (Exception e) {
System.err.println("GCC API error: " + e.getMessage());
e.printStackTrace();
}
}
private boolean updaterefId(String refId, int generatedId) {
String sql = "update waste_collectors_request set refid = ? where id = ?";
int result = jdbcTemplate.update(sql, refId, generatedId);
if (result > 0) {
return true;
}
return false;
}
public void sendrequestraisedWhatsappMessage(String refId, String mobileNumber) {
try {
String apiUrl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="
+ mobileNumber
+ "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Thank+you%21+Your+request+has+been+successfully+submitted.%0ARequest+Id+%3A+"
+ refId
+ "&isTemplate=true&header=C%26D+Waste+Collection+Request+Registered&footer=Greater+Chennai+Corporation";
System.out.println("WhatsApp API URL: " + apiUrl); // Optional debug
// smsService.sendMsg(apiUrl);
sendMsg(apiUrl);
} catch (Exception e) {
e.printStackTrace();
}
}
public String sendMsg(String msgUrl) {
System.out.println("Whatsapp URL :-" + msgUrl);
String response = "";
try {
HttpURLConnection connection = null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = responseCode + "";
System.out.println("Response Code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public String saveFeedbackImage(String SMS_Url) {
System.out.println("SMS URL:- " + SMS_Url);
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(SMS_Url, String.class);
return response;
}
public String saveFile(MultipartFile file) throws IOException {
String order_copy_url = "";
// type_folder = "works/"+type_folder;
// Handle file upload if a file is provided
if (file == null || file.isEmpty()) {
return order_copy_url;
}
// Set the file path where you want to save it
String uploadDirectory = environment.getProperty("file.upload.directory");
String serviceFolderName = environment.getProperty("dump_directory");
var year = DateTimeUtil.getCurrentYear();
var month = DateTimeUtil.getCurrentMonth();
// var date =DateTimeUtil.getCurrentDay();
uploadDirectory = uploadDirectory + "/" + serviceFolderName + "/" + year + "/" + month;
Path directoryPath = Paths.get(uploadDirectory);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
String datetimetxt = DateTimeUtil.getCurrentDateTime();
String fileName = datetimetxt + "" + generateRandomStringForFile(10) + "_" + file.getOriginalFilename();
// Construct the file path
String filepath = uploadDirectory + "/" + fileName;
String filepath_txt = "/" + serviceFolderName + "/" + year + "/" + month + "/" + fileName;
Path path = Paths.get(filepath);
// Ensure the directory exists
Files.createDirectories(path.getParent());
// Write the file to the specified path
Files.write(path, file.getBytes());
// Set the order_copy_url to the relative file path for storing in DB
order_copy_url = filepath_txt;
return order_copy_url;
}
public static String generateRandomStringForFile(int String_Lenth) {
StringBuilder result = new StringBuilder(String_Lenth);
for (int i = 0; i < STRING_LENGTH; i++) {
result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())));
}
return result.toString();
}
public List<Map<String, Object>> getRequestDetailsList(String mobileNo) {
StringBuilder query = new StringBuilder("SELECT "
+ "wcr.name, wcr.mobile_no, wcr.zone, wcr.ward, wtm.waste_type, wcr.payment_status, wcr.refid, "
+ "wcr.actual_weight, wcr.payment_type, wcr.processing_charge, "
+ "wcr.waste_collection_charge, wcr.total_charge, wcr.payment_mobile_no, wcr.door_number, wcr.street_name, "
+ "wcr.area, wcr.city, wcr.pincode, " + "CONCAT(' " + fileBaseUrl
+ "/gcc/files', wcr.upload_image_url) AS upload_image_url, "
+ "DATE_FORMAT(wcr.cdate, '%d-%m-%Y') AS request_date, " + "vm.vehicle_name, " + "qm.quantity, "
+ "dl.location " + "FROM waste_collectors_request wcr "
+ "LEFT JOIN vehicle_master vm ON wcr.vehicle_id = vm.id "
+ "LEFT JOIN dumping_location dl ON wcr.dump_location_id = dl.id "
+ "LEFT JOIN waste_type_master wtm ON wcr.waste_type_id = wtm.id "
+ "LEFT JOIN quantity_master qm ON wcr.waste_quantity_id = qm.id " + "WHERE wcr.mobile_no = ? ");
return jdbcTemplate.queryForList(query.toString(), mobileNo);
}
public List<Map<String, Object>> getRequestDetailsListByRefId(String refId) {
StringBuilder query = new StringBuilder("SELECT "
+ "wcr.name, wcr.mobile_no, wcr.zone, wcr.ward, wtm.waste_type, wcr.payment_status, wcr.refid, "
+ "wcr.actual_weight, wcr.payment_type, wcr.processing_charge, "
+ "wcr.waste_collection_charge, wcr.total_charge, wcr.payment_mobile_no, wcr.door_number, wcr.street_name, "
+ "wcr.area, wcr.city, wcr.pincode, " + "vm.vehicle_name, " + "qm.quantity, " + "dl.location, "
+ "CONCAT(' " + fileBaseUrl + "/gcc/files', wcr.upload_image_url) AS upload_image_url, "
+ "DATE_FORMAT(wcr.cdate, '%d-%m-%Y') AS request_date " + "FROM waste_collectors_request wcr "
+ "LEFT JOIN vehicle_master vm ON wcr.vehicle_id = vm.id "
+ "LEFT JOIN dumping_location dl ON wcr.dump_location_id = dl.id "
+ "LEFT JOIN waste_type_master wtm ON wcr.waste_type_id = wtm.id "
+ "LEFT JOIN quantity_master qm ON wcr.waste_quantity_id = qm.id " + "WHERE wcr.refid = ? ");
return jdbcTemplate.queryForList(query.toString(), refId);
}
}

44
src/main/java/com/gcc/restapiservices/cdwaste/util/ApiResponseUtil.java

@ -0,0 +1,44 @@
package com.gcc.restapiservices.cdwaste.util;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
public class ApiResponseUtil {
public static ResponseEntity<List<Map<String, Object>>> success(Object data, String message) {
return buildResponse(true, HttpStatus.OK, message, data);
}
public static ResponseEntity<List<Map<String, Object>>> notFound(String message) {
return buildResponse(false, HttpStatus.NOT_FOUND, message, Collections.emptyList());
}
public static ResponseEntity<List<Map<String, Object>>> error(String message, HttpStatus status) {
return buildResponse(false, status, message, null);
}
public static ResponseEntity<List<Map<String, Object>>> buildResponse(
boolean statusFlag,
HttpStatus httpStatus,
String message,
Object data
) {
Map<String, Object> response = new LinkedHashMap<>();
response.put("status", statusFlag);
response.put("code", httpStatus.value());
response.put("message", message);
response.put("data", data);
List<Map<String, Object>> responseList = Collections.singletonList(response);
return ResponseEntity.status(httpStatus).body(responseList);
}
}

35
src/main/java/com/gcc/restapiservices/cdwaste/util/DateTimeUtil.java

@ -0,0 +1,35 @@
package com.gcc.restapiservices.cdwaste.util;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Service
public class DateTimeUtil {
public static String getCurrentDateTime() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyyHHmmss");
LocalDateTime now = LocalDateTime.now();
return now.format(formatter);
}
public static String getCurrentYear() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
LocalDateTime now = LocalDateTime.now();
return now.format(formatter);
}
public static String getCurrentMonth() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM");
LocalDateTime now = LocalDateTime.now();
return now.format(formatter);
}
public static String getCurrentDay() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd");
LocalDateTime now = LocalDateTime.now();
return now.format(formatter);
}
public static String getCurrentDateTimeMysql() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
return now.format(formatter);
}
}

96
src/main/java/com/gcc/restapiservices/communityHall/configuration/PaymentConfig.java

@ -0,0 +1,96 @@
package com.gcc.restapiservices.communityHall.configuration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@Configuration
@PropertySource("classpath:paymentConfig.properties")
public class PaymentConfig {
@Value("${payment.worldline.merchantId}")
private String merchantId;
@Value("${payment.worldline.encryptionKey}")
private String encryptionKey;
@Value("${payment.worldline.encryptionIV}")
private String encryptionIV;
@Value("${payment.worldline.schemeCode}")
private String schemeCode;
@Value("${payment.worldline.merchantName}")
private String merchantName;
@Value("${payment.worldline.transactionSuccessCode}")
private String transactionSuccessCode;
@Value("${payment.worldline.refundSuccessCode}")
private String refundSuccessCode;
public String getMerchantId() {
return merchantId;
}
public void setMerchantId(String merchantId) {
this.merchantId = merchantId;
}
public String getEncryptionKey() {
return encryptionKey;
}
public byte[] getEncryptionKeyByte() {
return encryptionKey.getBytes();
}
public void setEncryptionKey(String encryptionKey) {
this.encryptionKey = encryptionKey;
}
public String getEncryptionIV() {
return encryptionIV;
}
public byte[] getEncryptionIVByte() {
return encryptionIV.getBytes();
}
public void setEncryptionIV(String encryptionIV) {
this.encryptionIV = encryptionIV;
}
public String getSchemeCode() {
return schemeCode;
}
public void setSchemeCode(String schemeCode) {
this.schemeCode = schemeCode;
}
public String getMerchantName() {
return merchantName;
}
public void setMerchantName(String merchantName) {
this.merchantName = merchantName;
}
public String getTransactionSuccessCode() {
return transactionSuccessCode;
}
public void setTransactionSuccessCode(String transactionSuccessCode) {
this.transactionSuccessCode = transactionSuccessCode;
}
public String getRefundSuccessCode() {
return refundSuccessCode;
}
public void setRefundSuccessCode(String refundSuccessCode) {
this.refundSuccessCode = refundSuccessCode;
}}

95
src/main/java/com/gcc/restapiservices/communityHall/controller/ReportController.java

@ -0,0 +1,95 @@
package com.gcc.restapiservices.communityHall.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gcc.restapiservices.communityHall.service.ReportService;
import com.gcc.restapiservices.communityHall.service.communityHallService;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Controller
@RequestMapping("/gccrestservices/communityhall/api")
public class ReportController {
@Autowired
private communityHallService bookingService;
@Autowired
private ReportService reportService;
@GetMapping("/report")
public ResponseEntity<?> getReport() {
return ResponseEntity.ok("Report");
}
// New REST endpoints for the three services using ReportService
@GetMapping("/zone-wise-booking-data")
public ResponseEntity<?> getZoneWiseBookingData(
@RequestParam(name = "fromDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String fromDate,
@RequestParam(name = "toDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String toDate) {
try {
List<Map<String, Object>> result = reportService.getZoneWiseBookingData(fromDate, toDate);
if (result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No data found for the specified date range");
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error retrieving zone-wise booking data: " + e.getMessage());
}
}
@GetMapping("/hall-details-by-zone")
public ResponseEntity<?> getHallDetailsByZoneAndDate(
@RequestParam(name = "fromDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String fromDate,
@RequestParam(name = "toDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String toDate,
@RequestParam(name = "zone") String zone) {
try {
if (zone == null || zone.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Zone parameter is required");
}
List<Map<String, Object>> result = reportService.getHallDetailsByZoneAndDate(fromDate, toDate, zone);
if (result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("No hall details found for zone: " + zone + " in the specified date range");
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error retrieving hall details by zone: " + e.getMessage());
}
}
@GetMapping("/hall-specific-data")
public ResponseEntity<?> getHallSpecificData(
@RequestParam(name = "fromDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String fromDate,
@RequestParam(name = "toDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) String toDate,
@RequestParam(name = "zone", required = false) String zone,
@RequestParam(name = "hallId", required = false) Integer hallId) {
try {
List<Map<String, Object>> result = reportService.getHallSpecificData(fromDate, toDate, zone, hallId);
if (result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("No counter-wise booking data found for the specified criteria");
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error retrieving counter-wise booking data: " + e.getMessage());
}
}
}

992
src/main/java/com/gcc/restapiservices/communityHall/controller/communityHallController.java

@ -0,0 +1,992 @@
package com.gcc.restapiservices.communityHall.controller;
import com.gcc.restapiservices.communityHall.dto.PaymentWebhookPayload;
import com.gcc.restapiservices.communityHall.service.CHPaymentService;
import com.gcc.restapiservices.communityHall.service.communityHallService;
import com.gcc.restapiservices.configuration.AppConfig;
import com.gcc.restapiservices.coworkspace.controller.ApiResponse;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.dao.EmptyResultDataAccessException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Random;
@RestController
@RequestMapping("/gccrestservices/communityhall/api")
public class communityHallController {
@Autowired
private CHPaymentService chPaymentService;
@Autowired
private communityHallService hallService;
@Autowired
private AppConfig appConfig;
@GetMapping("/getHallList")
public List<Map<String, Object>> getHallList() {
List<Map<String, Object>> hallList = new ArrayList<Map<String, Object>>();
hallList = hallService.getHallList();
if (hallList.isEmpty()) {
return hallList;
}
return hallList;
}
@GetMapping("/getReasonMaster")
public ResponseEntity<?> getReasonMaster() {
try {
List<Map<String, Object>> result = hallService.getReasonMaster();
if (result == null || result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No data found");
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/getDocumentsByReasonId")
public ResponseEntity<?> getDocumentsByReasonId(@RequestParam(value = "reasonId", required = false) Long reasonId) {
if (reasonId == null) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "reasonId is required");
errorResponse.put("message", "Missing required parameter for reasonId");
return ResponseEntity.badRequest().body(errorResponse);
}
try {
List<Map<String, Object>> result = hallService.getDocumentsByReasonId(reasonId);
if (result == null || result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No data found for reasonId: " + reasonId);
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/getRelationTypes")
public ResponseEntity<?> getRelationTypes() {
try {
List<Map<String, String>> result = hallService.getRelationTypesAsMap();
if (result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No data found");
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/getUserDetails")
public ResponseEntity<?> getUserDetails(@RequestParam(value = "Mobilenumber", required = false) Long Mobilenumber) {// @RequestParam(value
// =
// "mobileNumber",
// required
// =
// false)
// Long
// mobileNumber,
if (Mobilenumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
// Check if mobile number is 10 digits
String mobileStr = String.valueOf(Mobilenumber);
if (mobileStr.length() != 10) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Mobile number must be exactly 10 digits.");
}
try {
List<Map<String, Object>> result = hallService.getUserDetails(Mobilenumber);
if (result == null || result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("No data found for Mobilenumber: " + Mobilenumber);
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/calculatehallamount")
public ResponseEntity<Map<String, Object>> getHallDetailsConcession(
@RequestParam(value = "numDays", required = false) Integer numDays,
@RequestParam(value = "startPeriod", required = false) String startPeriod,
@RequestParam(value = "endPeriod", required = false) String endPeriod,
@RequestParam(value = "reasonforBooking", required = false) String reasonforBooking,
@RequestParam(value = "hallId", required = false) Integer hallId) {
// Validation for required parameters
if (numDays == null) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Number of days is required");
errorResponse.put("message", "Please provide the numDays parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (startPeriod == null || startPeriod.trim().isEmpty()) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Start period is required");
errorResponse.put("message", "Please provide the startPeriod parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (!startPeriod.equals("1") && !startPeriod.equals("2")) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Invalid startPeriod");
errorResponse.put("message", "startPeriod must be either '1' or '2'");
return ResponseEntity.badRequest().body(errorResponse);
}
if (endPeriod == null || endPeriod.trim().isEmpty()) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "End period is required");
errorResponse.put("message", "Please provide the endPeriod parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (!endPeriod.equals("1") && !endPeriod.equals("2")) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Invalid endPeriod");
errorResponse.put("message", "endPeriod must be either '1' or '2'");
return ResponseEntity.badRequest().body(errorResponse);
}
if (reasonforBooking == null || reasonforBooking.trim().isEmpty()) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Reason for booking is required");
errorResponse.put("message", "Please provide the reasonforBooking parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (hallId == null) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Hall ID is required");
errorResponse.put("message", "Please provide the hallId parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
Map<String, Object> hallDetails = hallService.getHallDetailsById(hallId);
if (hallDetails == null) {
return ResponseEntity.status(404).body(Map.of("message", "Incorrect HallID"));
}
System.out.println("hallDetails..." + hallDetails);
Map<String, Object> concession = hallService.getHallConcessionByHallId(hallId);
System.out.println("concession....." + concession);
Boolean isSGEObj = (Boolean) hallDetails.get("is_sge");
Boolean isCGEObj = (Boolean) hallDetails.get("is_cge");
boolean isSGE = isSGEObj != null && isSGEObj;
boolean isCGE = isCGEObj != null && isCGEObj;
double fullDayAmount = toDouble(hallDetails.get("full_day_rent"));
double halfDayAmount = toDouble(hallDetails.get("half_day_rent"));
double depositAmount = toDouble(hallDetails.get("deposit_amount"));
double gstRate = toDouble(hallDetails.get("gst"));
System.out.println("tete");
System.out.println(depositAmount);
Map<String, Object> response = new HashMap<>();
double amount = calculateAmount(numDays, startPeriod, endPeriod, fullDayAmount, halfDayAmount);
double totalDepositAmount = calculateDepositAmount(numDays, startPeriod, endPeriod, depositAmount);
double totalAmount = 0;
double discountAmount = 0;
response.put("reasonforBooking", reasonforBooking);
if (!isSGE) {
double gst = round(amount * gstRate / 100.0);
totalAmount = round(amount + gst + totalDepositAmount);
response.put("discount", 0);
response.put("amount", round(amount));
response.put("totalAmount", totalAmount);
response.put("depositAmount", round(totalDepositAmount));
response.put("gst", gst);
response.put("discountAmount", round(amount));
} else if ("SGE".equalsIgnoreCase(reasonforBooking) && concession != null) {
double fullCleaning = toDouble(concession.get("fullday_cleaningcharges"));
double fullPA = toDouble(concession.get("fullday_pasystem"));
double fullEB = toDouble(concession.get("fullday_ebcharges"));
double halfCleaning = toDouble(concession.get("halfday_cleaningcharges"));
double halfPA = toDouble(concession.get("halfday_pasystem"));
double halfEB = toDouble(concession.get("halfday_ebcharges"));
double fullAdd = fullCleaning + fullPA + fullEB;
double halfAdd = halfCleaning + halfPA + halfEB;
double addCharges = calculateAmount(numDays, startPeriod, endPeriod, fullAdd, halfAdd);
double sgeDiscount = toDouble(hallDetails.get("sge_discount"));
double fullRent = toDouble(concession.get("fulldayhallamount"));
double halfRent = toDouble(concession.get("halfdayhallamount"));
double gst = round(addCharges * gstRate / 100.0);
totalAmount = round(addCharges + totalDepositAmount + gst);
discountAmount = round((fullRent * sgeDiscount) / 100.0);
response.put("startPeriod", startPeriod);
response.put("endPeriod", endPeriod);
response.put("fulldayhallAmount", round(fullRent));
response.put("halfdayhallAmount", round(halfRent));
response.put("discount", sgeDiscount);
response.put("rentAmount", 0);
response.put("additionalCharges", round(addCharges));
response.put("netAmount", round(addCharges));
response.put("gst", gst);
response.put("depositAmount", round(totalDepositAmount));
response.put("totalAmount", totalAmount);
response.put("discountAmount", discountAmount);
} else if ("CGE".equalsIgnoreCase(reasonforBooking) && concession != null) {
double fullCleaning = toDouble(concession.get("fullday_cleaningcharges"));
double fullPA = toDouble(concession.get("fullday_pasystem"));
double fullEB = toDouble(concession.get("fullday_ebcharges"));
double halfCleaning = toDouble(concession.get("halfday_cleaningcharges"));
double halfPA = toDouble(concession.get("halfday_pasystem"));
double halfEB = toDouble(concession.get("halfday_ebcharges"));
double fullAdd = fullCleaning + fullPA + fullEB;
double halfAdd = halfCleaning + halfPA + halfEB;
double addCharges = calculateAmount(numDays, startPeriod, endPeriod, fullAdd, halfAdd);
double cgeDiscount = toDouble(hallDetails.get("cge_discount"));
double rentAmount = round((amount * cgeDiscount) / 100.0);
double netAmount = round(rentAmount + addCharges);
double gst = round(netAmount * gstRate / 100.0);
totalAmount = round(netAmount + gst + totalDepositAmount);
response.put("startPeriod", startPeriod);
response.put("endPeriod", endPeriod);
response.put("fulldayhallAmount", round(fullDayAmount));
response.put("halfdayhallAmount", round(halfDayAmount));
response.put("discount", cgeDiscount);
response.put("rentAmount", rentAmount);
response.put("additionalCharges", round(addCharges));
response.put("netAmount", netAmount);
response.put("gst", gst);
response.put("depositAmount", round(totalDepositAmount));
response.put("totalAmount", totalAmount);
response.put("discountAmount", round(discountAmount));
} else {
double gstValue = round(gstRate * amount / 100.0);
totalAmount = round(amount + gstValue + totalDepositAmount);
response.put("discount", 0);
response.put("amount", round(amount));
response.put("totalAmount", totalAmount);
response.put("depositAmount", round(totalDepositAmount));
response.put("gst", gstValue);
response.put("discountAmount", round(amount));
}
response.put("numDays", numDays);
response.put("startPeriod", startPeriod);
response.put("endPeriod", endPeriod);
response.put("reasonforBooking", reasonforBooking);
response.put("hallId", hallId);
return ResponseEntity.ok(response);
}
// Helper to safely convert Object to double
private double toDouble(Object value) {
if (value instanceof Number) {
return ((Number) value).doubleValue();
}
return 0.0;
}
// Helper to round to 2 decimal places
private double round(double value) {
return Math.round(value * 100.0) / 100.0;
}
public double calculateAmount(double numDays, String startPeriod, String endPeriod, double fullDayAmount,
double halfDayAmount) {
double amount = 0;
// If there is only one day
if (numDays == 1) {
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
amount = fullDayAmount;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
amount = halfDayAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
amount = halfDayAmount;
} else {
amount = numDays;
}
} else {
// For multiple days
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
amount = fullDayAmount * numDays;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
amount = fullDayAmount * (numDays - 1) + halfDayAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
amount = fullDayAmount * (numDays - 1) + halfDayAmount;
} else if ("2".equals(startPeriod) && "1".equals(endPeriod)) {
amount = fullDayAmount * (numDays - 2) + halfDayAmount * 2;
} else {
amount = numDays;
}
}
return amount;
}
public double calculateDepositAmount(double numDays, String startPeriod, String endPeriod, double depositAmount) {
double damount = 0;
// If there is only one day
if (numDays == 1) {
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
damount = depositAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount;
} else {
damount = numDays;
}
} else {
// For multiple days
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount * numDays;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
damount = depositAmount * (numDays - 1) + depositAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount * (numDays - 1) + depositAmount;
} else if ("2".equals(startPeriod) && "1".equals(endPeriod)) {
damount = depositAmount * (numDays - 2) + depositAmount;
} else {
damount = numDays;
}
}
return damount;
}
/*
* @GetMapping("/checkMobileExits") public String checkMobileExits(@RequestParam
* (value = "Mobilenumber", required = false) long Mobilenumber) {
* // @RequestParam(value = "mobileNumber", required = false) Long mobileNumber,
*
* try {
*
* // Validate mobile number has exactly 10 digits String mobileStr =
* String.valueOf(Mobilenumber); if (mobileStr.length() != 10) { return
* "Invalid mobile number. Must be exactly 10 digits."; } return
* !hallService.checkMobileExits(Mobilenumber).isEmpty() ? "Already Registered"
* : "Allow to Register"; } catch (Exception e) { return "error"; } }
*/
@GetMapping("/checkMobileExits")
public ResponseEntity<String> checkMobileExits(
@RequestParam(value = "Mobilenumber", required = false) Long Mobilenumber) {
if (Mobilenumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
try {
String mobileStr = String.valueOf(Mobilenumber);
if (mobileStr.length() != 10) {
return ResponseEntity.badRequest().body("Invalid mobile number. Must be exactly 10 digits.");
}
boolean exists = !hallService.checkMobileExits(Mobilenumber).isEmpty();
return ResponseEntity.ok(exists ? "Already Registered" : "Allow to Register");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal server error");
}
}
// otp
@GetMapping(value = "/sendOTP")
public String sendOtp(HttpServletRequest request, @RequestParam String mobile) {
// Validate mobile number has exactly 10 digits
if (mobile == null || mobile.trim().isEmpty()) {
return "Mobile number is required.";
}
String mobileTrimmed = mobile.trim();
if (mobileTrimmed.length() != 10) {
return "Invalid mobile number. Must be exactly 10 digits.";
}
String MobileNo = mobile;
System.out.print("\n MobileNo---:" + mobile);
Random rand = new Random();
int otp = rand.nextInt(90000) + 10000;
// int otp= 22222;
System.out.print("\n otp---:" + otp);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy%20HH:mm");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now));
String generatedToken = "Welcome to GCC! Your OTP for GCC Community Centre is " + otp;
String key = "pfTEYN6H";
String urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + mobile
+ "&from=GCCCRP&body=Welcome to GCC! Your OTP for GCC Community Centre booking is " + otp
+ "&entityid=1401572690000011081&templateid=1407172346444550398";
System.out.print("\n urlString---: " + urlString);
String bodyMessage = "";
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(urlString, String.class);
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
jsonResponse.put("MobileNo", MobileNo);
jsonResponse.put("otp", otp);
bodyMessage = jsonResponse.toString();
System.out.println("\n bodyMessage" + bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: " + e);
bodyMessage = "Error";
}
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
return bodyMessage;
}
@GetMapping("/verifyEmployee")
public ResponseEntity<?> verifyEmployee(@RequestParam String userType,
@RequestParam(value = "EmployeeID", required = false) String EmployeeID) {
if (EmployeeID == null || EmployeeID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Missing or empty 'EmployeeID' parameter");
}
if (!"GCC EMPLOYEE".equalsIgnoreCase(userType)) {
return ResponseEntity.badRequest().body("Invalid userType for Employee verification.");
}
if (EmployeeID == null || EmployeeID.isBlank()) {
return ResponseEntity.badRequest().body("Employee ID is required for GCC EMPLOYEE.");
}
List<Map<String, Object>> existingEmployeeUsers = hallService.checkEmployeeExits(EmployeeID);
if (existingEmployeeUsers != null && !existingEmployeeUsers.isEmpty()) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Employee number already registered");
}
try {
String responseBody = getEmployeeResponse(EmployeeID);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
boolean resultStatus = rootNode.path("ResultStatus").asBoolean();
if (!resultStatus) {
return ResponseEntity.badRequest().body("Invalid employee ID.");
}
return ResponseEntity.ok(rootNode);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Employee verification failed.");
}
}
@GetMapping("/verifyPensioner")
public ResponseEntity<?> verifyPensioner(@RequestParam String userType,
@RequestParam(value = "PensionerID", required = false) String PensionerID) {
if (PensionerID == null || PensionerID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Missing or empty 'PensionerID' parameter");
}
if (!"GCC PENSIONER".equalsIgnoreCase(userType)) {
return ResponseEntity.badRequest().body("Invalid userType for Pensioner verification.");
}
if (PensionerID == null || PensionerID.isBlank()) {
return ResponseEntity.badRequest().body("Pensioner ID is required for GCC PENSIONER.");
}
List<Map<String, Object>> existingEmployeeUsers = hallService.checkPenionerExits(PensionerID);
if (existingEmployeeUsers != null && !existingEmployeeUsers.isEmpty()) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Pensioner number already registered");
}
try {
String responseBody = getPensionerResponse(PensionerID);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
boolean resultStatus = rootNode.path("ResultStatus").asBoolean();
if (!resultStatus) {
return ResponseEntity.badRequest().body("Invalid pensioner ID.");
}
return ResponseEntity.ok(rootNode);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Pensioner verification failed.");
}
}
@PostMapping("/register")
public ResponseEntity<String> registerUser(@RequestParam(value = "userType", required = false) String userType,
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "mobileNumber", required = false) Long mobileNumber,
@RequestParam(value = "aadharNumber", required = false) String aadharNumber,
@RequestParam(required = false) MultipartFile profilePhoto, @RequestParam(required = false) String emailId,
@RequestParam(value = "doorNo", required = false) String doorNo,
@RequestParam(value = "street", required = false) String street,
@RequestParam(value = "area", required = false) String area,
@RequestParam(value = "location", required = false) String location,
@RequestParam(value = "pincode", required = false) String pincode,
@RequestParam(required = false) String PensionerID,
@RequestParam(required = false) String PensionerDepartment,
@RequestParam(required = false) String EmployeeID,
@RequestParam(required = false) String EmployeeDepartment) {
try {
if (userType == null || userType.trim().isEmpty()) {
return ResponseEntity.badRequest().body("User type is required.");
}
if (name == null || name.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Name is required.");
}
if (mobileNumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
if (aadharNumber == null || aadharNumber.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Aadhar number is required.");
}
if (doorNo == null || doorNo.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Door number is required.");
}
if (street == null || street.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Street is required.");
}
if (area == null || area.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Area is required.");
}
if (location == null || location.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Location is required.");
}
if (pincode == null || pincode.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Pincode is required.");
}
// Additional validations for specific user types
if ("GCC PENSIONER".equalsIgnoreCase(userType)) {
if (PensionerID == null || PensionerID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Pensioner ID is required for GCC PENSIONER user type.");
}
if (PensionerID.length() != 6) {
return ResponseEntity.badRequest().body("Invalid PensionerID. Must be exactly 6 digits..");
}
if (PensionerDepartment == null || PensionerDepartment.trim().isEmpty()) {
return ResponseEntity.badRequest()
.body("Pensioner Department is required for GCC PENSIONER user type.");
}
}
if ("GCC EMPLOYEE".equalsIgnoreCase(userType)) {
if (EmployeeID == null || EmployeeID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Employee ID is required for GCC EMPLOYEE user type.");
}
if (EmployeeID.length() != 6) {
return ResponseEntity.badRequest().body("Invalid EmployeeID. Must be exactly 6 digits..");
}
if (EmployeeDepartment == null || EmployeeDepartment.trim().isEmpty()) {
return ResponseEntity.badRequest()
.body("Employee Department is required for GCC EMPLOYEE user type.");
}
}
// Format validations
if (String.valueOf(mobileNumber).length() != 10) {
return ResponseEntity.badRequest().body("Mobile number must be exactly 10 digits.");
}
if (pincode.length() != 6) {
return ResponseEntity.badRequest().body("Pincode must be exactly 6 digits.");
}
if (emailId != null && !emailId.isBlank()) {
String emailRegex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.com$";
if (!emailId.matches(emailRegex)) {
return ResponseEntity.badRequest().body("Invalid email ID.");
}
}
if (aadharNumber.length() != 12) {
return ResponseEntity.badRequest().body("Aadhar number must be exactly 12 digits.");
}
// Mobile number check only for PUBLIC users
if ("PUBLIC".equalsIgnoreCase(userType)) {
List<Map<String, Object>> existingUsers = hallService.checkMobileExits(mobileNumber);
boolean exists = existingUsers != null && !existingUsers.isEmpty();
if (exists) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Mobile number already registered");
}
}
if ("GCC PENSIONER".equalsIgnoreCase(userType)) {
List<Map<String, Object>> existingUsers = hallService.checkPenionerExits(PensionerID);
boolean exists = existingUsers != null && !existingUsers.isEmpty();
if (exists) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Pensioner number already registered ");
}
}
if ("GCC EMPLOYEE".equalsIgnoreCase(userType)) {
List<Map<String, Object>> existingUsers = hallService.checkEmployeeExits(EmployeeID);
boolean exists = existingUsers != null && !existingUsers.isEmpty();
if (exists) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Employee number already registered");
}
}
// Register all user types
hallService.registerUser(userType, name, mobileNumber, aadharNumber, profilePhoto, emailId, doorNo, street,
area, location, pincode, PensionerID, PensionerDepartment, EmployeeID, EmployeeDepartment);
// return ResponseEntity.ok("Pending.");
// Return different success messages based on user type
String successMessage;
if ("PUBLIC".equalsIgnoreCase(userType)) {
successMessage = "Welcome to GCC, Your User Registration for booking Community Centre is successful.";
} else if ("GCC PENSIONER".equalsIgnoreCase(userType) || "COUNCILLOR".equalsIgnoreCase(userType)
|| "GCC EMPLOYEE".equalsIgnoreCase(userType)) {
successMessage = "Welcome to GCC, Your User Registration request for booking Community Centre is submitted successfully.";
} else {
successMessage = "Welcome to GCC, your registration is successful.";
}
return ResponseEntity.ok(successMessage);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Registration failed.");
}
}
private String getPensionerResponse(String pensionerId) {
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?serviceId=getPensionerDetailsList&pensionerId="
+ pensionerId;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
String responseBody = responseEntity.getBody();
System.out.println("response.. " + responseBody);
return responseBody;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private String getEmployeeResponse(String employeeId) {
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?serviceId=getEmployeeDetail&EmployeeID="
+ employeeId;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
String responseBody = responseEntity.getBody();
System.out.println("Employee API response: " + responseBody);
return responseBody;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@GetMapping("/verifyCounsellor")
public ResponseEntity<?> checkCounsellorMobileExits(
@RequestParam(value = "mobileNo", required = false) Long mobileNo) {// @RequestParam(value = "mobileNumber",
// required = false) Long mobileNumber,
if (mobileNo == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
String mobileStr = String.valueOf(mobileNo);
if (mobileStr.length() != 10) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Mobile number must be exactly 10 digits.");
}
try {
// Validate input
if (mobileNo == null || mobileNo.toString().trim().isEmpty()) {
return ResponseEntity.badRequest().body("Missing or empty 'mobileNo' parameter.");
}
// Search for counsellor using mobile1 or mobile2
List<Map<String, Object>> counsellorList = hallService.findCounsellorByMobile(mobileNo);
if (counsellorList == null || counsellorList.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Counsellor mobile number not found.");
}
Map<String, Object> counsellor = counsellorList.get(0);
String mobile1 = String.valueOf(counsellor.get("mobile1"));
String mobile2 = String.valueOf(counsellor.get("mobile2"));
// Check if either number is already used in Users table
boolean isMobile1Used = !hallService.checkMobileExits(Long.parseLong(mobile1)).isEmpty();
boolean isMobile2Used = !hallService.checkMobileExits(Long.parseLong(mobile2)).isEmpty();
if (isMobile1Used || isMobile2Used) {
return ResponseEntity.status(HttpStatus.CONFLICT)
.body("One of the counsellor's mobile numbers is already used.");
}
return ResponseEntity.ok(counsellor.get("name").toString());
} catch (NumberFormatException e) {
return ResponseEntity.badRequest().body("Invalid mobile number format.");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Mobile number verification failed.");
}
}
// acknowledgment
/*
* @GetMapping("/acknowledgement") public ResponseEntity<Map<String, Object>>
* getBookingDetails(@RequestParam(value = "bookingId", required = false) int
* bookingId) { Map<String, Object> bookingDetails =
* hallService.getBookingDetailsById(bookingId); return
* ResponseEntity.ok(bookingDetails); }
*/
@GetMapping("/acknowledgement")
public ResponseEntity<?> getBookingDetails(@RequestParam(value = "bookingId", required = false) Integer bookingId) {
if (bookingId == null) {
return ResponseEntity.badRequest().body("Booking ID is required.");
}
try {
Map<String, Object> bookingDetails = hallService.getBookingDetailsById(bookingId);
return ResponseEntity.ok(bookingDetails);
} catch (EmptyResultDataAccessException ex) {
// No booking found
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No booking found for bookingId");
} catch (Exception e) {
// Any other error
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
//mobile
/*
* @GetMapping("/viewhistory") public ResponseEntity<Map<String, Object>>
* getBookingsByMobile(
*
* @RequestParam("mobileNumber") Long mobileNumber) {
*
*
* Map<String, Object> response = new HashMap<>();
*
* // Step 1: Check if user exists List<Map<String, Object>> userResult =
* hallService.checkMobileExits(mobileNumber);
*
* if (userResult.isEmpty()) { response.put("status", "NOT_FOUND");
* response.put("message", "No user found with the given mobile number"); return
* ResponseEntity.ok(response); }
*
* // Step 2: If exists → Call service List<Map<String, Object>> bookings =
* hallService.getBookingsByMobile(mobileNumber);
*
* response.put("status", "SUCCESS");
*
* response.put("mobile_no", mobileNumber); response.put("bookings", bookings);
*
* return ResponseEntity.ok(response); }
*/
@GetMapping("/viewhistory")
public ResponseEntity<?> getBookingsByMobile(
@RequestParam(value = "mobileNumber", required = false) Long mobileNumber) {
if (mobileNumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
// Check if mobile number is exactly 10 digits
String mobileStr = String.valueOf(mobileNumber);
if (mobileStr.length() != 10) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Mobile number must be exactly 10 digits.");
}
try {
// Step 1: Check if user exists
List<Map<String, Object>> userResult = hallService.checkMobileExits(mobileNumber);
if (userResult.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No user found with the given mobile number ");
}
// Step 2: Get bookings
List<Map<String, Object>> bookings = hallService.getBookingsByMobile(mobileNumber);
if (bookings == null || bookings.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("No bookings found for mobile number: " + mobileNumber);
}
// Success response
Map<String, Object> response = new HashMap<>();
response.put("status", "SUCCESS");
response.put("mobile_no", mobileNumber);
response.put("bookings", bookings);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@PostMapping(path = "/saveTheRequest2", consumes = {"multipart/form-data"})
public ResponseEntity<?> saveTheBookingDetails2(HttpServletRequest request) {
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, Object> bookingDetails = splitFormData(multipartRequest);
Map<String, Object> saveBookingDetails = hallService.saveBookingDetails(bookingDetails);
return ResponseEntity.ok(new ApiResponse("success", "Booking details saved successfully",
saveBookingDetails, HttpStatus.OK.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to save booking details " + e.getMessage(), null,
HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
public Map<String, Object> splitFormData(MultipartHttpServletRequest multipartRequest) {
Map<String, Object> formData = new HashMap<>();
// Iterate through the request parameters
Enumeration<String> parameterNames = multipartRequest.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = parameterNames.nextElement();
String paramValues = multipartRequest.getParameter(paramName);
formData.put(paramName, paramValues);
}
// Iterate through the request parts (files)
try {
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
MultipartFile file = entry.getValue();
if (!file.isEmpty()) {
formData.put(entry.getKey(), file);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return formData;
}
@PostMapping("/payment-request")
public ResponseEntity<?> startPayment(@RequestParam int bookingId) {
try {
Map<String, Object> paymentDetails = hallService.startPayment(bookingId);
return ResponseEntity.ok(new ApiResponse("success", "Payment request initiated successfully",
paymentDetails, HttpStatus.OK.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to initiate payment request: " + e.getMessage(), null,
HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
@PostMapping("/payment-response")
public ResponseEntity<?> paymentResponse(@RequestParam String orderId, @RequestBody PaymentWebhookPayload payload) {
try {
ResponseEntity<?> result = chPaymentService.processPaymentResponse(orderId, payload);
return ResponseEntity
.ok(new ApiResponse("success", "Payment processed successfully", result, HttpStatus.OK.value()));
} catch (IllegalArgumentException e) {
e.printStackTrace();
return ResponseEntity.badRequest().body(new ApiResponse("error", "Invalid request: " + e.getMessage(), null,
HttpStatus.BAD_REQUEST.value()));
} catch (EmptyResultDataAccessException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ApiResponse("error",
"No payment record found for Order ID: " + orderId, null, HttpStatus.NOT_FOUND.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ApiResponse("error",
"Failed to Process the Payment: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
@GetMapping("/checkSlot")
public ResponseEntity<Map<String, Object>> checkSlotAvailability(
@RequestParam int hallId,
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam int startingSlot, // 1 = morning, 2 = evening
@RequestParam int endingSlot // 1 = morning, 2 = evening
) {
Map<String, Object> result = hallService.checkSlotAvailability(hallId, startDate, endDate, startingSlot, endingSlot);
return ResponseEntity.ok(result);
}
}

198
src/main/java/com/gcc/restapiservices/communityHall/dto/PaymentWebhookPayload.java

@ -0,0 +1,198 @@
package com.gcc.restapiservices.communityHall.dto;
import java.math.BigDecimal;
public class PaymentWebhookPayload {
private String reference_id;
private Currency currency;
private Amount paymentAmount;
private Transaction transaction;
public String getReference_id() {
return reference_id;
}
public void setReference_id(String reference_id) {
this.reference_id = reference_id;
}
public Currency getCurrency() {
return currency;
}
public void setCurrency(Currency currency) {
this.currency = currency;
}
public Amount getPaymentAmount() {
return paymentAmount;
}
public void setPaymentAmount(Amount paymentAmount) {
this.paymentAmount = paymentAmount;
}
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
public static class Currency {
private String reference_id;
private Amount amount;
private String currency;
private Transaction transaction;
public String getReference_id() {
return reference_id;
}
public void setReference_id(String reference_id) {
this.reference_id = reference_id;
}
public Amount getAmount() {
return amount;
}
public void setAmount(Amount amount) {
this.amount = amount;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
}
public static class Amount {
private double value;
private double offset;
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public double getOffset() {
return offset;
}
public void setOffset(double offset) {
this.offset = offset;
}
}
public static class Transaction {
private String id;
private String pg_transaction_id;
private String type;
private String status;
private long created_timestamp;
private long updated_timestamp;
private Amount amount;
private String currency;
private Method method;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPg_transaction_id() {
return pg_transaction_id;
}
public void setPg_transaction_id(String pg_transaction_id) {
this.pg_transaction_id = pg_transaction_id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public long getCreated_timestamp() {
return created_timestamp;
}
public void setCreated_timestamp(long created_timestamp) {
this.created_timestamp = created_timestamp;
}
public long getUpdated_timestamp() {
return updated_timestamp;
}
public void setUpdated_timestamp(long updated_timestamp) {
this.updated_timestamp = updated_timestamp;
}
public Amount getAmount() {
return amount;
}
public void setAmount(Amount amount) {
this.amount = amount;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public Method getMethod() {
return method;
}
public void setMethod(Method method) {
this.method = method;
}
}
public static class Method {
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
}

83
src/main/java/com/gcc/restapiservices/communityHall/dto/TransactionData.java

@ -0,0 +1,83 @@
package com.gcc.restapiservices.communityHall.dto;
public class TransactionData {
private Merchant merchant = new Merchant();
private Transaction transaction = new Transaction();
public Merchant getMerchant() {
return merchant;
}
public Transaction getTransaction() {
return transaction;
}
public static class Merchant {
private String identifier;
public String getIdentifier() {
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
}
public static class Transaction {
private String amount;
private String identifier;
private String dateTime;
private String requestType;
private String token;
private String reference;
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getIdentifier() {
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
public String getDateTime() {
return dateTime;
}
public void setDateTime(String dateTime) {
this.dateTime = dateTime;
}
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getReference() {
return reference;
}
public void setReference(String reference) {
this.reference = reference;
}
}
}

73
src/main/java/com/gcc/restapiservices/communityHall/dto/TransactionRefundResponse.java

@ -0,0 +1,73 @@
package com.gcc.restapiservices.communityHall.dto;
public class TransactionRefundResponse {
private String merchantTransactionIdentifier;
private PaymentMethod paymentMethod;
public String getMerchantTransactionIdentifier() {
return merchantTransactionIdentifier;
}
public void setMerchantTransactionIdentifier(String merchantTransactionIdentifier) {
this.merchantTransactionIdentifier = merchantTransactionIdentifier;
}
public PaymentMethod getPaymentMethod() {
return paymentMethod;
}
public void setPaymentMethod(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}
public static class PaymentMethod {
private PaymentTransaction paymentTransaction;
public PaymentTransaction getPaymentTransaction() {
return paymentTransaction;
}
public void setPaymentTransaction(PaymentTransaction paymentTransaction) {
this.paymentTransaction = paymentTransaction;
}
}
public static class PaymentTransaction {
private String statusCode;
private String amount;
private String balanceAmount;
private String refundIdentifier;
public String getStatusCode() {
return statusCode;
}
public void setStatusCode(String statusCode) {
this.statusCode = statusCode;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getBalanceAmount() {
return balanceAmount;
}
public void setBalanceAmount(String balanceAmount) {
this.balanceAmount = balanceAmount;
}
public String getRefundIdentifier() {
return refundIdentifier;
}
public void setRefundIdentifier(String refundIdentifier) {
this.refundIdentifier = refundIdentifier;
}
}
}

536
src/main/java/com/gcc/restapiservices/communityHall/service/CHPaymentService.java

@ -0,0 +1,536 @@
package com.gcc.restapiservices.communityHall.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gcc.restapiservices.communityHall.configuration.PaymentConfig;
import com.gcc.restapiservices.communityHall.dto.PaymentWebhookPayload;
import com.gcc.restapiservices.communityHall.dto.TransactionData;
import com.gcc.restapiservices.communityHall.dto.TransactionRefundResponse;
import com.gcc.restapiservices.communityHall.util.EncryptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import javax.sql.DataSource;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
public class CHPaymentService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private PaymentConfig paymentConfig;
@Autowired
private WhatsappMsgServiceImpl whatsappMsgServiceImpl;
@Autowired
private EncryptionUtils encryptionUtils;
private final ObjectMapper objectMapper = new ObjectMapper();
@Autowired
public void setDataSource(@Qualifier("mysqlCommunityHallDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional("mysqlCommunityHallTransactionManager")
public ResponseEntity<?> processPaymentResponse(
@RequestParam String OrderId,
@RequestBody PaymentWebhookPayload payload) throws Exception {
Map<String, Object> result = new HashMap<>();
String transactionId = OrderId;
String pgTxnId = payload.getTransaction().getPg_transaction_id();
String status = payload.getTransaction().getStatus();
double amount = payload.getTransaction().getAmount().getValue() / 100.0;
String dateTime = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")
.withZone(ZoneId.of("Asia/Kolkata"))
.format(Instant.ofEpochSecond(payload.getTransaction().getCreated_timestamp()));
Map<String, Object> txn;
try {
txn = jdbcTemplate.queryForMap(
"SELECT * FROM transaction_response WHERE txansaction_id = ? AND status_code ='temp' ",
transactionId);
} catch (EmptyResultDataAccessException e) {
result.put("status", "error");
result.put("message", "Transaction not found or already processed.");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
}
int bookingId = (int) txn.get("booking_id");
int hallId = (int) txn.get("hall_id");
String userId = (String) txn.get("user_id");
jdbcTemplate.update(
"UPDATE transaction_response SET tpsl_txn_id = ?, amount = ?, date = ?, status_code = ?, response = ?, "
+
"booking_id = ?, hall_id = ?, user_id = ? WHERE txansaction_id = ?",
pgTxnId, String.valueOf(amount), dateTime, status,
objectMapper.writeValueAsString(payload), bookingId, hallId, userId, transactionId);
Map<String, Object> booking;
try {
booking = jdbcTemplate.queryForMap("SELECT * FROM booking_details WHERE booking_id = ?", bookingId);
} catch (EmptyResultDataAccessException e) {
result.put("status", "error");
result.put("message", "Booking not found.");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
}
double expectedAmount = booking.get("amount_received") != null
? ((Number) booking.get("amount_received")).doubleValue()
: 0.0;
jdbcTemplate.update("INSERT INTO payments "
+ " (transaction_id, amount_received, payment_status, cdate, booking_details_booking_id) "
+ " VALUES (?, ?, ?, ?, ?)", transactionId, amount, "Not Completed", new Date(),
bookingId);
if (expectedAmount != amount) {
updatePaymentStatus(transactionId, "Failed");
// bookingFailure(bookingId, 1);
result.put("status", "error");
result.put("message", "Amount mismatch. Payment failed.");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
}
if ("success".equalsIgnoreCase(status)) {
updatePaymentStatus(transactionId, "Success");
confirmBooking(bookingId);
String acknowledgementUrl = "https://gccservices.chennaicorporation.gov.in/communityhall/user/acknowledgement?bookingId="
+ bookingId;
result.put("status", "success");
result.put("message", "Payment processed successfully.");
result.put("acknowledgement_url", acknowledgementUrl);
return ResponseEntity.ok(result);
} else {
updatePaymentStatus(transactionId, "Failed");
result.put("status", "error");
result.put("message", "Payment failed.");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
}
}
public void updatePaymentStatus(String transactionId, String status) {
jdbcTemplate.update("UPDATE payments SET payment_status = ? WHERE transaction_id = ?", status, transactionId);
}
@Transactional(value = "mysqlCommunityHallTransactionManager", propagation = Propagation.REQUIRES_NEW)
public void bookingFailure(int bookingId, int flag) {
String comment = flag == 1 ? "Booking Not Confirmed"
: "Slot occupied by other user, Amount paid will be refunded.";
jdbcTemplate.update("UPDATE booking_details SET booking_status = 'REFUNDED', comments = ? WHERE booking_id = ?",
comment, bookingId);
/*
* String refundStatus = booking.get("refund_status").toString();
* if (!("COMPLETED".equalsIgnoreCase(refundStatus)) &&
* !("CLOSED".equalsIgnoreCase(refundStatus))) {
* refundTheAmount(bookingId, Integer.parseInt(userId));
* }
*/
}
@Transactional("mysqlCommunityHallTransactionManager")
public String confirmBooking(int bookingId) {
Map<String, Object> booking = jdbcTemplate.queryForMap("SELECT * FROM booking_details WHERE booking_id = ?",
bookingId);
try {
int hallId = (int) booking.get("hall_details_hall_id");
LocalDate startDate = LocalDate.parse((String) booking.get("start_date"));
LocalDate endDate = LocalDate.parse((String) booking.get("end_date"));
int startSlot = (int) booking.get("starting_slot");
int endSlot = (int) booking.get("ending_slot");
double noOfDays = booking.get("no_of_days") != null ? (double) booking.get("no_of_days") : 1.0;
// int i = 0;
// for (LocalDate date = startDate; !date.isAfter(endDate); date =
// date.plusDays(1)) {
// String checkSql = "SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id
// = ?";
// List<Map<String, Object>> existing = jdbcTemplate.queryForList(checkSql,
// date, hallId);
// if (!existing.isEmpty()) {
// Map<String, Object> cal = existing.get(0);
// if ((boolean) cal.get("is_blocked")) throw new RuntimeException("GCC Blocked
// Date");
// boolean morningBooked = (boolean) cal.get("morning_slot");
// boolean eveningBooked = (boolean) cal.get("evening_slot");
// if ((date.equals(startDate) && startSlot == 1 && morningBooked) ||
// (date.equals(startDate) && startSlot == 2 && eveningBooked) ||
// (date.equals(endDate) && endSlot == 1 && morningBooked) ||
// (date.equals(endDate) && endSlot == 2 && eveningBooked)) {
// throw new RuntimeException("Slot already booked or partially occupied");
// }
// updateCalendarWithBooking(date, bookingId, hallId, startDate, endDate,
// startSlot, endSlot, i);
// } else {
// insertCalendarWithBooking(date, bookingId, hallId, startDate, endDate,
// startSlot, endSlot, i);
// }
// i++;
// }
int i = 0;
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
String checkSql = "SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id = ?";
List<Map<String, Object>> existing = jdbcTemplate.queryForList(checkSql, date, hallId);
if (!existing.isEmpty()) {
Map<String, Object> cal = existing.get(0);
if ((boolean) cal.get("is_blocked"))
throw new RuntimeException("GCC Blocked Date");
boolean morningBooked = (boolean) cal.get("morning_slot");
boolean eveningBooked = (boolean) cal.get("evening_slot");
int isBooked = (int) cal.get("is_booked");
String bookingId1 = (String) cal.get("booking_id_1");
String bookingId2 = (String) cal.get("booking_id_2");
// ====== Validation ======
if ((date.equals(startDate) && startSlot == 1 && morningBooked) ||
(date.equals(startDate) && startSlot == 2 && eveningBooked) ||
(date.equals(endDate) && endSlot == 1 && morningBooked) ||
(date.equals(endDate) && endSlot == 2 && eveningBooked) ||
(morningBooked && eveningBooked)) {
throw new RuntimeException("Slot already booked or partially occupied");
}
// ====== Update slots ======
if (date.equals(startDate)) {
if (startSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
if (!date.equals(endDate) || (startDate.equals(endDate) && endSlot == 2)) {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else if (date.equals(endDate)) {
if (endSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
if (endSlot == 2) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
}
}
} else {
morningBooked = true;
eveningBooked = true;
bookingId1 = String.valueOf(bookingId);
bookingId2 = String.valueOf(bookingId);
isBooked += 2;
}
// ====== Run UPDATE ======
String updateSql = "UPDATE booking_calendar " +
"SET morning_slot=?, evening_slot=?, is_booked=?, booking_id_1=?, booking_id_2=? " +
"WHERE bdate=? AND hall_id=?";
jdbcTemplate.update(updateSql,
morningBooked, eveningBooked, isBooked, bookingId1, bookingId2,
date, hallId);
} else {
// ====== Insert new row ======
boolean morningBooked = false;
boolean eveningBooked = false;
boolean isDelete = false;
boolean isBlocked = false;
int isBooked = 0;
String bookingId1 = null, bookingId2 = null;
if (date.equals(startDate)) {
if (startSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
if (!date.equals(endDate) || (startDate.equals(endDate) && endSlot == 2)) {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else if (date.equals(endDate)) {
if (endSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
if (endSlot == 2) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
}
}
} else {
morningBooked = true;
eveningBooked = true;
bookingId1 = String.valueOf(bookingId);
bookingId2 = String.valueOf(bookingId);
isBooked += 2;
}
String uniqueId = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
System.out.println("uniqueId...."+uniqueId+"\n hallId: "+hallId+"\n morningBooked: "+morningBooked+
"\n eveningBooked: "+eveningBooked+"\n isBooked: "+isBooked+"\n bookingId1: "+bookingId1+"\n bookingId2: "+bookingId2);
String insertSql = "INSERT INTO booking_calendar " +
"(bdate, hall_id, morning_slot, evening_slot, is_booked, booking_id_1, booking_id_2, is_active, unique_id, is_delete, is_blocked) "
+"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
jdbcTemplate.update(insertSql,date, hallId, morningBooked, eveningBooked, isBooked,bookingId1, bookingId2, true, uniqueId, isDelete, isBlocked);
}
i++;
}
String reason = (String) booking.get("reason");
String reasonCode = fetchReasonCode(reason);
String status = "APPROVED";
String comments = "Booking Confirmed Successfully";
if (reasonCode != null && !reasonCode.trim().isEmpty()) {
if (List.of("CGE", "CAO", "SGE").contains(reasonCode)) {
status = "WAITING_FOR_NOC";
comments = "Waiting For NOC Documents";
}
}
jdbcTemplate.update("UPDATE booking_details SET booking_status = ?, comments = ? WHERE booking_id = ?",
status, comments, bookingId);
sendConfirmationMessages(bookingId, booking);
return comments;
} catch (Exception e) {
e.printStackTrace();
// bookingFailure(bookingId, 2);
return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingId;
}
}
private void updateCalendarWithBooking(LocalDate date, int bookingId, int hallId, LocalDate startDate,
LocalDate endDate, int startSlot, int endSlot, int i) {
String updateSql = "UPDATE booking_calendar SET morning_slot = ?, evening_slot = ?, booking_id_1 = ?, booking_id_2 = ?, is_booked = is_booked + ? WHERE bdate = ? AND hall_id = ?";
boolean isMorning = true;
boolean isEvening = true;
int increment = 2;
jdbcTemplate.update(updateSql, isMorning, isEvening, bookingId, bookingId, increment, date, hallId);
}
private void insertCalendarWithBooking(LocalDate date, int bookingId, int hallId, LocalDate startDate,
LocalDate endDate, int startSlot, int endSlot, int i) {
String uniqueId = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
String insertSql = "INSERT INTO booking_calendar (bdate, hall_id, is_active, is_booked, is_delete, morning_slot, evening_slot, booking_id_1, booking_id_2, is_blocked, unique_id) VALUES (?, ?, true, ?, false, ?, ?, ?, ?, false, ?)";
jdbcTemplate.update(insertSql, date, hallId, 2, true, true, bookingId, bookingId, uniqueId);
}
private String fetchReasonCode(String reason) {
try {
String sql = "SELECT reasoncode FROM reason_master WHERE reason = ?";
return jdbcTemplate.queryForObject(sql, String.class, reason);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
private String sendConfirmationMessages(int bookingId, Map<String, Object> booking) {
System.out.println("confirmation message calling..");
try {
String bookingconfirmationmsg, urlString, whatsupmsg;
String reason = booking.get("reason").toString();
String reasonCode = fetchReasonCode(reason);
String bookingDate = booking.get("booking_date").toString();
String startDate = booking.get("start_date").toString();
int userId = Integer.parseInt(booking.get("users_user_id").toString());
Map<String, Object> userData = jdbcTemplate.queryForMap("SELECT * FROM users WHERE user_id = ? ", userId);
String userMobNo = userData.get("mobile_no").toString();
if (reasonCode != null && !reasonCode.trim().isEmpty()) {
if (reasonCode.equals("CGE") || reasonCode.equals("CAO") || reasonCode.equals("SGE")) {
updateBookingStatus(bookingId, "WAITING_FOR_NOC", "Waiting For NOC Documents");
bookingconfirmationmsg = "Your booking ID " + bookingId + " on " + bookingDate
+ " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + userMobNo +
"&from=GCCCRP&body=" + bookingconfirmationmsg
+ "&entityid=1401572690000011081&templateid=1407172346459428987";
whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="
+userMobNo + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+"
+bookingId + "+on+" + bookingDate+ "+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Waiting For NOC Documents";
} else {
updateBookingStatus(bookingId, "APPROVED", "Booking Confirmed Successfully");
bookingconfirmationmsg = "Your booking ID " + bookingId + " on " + startDate
+ " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + userMobNo +
"&from=GCCCRP&body=" + bookingconfirmationmsg
+ "&entityid=1401572690000011081&templateid=1407172346459428987";
whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="
+
userMobNo + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+"
+
bookingId + "+on+" + startDate
+ "+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Booking confirmed successfully";
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return "Incorrect booking data";
}
/*
* public String refundTheAmount(int bookingId, int userId) {
* try {
*
* // get mobile no using userId --> need to add
* Map<String, Object> txn = jdbcTemplate.
* queryForMap("SELECT * FROM transaction_response WHERE booking_id = ? AND status_code = ? ORDER BY id DESC LIMIT 1"
* , bookingId, paymentConfig.getTransactionSuccessCode());
* String amount = (String) txn.get("amount");
* String txnDate = ((String) txn.get("date")).split(" ")[0];
* String tpslTxnId = (String) txn.get("tpsl_txn_id");
*
* TransactionData payload = new TransactionData();
* payload.getMerchant().setIdentifier(paymentConfig.getMerchantId());
* payload.getTransaction().setAmount(amount);
* payload.getTransaction().setIdentifier("");
* payload.getTransaction().setDateTime(txnDate);
* payload.getTransaction().setRequestType("R");
* payload.getTransaction().setToken("");
* payload.getTransaction().setReference(tpslTxnId);
*
* String json = objectMapper.writeValueAsString(payload);
* String encrypted = encryptionUtils.encryptHxRefund(json);
*
* String url = "https://www.tpsl-india.in/PaymentGateway/merchant2.pg/" +
* paymentConfig.getMerchantId();
* ResponseEntity<String> response = new RestTemplate().postForEntity(url,
* encrypted, String.class);
* String decrypted = encryptionUtils.decryptHxTRefund(response.getBody());
*
* TransactionRefundResponse refundRes = objectMapper.readValue(decrypted,
* TransactionRefundResponse.class);
* String refundStatusCode =
* refundRes.getPaymentMethod().getPaymentTransaction().getStatusCode();
* String refundTxnId = refundRes.getMerchantTransactionIdentifier();
* String refundIdentifier =
* refundRes.getPaymentMethod().getPaymentTransaction().getRefundIdentifier();
* String refundedAmount =
* refundRes.getPaymentMethod().getPaymentTransaction().getAmount();
* String balanceAmount =
* refundRes.getPaymentMethod().getPaymentTransaction().getBalanceAmount();
*
* jdbcTemplate.
* update("INSERT INTO refund_response (booking_id, user_id, response, status_code, txansaction_id, amount, balace_amount, date) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
* , bookingId, userId, decrypted, refundStatusCode, refundTxnId,
* refundedAmount, balanceAmount, LocalDate.now());
*
* Map<String, Object> booking =
* jdbcTemplate.queryForMap("SELECT * FROM booking_details WHERE booking_id = ?"
* , bookingId);
*
* jdbcTemplate.
* update("INSERT INTO refund_transaction (amount_refunded, cdate, booking_details_booking_id, refund_identifier, refund_status, transaction_id) VALUES (?, ?, ?, ?, ?, ?)"
* , Double.parseDouble(refundedAmount), new Date(), bookingId,
* refundIdentifier, refundStatusCode, refundTxnId);
*
* if (refundStatusCode.equals(paymentConfig.getRefundSuccessCode())) {
* jdbcTemplate.
* update("UPDATE booking_details SET refund_status = 'COMPLETED' WHERE booking_id = ?"
* , bookingId);
*
* long mobile = (long) booking.get("users_user_id");
* double amt = Double.parseDouble(refundedAmount);
* whatsappMsgServiceImpl.sendSMS(buildSMSUrl(mobile, amt, bookingId));
* whatsappMsgServiceImpl.sendMsg(buildWhatsAppUrl(mobile, amt, bookingId));
* return "Refunded";
* }
*
* return "Error";
* } catch (Exception e) {
* e.printStackTrace();
* return "error";
* }
* }
*/
private String buildSMSUrl(long mobile, double amt, int bookingId) {
return "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + mobile
+ "&from=GCCCRP&body=Your refund amount of Rs. " + amt + " for Booking ID " + bookingId
+ " has been initiated.";
}
private String buildWhatsAppUrl(long mobile, double amt, int bookingId) {
return "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + mobile
+ "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+refund+of+Rs.+" + amt
+ "+for+Booking+ID+" + bookingId + "+has+been+initiated.";
}
public void updateBookingStatus(int bookingId, String bookingStatus, String comments) {
String updateSql = "update booking_details set booking_status =?, comments= ? WHERE booking_id = ?";
jdbcTemplate.update(updateSql, bookingStatus, comments, bookingId);
}
}

162
src/main/java/com/gcc/restapiservices/communityHall/service/ReportService.java

@ -0,0 +1,162 @@
package com.gcc.restapiservices.communityHall.service;
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;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.stream.Collectors;
@Service
public class ReportService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlCommunityHallliveDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// Zone-wise booking data from date to date
public List<Map<String, Object>> getZoneWiseBookingData(String fromDate, String toDate) {
String sql = "SELECT hd.zone, " +
"COUNT(DISTINCT hd.hall_id) AS hall_count, " +
"SUM(CASE WHEN bd.booking_type = 'ONLINE' AND bd.counter_id IS NULL THEN 1 ELSE 0 END) AS online_bookings, " +
"SUM(CASE WHEN bd.booking_type = 'ONLINE' AND bd.counter_id IS NOT NULL THEN 1 ELSE 0 END) AS counter_bookings, " +
"COUNT(bd.booking_id) AS total_bookings " +
"FROM hall_details hd " +
"LEFT JOIN booking_details bd ON hd.hall_id = bd.hall_details_hall_id " +
"AND DATE(bd.booking_date) BETWEEN ? AND ? " +
"AND bd.booking_status NOT IN ('PENDING','GCC_UNBLOCKED','REFUNDED','GCC_BLOCKED') " +
"AND bd.booking_type IS NOT NULL " +
"GROUP BY hd.zone " +
"ORDER BY hd.zone";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, fromDate, toDate);
// Transform to the desired JSON format
List<Map<String, Object>> jsonResult = new ArrayList<>();
for (Map<String, Object> row : result) {
Map<String, Object> zoneData = new HashMap<>();
zoneData.put("Zone", row.get("zone"));
zoneData.put("Hall Count", row.get("hall_count"));
zoneData.put("Online Bookings", row.get("online_bookings"));
zoneData.put("Counter Bookings", row.get("counter_bookings"));
zoneData.put("Total Bookings", row.get("total_bookings"));
jsonResult.add(zoneData);
}
return jsonResult;
}
// Helper method to get zone labels
private String getZoneLabel(String zoneNumber) {
switch (zoneNumber) {
case "01": return "Zone 1 - Tondiarpet";
case "02": return "Zone 2 - Royapuram";
case "03": return "Zone 3 - Thiru Vi Ka Nagar";
case "04": return "Zone 4 - Ambattur";
case "05": return "Zone 5 - Anna Nagar";
case "06": return "Zone 6 - Teynampet";
case "07": return "Zone 7 - Kodambakkam";
case "08": return "Zone 8 - Valasaravakkam";
case "09": return "Zone 9 - Alandur";
case "10": return "Zone 10 - Adyar";
case "11": return "Zone 11 - Perungudi";
case "12": return "Zone 12 - Sholinganallur";
case "13": return "Zone 13 - Thiruvottiyur";
case "14": return "Zone 14 - Manali";
case "15": return "Zone 15 - Madhavaram";
default: return "Zone " + zoneNumber;
}
}
// From date to date zone for hall details
public List<Map<String, Object>> getHallDetailsByZoneAndDate(String fromDate, String toDate, String zone) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT hd.hall_id, hd.hall_name, ");
sql.append("SUM(CASE WHEN bd.booking_type = 'ONLINE' AND bd.counter_id IS NULL THEN 1 ELSE 0 END) AS online_bookings, ");
sql.append("SUM(CASE WHEN bd.booking_type = 'ONLINE' AND bd.counter_id IS NOT NULL THEN 1 ELSE 0 END) AS counter_bookings, ");
sql.append("COUNT(bd.booking_id) AS total_bookings ");
sql.append("FROM hall_details hd ");
sql.append("LEFT JOIN booking_details bd ON hd.hall_id = bd.hall_details_hall_id ");
sql.append("AND DATE(bd.booking_date) BETWEEN ? AND ? ");
sql.append("AND bd.booking_status NOT IN ('PENDING','GCC_UNBLOCKED','REFUNDED','GCC_BLOCKED') " +
"AND bd.booking_type IS NOT NULL ");
sql.append("WHERE hd.zone = ? ");
sql.append("GROUP BY hd.hall_id, hd.hall_name ");
sql.append("ORDER BY hd.hall_name");
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql.toString(), fromDate, toDate, zone);
// Transform to the desired JSON format with only requested fields
List<Map<String, Object>> jsonResult = new ArrayList<>();
for (Map<String, Object> row : result) {
Map<String, Object> hallData = new HashMap<>();
hallData.put("Hall Name", row.get("hall_name"));
hallData.put("Hall ID", row.get("hall_id"));
hallData.put("Online Booking Count", row.get("online_bookings"));
hallData.put("Counter Booking Count", row.get("counter_bookings"));
hallData.put("Total Count", row.get("total_bookings"));
jsonResult.add(hallData);
}
return jsonResult;
}
// From date to date zone hall ID specific data
public List<Map<String, Object>> getHallSpecificData(String fromDate, String toDate, String zone, Integer hallId) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ");
sql.append("bd.counter_id, bd.hall_details_hall_id, ");
sql.append("COUNT(bd.booking_id) AS booking_count ");
sql.append("FROM booking_details bd ");
sql.append("INNER JOIN hall_details hd ON bd.hall_details_hall_id = hd.hall_id ");
sql.append("WHERE DATE(bd.booking_date) BETWEEN ? AND ? ");
sql.append("AND bd.booking_status NOT IN ('PENDING','GCC_UNBLOCKED','REFUNDED','GCC_BLOCKED') ");
sql.append("AND bd.booking_type IS NOT NULL ");
sql.append("AND bd.counter_id IS NOT NULL ");
List<Object> params = new ArrayList<>();
params.add(fromDate);
params.add(toDate);
if (zone != null && !zone.trim().isEmpty()) {
sql.append("AND hd.zone = ? ");
params.add(zone);
}
if (hallId != null) {
sql.append("AND hd.hall_id = ? ");
params.add(hallId);
}
sql.append("GROUP BY bd.counter_id, bd.hall_details_hall_id ");
sql.append("ORDER BY bd.counter_id");
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql.toString(), params.toArray());
// Transform to the desired JSON format
List<Map<String, Object>> jsonResult = new ArrayList<>();
for (Map<String, Object> row : result) {
Map<String, Object> counterData = new HashMap<>();
counterData.put("Counter ID", row.get("counter_id"));
counterData.put("Hall ID", row.get("hall_details_hall_id"));
counterData.put("Booking Count", row.get("booking_count"));
jsonResult.add(counterData);
}
return jsonResult;
}
}

41
src/main/java/com/gcc/restapiservices/communityHall/service/WhatsappMsgServiceImpl.java

@ -0,0 +1,41 @@
package com.gcc.restapiservices.communityHall.service;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.net.HttpURLConnection;
import java.net.URL;
@Service
public class WhatsappMsgServiceImpl {
public String sendMsg(String msgUrl) {
System.out.println("Whatsapp URL :-" + msgUrl);
String response = "";
try {
HttpURLConnection connection = null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = responseCode + "";
System.out.println("Response Code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public String sendSMS(String SMS_Url) {
System.out.println("SMS URL:- " + SMS_Url);
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(SMS_Url, String.class);
return response;
}
}

864
src/main/java/com/gcc/restapiservices/communityHall/service/communityHallService.java

@ -0,0 +1,864 @@
package com.gcc.restapiservices.communityHall.service;
import com.gcc.restapiservices.communityHall.configuration.PaymentConfig;
import com.gcc.restapiservices.communityHall.util.TransactionNumberGenerator;
import com.gcc.restapiservices.configuration.AppConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.util.Random;
import com.gcc.restapiservices.configuration.AppConfig;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@Service
public class communityHallService {
private JdbcTemplate jdbcTemplate;
@Autowired
private AppConfig appConfig;
@Autowired
private Environment environment;
@Autowired
private PaymentConfig paymentConfig;
@Autowired
private TransactionNumberGenerator transactionNumberGenerator;
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int STRING_LENGTH = 15;
private static final Random RANDOM = new SecureRandom();
@Value("${file.upload.directory.communityhall}")
private String uploadDirectory;
@Value("${file.fullpath.communityhall}")
private String serverPath;
@Autowired
public void setDataSource(@Qualifier("mysqlCommunityHallDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getHallList() {
return jdbcTemplate.queryForList("SELECT * FROM hall_details WHERE is_active = 1 order by hall_name asc");
}
public List<Map<String, Object>> getReasonMaster() {
String sql = "SELECT reason_id,reason,maxdays,reasoncode FROM reason_master";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getDocumentsByReasonId(Long reasonId) {
String sql = "SELECT doc_field_name,field_name FROM reason_document_master WHERE reason_id = ?";
return jdbcTemplate.queryForList(sql, reasonId);
}
public List<Map<String, String>> getRelationTypesAsMap() {
List<Map<String, String>> relationList = new ArrayList<>();
String[] relations = {"Self", "Son", "Daughter", "Granddaughter", "Grandson", "Brother", "Sister"};
for (String rel : relations) {
Map<String, String> map = new HashMap<>();
map.put("relation_name", rel);
map.put("value", rel);
relationList.add(map);
}
return relationList;
}
public List<Map<String, Object>> getUserDetails(Long Mobilenumber) {
String sql = "SELECT name,email,mobile_no,doorno,area,location,pin_code,user_status,usertype,profilephoto FROM users WHERE mobile_no = ?";
return jdbcTemplate.queryForList(sql, Mobilenumber);
}
public Map<String, Object> getHallDetailsById(int hallId) {
String sql = "SELECT * FROM hall_details WHERE hall_id = ?";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, hallId);
if (result.isEmpty()) {
return null; // or Collections.emptyMap() if you prefer
}
return result.get(0);
}
public Map<String, Object> getHallConcessionByHallId(int hallId) {
String sql = "SELECT * FROM hall_details_concession WHERE hall_id = ?";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, hallId);
if (result.isEmpty()) {
return null; // or Collections.emptyMap()
}
return result.get(0); // ✅ safe return of first result
}
public List<Map<String, Object>> checkMobileExits(Long Mobilenumber) {
String sql = "SELECT * FROM users WHERE mobile_no = ?";
return jdbcTemplate.queryForList(sql, Mobilenumber);
}
public List<Map<String, Object>> checkEmployeeExits(String EmployeeID) {
String sql = "SELECT * FROM users WHERE government_id= ?";
return jdbcTemplate.queryForList(sql, EmployeeID);
}
/*
* public Map<String, Object> getBookingDetailsById(int bookingId) { String sql
* = "SELECT " +
* "bd.booking_id, bd.booking_date, bd.start_date, bd.end_date, bd.comments, bd.booking_status, "
* +
* "bd.starting_slot, bd.ending_slot, bd.no_of_days, bd.reason, bd.gst, bd.deposit_amount, "
* + "bd.hall_amount, bd.amount_received AS booking_amount_received, " +
* "u.name, u.usertype, u.mobile_no, u.email, " +
* "hd.zone, hd.division, hd.hall_incharge_name, hd.hall_incharge_no, hd.hall_name, "
* + "CONCAT_WS(', ', hd.street, hd.area, hd.pin_code) AS address, " +
* "p.transaction_id, p.payment_status, p.amount_received AS payment_amount_received "
* + "FROM booking_details bd " +
* "INNER JOIN users u ON bd.users_user_id = u.user_id " +
* "INNER JOIN hall_details hd ON bd.hall_details_hall_id = hd.hall_id " +
* "INNER JOIN payments p ON bd.booking_id = p.booking_details_booking_id " +
* "WHERE bd.booking_id = ?";
*
* return jdbcTemplate.queryForMap(sql, bookingId); }
*/
public Map<String, Object> getBookingDetailsById(int bookingId) {
String sql = "SELECT "
+ "bd.booking_id, DATE_FORMAT(bd.booking_date, '%d-%m-%Y') AS booking_date, "
+ " DATE_FORMAT(bd.start_date, '%d-%m-%Y') AS start_date, "
+ " DATE_FORMAT(bd.end_date, '%d-%m-%Y') AS end_date, "
+ " bd.comments, bd.booking_status, "
+ "bd.starting_slot, bd.ending_slot, bd.no_of_days, bd.reason, bd.gst, bd.deposit_amount, "
+ "bd.hall_amount, bd.amount_received AS total_amount, " + "u.name, u.usertype, u.mobile_no, u.email, "
+ "hd.zone, hd.division, hd.hall_incharge_name as caretaker_name, hd.hall_incharge_no as caretaker_mobileno, hd.hall_name, "
+ "CONCAT_WS(', ', hd.street, hd.area, hd.pin_code) AS hall_address, "
+ "p.transaction_id, p.payment_status, p.amount_received AS payment_amount_received "
+ "FROM booking_details bd " + "INNER JOIN users u ON bd.users_user_id = u.user_id "
+ "INNER JOIN hall_details hd ON bd.hall_details_hall_id = hd.hall_id "
+ "INNER JOIN payments p ON bd.booking_id = p.booking_details_booking_id " + "WHERE bd.booking_id = ?";
Map<String, Object> result = jdbcTemplate.queryForMap(sql, bookingId);
// Add the acknowledgement URL to the result
String acknowledgementUrl = "https://gccservices.chennaicorporation.gov.in/communityhall/user/acknowledgement?bookingId=" + bookingId;
result.put("acknowledgement_url", acknowledgementUrl);
return result;
}
// pdf
/*
* public List<Map<String, Object>> getBookingsByMobile(Long mobileNumber) {
* String sql =
* "SELECT bd.booking_id, bd.booking_date, bd.start_date, bd.end_date, " +
* "bd.starting_slot, bd.ending_slot, bd.reason, bd.booking_status, " +
* "p.payment_status AS payment_status " +
* "FROM testcommunityhall.booking_details bd " +
* "INNER JOIN testcommunityhall.users u ON bd.users_user_id = u.user_id " +
* "INNER JOIN testcommunityhall.payments p ON bd.booking_id = p.booking_details_booking_id "
* + "WHERE u.mobile_no = ? " + "AND bd.booking_status NOT IN ('PENDING')";
*
* return jdbcTemplate.queryForList(sql, mobileNumber); }
*/
public List<Map<String, Object>> getBookingsByMobile(Long mobileNumber) {
String sql = "SELECT bd.booking_id , DATE_FORMAT(bd.booking_date, '%d-%m-%Y') AS booking_date,"
+ " DATE_FORMAT(bd.start_date, '%d-%m-%Y') AS start_date,"
+ " DATE_FORMAT(bd.end_date, '%d-%m-%Y') AS end_date, "
+ "bd.starting_slot, bd.ending_slot, bd.reason, bd.booking_status, "
+ "p.payment_status AS payment_status " + "FROM booking_details bd "
+ "INNER JOIN users u ON bd.users_user_id = u.user_id "
+ "INNER JOIN payments p ON bd.booking_id = p.booking_details_booking_id "
+ "WHERE u.mobile_no = ? " + "AND bd.booking_status NOT IN ('PENDING')";
List<Map<String, Object>> bookings = jdbcTemplate.queryForList(sql, mobileNumber);
// Add acknowledgement URL to each booking
for (Map<String, Object> booking : bookings) {
Object bookingId = booking.get("booking_id");
if (bookingId != null) {
String acknowledgementUrl = "https://gccservices.chennaicorporation.gov.in/communityhall/user/acknowledgement?bookingId="
+ bookingId;
booking.put("acknowledgement_url", acknowledgementUrl);
}
}
return bookings;
}
public List<Map<String, Object>> checkPenionerExits(String PensionerID) {
String sql = "SELECT * FROM users WHERE government_id= ?";
return jdbcTemplate.queryForList(sql, PensionerID);
}
//
public List<Map<String, Object>> findCounsellorByMobile(long mobileNo) {
String sql = "SELECT * FROM counsellor_details WHERE mobile1 = ? OR mobile2 = ?";
return jdbcTemplate.queryForList(sql, mobileNo, mobileNo);
}
public void registerUser(String userType, String name, long mobileNumber, String aadharNumber,
MultipartFile profilePhoto, String emailId, String doorNo, String street, String area, String location,
String pincode, String pensionerID, String pensionerDepartment, String employeeID,
String employeeDepartment) throws IOException {
String uploadPhotoUrl = null;
if (profilePhoto != null && !profilePhoto.isEmpty()) {
uploadPhotoUrl = saveFile(profilePhoto);
}
// Default values for government_id and department
String governmentId = null;
String department = null;
String userstatus = "APPROVED";
// Logic for conditional insertion based on userType
if ("GCC PENSIONER".equalsIgnoreCase(userType)) {
governmentId = pensionerID;
department = pensionerDepartment;
userstatus = "PENDING";
} else if ("GCC EMPLOYEE".equalsIgnoreCase(userType)) {
governmentId = employeeID;
department = employeeDepartment;
userstatus = "PENDING";
}
String sql = "INSERT INTO users (usertype, name, mobile_no, aadhar_number, profilephoto, email, "
+ "doorno, street, area, location, pin_code, government_id, department,user_status) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
jdbcTemplate.update(sql, userType, name, mobileNumber, aadharNumber, uploadPhotoUrl, emailId, doorNo, street,
area, location, pincode, governmentId, department, userstatus);
}
public String saveFile(MultipartFile file) throws IOException {
String order_copy_url = "";
// Handle file upload if a file is provided
if (file == null || file.isEmpty()) {
return order_copy_url;
}
// Get the base upload directory from properties
String uploadDirectory = environment.getProperty("file.upload.directory"); // e.g., /opt/myapp/uploads
// Define the subdirectory structure
String serviceFolderName = "images/userPhoto"; // You can also get from properties if needed
// Build the full folder path
String fullUploadPath = uploadDirectory + File.separator + serviceFolderName;
Path directoryPath = Paths.get(fullUploadPath);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
// Generate unique file name
// String datetimetxt = DateTimeUtil.getCurrentDateTime();
String fileName = generateRandomStringForFile(10) + "_" + file.getOriginalFilename();
// Physical file path
Path filePath = directoryPath.resolve(fileName);
// Write the file to the physical path
Files.write(filePath, file.getBytes());
// Relative path for storing in DB
String filepath_txt = "/" + serviceFolderName + "/" + fileName;
return filepath_txt;
}
public static String generateRandomStringForFile(int String_Lenth) {
StringBuilder result = new StringBuilder(String_Lenth);
for (int i = 0; i < STRING_LENGTH; i++) {
result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())));
}
return result.toString();
}
@Transactional("mysqlCommunityHallTransactionManager")
public Map<String, Object> saveBookingDetails(Map<String, Object> formData) {
Map<String, Object> hs = new HashMap<>();
Map<String, Object> userMaster = jdbcTemplate.queryForMap("SELECT * FROM users WHERE mobile_no = ?",
(formData.get("mobNo").toString()));
Integer userId = (Integer) userMaster.get("user_id");
Map<String, Object> reasonMaster = jdbcTemplate.queryForMap("SELECT * FROM reason_master WHERE reason_id = ?",
Integer.parseInt(formData.get("reasonId").toString()));
Map<String, Object> hallDetails = jdbcTemplate.queryForMap("SELECT * FROM hall_details WHERE hall_id = ?",
Integer.parseInt(formData.get("hallId").toString()));
// Fetch User
Map<String, Object> user = jdbcTemplate.queryForMap("SELECT * FROM users WHERE user_id = ?", userId);
String bookingId = formData.get("bookingId").toString();
Map<String, Object> bookingDetails = null;
if (bookingId != null && bookingId.equals("0")) {
} else {
List<Map<String, Object>> bookings = jdbcTemplate
.queryForList("SELECT * FROM booking_details WHERE booking_id = ?", Integer.parseInt(bookingId));
if (!bookings.isEmpty()) {
bookingDetails = bookings.get(0);
jdbcTemplate.update("DELETE FROM booking_documents WHERE booking_id = ?", Integer.parseInt(bookingId));
}
}
if (user != null) {
String startDate = formData.get("startDate").toString();
String endDate = formData.get("endDate").toString();
String relation = formData.get("relation").toString();
double days = Double.parseDouble(formData.get("days").toString());
int daysrange = Integer.parseInt(formData.get("daysrange").toString());
String usertype = user.get("usertype").toString();
String reason = reasonMaster.get("reason").toString();
int startingSlot = Integer.parseInt(formData.get("startingSlot").toString());
int endingSlot = Integer.parseInt(formData.get("endingSlot").toString());
String startingSlot_txt = formData.get("startingSlot").toString();
String endingSlot_txt = formData.get("endingSlot").toString();
Map<String, Object> discountrange = jdbcTemplate
.queryForMap("SELECT * FROM discount_range WHERE usertype = ?", usertype);
float discount = Float.parseFloat(discountrange.get("discount_range").toString());
double hallAmount = calcHallAmountJdbc(hallDetails, daysrange, startingSlot, endingSlot);
hs.put("actualhallamount", hallAmount);
double depositeamount = Double.parseDouble(hallDetails.get("deposit_amount").toString());
double halfDepositAmount = Double.parseDouble(hallDetails.get("half_deposit_amount").toString());
double Totaldepositeamount = calculateDepositAmountJdbc(daysrange, startingSlot_txt, endingSlot_txt,
depositeamount, halfDepositAmount);
depositeamount = Totaldepositeamount;
double discountAmount = 0;
double gstAmount = 0.00;
String reasoncode = reasonMaster.get("reasoncode") != null ? reasonMaster.get("reasoncode").toString() : "";
hs.put("reasoncode", reasoncode);
/*Map<String, Object> governmentevents = jdbcTemplate.queryForMap(
"SELECT * FROM hall_details_concession WHERE hall_id = ?",
Integer.parseInt(hallDetails.get("hall_id").toString()));*/
List<Map<String, Object>> rows = jdbcTemplate.queryForList(
"SELECT * FROM hall_details_concession WHERE hall_id = ?",
Integer.parseInt(hallDetails.get("hall_id").toString())
);
Map<String, Object> governmentevents = rows.isEmpty()
? Collections.emptyMap() // or null, your call
: rows.get(0);
if (reasoncode.equals("SGE")) {
if (startingSlot == 1 && endingSlot == 2) {
discountAmount = (Double.parseDouble(governmentevents.get("fulldayhallamount").toString())
* Double.parseDouble(hallDetails.get("sgediscount").toString())) / 100;
hallAmount = Double.parseDouble(governmentevents.get("fulldayhallamount").toString());
hs.put("discount", hallDetails.get("sgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("full_day_cleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("fulldaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("fulldayebcharges").toString());
double additionalcharges = cleaningCharges + PASystem + EB;
gstAmount = Math.round(additionalcharges * Double.parseDouble(hallDetails.get("gst").toString()))
/ 100.0;
double depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
double totalAmount = additionalcharges + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, additionalcharges, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
} else {
hallAmount = Double.parseDouble(governmentevents.get("halfdayhallamount").toString());
discountAmount = (hallAmount * Double.parseDouble(hallDetails.get("sgediscount").toString())) / 100;
hs.put("discount", hallDetails.get("sgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("halfdaycleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("halfdaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("halfdayebcharges").toString());
double additionalcharges = cleaningCharges + PASystem + EB;
gstAmount = Math.round(additionalcharges * Double.parseDouble(hallDetails.get("gst").toString()))
/ 100.0;
double depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
double totalAmount = additionalcharges + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, additionalcharges, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
}
} else if (reasoncode.equals("CGE")) {
double rentAmount, netAmount, depositAmount, totalAmount, truncatedTotalAmount, additionalcharges;
if (startingSlot == 1 && endingSlot == 2) {
discountAmount = (Double.parseDouble(hallDetails.get("full_day_rent").toString())
* Double.parseDouble(hallDetails.get("cgediscount").toString())) / 100;
hallAmount = Double.parseDouble(hallDetails.get("full_day_rent").toString());
hs.put("discount", hallDetails.get("cgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("full_day_cleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("fulldaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("fulldayebcharges").toString());
additionalcharges = cleaningCharges + PASystem + EB;
rentAmount = hallAmount - discountAmount;
netAmount = rentAmount + additionalcharges;
gstAmount = Math.round(netAmount * Double.parseDouble(hallDetails.get("gst").toString())) / 100.0;
depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
totalAmount = netAmount + gstAmount + depositAmount;
truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("rentAmount", rentAmount);
hs.put("gstAmount", gstAmount);
hs.put("netAmount", netAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, netAmount, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
} else {
discountAmount = (Double.parseDouble(hallDetails.get("half_day_rent").toString())
* Double.parseDouble(hallDetails.get("cge_discount").toString())) / 100;
hallAmount = Double.parseDouble(hallDetails.get("half_day_rent").toString());
hs.put("discount", hallDetails.get("cgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("half_day_cleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("halfdaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("halfdayebcharges").toString());
additionalcharges = cleaningCharges + PASystem + EB;
rentAmount = hallAmount - discountAmount;
netAmount = rentAmount + additionalcharges;
gstAmount = Math.round(netAmount * Double.parseDouble(hallDetails.get("gst").toString())) / 100.0;
depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
totalAmount = netAmount + gstAmount + depositAmount;
truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("rentAmount", rentAmount);
hs.put("gstAmount", gstAmount);
hs.put("netAmount", netAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, netAmount, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
}
} else {
if (usertype.equals("COUNCILLOR") || usertype.equals("PENSIONER") || usertype.equals("GCC_EMPLOYEE")
|| usertype.equals("PUBLIC")) {
discountAmount = (hallAmount * discount) / 100;
hallAmount = hallAmount - discountAmount;
gstAmount = Math.round(hallAmount * Double.parseDouble(hallDetails.get("gst").toString())) / 100.0;
double totalAmount = hallAmount + gstAmount + depositeamount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, hallAmount, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
}
}
System.out.println("bookingId...." + bookingId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start = LocalDate.parse(startDate, formatter);
LocalDate end = LocalDate.parse(endDate, formatter);
int hallId = Integer.parseInt(hallDetails.get("hall_id").toString());
int i = 0;
for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
Map<String, Object> bookingCalendar = null;
List<Map<String, Object>> calList = jdbcTemplate.queryForList(
"SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id = ?", date.toString(), hallId);
if (!calList.isEmpty())
bookingCalendar = calList.get(0);
if (bookingCalendar != null) {
boolean morningSlot = Boolean.TRUE.equals(bookingCalendar.get("morning_slot"));
boolean eveningSlot = Boolean.TRUE.equals(bookingCalendar.get("evening_slot"));
if ((date.equals(start) && startingSlot == 1 && morningSlot)
|| (date.equals(start) && startingSlot == 2 && eveningSlot)
|| (date.equals(end) && endingSlot == 1 && morningSlot)
|| (date.equals(end) && endingSlot == 2 && eveningSlot)) {
return Collections.singletonMap("status", "slotOccupied");
} else if (morningSlot && eveningSlot) {
return Collections.singletonMap("status", "slotOccupied");
} else if (!date.equals(end) && i != 0 && i != Math.round(days - 1)
&& (morningSlot || eveningSlot)) {
return Collections.singletonMap("status", "slotOccupied");
} else if (date.equals(end) && endingSlot == 2 && morningSlot && i != 0
&& i == Math.round(days - 1)) {
return Collections.singletonMap("status", "slotOccupied");
}
}
i++;
}
List<Map<String, Object>> reasonDocMaster = jdbcTemplate.queryForList(
"SELECT * FROM reason_document_master WHERE reason_id = ?",
Integer.parseInt(formData.get("reasonId").toString()));
List<Map<String, Object>> uploadedDocs = new ArrayList<>();
for (Map<String, Object> rm : reasonDocMaster) {
Map<String, Object> docMap = new HashMap<>();
String fieldName = "";
String value = "";
String fileName = "";
String fileUrl = "";
String filePath = "";
if (Boolean.TRUE.equals(rm.get("add_text_field"))) {
fieldName = rm.get("field_name").toString();
value = formData.get(fieldName).toString();
jdbcTemplate.update(
"INSERT INTO booking_documents (booking_details_booking_id, booking_label, name) VALUES (?, ?, ?)",
Integer.parseInt(bookingId), fieldName, value);
docMap.put("booking_label", fieldName);
docMap.put("name", value);
}
if (Boolean.TRUE.equals(rm.get("add_document_field"))) {
String docFieldName = rm.get("doc_field_name").toString();
MultipartFile file = (MultipartFile) formData.get(docFieldName);
fileName = bookingId + "_" + file.getOriginalFilename();
fileUrl = serverPath + "images/" + reason + "/" + fileName;
filePath = uploadDirectory + "/" + reason + "/" + fileName;
// Create directory if it doesn't exist
File directory = new File(uploadDirectory + "/" + reason);
if (!directory.exists()) {
directory.mkdirs(); // Creates parent directories if needed
}
docMap.put("documentName", file.getOriginalFilename());
docMap.put("documentType", file.getContentType());
docMap.put("bookingDocUrl", fileUrl);
// Save file to disk
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] bytes = file.getBytes();
fos.write(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
jdbcTemplate.update(
"INSERT INTO booking_documents (booking_details_booking_id, booking_doc_url, document_name, document_type, booking_label, name) VALUES (?, ?, ?, ?, ?, ?)",
Integer.parseInt(bookingId), fileUrl, file.getOriginalFilename(), file.getContentType(),
fieldName, value);
}
uploadedDocs.add(docMap);
}
hs.put("bookingId", bookingId);
hs.put("hallName", hallDetails.get("hall_name"));
hs.put("NoOfDay", days);
hs.put("startDate", startDate);
hs.put("endDate", endDate);
hs.put("startingSlot", startingSlot);
hs.put("endingSlot", endingSlot);
hs.put("hallAmount", hallAmount);
hs.put("gst", gstAmount);
hs.put("depositAmount", depositeamount);
hs.put("username", user.get("name"));
hs.put("userId", user.get("user_id"));
hs.put("mobileNo", user.get("mobile_no"));
hs.put("userType", user.get("usertype"));
hs.put("reason", reason);
hs.put("bookingId", bookingId);
hs.put("uploadedDocs", uploadedDocs);
}
return hs;
}
private double calcHallAmountJdbc(Map<String, Object> hallDetails, int daysrange, int startPeriod, int endPeriod) {
double fullDayRent = Double.parseDouble(hallDetails.get("full_day_rent").toString());
double halfDayRent = Double.parseDouble(hallDetails.get("half_day_rent").toString());
if (daysrange == 1) {
if (startPeriod == 1 && endPeriod == 2)
return fullDayRent;
else if (startPeriod == 1 && endPeriod == 1)
return halfDayRent;
else if (startPeriod == 2 && endPeriod == 2)
return halfDayRent;
else if (startPeriod == 2 && endPeriod == 1)
return fullDayRent;
} else {
if (startPeriod == 1 && endPeriod == 2)
return fullDayRent * daysrange;
else if (startPeriod == 1 && endPeriod == 1)
return fullDayRent * (daysrange - 1) + halfDayRent;
else if (startPeriod == 2 && endPeriod == 2)
return fullDayRent * (daysrange - 1) + halfDayRent;
else if (startPeriod == 2 && endPeriod == 1)
return fullDayRent * (daysrange - 2) + halfDayRent * 2;
}
return 0;
}
private double calculateDepositAmountJdbc(double numDays, String startPeriod, String endPeriod,
double depositAmount, double HalfDepositAmount) {
double damount = 0;
if (numDays == 1) {
if ("1".equals(startPeriod) && "2".equals(endPeriod))
damount = depositAmount;
else if ("1".equals(startPeriod) && "1".equals(endPeriod))
damount = HalfDepositAmount;
else if ("2".equals(startPeriod) && "2".equals(endPeriod))
damount = HalfDepositAmount;
else
damount = numDays;
} else {
if ("1".equals(startPeriod) && "2".equals(endPeriod))
damount = depositAmount * numDays;
else if ("1".equals(startPeriod) && "1".equals(endPeriod))
damount = depositAmount * (numDays - 1) + HalfDepositAmount;
else if ("2".equals(startPeriod) && "2".equals(endPeriod))
damount = depositAmount * (numDays - 1) + HalfDepositAmount;
else if ("2".equals(startPeriod) && "1".equals(endPeriod))
damount = depositAmount * (numDays - 2) + depositAmount;
else
damount = numDays;
}
return damount;
}
private String insertOrUpdateBookingDetailsJdbc(JdbcTemplate jdbcTemplate, String bookingId,
Map<String, Object> user, Map<String, Object> hallDetails, String startDate, String endDate, double days,
int startingSlot, int endingSlot, double depositAmount, double hallAmount, double gst, double totalAmount,
String reason, String relation, String refundStatus, String comments, String bookingType) {
if (bookingId == null || bookingId.equals("0")) {
// Insert with KeyHolder
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(
"INSERT INTO booking_details (users_user_id, hall_details_hall_id, start_date, end_date, no_of_days, starting_slot, ending_slot, deposit_amount, hall_amount, gst, amount_received, reason, refund_status, comments, booking_type, relationship, booking_date, schedule_count, source) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
Statement.RETURN_GENERATED_KEYS);
ps.setObject(1, user.get("user_id"));
ps.setObject(2, hallDetails.get("hall_id"));
ps.setString(3, startDate);
ps.setString(4, endDate);
ps.setDouble(5, days);
ps.setInt(6, startingSlot);
ps.setInt(7, endingSlot);
ps.setDouble(8, depositAmount);
ps.setDouble(9, hallAmount);
ps.setDouble(10, gst);
ps.setDouble(11, totalAmount);
ps.setString(12, reason);
ps.setString(13, refundStatus);
ps.setString(14, comments);
ps.setString(15, bookingType);
ps.setString(16, relation);
ps.setString(17, java.time.LocalDate.now().toString());
ps.setInt(18, 0);
ps.setInt(19, 2);
return ps;
}, keyHolder);
Number generatedId = keyHolder.getKey();
return generatedId != null ? generatedId.toString() : null;
} else {
// Update
jdbcTemplate.update(
"UPDATE booking_details SET users_user_id=?, hall_details_hall_id=?, start_date=?, end_date=?, no_of_days=?, starting_slot=?, ending_slot=?, deposit_amount=?, hall_amount=?, gst=?, amount_received=?, reason=?, refund_status=?, comments=?, booking_type=?, relationship=?, booking_date=?, schedule_count=? WHERE booking_id=?",
user.get("user_id"), hallDetails.get("hall_id"), startDate, endDate, days, startingSlot, endingSlot,
depositAmount, hallAmount, gst, totalAmount, reason, refundStatus, comments, bookingType, relation,
java.time.LocalDate.now().toString(), 0, Integer.parseInt(bookingId));
return bookingId;
}
}
public HashMap<String, Object> startPayment(int bookingId) {
HashMap<String, Object> hs = new HashMap<>();
String bookingSql = "SELECT b.amount_received, b.users_user_id, b.hall_details_hall_id, "
+ " u.user_id, u.mobile_no, u.email " + " FROM booking_details b "
+ " JOIN users u ON b.users_user_id = u.user_id " + " WHERE b.booking_id = ?";
try {
Map<String, Object> data = jdbcTemplate.queryForMap(bookingSql, bookingId);
double amountReceived = (double) data.get("amount_received");
int UserId = (int) data.get("user_id");
long mobileNo = (long) data.get("mobile_no");
String email = (String) data.get("email");
int hallId = (int) data.get("hall_details_hall_id");
String txnId = "CHB" + transactionNumberGenerator.generateTransactionNumber()
+ String.format("%05d", UserId);
String totalAmt = String.valueOf(amountReceived);
String insertSql = "INSERT INTO transaction_response (txansaction_id, hall_id, user_id, status_code, booking_id) "
+ " VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(insertSql, txnId, hallId, String.valueOf(UserId), "temp", bookingId);
String merchantId = paymentConfig.getMerchantId();
String consumerId = String.format("%05d", UserId);
String encryptedToken = getToken(merchantId + "|", txnId + "|", totalAmt + "|", "|", consumerId + "|",
mobileNo + "|", email + "|", "|", "|", "|", "|", "|", "|", "|", "|", "|",
paymentConfig.getEncryptionKey());
hs.put("txansactionId", txnId);
hs.put("token", encryptedToken);
hs.put("amount", totalAmt);
/*
* hs.put("merchantId", merchantId); hs.put("consumerMobileNo", mobileNo);
* hs.put("consumerEmailId", email); hs.put("consumerId", consumerId);
* hs.put("error", false);
*/
} catch (EmptyResultDataAccessException | NoSuchAlgorithmException e) {
hs.put("error", true);
hs.put("message", "Invalid booking ID or no user data found. ");
e.printStackTrace();
}
return hs;
}
public String getToken(String merchantId, String txnId, String totalAmt, String accountNo, String consumerId,
String consumerMobileNo, String consumerEmailId, String debitStartDate, String debitEndDate,
String maxAmount, String amountType, String frequency, String cardNumber, String expMonth, String expYear,
String cvvCode, String salt) throws NoSuchAlgorithmException {
String token = merchantId + txnId + totalAmt + accountNo + consumerId + consumerMobileNo + consumerEmailId
+ debitStartDate + debitEndDate + maxAmount + amountType + frequency + cardNumber + expMonth + expYear
+ cvvCode + salt;
return generateToken(token);
}
public String generateToken(String token) throws NoSuchAlgorithmException {
// System.out.println("Token:-" + token);
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(token.getBytes());
byte[] bytes = md.digest();
BigInteger bigInt = new BigInteger(1, bytes);
String encryptedtoken = bigInt.toString(16);
while (encryptedtoken.length() < 128) {
encryptedtoken = "0" + encryptedtoken;
}
// System.out.println("Encryption :- " + encryptedtoken);
return encryptedtoken;
}
public Map<String, Object> checkSlotAvailability(int hallId, String startDate, String endDate, int startingSlot, int endingSlot) {
// Validate slot numbers
if (startingSlot < 1 || startingSlot > 2 || endingSlot < 1 || endingSlot > 2) {
throw new IllegalArgumentException("Slot values must be 1 (morning) or 2 (evening).");
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start;
LocalDate end;
try {
start = LocalDate.parse(startDate, formatter);
end = LocalDate.parse(endDate, formatter);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid date format. Use yyyy-MM-dd.");
}
if (end.isBefore(start)) {
throw new IllegalArgumentException("End date cannot be before start date.");
}
long days = java.time.temporal.ChronoUnit.DAYS.between(start, end) + 1;
int i = 0;
try {
for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
List<Map<String, Object>> calList = jdbcTemplate.queryForList(
"SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id = ?",
date.toString(), hallId
);
if (!calList.isEmpty()) {
Map<String, Object> bookingCalendar = calList.get(0);
boolean morningSlot = Boolean.TRUE.equals(bookingCalendar.get("morning_slot"));
boolean eveningSlot = Boolean.TRUE.equals(bookingCalendar.get("evening_slot"));
if ((date.equals(start) && startingSlot == 1 && morningSlot)
|| (date.equals(start) && startingSlot == 2 && eveningSlot)
|| (date.equals(end) && endingSlot == 1 && morningSlot)
|| (date.equals(end) && endingSlot == 2 && eveningSlot)) {
return Map.of("status", "slotOccupied");
} else if (morningSlot && eveningSlot) {
return Map.of("status", "slotOccupied");
} else if (!date.equals(end) && i != 0 && i != Math.round(days - 1)
&& (morningSlot || eveningSlot)) {
return Map.of("status", "slotOccupied");
} else if (date.equals(end) && endingSlot == 2 && morningSlot && i != 0
&& i == Math.round(days - 1)) {
return Map.of("status", "slotOccupied");
}
}
i++;
}
} catch (DataAccessException e) {
e.printStackTrace();
throw new RuntimeException("Database error occurred while checking slot availability.");
}
return Map.of("status", "slotAvailable");
}
}

63
src/main/java/com/gcc/restapiservices/communityHall/util/EncryptionUtils.java

@ -0,0 +1,63 @@
package com.gcc.restapiservices.communityHall.util;
import com.gcc.restapiservices.communityHall.configuration.PaymentConfig;
import org.apache.commons.codec.binary.Hex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
@Component
public class EncryptionUtils {
@Autowired
private PaymentConfig paymentConfig;
public String encryptHxRefund(String text) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(this.paymentConfig.getEncryptionKeyByte(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(this.paymentConfig.getEncryptionIVByte());
cipher.init(1, keySpec, ivSpec);
byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
String hxencstr = ToHexStrRefund(results);
return hxencstr;
}
public String ToHexStrRefund(byte[] dataBuf) {
String hxstr = null;
Hex hx = new Hex();
hxstr = new String(hx.encode(dataBuf));
return hxstr;
}
public String decryptHxTRefund(String hxstrr) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(this.paymentConfig.getEncryptionKeyByte(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(this.paymentConfig.getEncryptionIVByte());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decbytes = FromHexStr(hxstrr);
byte[] results = cipher.doFinal(decbytes);
return new String(results, "UTF-8").trim();
}
public byte[] FromHexStr(String hxStr) {
byte[] charArray = hxStr.getBytes();
byte[] bufstr = null;
Hex hxx = new Hex();
try {
bufstr = hxx.decode(charArray);
} catch (Exception e) {
e.printStackTrace();
}
return bufstr;
}
}

37
src/main/java/com/gcc/restapiservices/communityHall/util/TransactionNumberGenerator.java

@ -0,0 +1,37 @@
package com.gcc.restapiservices.communityHall.util;
import org.springframework.stereotype.Service;
import java.util.Random;
@Service
public class TransactionNumberGenerator {
public String generateTransactionNumber() {
// Define the length of the transaction number
int length = 12;
// Define characters to be used in the transaction number
String characters = "0123456789";
// Create a StringBuilder to store the transaction number
StringBuilder sb = new StringBuilder();
// Create an instance of Random class
Random random = new Random();
// Generate the transaction number
for (int i = 0; i < length; i++) {
// Generate a random index within the range of characters
int randomIndex = random.nextInt(characters.length());
// Append the character at the random index to the transaction number
sb.append(characters.charAt(randomIndex));
}
// Convert StringBuilder to String and return
return sb.toString();
}
}

64
src/main/java/com/gcc/restapiservices/configuration/AppConfig.java

@ -0,0 +1,64 @@
package com.gcc.restapiservices.configuration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
private String title;
private String baseUrl;
private String getOtpUrl;
private String erpUrl;
// @Value("${payment.razorpay.my_key_id}") private String keyId;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBaseUrl() {
return baseUrl;
}
public void setBaseUrl(String baseUrl) {
this.baseUrl = baseUrl;
}
public String getGetOtpUrl() {
return getOtpUrl;
}
public void setGetOtpUrl(String getOtpUrl) {
this.getOtpUrl = getOtpUrl;
}
public String getErpUrl() {
return erpUrl;
}
public void setErpUrl(String erpUrl) {
this.erpUrl = erpUrl;
}
/*
* public String getKeyId() { return keyId; }
*
* public void setKeyId(String keyId) { this.keyId = keyId; }
*/
}

201
src/main/java/com/gcc/restapiservices/configuration/DataSourceConfig.java

@ -0,0 +1,201 @@
package com.gcc.restapiservices.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.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.client.RestTemplate;
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
// live aws connection
private static final String awshost = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306";
private static final String awspassword = "gcc-facial-password";
// local
// private static final String awshost = "localhost";
// private static final String awspassword = "root";
@Bean(name = "mysqlCdWasteDataSource")
public DataSource mysqlCdWasteDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/gcc_c_d_waste_web");
dataSource.setPassword(awspassword);
dataSource.setUsername("root");
return dataSource;
}
// @Bean(name = "mysqlCdWasteDataSource")
// public DataSource mysqlCdWasteDataSource() {
// DriverManagerDataSource dataSource = new DriverManagerDataSource();
// dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// dataSource.setUrl("jdbc:mysql://" + host + "/dumpwastecollector");
// dataSource.setUsername("root");
// dataSource.setPassword(dbpassword);
// return dataSource;
// }
// local crs logs
// @Bean(name = "mysqlCrsLogsDataSource")
// public DataSource mysqlCrsLogsAwsDataSource() {
// DriverManagerDataSource dataSource = new DriverManagerDataSource();
// dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// dataSource.setUrl("jdbc:mysql://" + host + "/crs_logs");
// dataSource.setUsername("root");
// dataSource.setPassword(dbpassword);
// return dataSource;
// }
// crs log from live yogi
@Bean(name = "mysqlCrsLogsDataSource")
public DataSource mysqlCrsLogsAwsDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/crs_logs");
dataSource.setPassword(awspassword);
dataSource.setUsername("root");
return dataSource;
}
// feedback
@Bean(name = "mysqlFeedbackDataSource")
public DataSource mysqlFeedbackDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/feedback_service");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
// dataSource.setUrl("jdbc:mysql://" + host + "/feedback_service");
// dataSource.setUsername("root");
// dataSource.setPassword(dbpassword);
return dataSource;
}
@Bean(name = "mysqlCommunityHallDataSource")
public DataSource mysqlCommunityHallDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/communityhall_live");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
@Bean(name = "mysqlCoworkspaceRestServicesDataSource")
public DataSource mysqlCoworkspaceRestServicesDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/coworkingspace");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
// Swimmingpool
@Bean(name = "mysqlSwimmingpoolDataSource")
public DataSource mysqlSwimmingpoolDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/swimmingpool");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
@Bean(name = "mysqlServicespdfDataSource")
public DataSource mysqlServicespdfDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/gcc_rest_services");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
@Bean(name = "mysqlVictoriaHallDataSource")
public DataSource mysqlVictoriaHallDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/victoriahallbooking_test");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
@Bean(name = "mysqlVictoriaHallTransactionManager")
public PlatformTransactionManager mysqlVictoriaHallTransactionManager(
@Qualifier("mysqlVictoriaHallDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "mysqlCommunityHallTransactionManager")
public PlatformTransactionManager mysqlCommunityHallTransactionManager(
@Qualifier("mysqlCommunityHallDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "coworkspaceTransactionManager")
public PlatformTransactionManager coworkspaceTransactionManager(
@Qualifier("mysqlCoworkspaceRestServicesDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "mysqlGccRestServicesTransactionManager")
public PlatformTransactionManager mysqlGccRestServicesTransactionManager(
@Qualifier("mysqlGccRestServicesDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "servicesPdfJdbcTemplate")
public JdbcTemplate servicesPdfJdbcTemplate(@Qualifier("mysqlServicespdfDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
// @Bean(name = "PetRegistrationdJbcTemplate")
// public JdbcTemplate PetRegistrationdJbcTemplate(@Qualifier("mysqlPetRegistrationRestServicesDataSource") DataSource dataSource) {
// return new JdbcTemplate(dataSource);
// }
@Bean(name = "mysqlCommunityHallliveDataSource")
public DataSource mysqlCommunityHallliveDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/communityhall_live");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
@Bean(name = "mysqlGccRestServicesDataSource")
public DataSource mysqlGccRestServicesDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/gcc_rest_services");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
@Bean(name = "mysqlPetRegistrationRestServicesDataSource")
public DataSource mysqlPetRegistrationRestServicesDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + awshost + "/gcc_pets");
dataSource.setUsername("root");
dataSource.setPassword(awspassword);
return dataSource;
}
}

11
src/main/java/com/gcc/restapiservices/coworkspace/constants/AppConstants.java

@ -0,0 +1,11 @@
package com.gcc.restapiservices.coworkspace.constants;
public final class AppConstants {
// public static String key_id="rzp_live_ySI5Ns54Y7qOcJ";
// public static String key_secret="Nwf1TjhUtaskof8vePkRR8Sb";
//uncomment for testing payment
public static String key_id="rzp_test_tDkHFEqWXmuEi8";
public static String key_secret="cBQUjMcKZ4J6vmOKSyNZ92py";
}

49
src/main/java/com/gcc/restapiservices/coworkspace/controller/ApiResponse.java

@ -0,0 +1,49 @@
package com.gcc.restapiservices.coworkspace.controller;
public class ApiResponse {
private String status;
private String message;
private Object data;
private int statusCode;
// Constructor
public ApiResponse(String status, String message, Object data, int statusCode) {
this.status = status;
this.message = message;
this.data = data;
this.statusCode = statusCode;
}
// Getters and Setters
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public int getStatusCode() {
return statusCode;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
}

389
src/main/java/com/gcc/restapiservices/coworkspace/controller/CoworkspaceApiController.java

@ -0,0 +1,389 @@
package com.gcc.restapiservices.coworkspace.controller;
import com.gcc.restapiservices.coworkspace.constants.AppConstants;
import com.gcc.restapiservices.coworkspace.service.CoworkspaceApiService;
import com.gcc.restapiservices.coworkspace.service.PaymentService;
import com.razorpay.Order;
import com.razorpay.RazorpayClient;
import com.razorpay.RazorpayException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.util.*;
@RestController
@RequestMapping("/gccrestservices/api/coworkspace")
public class CoworkspaceApiController {
@Autowired
CoworkspaceApiService coworkspaceApiService;
@Autowired
PaymentService paymentService;
// Endpoint for getting categories
@GetMapping("/getBuildings")
public ResponseEntity<?> getBuildings() {
try {
System.out.println("Inside getBuildings");
return ResponseEntity.ok(new ApiResponse("success", "Buildings retrieved successfully", coworkspaceApiService.getBuildings(), HttpStatus.OK.value()));
} catch (Exception e) {
return new ResponseEntity<>(new ApiResponse("error", "Failed to retrieve Buildings", null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/getBuildingsbybid")
public ResponseEntity<?> getBuildingsbybid(@RequestParam("bid") int bid) {
try {
System.out.println("Inside getBuildingsbybid");
return ResponseEntity.ok(new ApiResponse("success", "Buildingsbybid retrieved successfully", coworkspaceApiService.getBuildingsbybid(bid), HttpStatus.OK.value()));
} catch (Exception e) {
return new ResponseEntity<>(new ApiResponse("error", "Failed to retrieve Buildingsbybid", null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// Endpoint for getting categories
@GetMapping("/getcategory")
public ResponseEntity<?> getcategory() {
try {
System.out.println("Inside getcategory");
return ResponseEntity.ok(new ApiResponse("success", "Categories retrieved successfully", coworkspaceApiService.getcat(), HttpStatus.OK.value()));
} catch (Exception e) {
return new ResponseEntity<>(new ApiResponse("error", "Failed to retrieve categories", null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/getCategoriesByBid")
public ResponseEntity<?> getCategoriesByBid(@RequestParam("bid") int bid) {
try {
return ResponseEntity.ok(new ApiResponse(
"success",
"Categories retrieved successfully",
coworkspaceApiService.getcat(bid),
HttpStatus.OK.value()
));
} catch (Exception e) {
return new ResponseEntity<>(
new ApiResponse("error", "Failed to retrieve categories by bid", null, HttpStatus.INTERNAL_SERVER_ERROR.value()),
HttpStatus.INTERNAL_SERVER_ERROR
);
}
}
// Endpoint for fetching slots by category ID
@GetMapping("/slots-by-category")
public ResponseEntity<?> getSlotsByCategory(@RequestParam("cid") int cid) {
try {
return ResponseEntity.ok(new ApiResponse("success", "Slots retrieved successfully", coworkspaceApiService.getSlotsByCategoryId(cid), HttpStatus.OK.value()));
} catch (Exception e) {
return new ResponseEntity<>(new ApiResponse("error", "Failed to retrieve slots", null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/slots-by-displaycategory")
public ResponseEntity<ApiResponse> getSlotsByCategoryIdWithDisplayName(@RequestParam("cid") int cid) {
try {
System.out.println("Fetching slots for category ID: " + cid);
List<Map<String, Object>> slots = coworkspaceApiService.getSlotsByCategoryIdWithDisplayName(cid);
if (slots == null || slots.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ApiResponse("error", "No slots found for category ID: " + cid, null, HttpStatus.NOT_FOUND.value()));
}
return ResponseEntity.ok(new ApiResponse("success", "Slots retrieved successfully", slots, HttpStatus.OK.value()));
} catch (Exception e) {
e.printStackTrace(); // Log full stack trace for debugging
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to retrieve slots: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
// Endpoint for checking slot availability
@GetMapping("/checkSlotAvailability")
public ResponseEntity<?> checkSlotAvailability(
@RequestParam("buildId") int buildId,
@RequestParam("catId") int catId,
@RequestParam("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
@RequestParam("subId") Integer subId,
@RequestParam(value = "noOfPeople", required = false) Integer noOfPeople,
@RequestParam(value = "slotId", required = false) Integer slotId) {
// buildId=1;
try {
Map<String, Object> response = coworkspaceApiService.checkSlotAvailability(buildId, catId, date,subId ,noOfPeople, slotId);
if (response.isEmpty()) {
return new ResponseEntity<>(new ApiResponse("error", "No slot availability data found", null, HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND);
}
return ResponseEntity.ok(new ApiResponse("success", "Slot availability checked successfully", response, HttpStatus.OK.value()));
} catch (Exception e) {
return new ResponseEntity<>(new ApiResponse("error", e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// Endpoint for saving temp booking
// @PostMapping("/saveInTemp")
// public ResponseEntity<?> saveTempBooking(@RequestParam("catId") int catId,
// @RequestParam("buildId") int buildId,
// @RequestParam("subId") int subId,
// @RequestParam("noOfPeople") int noOfPeople,
// @RequestParam("fromDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fromDate,
// @RequestParam("toDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate toDate,
// @RequestParam("userName") String userName,
// @RequestParam("userMobile") long userMobile,
// @RequestParam("slots") List<Integer> slots) {
//
// try {
// Map<String, Object> tempBooking = coworkspaceApiService.saveTempBooking(userName, userMobile, slots, fromDate, toDate, noOfPeople, catId, buildId, subId);
// if (tempBooking == null || tempBooking.isEmpty()) {
// return new ResponseEntity<>(new ApiResponse("error", "Failed to save booking", null, HttpStatus.BAD_REQUEST.value()), HttpStatus.BAD_REQUEST);
// }
// return ResponseEntity.ok(new ApiResponse("success", "Booking saved temporarily", tempBooking, HttpStatus.OK.value()));
// } catch (Exception e) {
// return new ResponseEntity<>(new ApiResponse("error", "Error occurred while saving booking", null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
// }
// }
@PostMapping("/saveInTemp")
public ResponseEntity<?> saveTempBooking(@RequestParam("catId") int catId,
@RequestParam("buildId") int buildId,
@RequestParam("subId") int subId,
@RequestParam("noOfPeople") int noOfPeople,
@RequestParam("fromDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fromDate,
@RequestParam("toDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate toDate,
@RequestParam("userName") String userName,
@RequestParam("userMobile") long userMobile,
@RequestParam("slots") List<Integer> slots) {
try {
// 🛑 Validation: fromDate should not be after toDate
if (fromDate.isAfter(toDate)) {
return ResponseEntity.badRequest().body(
new ApiResponse("error", "From date cannot be after To date", null, HttpStatus.BAD_REQUEST.value()));
}
// buildId=1;
// ⚠️ Validation: at least one slot is required
if (slots == null || slots.isEmpty()) {
return ResponseEntity.badRequest().body(
new ApiResponse("error", "At least one slot must be selected", null, HttpStatus.BAD_REQUEST.value()));
}
Map<String, Object> tempBooking = coworkspaceApiService.saveTempBooking(
userName, userMobile, slots, fromDate, toDate, noOfPeople, catId, buildId, subId);
if (tempBooking == null || tempBooking.isEmpty()) {
return new ResponseEntity<>(
new ApiResponse("error", "Failed to save booking", null, HttpStatus.BAD_REQUEST.value()),
HttpStatus.BAD_REQUEST);
}
return ResponseEntity.ok(
new ApiResponse("success", "Booking saved temporarily", tempBooking, HttpStatus.OK.value()));
} catch (Exception e) {
return new ResponseEntity<>(
new ApiResponse("error", "Error occurred while saving booking", null, HttpStatus.INTERNAL_SERVER_ERROR.value()),
HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// Endpoint for creating an order (Razorpay)
@PostMapping(value="/create_order")
public ResponseEntity<?> create_order(HttpServletRequest request, @RequestParam("id") int tempid) throws RazorpayException {
try {
Map<String, Object> tempBookingInfo = coworkspaceApiService.getTempBookingByTempId(tempid);
if (tempBookingInfo != null && !tempBookingInfo.isEmpty()) {
String tempbookid = tempBookingInfo.get("tempbookid").toString();
String amount = tempBookingInfo.get("amount").toString();
double amountDouble = 0.0;
try {
amountDouble = Double.parseDouble(amount);
} catch (NumberFormatException e) {
return new ResponseEntity<>(new ApiResponse("error", "Invalid amount format", null, HttpStatus.BAD_REQUEST.value()), HttpStatus.BAD_REQUEST);
}
// Razorpay order creation
var client = new RazorpayClient(AppConstants.key_id, AppConstants.key_secret);
JSONObject options = new JSONObject();
options.put("amount", amountDouble * 100);
options.put("currency", "INR");
Order od = client.orders.create(options);
paymentService.saveorderLog(od.get("id").toString(), od.toString(), tempbookid);
return ResponseEntity.ok(new ApiResponse("success", "Order created successfully", od.toJson().toMap(), HttpStatus.OK.value()));
} else {
return new ResponseEntity<>(new ApiResponse("error", "No data found for tempid: " + tempid, null, HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND);
}
} catch (RazorpayException e) {
return new ResponseEntity<>(new ApiResponse("error", "Razorpay error: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
} catch (Exception e) {
return new ResponseEntity<>(new ApiResponse("error", "Unexpected error: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@PostMapping("/Confirm")
public ResponseEntity<?> confirmBookingViaWhatsApp(
@RequestParam("id") String tempId,
@RequestParam(value = "source", defaultValue = "2") int source,
@RequestParam(value = "orderId", required = true) String orderId,
@RequestBody Map<String, Object> paymentResponse
) {
return coworkspaceApiService.processPaymentConfirmation(tempId, source, orderId, paymentResponse);
}
//sanjay
@GetMapping(value = "/sendOTP")
public ResponseEntity<?> sendOtp(HttpServletRequest request, @RequestParam String mobileNo) {
// Basic mobile number validation
if (mobileNo == null || mobileNo.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Error: Mobile number cannot be empty.");
}
if (!mobileNo.matches("^[6-9]\\d{9}$")) {
return ResponseEntity.badRequest().body("Error: Invalid mobile number format. It should be 10 digits starting with 6-9.");
}
// Check if mobile number exists in DB
List<?> bookingDetailsList = coworkspaceApiService.findByMobileNo(Long.parseLong(mobileNo));
if (bookingDetailsList == null || bookingDetailsList.isEmpty()) {
return ResponseEntity.badRequest().body("Error: This number is not registered.");
}
// Generate OTP
Random rand = new Random();
int otp = rand.nextInt(90000) + 10000;
System.out.println("Generated OTP: " + otp);
// Send SMS
String bodyMessage = coworkspaceApiService.sendOTPNsms(mobileNo, otp + "");
// Store OTP in session
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
session.setAttribute("mobileNo", mobileNo);
return ResponseEntity.ok(bodyMessage);
}
@GetMapping("/booking-history")
public ResponseEntity<ApiResponse> getBookingHistory(@RequestParam("mobile") long mobile) {
try {
System.out.println("API Called: /booking-history?mobile=" + mobile);
List<Map<String, Object>> rawData = coworkspaceApiService.getBookingHistoryByMobile(mobile);
if (rawData.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ApiResponse("error", "No booking history found", null, HttpStatus.NOT_FOUND.value()));
}
// Group data by booking_id
Map<Long, Map<String, Object>> groupedData = new LinkedHashMap<>();
for (Map<String, Object> row : rawData) {
Long bookingId = ((Number) row.get("booking_id")).longValue();
if (!groupedData.containsKey(bookingId)) {
Map<String, Object> booking = new LinkedHashMap<>();
booking.put("booking_id", bookingId);
booking.put("from_date", row.get("from_date"));
booking.put("to_date", row.get("to_date"));
booking.put("booking_date", row.get("booking_date"));
booking.put("user_name", row.get("user_name"));
booking.put("mobile", row.get("mobile"));
booking.put("amount", row.get("amount"));
booking.put("payment_status", row.get("payment_status"));
booking.put("no_of_person", row.get("no_of_person"));
booking.put("building_name", row.get("building_name"));
booking.put("category_name", row.get("category_name"));
booking.put("category_display_name", row.get("category_display_name"));
booking.put("status", row.get("status"));
booking.put("slots", new ArrayList<Map<String, Object>>());
groupedData.put(bookingId, booking);
}
// Add slot info
List<Map<String, Object>> slots = (List<Map<String, Object>>) groupedData.get(bookingId).get("slots");
Map<String, Object> slot = new HashMap<>();
slot.put("slotid", row.get("slotid"));
slot.put("slot_name", row.get("slot_name"));
slot.put("checkin", row.get("checkin"));
slot.put("checkout", row.get("checkout"));
slots.add(slot);
}
return ResponseEntity.ok(new ApiResponse(
"success",
"Booking history retrieved successfully",
new ArrayList<>(groupedData.values()),
HttpStatus.OK.value()
));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to retrieve booking history: " + e.getMessage(), null,
HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
@GetMapping("/slots-by-subcategory")
public ResponseEntity<ApiResponse> getSlotsBySubCategory(@RequestParam("scid") int scid) {
try {
List<Map<String, Object>> slots = coworkspaceApiService.getSlotsBySubCategoryId(scid);
if (slots.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ApiResponse("error", "No slots found for subcategory ID: " + scid, null, HttpStatus.NOT_FOUND.value()));
}
return ResponseEntity.ok(new ApiResponse("success", "Slots retrieved successfully", slots, HttpStatus.OK.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to retrieve slots: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
@GetMapping("/getsubcategorymaster")
public ResponseEntity<ApiResponse> getsubcategorymaster(@RequestParam("cid")int cid){
try {
List<Map<String,Object>> getsubcategorymaster=coworkspaceApiService.getsubcategorymaster(cid);
if (getsubcategorymaster.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ApiResponse("error", "No subcategorymaster found for subcategory ID: " + getsubcategorymaster, null, HttpStatus.NOT_FOUND.value()));
}
return ResponseEntity.ok(new ApiResponse("success", "subcategorymaster retrieved successfully", getsubcategorymaster, HttpStatus.OK.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to retrieve subcategorymaster: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
}

44
src/main/java/com/gcc/restapiservices/coworkspace/exception/GlobalExceptionHandler.java

@ -0,0 +1,44 @@
package com.gcc.restapiservices.coworkspace.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalExceptionHandler {
// @ExceptionHandler(IllegalArgumentException.class)
// public ResponseEntity<?> handleIllegalArgument(IllegalArgumentException ex) {
// Map<String, Object> error = new HashMap<>();
// error.put("timestamp", LocalDateTime.now());
// error.put("status", 400);
// error.put("error", "Bad Request");
// error.put("message", ex.getMessage());
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
// }
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleAll(Exception ex) {
Map<String, Object> error = new HashMap<>();
error.put("timestamp", LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
error.put("status", 500);
error.put("error", "Internal Server Error");
error.put("message", ex.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<?> handleIllegalArgument(IllegalArgumentException ex) {
Map<String, Object> error = new HashMap<>();
error.put("timestamp", LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
error.put("status", HttpStatus.BAD_REQUEST.value());
error.put("error", "Bad Request");
error.put("message", ex.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
}
}

7
src/main/java/com/gcc/restapiservices/coworkspace/exception/NoSlotAvailable.java

@ -0,0 +1,7 @@
package com.gcc.restapiservices.coworkspace.exception;
public class NoSlotAvailable extends RuntimeException{
public NoSlotAvailable(String msg){
super(msg);
}
}

38
src/main/java/com/gcc/restapiservices/coworkspace/service/AmountConfigService.java

@ -0,0 +1,38 @@
package com.gcc.restapiservices.coworkspace.service;
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;
import javax.sql.DataSource;
import java.util.Map;
@Service
public class AmountConfigService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlCoworkspaceRestServicesDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public Map<String, Object> getAmountBySlotid(int slotid) {
String sql = """
SELECT * FROM amount_config WHERE slotid = ?
AND isactive = 1 AND isdelete = 0
""";
try {
Map<String, Object> result = jdbcTemplate.queryForMap(sql, slotid);
return result;
}catch (Exception e){
return null;
}
// Check if the result is null and return an empty map if so
}
}

33
src/main/java/com/gcc/restapiservices/coworkspace/service/CalendarService.java

@ -0,0 +1,33 @@
package com.gcc.restapiservices.coworkspace.service;
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;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
@Service
public class CalendarService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlCoworkspaceRestServicesDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getCalendarBasedOnSubCatId(int scid) {
String sql = "select * from slots where scid = ? AND (`isactive`=1 AND `isdelete`=0)";
System.err.println(sql+scid);
return jdbcTemplate.queryForList(sql, scid);
}
public String getSlotText(String slotID) {
String sql = "SELECT name FROM slots WHERE slotid = ? AND isactive = 1 AND isdelete = 0";
return jdbcTemplate.queryForObject(sql, new Object[]{slotID}, String.class);
}
}

1447
src/main/java/com/gcc/restapiservices/coworkspace/service/CoworkspaceApiService.java
File diff suppressed because it is too large
View File

193
src/main/java/com/gcc/restapiservices/coworkspace/service/PaymentService.java

@ -0,0 +1,193 @@
package com.gcc.restapiservices.coworkspace.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
@Service
public class PaymentService {
@Autowired
public void setDataSource(@Qualifier("mysqlCoworkspaceRestServicesDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
System.out.println("🔵 PaymentService JdbcTemplate initialized with dataSource: " + dataSource);
}
private JdbcTemplate jdbcTemplate;
@Transactional("coworkspaceTransactionManager")
public int savePayment( String totalAmount,
String payment_id,
String payment_orderid,
String payment_status,
String bookingId,
String mobile_no,
String whatsUpRefId
){
System.out.println("🔵 PaymentService.savePayment called with:");
System.out.println("- totalAmount: " + totalAmount);
System.out.println("- payment_id: " + payment_id);
System.out.println("- payment_orderid: " + payment_orderid);
System.out.println("- payment_status: " + payment_status);
System.out.println("- bookingId: " + bookingId);
System.out.println("- mobile_no: " + mobile_no);
System.out.println("- whatsUpRefId: " + whatsUpRefId);
System.out.println("- paymentdate: " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
int lastInsertId = 0;
String sqlQuery = "INSERT INTO `payment`(`amount`, `mobno`, `order_id`, `payment_id`, `payment_status`, `paymentdate`, `booking_id`, `whats_up_refid`) "
+ "VALUES (?,?,?,?,?,?,?,?)";
System.out.println("🔵 SQL Query: " + sqlQuery);
System.out.println("🔵 JdbcTemplate instance: " + jdbcTemplate);
if (jdbcTemplate == null) {
System.out.println("❌ JdbcTemplate is null! Cannot save payment.");
return 0;
}
KeyHolder keyHolder = new GeneratedKeyHolder();
try {
int affectedRows = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"});
ps.setString(1, totalAmount);
ps.setString(2, mobile_no);
ps.setString(3, payment_orderid);
ps.setString(4, payment_id);
ps.setString(5, payment_status);
ps.setString(6, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
ps.setString(7, bookingId);
ps.setString(8, whatsUpRefId);
return ps;
}
}, keyHolder);
System.out.println("🔵 Affected rows: " + affectedRows);
if (affectedRows > 0) {
Number generatedId = keyHolder.getKey();
lastInsertId = (generatedId != null) ? generatedId.intValue() : 0;
System.out.println("🔵 Generated ID: " + lastInsertId);
return lastInsertId;
} else {
System.out.println("❌ Error on payment save - no rows affected!");
return 0;
}
} catch (DataAccessException e) {
System.out.println("❌ Data Access Exception in savePayment:");
e.printStackTrace();
Throwable rootCause = e.getMostSpecificCause();
if (rootCause instanceof SQLException) {
SQLException sqlException = (SQLException) rootCause;
System.out.println("SQL State: " + sqlException.getSQLState());
System.out.println("Error Code: " + sqlException.getErrorCode());
System.out.println("Message: " + sqlException.getMessage());
} else {
System.out.println("Message: " + rootCause.getMessage());
}
return 0;
} catch (Exception e) {
System.out.println("❌ General Exception in savePayment:");
e.printStackTrace();
return 0;
}
}
public int saveorderLog(String order_id, String order_info, String temp_booking_id) {
System.out.println("inside order log");
if (order_id == null || temp_booking_id == null) {
System.out.println("❌ Missing required fields. Order ID: " + order_id + ", Temp Book ID: " + temp_booking_id);
return 0;
}
String sqlQuery = "INSERT INTO `order_log`(`order_id`, `order_info`, `temp_booking_id`) VALUES (?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
try {
int affectedRows = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"});
ps.setString(1, order_id);
ps.setString(2, order_info);
ps.setString(3, temp_booking_id);
return ps;
}, keyHolder);
if (affectedRows > 0) {
Number generatedId = keyHolder.getKey();
return (generatedId != null) ? generatedId.intValue() : 0;
} else {
System.out.println("❌ Failed to insert into order_log.");
return 0;
}
} catch (Exception e) {
System.out.println("🚨 Exception during insert to order_log: " + e.getMessage());
e.printStackTrace();
return 0;
}
}
@Transactional("coworkspaceTransactionManager")
public int updateBookingIdInPayment(String mobile_no,String bookingId,String payment_id) {
System.out.println("inside update payment ");
String sqlQuery = "UPDATE `payment` SET `mobno` = ?, `booking_id` = ? WHERE `id` = ?";
try {
int affectedRows = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sqlQuery);
ps.setString(1, mobile_no); // Set the new mobile number
ps.setString(2, bookingId); // Set the new booking ID
ps.setString(3, payment_id); // Use the payment ID to locate the record to update
return ps;
}
});
if (affectedRows > 0) {
System.out.println("Record updated successfully!");
return 1; // Or return some relevant status
} else {
System.out.println("Error on updating record!");
return 0;
}
} catch (DataAccessException e) {
System.out.println("Data Access Exception:");
Throwable rootCause = e.getMostSpecificCause();
if (rootCause instanceof SQLException) {
SQLException sqlException = (SQLException) rootCause;
System.out.println("SQL State: " + sqlException.getSQLState());
System.out.println("Error Code: " + sqlException.getErrorCode());
System.out.println("Message: " + sqlException.getMessage());
} else {
System.out.println("Message: " + rootCause.getMessage());
}
return 0;
}
}
public Map<String, Object > getPaymentById(int pid){
String sqlQuery="select * from payment where id = ?";
return jdbcTemplate.queryForMap(sqlQuery,pid);
}
}

69
src/main/java/com/gcc/restapiservices/coworkspace/service/SMSService.java

@ -0,0 +1,69 @@
package com.gcc.restapiservices.coworkspace.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.net.HttpURLConnection;
import java.net.URL;
@Service
public class SMSService {
public String sendMsg(String msgUrl) {
System.out.println("Whatsapp URL :-"+msgUrl);
String response ="";
try{
HttpURLConnection connection =null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response=responseCode+"";
System.out.println("Response Code: " + responseCode);
}catch (Exception e){
e.printStackTrace();
}
return response;
}
public String sendSMS( String SMS_Url, String mobileNo, String otp) {
System.out.println("SMS URL:- "+ SMS_Url);
String bodyMessage = "";
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(SMS_Url, String.class);
// Using Jackson ObjectMapper to parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
// Add mobileNo and otp to the response JSON
jsonResponse.put("MobileNo", mobileNo);
jsonResponse.put("otp", otp);
// Convert the updated JSON object back to string
bodyMessage = jsonResponse.toString();
// bodyMessage=Response;
System.out.println("\n bodyMessage"+bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: "+e);
bodyMessage = "Error";
}
return bodyMessage;
}
}

102
src/main/java/com/gcc/restapiservices/coworkspace/service/WhatsAppService.java

@ -0,0 +1,102 @@
package com.gcc.restapiservices.coworkspace.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class WhatsAppService {
@Autowired
private SMSService whatsappMsgService;
String password = "h2YjFNcJ";
public String sendOTP(String mobileNo, String msg) {
String msgContent ="https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+mobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Welcome+to+Mudhalvar+Padaipagam%2C+%0A%0AThe+OTP+for+your+booking+is+"+msg+"%2A";
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendELearnNmsg(String MobileNo, String noOfPerson, String bdate, String slot, String amount, String bookingId) {
String msgContent = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+MobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Dear+Patron%2C%0AWelcome+to+Muthalvar+Padaippagam%F0%9F%99%8F++%0A%0AYou+have+booked+our+Learning+Centre+for+%2A"+noOfPerson+"%2A+number+of+persons+on+%2A"+bdate+"%2A+at+%0Atime+slot+%2A"+slot+"%2A+.%0A%0APayment+for+the+booking+is+%2ARs.+"+amount+"%2A+received.+%0A%0APlease+show+your+QR+Code+at+Reception+Desk+for+accessing+Muthalvar+Padaippagam.%0A%0AHave+a+Nice+Day%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendTLearnNmsg(String MobileNo, String noOfPerson, String bdate, String slot, String amount, String bookingId) {
String msgContent = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+MobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%BE%E0%AE%A9+%E0%AE%B5%E0%AE%BE%E0%AE%9F%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%B3%E0%AE%B0%E0%AF%87%2C+%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%A4%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%88+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AF%81%E0%AE%9F%E0%AE%A9%E0%AF%8D+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BF%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AE%A4%E0%AF%81+%F0%9F%99%8F++%0A%0A%E0%AE%A4%E0%AE%BE%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+%E0%AE%8E%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AE%BF%E0%AE%A9%E0%AF%8D+%E0%AE%95%E0%AE%B1%E0%AF%8D%E0%AE%B1%E0%AE%B2%E0%AF%8D+%E0%AE%AE%E0%AF%88%E0%AE%AF%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AF%88++%2A"+noOfPerson+"%2A+%E0%AE%8E%E0%AE%A3%E0%AF%8D%E0%AE%A3%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88+%E0%AE%A8%E0%AE%AA%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%81%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%81++%2A"+bdate+"%2A+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AF%81++%E0%AE%A8%E0%AF%87%E0%AE%B0+%E0%AE%87%E0%AE%9F%E0%AF%88%E0%AE%B5%E0%AF%86%E0%AE%B3%E0%AE%BF+%2A"+slot+"%2A+%E0%AE%B2%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%8A%E0%AE%B3%E0%AF%8D%E0%AE%B3+%E0%AE%AE%E0%AF%81%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%A4%E0%AE%BF%E0%AE%B5%E0%AF%81+%E0%AE%9A%E0%AF%86%E0%AE%AF%E0%AF%8D%E0%AE%A4%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AF%80%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D.+.%0A%0A%E0%AE%87%E0%AE%A4%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BE%E0%AE%A9++%E0%AE%95%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A3%E0%AE%AE%E0%AF%8D+%2A%E0%AE%B0%E0%AF%82.+"+amount+"%2A+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AE%A4%E0%AF%81.%0A%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4+%E0%AE%89%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+QR+%E0%AE%95%E0%AF%81%E0%AE%B1%E0%AE%BF%E0%AE%AF%E0%AF%80%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%88+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%AA%E0%AE%B1%E0%AF%88%E0%AE%AF%E0%AE%BF%E0%AE%B2%E0%AF%8D+%E0%AE%95%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D.%0A%0A%E0%AE%87%E0%AE%A8%E0%AF%8D%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AF%8D+%E0%AE%87%E0%AE%A9%E0%AE%BF%E0%AE%AF+%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AE%BE%E0%AE%AF%E0%AF%8D+%E0%AE%85%E0%AE%AE%E0%AF%88%E0%AE%AF%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%AE%E0%AF%8D%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendEDeskspaceNmsg(String MobileNo, String noOfPerson, String bdate, String slot, String amount, String bookingId) {
String msgContent = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+MobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Dear+Patron%2C%0AWelcome+to+Muthalvar+Padaippagam%F0%9F%99%8F++%0A%0AYou+have+booked+our+Desk+space+for+%2A"+noOfPerson+"%2A+number+of+persons+on+%2A"+bdate+"%2A+at+time+slot+%2A"+slot+"%2A+.%0A%0APayment+for+the+booking+is+%2ARs.+"+amount+"%2A+received.+%0A%0APlease+show+your+QR+Code+at+Reception+Desk+for+accessing+Muthalvar+Padaippagam.%0A%0AHave+a+Nice+Day%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendTDeskspaceNmsg(String MobileNo, String noOfPerson, String bdate, String slot, String amount, String bookingId) {
String msgContent = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+MobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%BE%E0%AE%A9+%E0%AE%B5%E0%AE%BE%E0%AE%9F%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%B3%E0%AE%B0%E0%AF%87%2C+%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%A4%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%88+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AF%81%E0%AE%9F%E0%AE%A9%E0%AF%8D+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BF%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AE%A4%E0%AF%81%F0%9F%99%8F++%0A%0A%E0%AE%A4%E0%AE%BE%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+%E0%AE%8E%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AE%BF%E0%AE%A9%E0%AF%8D+%E0%AE%AE%E0%AF%87%E0%AE%9A%E0%AF%88+%E0%AE%87%E0%AE%9F%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%A9%E0%AF%88+%2A"+noOfPerson+"%2A+%E0%AE%8E%E0%AE%A3%E0%AF%8D%E0%AE%A3%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88+%E0%AE%A8%E0%AE%AA%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%81%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%81+%2A"+bdate+"%2A+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AF%81+%E0%AE%A8%E0%AF%87%E0%AE%B0+%E0%AE%87%E0%AE%9F%E0%AF%88%E0%AE%B5%E0%AF%86%E0%AE%B3%E0%AE%BF+%2A"+slot+"%2A+%E0%AE%B2%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%8A%E0%AE%B3%E0%AF%8D%E0%AE%B3+%E0%AE%AE%E0%AF%81%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%A4%E0%AE%BF%E0%AE%B5%E0%AF%81+%E0%AE%9A%E0%AF%86%E0%AE%AF%E0%AF%8D%E0%AE%A4%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AF%80%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D.%0A%0A%E0%AE%87%E0%AE%A4%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BE%E0%AE%A9++%E0%AE%95%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A3%E0%AE%AE%E0%AF%8D+%2A%E0%AE%B0%E0%AF%82.+"+amount+"%2A+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AE%A4%E0%AF%81.+%0A%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4+%E0%AE%89%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+QR+%E0%AE%95%E0%AF%81%E0%AE%B1%E0%AE%BF%E0%AE%AF%E0%AF%80%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%88+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%AA%E0%AE%B1%E0%AF%88%E0%AE%AF%E0%AE%BF%E0%AE%B2%E0%AF%8D+%E0%AE%95%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D%0A%0A%E0%AE%87%E0%AE%A8%E0%AF%8D%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AF%8D+%E0%AE%87%E0%AE%A9%E0%AE%BF%E0%AE%AF+%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AE%BE%E0%AE%AF%E0%AF%8D+%E0%AE%85%E0%AE%AE%E0%AF%88%E0%AE%AF%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%AE%E0%AF%8D%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendEMonthDeskspaceNmsg(String MobileNo, String noOfPerson, String bFromdate,String bTodate, String slot, String amount, String bookingId) {
String msgContent = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+MobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Dear+Patron%2C%0AWelcome+to+Muthalvar+Padaippagam%F0%9F%99%8F++%0A%0AYou+have+booked+our+Desk+space+for+%2A"+noOfPerson+"%2A+number+of+persons+for+30+days+from+%2A"+bFromdate+"+to+"+bTodate+"%2A+at+time+slot+%2A"+slot+"%2A.%0A%0APayment+for+the+booking+is+%2ARs.+"+amount+"%2A+received.+%0A%0APlease+show+your+QR+Code+at+Reception+Desk+for+accessing+Muthalvar+Padaippagam.%0A%0AHave+a+Nice+Day%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendTMonthDeskspaceNmsg(String MobileNo, String noOfPerson, String bfromDate,String btoDate, String slot, String amount, String bookingId) {
String msgContent = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="+MobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%BE%E0%AE%A9+%E0%AE%B5%E0%AE%BE%E0%AE%9F%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%B3%E0%AE%B0%E0%AF%87%2C+%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%A4%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%88+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AF%81%E0%AE%9F%E0%AE%A9%E0%AF%8D+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BF%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AE%A4%E0%AF%81+%F0%9F%99%8F++%0A%0A%E0%AE%A4%E0%AE%BE%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+%E0%AE%8E%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AE%BF%E0%AE%A9%E0%AF%8D+%E0%AE%AE%E0%AF%87%E0%AE%9A%E0%AF%88+%E0%AE%87%E0%AE%9F%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AF%88+%2A"+noOfPerson+"%2A+%E0%AE%8E%E0%AE%A3%E0%AF%8D%E0%AE%A3%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88+%E0%AE%A8%E0%AE%AA%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%81%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%81+30+%E0%AE%A8%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+%2A"+bfromDate+"+%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D+"+btoDate+"%2A+%E0%AE%B5%E0%AE%B0%E0%AF%88+%E0%AE%A8%E0%AF%87%E0%AE%B0+%E0%AE%87%E0%AE%9F%E0%AF%88%E0%AE%B5%E0%AF%86%E0%AE%B3%E0%AE%BF+%2A"+slot+"%2A+%E0%AE%B2%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%8A%E0%AE%B3%E0%AF%8D%E0%AE%B3+%E0%AE%AE%E0%AF%81%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%A4%E0%AE%BF%E0%AE%B5%E0%AF%81+%E0%AE%9A%E0%AF%86%E0%AE%AF%E0%AF%8D%E0%AE%A4%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AF%80%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D.%0A%0A%E0%AE%87%E0%AE%A4%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BE%E0%AE%A9++%E0%AE%95%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A3%E0%AE%AE%E0%AF%8D+%2A%E0%AE%B0%E0%AF%82.+"+amount+"%2A+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AE%A4%E0%AF%81.%0A%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4+%E0%AE%89%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+QR+%E0%AE%95%E0%AF%81%E0%AE%B1%E0%AE%BF%E0%AE%AF%E0%AF%80%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%88+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%AA%E0%AE%B1%E0%AF%88%E0%AE%AF%E0%AE%BF%E0%AE%B2%E0%AF%8D+%E0%AE%95%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D%0A%0A%E0%AE%87%E0%AE%A8%E0%AF%8D%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AF%8D+%E0%AE%87%E0%AE%A9%E0%AE%BF%E0%AE%AF+%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AE%BE%E0%AE%AF%E0%AF%8D+%E0%AE%85%E0%AE%AE%E0%AF%88%E0%AE%AF%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%AE%E0%AF%8D%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendEConfeNmsg(String mobileNo, String bdate, String slot, String amount,String bookingId) {
String msgContent= "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="+mobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Dear+Patron%2C%0AWelcome+to+Muthalvar+Padaippagam%F0%9F%99%8F++%0A%0AYou+have+booked+our+Conference+Hall+on+%2A"+bdate+"%2A+at+time+slot+%2A"+slot+"%2A+.%0A%0APayment+for+the+booking+is+%2ARs.+"+amount+"%2A+received.+%0A%0APlease+show+your+QR+Code+at+Reception+Desk+for+accessing+Muthalvar+Padaippagam.%0A%0AHave+a+Nice+Day%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
System.out.println(msgContent);
return whatsappMsgService.sendMsg(msgContent);
}
public String sendTConfeNmsg(String mobileNo, String bdate, String slot, String amount,String bookingId) {
String msgContent = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="+mobileNo+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%BE%E0%AE%A9+%E0%AE%B5%E0%AE%BE%E0%AE%9F%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%B3%E0%AE%B0%E0%AF%87%2C+%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%A4%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%88+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AF%81%E0%AE%9F%E0%AE%A9%E0%AF%8D+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BF%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AE%A4%E0%AF%81+%F0%9F%99%8F++%0A%0A%E0%AE%A4%E0%AE%BE%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+%E0%AE%8E%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AE%BF%E0%AE%A9%E0%AF%8D+%E0%AE%95%E0%AE%B2%E0%AE%A8%E0%AF%8D%E0%AE%A4%E0%AE%BE%E0%AE%AF%E0%AF%8D%E0%AE%B5%E0%AF%81+%E0%AE%85%E0%AE%B0%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%A9%E0%AF%88+%2A"+bdate+"%2A+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AF%81++%E0%AE%A8%E0%AF%87%E0%AE%B0+%E0%AE%87%E0%AE%9F%E0%AF%88%E0%AE%B5%E0%AF%86%E0%AE%B3%E0%AE%BF+%2A"+slot+"%2A+%E0%AE%B2%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%8A%E0%AE%B3%E0%AF%8D%E0%AE%B3+%E0%AE%AE%E0%AF%81%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%A4%E0%AE%BF%E0%AE%B5%E0%AF%81+%E0%AE%9A%E0%AF%86%E0%AE%AF%E0%AF%8D%E0%AE%A4%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AF%80%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D.+%0A%0A%E0%AE%87%E0%AE%A4%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BE%E0%AE%A9++%E0%AE%95%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A3%E0%AE%AE%E0%AF%8D+%2A%E0%AE%B0%E0%AF%82.+"+amount+"%2A+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AE%A4%E0%AF%81.+%0A%0A%E0%AE%AE%E0%AF%81%E0%AE%A4%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%B0%E0%AF%8D+%E0%AE%AA%E0%AE%9F%E0%AF%88%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%95%E0%AE%AE%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4+%E0%AE%89%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+QR+%E0%AE%95%E0%AF%81%E0%AE%B1%E0%AE%BF%E0%AE%AF%E0%AF%80%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%88+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%AA%E0%AE%B1%E0%AF%88%E0%AE%AF%E0%AE%BF%E0%AE%B2%E0%AF%8D+%E0%AE%95%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D%0A%0A%E0%AE%87%E0%AE%A8%E0%AF%8D%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AF%8D+%E0%AE%87%E0%AE%A9%E0%AE%BF%E0%AE%AF+%E0%AE%A8%E0%AE%BE%E0%AE%B3%E0%AE%BE%E0%AE%AF%E0%AF%8D+%E0%AE%85%E0%AE%AE%E0%AF%88%E0%AE%AF%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%AE%E0%AF%8D%F0%9F%98%8A&isTemplate=true&buttonUrlParam=muthalvarpadaippagam%2FbookingQRCode%3Fbooking_id%3D"+bookingId;
return whatsappMsgService.sendMsg(msgContent);
}
public String sendSMS( String SMS_Url, String mobileNo, String otp) {
System.out.println("SMS URL:- "+ SMS_Url);
String bodyMessage = "";
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(SMS_Url, String.class);
// Using Jackson ObjectMapper to parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
// Add mobileNo and otp to the response JSON
jsonResponse.put("MobileNo", mobileNo);
jsonResponse.put("otp", otp);
// Convert the updated JSON object back to string
bodyMessage = jsonResponse.toString();
// bodyMessage=Response;
System.out.println("\n bodyMessage"+bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: "+e);
bodyMessage = "Error";
}
return bodyMessage;
}
}

264
src/main/java/com/gcc/restapiservices/crslogs/controller/CrsLogsApiController.java

@ -0,0 +1,264 @@
package com.gcc.restapiservices.crslogs.controller;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.gcc.restapiservices.configuration.AppConfig;
import com.gcc.restapiservices.crslogs.service.CrsLogsService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@RestController
@RequestMapping("/gccrestservices/crslogs/api")
public class CrsLogsApiController {
@Autowired
private CrsLogsService crsLogsService;
@Autowired
private AppConfig appConfig;
// @PostMapping("/saveCrsCertificateLogs")
// public ResponseEntity<?> saveCrsCertificateLogs(HttpServletRequest request,
// @RequestParam String regNo,
// @RequestParam String eventDate,
// @RequestParam String Url,
// @RequestParam String service,
// @RequestParam(required = false) String application_flag,
// @RequestParam(required = false) String mobile_number) {
//
// // Set default value if not passed
// if (application_flag == null || application_flag.trim().isEmpty()) {
// application_flag = "whatsapp";
// }
//
// return crsLogsService.saveCrsCertificateLogs(regNo, eventDate, Url, service, application_flag, mobile_number);
// }
@PostMapping("/saveCrsCertificateLogs")
public ResponseEntity<Map<String, Object>> saveCrsCertificateLogs(
HttpServletRequest request,
@RequestParam String regNo,
@RequestParam String eventDate,
@RequestParam String Url,
@RequestParam String service,
@RequestParam(required = false) String application_flag,
@RequestParam(required = false) String mobile_number) {
Map<String, Object> response = new LinkedHashMap<>();
try {
// Validate required fields
if (regNo == null || regNo.trim().isEmpty()) {
return badRequest("regNo is required");
}
if (eventDate == null || eventDate.trim().isEmpty()) {
return badRequest("eventDate is required");
}
if (Url == null || Url.trim().isEmpty()) {
return badRequest("Url is required");
}
if (service == null || service.trim().isEmpty()) {
return badRequest("service is required");
}
// Default application_flag if not provided
if (application_flag == null || application_flag.trim().isEmpty()) {
application_flag = "whatsapp";
}
int count = crsLogsService.saveCrsCertificateLogs(
regNo.trim(), eventDate.trim(), Url.trim(), service.trim(),
application_flag.trim(), mobile_number != null ? mobile_number.trim() : null
);
if (count > 0) {
response.put("status", true);
response.put("message", "Details saved successfully");
response.put("status_code", 200);
return ResponseEntity.ok(response);
} else {
response.put("status", false);
response.put("message", "Failed to save details");
response.put("status_code", 500);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
} catch (Exception ex) {
response.put("status", false);
response.put("message", "An unexpected error occurred: " + ex.getMessage());
response.put("status_code", 500);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
private ResponseEntity<Map<String, Object>> badRequest(String message) {
Map<String, Object> error = new LinkedHashMap<>();
error.put("status", false);
error.put("message", message);
error.put("status_code", 400);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
}
/*///////////////// otp configuration /////////////////////*/
// @GetMapping(value = "/sendOTP")
// public String sendOtp(HttpServletRequest request, @RequestParam String mobile) {
//
// // Create an ObjectMapper instance
// ObjectMapper objectMapper = new ObjectMapper();
//
// Map<String, Object> response = new HashMap<>();
//
// String MobileNo=mobile;
// System.out.print("\n MobileNo---:"+mobile);
// Random rand = new Random();
// int otp = rand.nextInt(90000) + 10000;
//
// //int otp= 22222;
// System.out.print("\n otp---:"+otp);
// DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy%20HH:mm");
// LocalDateTime now = LocalDateTime.now();
// System.out.println(dtf.format(now));
// //String generatedToken = "Welcome to GCC! Your OTP for C%26D waste collectors Registration process is "+otp;
//
// //String generatedToken = "Welcome to GCC "+otp+" is your OTP for gcc QR System";
//
// String generatedToken = "Welcome to GCC! Your OTP for Birth and Death Certificate login is " + otp;
// //String generatedToken = "Welcome to GCC! Your OTP for C and D waste collectors Registration process is " + otp;
//// String key="qxg4mklD";
// String key="pfTEYN6H";
// String urlString= appConfig.getGetOtpUrl()+"from=GCCCRP&key="+key+"&sender=GCCCRP&to="+MobileNo+"&body="+generatedToken+"&entityid=1401572690000011081&templateid=1407174687453240990";
//
//
// //String urlString = "https://tmegov.onex-aura.com/api/sms?from=GCCCRP&key=pfTEYN6H&sender=GCCCRP&to=9360777472&body=Welcome%20to%20GCC!%20Your%20OTP%20for%20C%26D%20waste%20collectors%20Registration%20process%20is%20"+otp+"&entityid=1401572690000011081&templateid=1407172959127552127";
// //String urlString= appConfig.getGetOtpUrl()+"from=GCCCRP&key="+key+"&sender=GCCCRP&to="+MobileNo+"&body="+generatedToken+"&entityid=1401572690000011081&templateid=1407168250479102852";
//// String urlString=appConfig.getGetOtpUrl()+"user=GCCtrans&authkey=92kOC1RBGBIws&sender=GCCCRP&mobile="+MobileNo+"&text="+generatedToken+"&rpt=1&summary=1&output=json&entityid=1401572690000011081&templateid=1407168250479102852";
// System.out.print("\n urlString---: "+urlString);
// String bodyMessage = "";
//
//
// if (mobile == null || mobile.trim().isEmpty()) {
// throw new IllegalArgumentException("Mobile number is required");
// }
//
// // Validate mobile number is exactly 10 digits
// if (!mobile.matches("\\d{10}")) {
// throw new IllegalArgumentException("Mobile number must be exactly 10 digits");
// }
//
// try {
// RestTemplate restTemplate = new RestTemplate();
// String Response = restTemplate.getForObject(urlString, String.class);
//
// // Step 1: Ensure user is registered
// int userId = crsLogsService.ensureUserExists(mobile);
// System.out.println("\n User ID (existing or new): " + userId);
//
// ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
//
// // Add mobileNo and otp to the response JSON
// jsonResponse.put("MobileNo", MobileNo);
// jsonResponse.put("otp", otp);
//
//
// bodyMessage= jsonResponse.toString();
// System.out.println("\n bodyMessage"+bodyMessage);
//
// System.out.println("OTP sent successfully!");
//
// } catch (Exception e) {
// e.printStackTrace();
// System.out.println("ERROR---: " + e.getMessage());
// bodyMessage = "Error";
// }
// HttpSession session = request.getSession();
// session.setAttribute("otp", otp);
// return bodyMessage;
//
// }
@GetMapping(value = "/sendOTP")
public ResponseEntity<Map<String, Object>> sendOtp(HttpServletRequest request,
@RequestParam String mobile) {
Map<String, Object> response = new HashMap<>();
try {
if (mobile == null || mobile.trim().isEmpty()) {
response.put("status", false);
response.put("message", "Mobile number is required");
response.put("status_code", HttpStatus.BAD_REQUEST.value());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
if (!mobile.matches("\\d{10}")) {
response.put("status", false);
response.put("message", "Mobile number must be exactly 10 digits");
response.put("status_code", HttpStatus.BAD_REQUEST.value());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
Random rand = new Random();
int otp = rand.nextInt(90000) + 10000;
String generatedToken = "Welcome to GCC! Your OTP for Birth and Death Certificate login is " + otp;
String key = "pfTEYN6H";
String urlString = appConfig.getGetOtpUrl()
+ "from=GCCCRP&key=" + key
+ "&sender=GCCCRP&to=" + mobile
+ "&body=" + generatedToken
+ "&entityid=1401572690000011081&templateid=1407174687453240990";
RestTemplate restTemplate = new RestTemplate();
String smsResponse = restTemplate.getForObject(urlString, String.class);
int userId = crsLogsService.ensureUserExists(mobile);
System.out.println("\n User ID (existing or new): " + userId);
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
response.put("MobileNo", mobile);
response.put("otp", otp);
response.put("message", "OTP sent successfully");
response.put("status", HttpStatus.OK.value());
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
response.put("status", false);
response.put("message", "Error while sending OTP: " + e.getMessage());
response.put("status_code", HttpStatus.INTERNAL_SERVER_ERROR.value());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
}

80
src/main/java/com/gcc/restapiservices/crslogs/service/CrsLogsService.java

@ -0,0 +1,80 @@
package com.gcc.restapiservices.crslogs.service;
import java.util.List;
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 CrsLogsService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlCrsLogsDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// public ResponseEntity<?> saveCrsCertificateLogs(String regNo, String eventDate, String url, String service, String application_flag, String mobile_number) {
// String sql = "INSERT INTO certificate_logs (regno, event_date, english_url, service, application_flag, mobile_number) VALUES (?, ?, ?, ?, ?, ?)";
// Integer count = jdbcTemplate.update(sql, regNo, eventDate, url, service, application_flag, mobile_number);
// return count != null && count > 0 ? ResponseEntity.ok(count) : ResponseEntity.notFound().build();
// }
// public int saveCrsCertificateLogs(String regNo, String eventDate, String url, String service, String application_flag, String mobile_number) {
// String sql = "INSERT INTO certificate_logs (regno, event_date, english_url, service, application_flag, user_mobile) VALUES (?, ?, ?, ?, ?, ?)";
//
// try {
// return jdbcTemplate.update(sql, regNo, eventDate, url, service, application_flag, mobile_number);
// } catch (Exception e) {
// System.err.println("SQL Error: " + e.getMessage());
// throw e; // rethrow to let controller handle it
// }
// }
public int saveCrsCertificateLogs(String regNo, String eventDate, String url, String service,
String application_flag, String mobile_number) {
try {
Integer userId = null;
if (mobile_number != null && !mobile_number.trim().isEmpty()) {
userId = ensureUserExists(mobile_number.trim());
}
String sql = "INSERT INTO certificate_logs (regno, event_date, english_url, service, application_flag, user_id,user_mobile) " +
"VALUES (?, ?, ?, ?, ?, ?,?)";
return jdbcTemplate.update(sql, regNo, eventDate, url, service, application_flag, userId,mobile_number);
} catch (Exception e) {
System.err.println("SQL Error: " + e.getMessage());
throw e;
}
}
public int ensureUserExists(String mobile) {
String checkUserSql = "SELECT user_id FROM users WHERE user_mobile = ? ";
String insertUserSql = "INSERT INTO users (user_name, user_address, user_mobile) VALUES (?, ?, ?)";
List<Integer> result = jdbcTemplate.query(checkUserSql, (rs, rowNum) -> rs.getInt("user_id"), mobile);
if (result.isEmpty()) {
jdbcTemplate.update(insertUserSql, "-", "-", mobile);
}
// Always return the user id
return jdbcTemplate.queryForObject(checkUserSql, Integer.class, mobile);
}
}

127
src/main/java/com/gcc/restapiservices/feedback/controller/FeedbackController.java

@ -0,0 +1,127 @@
package com.gcc.restapiservices.feedback.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.gcc.restapiservices.cdwaste.util.ApiResponseUtil;
import com.gcc.restapiservices.feedback.service.FeedbackService;
@RestController
@RequestMapping("/gccrestservices/feedback/api")
public class FeedbackController {
@Autowired
private FeedbackService feedbackService;
@GetMapping("/getMasterServiceList")
public ResponseEntity<?> getMasterService() {
List<Map<String, Object>> result = feedbackService.getMasterService();
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
}
// @GetMapping("/getSubServiceList")
// public ResponseEntity<?> getSubServiceList(@RequestParam String serviceId) {
// int sId = 0;
//
// if (serviceId.isEmpty() ||serviceId == null) {
// return ApiResponseUtil.error("Please enter valid serviceId", HttpStatus.BAD_REQUEST);
// }
// else {
// sId = Integer.parseInt(serviceId);
// }
//
// List<Map<String, Object>> result = feedbackService.getSubServiceList(sId);
// if (result.isEmpty()) {
// return ApiResponseUtil.notFound("No data found");
// }
// return ApiResponseUtil.success(result, "Data found");
// }
@GetMapping("/getSubServiceList")
public ResponseEntity<?> getSubServiceList(@RequestParam(required = false) String serviceId) {
if (serviceId == null || serviceId.trim().isEmpty()) {
return ApiResponseUtil.error("Please enter valid serviceId", HttpStatus.BAD_REQUEST);
}
int sId;
try {
sId = Integer.parseInt(serviceId);
} catch (NumberFormatException e) {
return ApiResponseUtil.error("Invalid serviceId format", HttpStatus.BAD_REQUEST);
}
// Restricted service IDs (no subservice available)
List<Integer> restrictedIds = Arrays.asList(7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21);
if (restrictedIds.contains(sId)) {
return ApiResponseUtil.error("No subservice available for this serviceId", HttpStatus.NOT_FOUND);
}
List<Map<String, Object>> result = feedbackService.getSubServiceList(sId);
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
}
@PostMapping("/saveFeedback")
public ResponseEntity<?> saveFeedbackDetails(@RequestParam String userName,
@RequestParam String mobno,
@RequestParam String categoryId,
@RequestParam (required =false) String subCategoryId,
@RequestParam String remarks,
@RequestParam(required = false) MultipartFile feedbackImage) {
String imgPath="";
int cid =0;
int subid =0;
try {
if (userName.isEmpty() || userName == null) {
return ApiResponseUtil.error("Please enter valid user name", HttpStatus.BAD_REQUEST);
}
if (mobno == null || !mobno.matches("\\d{10}")) {
return ApiResponseUtil.error("Please enter a valid 10-digit mobile number", HttpStatus.BAD_REQUEST);
}
if (categoryId.isEmpty()||categoryId == null) {
return ApiResponseUtil.error("Invalid category selected", HttpStatus.BAD_REQUEST);
}else {
cid = Integer.parseInt(categoryId);
}
if (!subCategoryId.isEmpty()&& subCategoryId != null) {
subid = Integer.parseInt(subCategoryId);
}
if (remarks == null || remarks.trim().isEmpty()) {
return ApiResponseUtil.error("Remarks cannot be empty", HttpStatus.BAD_REQUEST);
}
if(!feedbackImage.isEmpty()){
imgPath = feedbackService.saveFeedbackImage(feedbackImage);
}
return feedbackService.saveFeedbackDetails(userName, mobno, cid, subid, remarks, imgPath);
} catch (Exception e) {
e.printStackTrace();
return ApiResponseUtil.error("Something went wrong: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

125
src/main/java/com/gcc/restapiservices/feedback/service/FeedbackService.java

@ -0,0 +1,125 @@
package com.gcc.restapiservices.feedback.service;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.SecureRandom;
import java.sql.PreparedStatement;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.gcc.restapiservices.cdwaste.util.ApiResponseUtil;
import com.gcc.restapiservices.cdwaste.util.DateTimeUtil;
@Service
public class FeedbackService {
@Autowired
private Environment environment;
@Autowired
public void setDataSource(@Qualifier("mysqlFeedbackDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
private JdbcTemplate jdbcTemplate;
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int STRING_LENGTH = 15;
private static final Random RANDOM = new SecureRandom();
public List<Map<String, Object>> getMasterService() {
String sql = "Select * from master_service where is_active =1";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getSubServiceList(int serviceId) {
String sql = "Select * from sub_service where master_id =? and is_active =1";
return jdbcTemplate.queryForList(sql, serviceId);
}
public String saveFeedbackImage(MultipartFile FeedbackImage) throws IOException {
String img_url = "";
if (FeedbackImage == null || FeedbackImage.isEmpty()) {
return img_url;
}
String uploadDirectory = environment.getProperty("file.upload.directory");
String serviceFolderName = environment.getProperty("feedback_directory");
var year = DateTimeUtil.getCurrentYear();
var month = DateTimeUtil.getCurrentMonth();
uploadDirectory = uploadDirectory + "/" + serviceFolderName + "/" + year + "/" + month;
Path directoryPath = Paths.get(uploadDirectory);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
String datetimetxt = DateTimeUtil.getCurrentDateTime();
String fileName = datetimetxt + "" + generateRandomStringForFile(10) + "_"
+ FeedbackImage.getOriginalFilename();
String filepath = uploadDirectory + "/" + fileName;
String filepath_txt = "/" + serviceFolderName + "/" + year + "/" + month + "/" + fileName;
Path path = Paths.get(filepath);
Files.createDirectories(path.getParent());
Files.write(path, FeedbackImage.getBytes());
img_url = filepath_txt;
return img_url;
}
public static String generateRandomStringForFile(int String_Lenth) {
StringBuilder result = new StringBuilder(String_Lenth);
for (int i = 0; i < STRING_LENGTH; i++) {
result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())));
}
return result.toString();
}
public ResponseEntity<?> saveFeedbackDetails(String userName, String mobno, int categoryId, int subCategoryId,
String remarks,
String imgPath) {
String sql = "INSERT INTO feedback_details (user_name, mobile_no, service_id, subservice_id, remarks, img_path) "
+ "VALUES (?, ?, ?, ?, ?, ?)";
int rowsAffected = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, userName.trim());
ps.setString(2, mobno.trim());
ps.setInt(3, categoryId);
ps.setInt(4, subCategoryId);
ps.setString(5, remarks.trim());
ps.setString(6, imgPath);
return ps;
});
if (rowsAffected > 0) {
return ApiResponseUtil.success( null,"Feedback submitted successfully");
} else {
return ApiResponseUtil.error("Failed to save feedback. Please try again", null);
}
}
}

108
src/main/java/com/gcc/restapiservices/nearbyservices/controller/LocationController.java

@ -0,0 +1,108 @@
package com.gcc.restapiservices.nearbyservices.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
@RestController
@RequestMapping("/gccrestservices/api/location")
public class LocationController {
@Value("${google.api.key}")
private String googleApiKey;
@Value("${gis.api.url}")
private String gisApiUrl;
private final RestTemplate restTemplate = new RestTemplate();
@GetMapping("/getDetails")
public ResponseEntity<?> getLocationDetails(@RequestParam String address) {
try {
if (address == null || address.trim().isEmpty()) {
return ResponseEntity.badRequest().body(Collections.singletonMap("error", "Address is required"));
}
String searchUrl = "https://maps.googleapis.com/maps/api/place/findplacefromtext/json"
+ "?input=" + URLEncoder.encode(address, StandardCharsets.UTF_8)
+ "&inputtype=textquery"
+ "&fields=geometry"
+ "&key=" + googleApiKey;
Map<String, Object> searchResponse = restTemplate.getForObject(searchUrl, Map.class);
if (searchResponse == null || !"OK".equals(searchResponse.get("status"))) {
return ResponseEntity.badRequest()
.body(Collections.singletonMap("error", "Invalid address or Google Places API error"));
}
List<Map<String, Object>> candidates = (List<Map<String, Object>>) searchResponse.get("candidates");
if (candidates == null || candidates.isEmpty()) {
return ResponseEntity.badRequest()
.body(Collections.singletonMap("error", "No location found for the given address"));
}
Map<String, Object> firstCandidate = candidates.get(0);
Map<String, Object> geometry = (Map<String, Object>) firstCandidate.get("geometry");
Map<String, Object> location = (Map<String, Object>) geometry.get("location");
double latitude = Math.floor((double) location.get("lat") * 1_000_000.0) / 1_000_000.0;
double longitude = Math.floor((double) location.get("lng") * 1_000_000.0) / 1_000_000.0;
// String geometryJson = String.format(
// "{\"x\":%f,\"y\":%f,\"spatialReference\":{\"wkid\":4326}}",
// longitude, latitude);
// String gisUrl =
// "https://gisgcc.chennaicorporation.gov.in/server/rest/services/GCCDepts/EDPMobile2025/FeatureServer/0/query";
// String params = "f=json"
// + "&geometry=" + URLEncoder.encode(geometryJson, StandardCharsets.UTF_8)
// + "&geometryType=esriGeometryPoint"
// + "&inSR=4326"
// + "&spatialRel=esriSpatialRelIntersects"
// + "&distance=25"
// + "&units=esriSRUnit_Meter"
// + "&outFields=region,new_zone,new_ward,road_id,road_name,gis_id,type"
// + "&returnGeometry=false";
// HttpHeaders headers = new HttpHeaders();
// headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// HttpEntity<String> request = new HttpEntity<>(params, headers);
// Map<String, Object> gisMap = restTemplate.postForObject(gisUrl, request,
// Map.class);
// if (gisMap == null) {
// return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
// .body(Collections.singletonMap("error", "Empty GIS response"));
// }
// if (gisMap.containsKey("error")) {
// return ResponseEntity.badRequest().body(gisMap.get("error"));
// }
// List<Map<String, Object>> gisResponse =
// (List<Map<String, Object>>) gisMap.getOrDefault("features",
// Collections.emptyList());
Map<String, Object> response = new LinkedHashMap<>();
response.put("latitude", latitude);
response.put("longitude", longitude);
response.put("address", address);
// response.put("gis_data", gisResponse);
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonMap("error", "Server error: " + e.getMessage()));
}
}
}

94
src/main/java/com/gcc/restapiservices/nearbyservices/controller/NearByController.java

@ -0,0 +1,94 @@
package com.gcc.restapiservices.nearbyservices.controller;
import java.util.HashMap;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import com.gcc.restapiservices.nearbyservices.service.NearByService;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RequestMapping("/gccrestservices/api/nearbyservices")
@RestController
public class NearByController {
private NearByService nearByService;
@Autowired
public NearByController(NearByService nearByService) {
this.nearByService = nearByService;
}
// @GetMapping("/toilets")
// public ResponseEntity<Map<String, Object>> getToilets(@RequestParam(value = "lat") String lat,
// @RequestParam(value = "lng") String lng){
// Map<String, Object> result = new HashMap<>();
// try {
// //String url1="https://chennaicorporation.gov.in/gcc/citizen-details/location-service/mob_ser_toilet.jsp?ServiceID=GetToilet&SetInput={citizenzone:"+""+",citizendivision:"+""+",lat:"+lat+",longt:"+lng+"}";
// String inputJson = String.format("{\"citizenzone\":\"\",\"citizendivision\":\"\",\"lat\":\"%s\",\"longt\":\"%s\"}", lat, lng);
// String encodedJson = URLEncoder.encode(inputJson, StandardCharsets.UTF_8);
// String urlString = "https://chennaicorporation.gov.in/gcc/citizen-details/location-service/mob_ser_toilet.jsp?ServiceID=GetToilet&SetInput=" + encodedJson;
// System.out.println(urlString);
//
//
// URL url = new URL(urlString);
// URLConnection urlcon=url.openConnection();
// InputStream stream=urlcon.getInputStream();
// StringBuilder responseBuilder = new StringBuilder();
// int i;
// while((i=stream.read())!=-1){
// responseBuilder.append((char) i);
// }
// stream.close();
//
// // Clean and extract actual JSON part
// String rawResponse = responseBuilder.toString().trim();
// System.out.println("rawResponse="+rawResponse);
// // Get JSON object
// JSONObject responseJson = new JSONObject(rawResponse);
//
// // Check if TOILETS exists and is not empty
// if (responseJson.has("TOILETS")) {
// JSONArray toiletsArray = responseJson.getJSONArray("TOILETS");
//
// if (toiletsArray.length() == 0) {
// result.put("Message", "No Data Found");
// result.put("Data", new JSONObject()); // or result.put("Data", Collections.emptyMap());
// } else {
// result.put("Message", "Success");
// result.put("Data", responseJson.toMap()); // Convert full response JSON to Map
// }
// } else {
// result.put("Message", "TOILETS key missing");
// result.put("Data", new JSONObject());
// }
//
//
//
// }
// catch (Exception e) {
// e.printStackTrace();
// result.put("Message", "Error");
// }
// return ResponseEntity.ok(result);
// }
@PostMapping(value = "/details")
public Map<String, Object> getServiceDetails(@RequestParam(value = "lat") String lat,
@RequestParam(value = "lng") String lng,
@RequestParam(value = "service") String service) {
return nearByService.getPropertyList(lat, lng, service);
}
@PostMapping(value = "/services")
public Map<String, Object> getServices() {
return nearByService.getServices();
}
}

633
src/main/java/com/gcc/restapiservices/nearbyservices/service/NearByService.java

@ -0,0 +1,633 @@
package com.gcc.restapiservices.nearbyservices.service;
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;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class NearByService {
private JdbcTemplate mysqlJdbcTemplate;
private JdbcTemplate communityJdbcTemplate;
@Autowired
public void setMysqlDataSource(@Qualifier("mysqlServicespdfDataSource") DataSource mysqlDataSource) {
this.mysqlJdbcTemplate = new JdbcTemplate(mysqlDataSource);
}
@Autowired
public void setDataSource(@Qualifier("mysqlCommunityHallDataSource") DataSource dataSource) {
this.communityJdbcTemplate = new JdbcTemplate(dataSource);
}
// @Transactional("mysqlNearByServicesfDataSource")
public Map<String, Object> getPropertyList(String lat, String lng, String service) {
Map<String, Object> response = new HashMap<>();
Map<String, Object> result = new HashMap<>();
if(service.equalsIgnoreCase("Burial Ground")){
result = getburialGround(lat,lng);
} else if(service.equalsIgnoreCase("Amma Unavagam")){
result = getammaUnavagam(lat,lng);
} else if(service.equalsIgnoreCase("Bus Shelter")) {
result = getbusShelter(lat,lng);
} else if(service.equalsIgnoreCase("Toilets")) {
result = gettoilets(lat,lng);
} else if(service.equalsIgnoreCase("School")) {
result = getschools(lat,lng);
} else if(service.equalsIgnoreCase("Community Center")) {
result = getCommunityCenter(lat,lng);
} else if(service.equalsIgnoreCase("UPHC") || service.equalsIgnoreCase("UCHC")) {
result = getUphcUchc(lat,lng,service);
}
response.put("Response", result);
return response;
}
private Map<String, Object> getCommunityCenter(String lat, String lng) {
Map<String, Object> result = new HashMap<>();
String sql = "SELECT hd.hall_name, " +
" hd.zone, " +
" hd.division, " +
" hd.door_no, " +
" hd.street, " +
" hd.area, " +
" hd.city, " +
" hd.pin_code, " +
" hd.parking_capacity, " +
" hd.seating_capacity, " +
" hd.half_day_rent, " +
" hd.full_day_rent, " +
" hd.half_deposit_amount, " +
" hd.deposit_amount, " +
" hd.eb_cost_per_unit, " +
" hd.gst, " +
" hd.latitude, " +
" hd.longitude " +
" FROM hall_details hd WHERE (hd.is_active=1) AND " +
" ((6371008.8 * acos( ROUND(cos(radians(?)) * cos(radians(hd.latitude)) * cos(radians(hd.longitude) - radians(?)) + " +
" sin(radians(?)) * sin(radians(hd.latitude)), 9) )) < 1000)";
try{
List<Map<String, Object>> data = communityJdbcTemplate.queryForList(sql, lat, lng, lat);
if (!data.isEmpty()) {
result.put("Community Center", data);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "Community Center List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", "Community Center Not Found");
result.put("Status Code", 404);
}
} catch (Exception e) {
e.printStackTrace();
result.put("Status", "Error");
result.put("Message", "Error in fetching Community Center list :" + e);
result.put("Status Code", 500);
}
return result;
}
private Map<String, Object> getUphcUchc(String lat, String lng, String service) {
Map<String, Object> result = new HashMap<>();
String sql = "SELECT " +
" uc.zone, " +
" uc.ward, " +
" uc.uc_name, " +
" uc.address, " +
" uc.mail_id, " +
" uc.contact, " +
" uc.contact_name, " +
" uc.contact_number, " +
" uc.special_facilities, " +
" uc.latitude, " +
" uc.longitude " +
" FROM uphc_uchc uc WHERE (uc.is_active=1 AND uc.is_delete=0 AND uc.type=?) AND " +
" ((6371008.8 * acos( ROUND(cos(radians(?)) * cos(radians(uc.latitude)) * cos(radians(uc.longitude) - radians(?)) + " +
" sin(radians(?)) * sin(radians(uc.latitude)), 9) )) < 1000)";
try{
List<Map<String, Object>> data = mysqlJdbcTemplate.queryForList(sql, service, lat, lng, lat);
if (!data.isEmpty()) {
result.put(service, data);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", service+" List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", service+" Not Found");
result.put("Status Code", 404);
}
} catch (Exception e) {
result.put("Status", "Error");
result.put("Message", "Error in fetching "+service+" list :" + e);
result.put("Status Code", 500);
}
return result;
}
private Map<String, Object> getschools(String lat, String lng) {
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> data1 = new ArrayList<>();
String urlString="https://gccservices.in/gccofficialapp/api/gcceducation/getSchoolList?latitude="+lat+"&longitude="+lng;
try{
List<Map<String, Object>> dataList = geturldata(urlString);
if (!dataList.isEmpty()) {
for(Map<String, Object> i:dataList) {
Map<String, Object> data = new HashMap<>();
String zone = (i.get("zone") != null && !i.get("zone").toString().trim().isEmpty())
? i.get("zone").toString().trim()
: "";
String ward = (i.get("division") != null && !i.get("division").toString().trim().isEmpty())
? i.get("division").toString().trim()
: "";
String latitude = (i.get("latitude") != null && !i.get("latitude").toString().trim().isEmpty())
? i.get("latitude").toString().trim()
: "";
String longitude = (i.get("longitude") != null && !i.get("longitude").toString().trim().isEmpty())
? i.get("longitude").toString().trim()
: "";
String udise = (i.get("udise") != null && !i.get("udise").toString().trim().isEmpty())
? i.get("udise").toString().trim()
: "";
String school_name = (i.get("school_name") != null && !i.get("school_name").toString().trim().isEmpty())
? i.get("school_name").toString().trim()
: "";
String school_address = (i.get("address") != null && !i.get("address").toString().trim().isEmpty())
? i.get("address").toString().trim()
: "";
String category = (i.get("category_type") != null && !i.get("category_type").toString().trim().isEmpty())
? i.get("category_type").toString().trim()
: "";
String hm_name = (i.get("hm_name") != null && !i.get("hm_name").toString().trim().isEmpty())
? i.get("hm_name").toString().trim()
: "";
String hm_mobile = (i.get("hm_phone_number") != null && !i.get("hm_phone_number").toString().trim().isEmpty())
? i.get("hm_phone_number").toString().trim()
: "";
data.put("Zone", zone);
data.put("Ward", ward);
data.put("Latitude", latitude);
data.put("Longitude", longitude);
data.put("UDISE", udise);
data.put("School Name", school_name);
data.put("School Address", school_address);
data.put("Category", category);
data.put("HM_Name", hm_name);
data.put("HM_Mobile", hm_mobile);
data1.add(data);
}
result.put("Bus Shelter", data1);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "School List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", "School List Not Found");
result.put("Status Code", 404);
}
} catch (Exception e) {
result.put("Status", "Error");
result.put("Message", "Error in fetching Bus School List :" + e);
result.put("Status Code", 500);
}
return result;
}
private Map<String, Object> gettoilets(String lat, String lng) {
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> data1 = new ArrayList<>();
String urlString = "https://gccservices.in/gccofficialapp/api/toilets/toiletlistRest?latitude=" + lat + "&longitude=" + lng;
String urlString1 = "https://gccservices.in/gccofficialapp/api/privatetoilets/toiletlistRest?latitude=" + lat + "&longitude=" + lng;
try {
List<Map<String, Object>> dataList = geturldata(urlString);
List<Map<String, Object>> dataList1 = geturldata(urlString1);
// GCC Toilet
if (!dataList.isEmpty()) {
for (Map<String, Object> i : dataList) {
Map<String, Object> data = new HashMap<>();
String zone = (i.get("zone") != null && !i.get("zone").toString().trim().isEmpty())
? i.get("zone").toString().trim()
: "";
String ward = (i.get("ward") != null && !i.get("ward").toString().trim().isEmpty())
? i.get("ward").toString().trim()
: "";
String latitude = (i.get("latitude") != null && !i.get("latitude").toString().trim().isEmpty())
? i.get("latitude").toString().trim()
: "";
String longitude = (i.get("longitude") != null && !i.get("longitude").toString().trim().isEmpty())
? i.get("longitude").toString().trim()
: "";
String street_name = (i.get("name") != null && !i.get("name").toString().trim().isEmpty())
? i.get("name").toString().trim()
: "";
String area = (i.get("locality") != null && !i.get("locality").toString().trim().isEmpty())
? i.get("locality").toString().trim()
: "";
String locality = "";
String model = "";
data.put("Zone", zone);
data.put("Ward", ward);
data.put("Latitude", latitude);
data.put("Longitude", longitude);
data.put("Area", area);
data.put("Street Name", street_name);
// data.put("Locality", locality);
// data.put("Model", model);
data1.add(data);
}
result.put("GCC Toilet", data1);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "GCC Toilet List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", "GCC Toilet Not Found");
result.put("Status Code", 404);
}
// Private Toilet
if (!dataList1.isEmpty()) {
for (Map<String, Object> i : dataList) {
Map<String, Object> data = new HashMap<>();
String zone = (i.get("zone") != null && !i.get("zone").toString().trim().isEmpty())
? i.get("zone").toString().trim()
: "";
String ward = (i.get("ward") != null && !i.get("ward").toString().trim().isEmpty())
? i.get("ward").toString().trim()
: "";
String latitude = (i.get("latitude") != null && !i.get("latitude").toString().trim().isEmpty())
? i.get("latitude").toString().trim()
: "";
String longitude = (i.get("longitude") != null && !i.get("longitude").toString().trim().isEmpty())
? i.get("longitude").toString().trim()
: "";
// String area = (i.get("locality") != null && !i.get("locality").toString().trim().isEmpty())
// ? i.get("locality").toString().trim()
// : "";
String street_name = (i.get("pct_name") != null && !i.get("pct_name").toString().trim().isEmpty())
? i.get("pct_name").toString().trim()
: "";
String locality = "";
String model = "";
String area = "";
data.put("Zone", zone);
data.put("Ward", ward);
data.put("Latitude", latitude);
data.put("Longitude", longitude);
// data.put("Area", area);
data.put("Street Name", street_name);
// data.put("Locality", locality);
// data.put("Model", model);
data1.add(data);
}
result.put("Private Toilet", data1);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "Private Toilet List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", "Private Toilet Not Found");
result.put("Status Code", 404);
}
} catch (Exception e) {
result.put("Status", "Error");
result.put("Message", "Error in fetching Toilet list :" + e);
result.put("Status Code", 500);
}
return result;
}
private Map<String, Object> getbusShelter(String lat, String lng) {
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> data1 = new ArrayList<>();
String urlString="https://gccservices.in/gccofficialapp/api/busshelter/getBusShelterList?latitude="+lat+"&longitude="+lng;
try{
List<Map<String, Object>> dataList = geturldata(urlString);
if (!dataList.isEmpty()) {
for(Map<String, Object> i:dataList) {
Map<String, Object> data = new HashMap<>();
String zone = (i.get("zone") != null && !i.get("zone").toString().trim().isEmpty())
? i.get("zone").toString().trim()
: "";
String ward = (i.get("ward") != null && !i.get("ward").toString().trim().isEmpty())
? i.get("ward").toString().trim()
: "";
String latitude = (i.get("latitude") != null && !i.get("latitude").toString().trim().isEmpty())
? i.get("latitude").toString().trim()
: "";
String longitude = (i.get("longitude") != null && !i.get("longitude").toString().trim().isEmpty())
? i.get("longitude").toString().trim()
: "";
String area = (i.get("area") != null && !i.get("area").toString().trim().isEmpty())
? i.get("area").toString().trim()
: "";
String road = (i.get("road") != null && !i.get("road").toString().trim().isEmpty())
? i.get("road").toString().trim()
: "";
String name = "";
data.put("Zone", zone);
data.put("Ward", ward);
data.put("Latitude", latitude);
data.put("Longitude", longitude);
data.put("Area", area);
data.put("Road", road);
//data.put("Name", name);
data1.add(data);
}
result.put("Bus Shelter", data1);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "Bus Shelter List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", "Bus Shelter Not Found");
result.put("Status Code", 404);
}
} catch (Exception e) {
result.put("Status", "Error");
result.put("Message", "Error in fetching Bus Shelter list :" + e);
result.put("Status Code", 500);
}
return result;
}
private Map<String, Object> getammaUnavagam(String lat, String lng) {
Map<String, Object> result = new HashMap<>();
String sql = "SELECT " +
" am.zone, " +
" am.ward, " +
" am.address, " +
" am.breakfast, " +
" am.lunch, " +
" am.dinner, " +
" am. open_time, " +
" am. close_time, " +
" am.latitude, " +
" am.longitude " +
" FROM ammaunavagam am WHERE (am.is_active=1 AND am.is_delete=0) AND " +
" ((6371008.8 * acos( ROUND(cos(radians(?)) * cos(radians(am.latitude)) * cos(radians(am.longitude) - radians(?)) + " +
" sin(radians(?)) * sin(radians(am.latitude)), 9) )) < 1000)";
try{
List<Map<String, Object>> data = mysqlJdbcTemplate.queryForList(sql, lat, lng, lat);
List<Map<String, Object>> data1 = new ArrayList<>();
if (!data.isEmpty()) {
for (Map<String, Object> i:data) {
Map<String, Object> check = new HashMap<>();
String zone = (i.get("zone") != null && !i.get("zone").toString().trim().isEmpty())
? i.get("zone").toString().trim()
: "";
String ward = (i.get("ward") != null && !i.get("ward").toString().trim().isEmpty())
? i.get("ward").toString().trim()
: "";
String address = (i.get("address") != null && !i.get("address").toString().trim().isEmpty())
? i.get("address").toString().trim()
: "";
String breakfast = (i.get("breakfast") != null && !i.get("breakfast").toString().trim().isEmpty())
? i.get("breakfast").toString().trim()
: "";
String lunch = (i.get("lunch") != null && !i.get("lunch").toString().trim().isEmpty())
? i.get("lunch").toString().trim()
: "";
String dinner = (i.get("dinner") != null && !i.get("dinner").toString().trim().isEmpty())
? i.get("dinner").toString().trim()
: "";
String open_time = (i.get("open_time") != null && !i.get("open_time").toString().trim().isEmpty())
? i.get("open_time").toString().trim()
: "";
String close_time = (i.get("close_time") != null && !i.get("close_time").toString().trim().isEmpty())
? i.get("close_time").toString().trim()
: "";
String latitude = (i.get("latitude") != null && !i.get("latitude").toString().trim().isEmpty())
? i.get("latitude").toString().trim()
: "";
String longitude = (i.get("longitude") != null && !i.get("longitude").toString().trim().isEmpty())
? i.get("longitude").toString().trim()
: "";
if(!zone.isEmpty() || !zone.isBlank()) {
check.put("zone", zone);
}
if(!ward.isEmpty() || !ward.isBlank()) {
check.put("ward", ward);
}
if(!address.isEmpty() || !address.isBlank()) {
check.put("address", address);
}
if(!breakfast.isEmpty() || !breakfast.isBlank()) {
check.put("burial_name", breakfast);
}
if(!lunch.isEmpty() || !lunch.isBlank()) {
check.put("burial_name", lunch);
}
if(!dinner.isEmpty() || !dinner.isBlank()) {
check.put("burial_name", dinner);
}
if(!open_time.isEmpty() || !open_time.isBlank()) {
check.put("open_time", open_time);
}
if(!close_time.isEmpty() || !close_time.isBlank()) {
check.put("close_time", close_time);
}
if(!latitude.isEmpty() || !latitude.isBlank()) {
check.put("latitude", latitude);
}
if(!longitude.isEmpty() || !longitude.isBlank()) {
check.put("longitude", longitude);
}
data1.add(check);
}
result.put("Amma Unavagam", data1);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "Amma Unavagam List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", "Amma Unavagam Not Found");
result.put("Status Code", 404);
}
} catch (Exception e) {
result.put("Status", "Error");
result.put("Message", "Error in fetching Amma Unavagam list :" + e);
result.put("Status Code", 500);
}
return result;
}
private Map<String, Object> getburialGround(String lat, String lng) {
Map<String, Object> result = new HashMap<>();
String sql = "SELECT " +
" bg.zone, " +
" bg.ward, " +
" bg.burial_name, " +
" bg.address, " +
" bg.open_time, " +
" bg.close_time, " +
" bg.latitude, " +
" bg.longitude " +
" FROM burial_ground bg WHERE (bg.is_active=1 AND bg.is_delete=0) AND " +
" ((6371008.8 * acos( ROUND(cos(radians(?)) * cos(radians(bg.latitude)) * cos(radians(bg.longitude) - radians(?)) + " +
" sin(radians(?)) * sin(radians(bg.latitude)), 9) )) < 1000)";
try{
List<Map<String, Object>> data = mysqlJdbcTemplate.queryForList(sql, lat, lng, lat);
List<Map<String, Object>> data1 = new ArrayList<>();
if (!data.isEmpty()) {
for (Map<String, Object> i:data) {
Map<String, Object> check = new HashMap<>();
String zone = (i.get("zone") != null && !i.get("zone").toString().trim().isEmpty())
? i.get("zone").toString().trim()
: "";
String ward = (i.get("ward") != null && !i.get("ward").toString().trim().isEmpty())
? i.get("ward").toString().trim()
: "";
String burial_name = (i.get("burial_name") != null && !i.get("burial_name").toString().trim().isEmpty())
? i.get("burial_name").toString().trim()
: "";
String address = (i.get("address") != null && !i.get("address").toString().trim().isEmpty())
? i.get("address").toString().trim()
: "";
String open_time = (i.get("open_time") != null && !i.get("open_time").toString().trim().isEmpty())
? i.get("open_time").toString().trim()
: "";
String close_time = (i.get("close_time") != null && !i.get("close_time").toString().trim().isEmpty())
? i.get("close_time").toString().trim()
: "";
String latitude = (i.get("latitude") != null && !i.get("latitude").toString().trim().isEmpty())
? i.get("latitude").toString().trim()
: "";
String longitude = (i.get("longitude") != null && !i.get("longitude").toString().trim().isEmpty())
? i.get("longitude").toString().trim()
: "";
if(!zone.isEmpty() || !zone.isBlank()) {
check.put("zone", zone);
}
if(!ward.isEmpty() || !ward.isBlank()) {
check.put("ward", ward);
}
if(!burial_name.isEmpty() || !burial_name.isBlank()) {
check.put("burial_name", burial_name);
}
if(!address.isEmpty() || !address.isBlank()) {
check.put("address", address);
}
if(!open_time.isEmpty() || !open_time.isBlank()) {
check.put("open_time", open_time);
}
if(!close_time.isEmpty() || !close_time.isBlank()) {
check.put("close_time", close_time);
}
if(!latitude.isEmpty() || !latitude.isBlank()) {
check.put("latitude", latitude);
}
if(!longitude.isEmpty() || !longitude.isBlank()) {
check.put("longitude", longitude);
}
data1.add(check);
}
result.put("Burial Ground", data1);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "Burial Ground List fetched successfully");
} else {
result.put("Status", "Not Found");
result.put("Message", "Burial Ground Not Found");
result.put("Status Code", 404);
}
} catch (Exception e) {
result.put("Status", "Error");
result.put("Message", "Error in fetching Burial Ground list :" + e);
result.put("Status Code", 500);
}
return result;
}
public List<Map<String, Object>> geturldata(String urlString) {
RestTemplate restTemplate = new RestTemplate();
List<Map<String, Object>> details = null;
ResponseEntity<String> response = restTemplate.getForEntity(urlString, String.class);
String rawResponse = response.getBody();
ObjectMapper objectMapper = new ObjectMapper();
try {
List<Map<String, Object>> responseList = objectMapper.readValue(rawResponse, List.class);
if (!responseList.isEmpty()) {
Map<String, Object> firstItem = responseList.get(0);
details = (List<Map<String, Object>>) firstItem.get("data");
}
System.out.println("details === " + details);
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return details;
}
public Map<String, Object> getServices() {
Map<String, Object> response = new HashMap<>();
Map<String, Object> result = new HashMap<>();
String sql = "SELECT service_type FROM service_master ORDER BY execution_order";
try {
List<Map<String, Object>> data = mysqlJdbcTemplate.queryForList(sql);
if (!data.isEmpty()) {
result.put("Service List", data);
result.put("Status", "Sucess");
result.put("Status Code", 200);
result.put("Message", "Service List fetched successfully");
response.put("Response", result);
} else {
result.put("Status", "Not Found");
result.put("Message", "Service List Not Found");
result.put("Status Code", 404);
response.put("Response", result);
}
} catch (Exception e) {
result.put("Status", "Error");
result.put("Message", "Error in fetching Service list :" + e);
result.put("Status Code", 500);
response.put("Response", result);
}
return response;
}
}

11
src/main/java/com/gcc/restapiservices/petregistration/constants/AppConstants.java

@ -0,0 +1,11 @@
package com.gcc.restapiservices.petregistration.constants;
public final class AppConstants {
//public static String key_id="rzp_live_ySI5Ns54Y7qOcJ";
// public static String key_secret="Nwf1TjhUtaskof8vePkRR8Sb";
//uncomment for testing payment
public static String key_id="rzp_test_tDkHFEqWXmuEi8";
public static String key_secret="cBQUjMcKZ4J6vmOKSyNZ92py";
}

76
src/main/java/com/gcc/restapiservices/petregistration/controller/PetController.java

@ -0,0 +1,76 @@
package com.gcc.restapiservices.petregistration.controller;
import com.gcc.restapiservices.petregistration.service.PetRegistrationApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/gccrestservices/petregistration")
public class PetController {
@Autowired
private PetRegistrationApiService petRegistrationApiService;
@GetMapping("/getlicense/{id}")
public String viewLicense(Model model, @PathVariable("id") int id, @RequestParam(required =false) String mobileNo) {
System.out.println("mobileNo"+mobileNo);
model.addAttribute("title","license");
int uniqueid = id;
Map<String, Object> lic =petRegistrationApiService.getbylicensemobnoanduniqueId(mobileNo, uniqueid);
Map<String, Object> own =petRegistrationApiService.getOwnerDetailsbymobile(mobileNo);
Map<String, Object> pet =petRegistrationApiService.getbymobnoanduniqueId(mobileNo, uniqueid);
System.out.println(lic);
System.out.println(own);
System.out.println(pet);
model.addAttribute("lic",lic);
model.addAttribute("own",own);
model.addAttribute("pet",pet);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
Calendar c = Calendar.getInstance();
LocalDateTime licenseDateTime = (LocalDateTime) lic.get("date");
Date licenseDate = Date.from(licenseDateTime.atZone(ZoneId.systemDefault()).toInstant());
c.setTime(licenseDate);
//c.setTime(lic.getDate());
String issuedate=dateFormat.format(c.getTime());
model.addAttribute("issue",issuedate);
c.add(Calendar.YEAR, 1);
c.add(Calendar.DATE, -1);
String dateInString=dateFormat.format(c.getTime());
model.addAttribute("valid",dateInString);
Date date1;
return "owners/petlicense";
}
/* @GetMapping("/downloadLicense")
public String dowmloadLicense(Model model) {
return "owners/downloadlic";
}*/
@GetMapping("/downloadLicense")
public String dowmloadLicense(Model model, @RequestParam("id") int id, @RequestParam(required =true) String mobileNo) {
System.out.println("Download License called.......");
model.addAttribute("mobileNo", mobileNo);
model.addAttribute("id", id);
model.addAttribute("name", "downloadLic");
return "owners/downloadlic";
}
}

757
src/main/java/com/gcc/restapiservices/petregistration/controller/PetRegistrationApiController.java

@ -0,0 +1,757 @@
package com.gcc.restapiservices.petregistration.controller;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.gcc.restapiservices.configuration.AppConfig;
import com.gcc.restapiservices.petregistration.constants.AppConstants;
import com.gcc.restapiservices.petregistration.service.PetRegistrationApiService;
import com.gcc.restapiservices.petregistration.util.ApiResponseUtil;
import com.gcc.restapiservices.swimmingpool.util.ApiResponse;
import com.razorpay.Order;
import com.razorpay.RazorpayClient;
import com.razorpay.RazorpayException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
@RestController
@RequestMapping("/gccrestservices/petregistration/api")
public class PetRegistrationApiController {
@Autowired
private PetRegistrationApiService petRegistrationApiService;
@Autowired
private AppConfig appConfig;
@GetMapping("/breed")
public ResponseEntity<?> getBreedList(@RequestParam int type) {
List<Map<String, Object>> result = petRegistrationApiService.getBreedList(type);
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// get owner details
@GetMapping("/ownerinfo")
public ResponseEntity<?> getOwnerDetails(@RequestParam String mobile) {
List<Map<String, Object>> result = petRegistrationApiService.getOwnerDetails(mobile);
try {
// Check if mobile is missing or blank
if (mobile == null || mobile.trim().isEmpty()) {
return ApiResponseUtil.error("Mobile number is required", HttpStatus.BAD_REQUEST);
}
// Check if mobile is not 10 digits
if (!mobile.matches("\\d{10}")) {
return ApiResponseUtil.error("Mobile number must be exactly 10 digits", HttpStatus.BAD_REQUEST);
}
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// get pet type
@GetMapping("/pettypes")
public ResponseEntity<?> getPetTypes() {
List<Map<String, Object>> result = petRegistrationApiService.getTypeOfPets();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// get pet type
@GetMapping("/allyears")
public ResponseEntity<?> getAllYears() {
List<Map<String, Object>> result = petRegistrationApiService.getAllYears();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// get pet type
@GetMapping("/allmonths")
public ResponseEntity<?> getAllMonths() {
List<Map<String, Object>> result = petRegistrationApiService.getAllMonths();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/userexistornot")
public ResponseEntity<?> userExistOrNot(@RequestParam String mobilenum) {
try {
// Check if mobile is missing or blank
if (mobilenum == null || mobilenum.trim().isEmpty()) {
return ApiResponseUtil.error("Mobile number is required", HttpStatus.BAD_REQUEST);
}
// Check if mobile is not 10 digits
if (!mobilenum.matches("\\d{10}")) {
return ApiResponseUtil.error("Mobile number must be exactly 10 digits", HttpStatus.BAD_REQUEST);
}
boolean result = petRegistrationApiService.isPhoneRegistered(mobilenum);
System.out.println("result: " + result);
String message = result ? "Mobile number already registered" : "Mobile number not registered";
return ApiResponseUtil.success(result, message);
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// save new owner registration
@PostMapping("/pet-owner/register")
public ResponseEntity<?> savePinDetails(HttpServletRequest request,
@RequestParam(required = false) String title,
@RequestParam(required = false) String username,
@RequestParam(required = false) String doornumber,
@RequestParam(required = false) String street,
@RequestParam(required = false) String area,
@RequestParam(required = false) String city,
@RequestParam(required = false) String pincode,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String ward,
@RequestParam(required = false) String phone,
@RequestParam(required = false) String email,
@RequestParam(required = false) String pin) {
List<String> missingFields = new ArrayList<>();
if (title == null || title.trim().isEmpty())
missingFields.add("title");
if (username == null || username.trim().isEmpty())
missingFields.add("username");
if (doornumber == null || doornumber.trim().isEmpty())
missingFields.add("doornumber");
if (street == null || street.trim().isEmpty())
missingFields.add("street");
if (area == null || area.trim().isEmpty())
missingFields.add("area");
if (city == null || city.trim().isEmpty())
missingFields.add("city");
if (pincode == null || pincode.trim().isEmpty())
missingFields.add("pincode");
if (zone == null || zone.trim().isEmpty())
missingFields.add("zone");
if (ward == null || ward.trim().isEmpty())
missingFields.add("ward");
if (phone == null || phone.trim().isEmpty())
missingFields.add("phone");
if (email == null || email.trim().isEmpty())
missingFields.add("email");
if (pin == null || pin.trim().isEmpty())
missingFields.add("pin");
if (!missingFields.isEmpty()) {
return ApiResponseUtil.invalidRequest("Missing required fields: " + String.join(", ", missingFields));
}
try {
// Check if mobile is missing or blank
if (phone == null || phone.trim().isEmpty()) {
return ApiResponseUtil.error("Mobile number is required", HttpStatus.BAD_REQUEST);
}
// Check if mobile is not 10 digits
if (!phone.matches("\\d{10}")) {
return ApiResponseUtil.error("Mobile number must be exactly 10 digits", HttpStatus.BAD_REQUEST);
}
// Check if mobile is not 10 digits
if (!pincode.matches("\\d{6}")) {
return ApiResponseUtil.error("Pincode must be exactly 6 digits", HttpStatus.BAD_REQUEST);
}
// Validate email if provided
if (email != null && !email.isBlank()) {
String emailRegex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.com$";
if (!email.matches(emailRegex)) {
return ApiResponseUtil.error("Invalid email id", HttpStatus.BAD_REQUEST);
}
}
// Check if mobile is not 10 digits
if (!pincode.matches("\\d{6}")) {
return ApiResponseUtil.error("Pincode must be exactly 6 digits", HttpStatus.BAD_REQUEST);
}
// pin validation
if (!pin.matches("\\d{4}")) {
return ApiResponseUtil.error("pin must be 4 digits only", HttpStatus.BAD_REQUEST);
}
return petRegistrationApiService.insertPetOwner(
title, username, doornumber, street, area, city, pincode, zone, ward, phone, email, pin);
} catch (Exception ex) {
return ApiResponseUtil.error("Internal server error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@PostMapping("/saveregistrationdetails")
public ResponseEntity<?> saveRegistrationDetails(
@RequestParam(required = false) String petname,
@RequestParam(required = false) String species,
@RequestParam(required = false) String breed,
@RequestParam(required = false) String identification_mark,
@RequestParam(required = false) String petcolor,
@RequestParam(required = false) String gender,
@RequestParam(required = false) String age_year,
@RequestParam(required = false) String months,
@RequestParam(required = false) String is_sterilized,
@RequestParam(required = false) String is_adopted_street,
@RequestParam(required = false) String is_rabies_vaccination,
@RequestParam(required = false) String arv_date,
@RequestParam(required = false) String lastdate_of_deworming,
@RequestParam(required = false) String other_vaccination,
@RequestParam(required = false) String previous_licenseNo,
@RequestParam(required = false) String consultant_name,
@RequestParam(required = false) String council_number,
@RequestParam(required = false) String mobilenum,
@RequestParam(required = false) MultipartFile applicantphoto,
@RequestParam(required = false) MultipartFile addressproof,
@RequestParam(required = false) MultipartFile petphoto,
@RequestParam(required = false) MultipartFile rabiesvacCertificate) {
LocalDate today = LocalDate.now();
String registerdate = today.toString();
List<String> missingFields = new ArrayList<>();
if (petname == null || petname.trim().isEmpty())
missingFields.add("petname");
if (species == null || species.trim().isEmpty())
missingFields.add("species");
if (breed == null || breed.trim().isEmpty())
missingFields.add("breed");
// if (identification_mark == null || identification_mark.trim().isEmpty())
// missingFields.add("identification_mark"); optional
if (petcolor == null || petcolor.trim().isEmpty())
missingFields.add("petcolor");
if (gender == null || gender.trim().isEmpty())
missingFields.add("gender");
if (age_year == null || age_year.trim().isEmpty())
missingFields.add("age_year");
if (months == null || months.trim().isEmpty())
missingFields.add("months");
if (is_sterilized == null || is_sterilized.trim().isEmpty())
missingFields.add("is_sterilized");
if (is_adopted_street == null || is_adopted_street.trim().isEmpty())
missingFields.add("is_adopted_street");
if (is_rabies_vaccination == null || is_rabies_vaccination.trim().isEmpty())
missingFields.add("is_rabies_vaccination");
if (arv_date == null || arv_date.trim().isEmpty())
missingFields.add("arv_date");
// if (lastdate_of_deworming == null || lastdate_of_deworming.trim().isEmpty())
// missingFields.add("lastdate_of_deworming"); optional
// if (other_vaccination == null || other_vaccination.trim().isEmpty())
// missingFields.add("other_vaccination"); optional
// if (previous_licenseNo == null || previous_licenseNo.trim().isEmpty())
// missingFields.add("previous_licenseNo"); optional
// if (consultant_name == null || consultant_name.trim().isEmpty())
// missingFields.add("consultant_name"); optional
// if (council_number == null || council_number.trim().isEmpty())
// missingFields.add("council_number"); optional
if (mobilenum == null || mobilenum.trim().isEmpty())
missingFields.add("mobilenum");
if (applicantphoto == null || applicantphoto.isEmpty())
missingFields.add("applicantphoto");
if (addressproof == null || addressproof.isEmpty())
missingFields.add("addressproof");
if (petphoto == null || petphoto.isEmpty())
missingFields.add("petphoto");
if (rabiesvacCertificate == null || rabiesvacCertificate.isEmpty())
missingFields.add("rabiesvacCertificate");
if (!missingFields.isEmpty()) {
return ApiResponseUtil.invalidRequest("Missing required fields: " + String.join(", ", missingFields));
}
try {
// Save to DB
String saveStatus = petRegistrationApiService.saveAllRegistrationDetails(petname, species, breed,
identification_mark, petcolor, gender, age_year, months,
is_sterilized, is_adopted_street, is_rabies_vaccination,
arv_date, lastdate_of_deworming, other_vaccination, previous_licenseNo, consultant_name,
council_number, mobilenum,
applicantphoto, addressproof, petphoto, rabiesvacCertificate, registerdate);
Map<String, Object> response = new HashMap<>();
System.out.println("saveStatus " + saveStatus);
// Check if mobile is missing or blank
if (mobilenum == null || mobilenum.trim().isEmpty()) {
return ApiResponseUtil.error("Mobile number is required", HttpStatus.BAD_REQUEST);
}
// Check if mobile is not 10 digits
if (!mobilenum.matches("\\d{10}")) {
return ApiResponseUtil.error("Mobile number must be exactly 10 digits", HttpStatus.BAD_REQUEST);
}
if (is_rabies_vaccination != null && !is_rabies_vaccination.isBlank()
&& is_rabies_vaccination.equalsIgnoreCase("Yes")) {
// Continue registration
} else {
return ApiResponseUtil.error(
"You can't register a pet without Rabies Vaccination. Please select 'Yes' only.",
HttpStatus.BAD_REQUEST);
}
// Define the date format used in the request (adjust as needed)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
if (arv_date != null && !arv_date.isBlank()) {
LocalDate arvDate = LocalDate.parse(arv_date.trim(), formatter);
if (arvDate.isAfter(LocalDate.now())) {
return ApiResponseUtil.error("ARV date cannot be in the future", HttpStatus.BAD_REQUEST);
}
}
if (lastdate_of_deworming != null && !lastdate_of_deworming.isBlank()) {
LocalDate dewormDate = LocalDate.parse(lastdate_of_deworming.trim(), formatter);
if (dewormDate.isAfter(LocalDate.now())) {
return ApiResponseUtil.error("Deworming date cannot be in the future", HttpStatus.BAD_REQUEST);
}
}
int yearsInt = 0;
int monthsInt = 0;
try {
if (age_year != null && !age_year.isBlank()) {
yearsInt = Integer.parseInt(age_year.trim());
}
if (months != null && !months.isBlank()) {
monthsInt = Integer.parseInt(months.trim());
}
if (yearsInt <= 0 && monthsInt <= 0) {
return ApiResponseUtil.error("Pet age must be at least 1 month (either in years or months)",
HttpStatus.BAD_REQUEST);
}
} catch (NumberFormatException e) {
return ApiResponseUtil.error("Invalid value for age_year or months. Both must be numbers.",
HttpStatus.BAD_REQUEST);
}
if (saveStatus == null || saveStatus.isEmpty() || saveStatus.contains("error")) {
response.put("status", false);
response.put("message", saveStatus);
response.put("description", "Failed to save the details");
return ResponseEntity.ok(response);
} else {
response.put("status", true);
response.put("message", "success");
response.put("description", "Details were saved successfully");
response.put("petId", saveStatus);
}
// Add uniqueid to response
return ResponseEntity.ok(response);
} catch (Exception ex) {
return ApiResponseUtil.error("Internal server error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// getpetdetails
// get pet type
@GetMapping("/getpetdetails")
public ResponseEntity<?> getPetDetails(@RequestParam String mobilenum) {
try {
// Check if mobile is missing or blank
if (mobilenum == null || mobilenum.trim().isEmpty()) {
return ApiResponseUtil.error("Mobile number is required", HttpStatus.BAD_REQUEST);
}
// Check if mobile is not 10 digits
if (!mobilenum.matches("\\d{10}")) {
return ApiResponseUtil.error("Mobile number must be exactly 10 digits", HttpStatus.BAD_REQUEST);
}
List<Map<String, Object>> results = petRegistrationApiService.getPetRegistrationDetailsbyMobile(mobilenum);
// if (results == null || results.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND)
// .body("No Registration Data for mobile number: " + mobilenum);
// }
if (results == null || results.isEmpty()) {
return ApiResponseUtil.error("No PET Registration Details for mobile number ", HttpStatus.BAD_REQUEST);
}
return ApiResponseUtil.success(results, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// renewal the pet certificate
@PostMapping("/updateARVDetails")
public ResponseEntity<?> updateARVDetails(
@RequestParam("uniqueid") String uniqueid,
@RequestParam("arvdate") String arvdate,
@RequestParam("rabiesvacCertificate") MultipartFile rabiesvacCertificate) {
try {
if (uniqueid == null || uniqueid.trim().isEmpty()) {
return ApiResponseUtil.error("Unique ID is required", HttpStatus.BAD_REQUEST);
}
if (arvdate == null || arvdate.trim().isEmpty()) {
return ApiResponseUtil.error("ARV date is required", HttpStatus.BAD_REQUEST);
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate arvDate;
try {
arvDate = LocalDate.parse(arvdate.trim(), formatter);
} catch (DateTimeParseException e) {
return ApiResponseUtil.error("Invalid date format. Please use dd-MM-yyyy", HttpStatus.BAD_REQUEST);
}
// if (arvDate.isAfter(LocalDate.now())) {
// return ApiResponseUtil.error("ARV date cannot be in the future",
// HttpStatus.BAD_REQUEST);
// }
if (rabiesvacCertificate == null || rabiesvacCertificate.isEmpty()) {
return ApiResponseUtil.error("Rabies vaccination certificate is required", HttpStatus.BAD_REQUEST);
}
String result = petRegistrationApiService.updateARVAndRabiesCertificate(uniqueid, arvdate,
rabiesvacCertificate);
if ("success".equalsIgnoreCase(result)) {
return ApiResponseUtil.success(null, "Details updated successfully");
} else if (result.startsWith("Renewal allowed only after:")) {
return ApiResponseUtil.error(result, HttpStatus.BAD_REQUEST);
} else if (result.startsWith("No license validity")) {
return ApiResponseUtil.error(result, HttpStatus.NOT_FOUND);
} else if (result.startsWith("Invalid ARV date format")) {
return ApiResponseUtil.error(result, HttpStatus.BAD_REQUEST);
} else {
return ApiResponseUtil.error(result, HttpStatus.INTERNAL_SERVER_ERROR);
}
// if ("success".equalsIgnoreCase(result)) {
// return ApiResponseUtil.success(null, "Details updated successfully");
// } else {
// return ApiResponseUtil.error(result, HttpStatus.NOT_FOUND);
// }
} catch (Exception e) {
return ApiResponseUtil.error("Exception: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// @PostMapping("/create_order")
// public ResponseEntity<?> createOrder(@RequestParam String petId) throws RazorpayException {
// try {
// Map<String, Object> petDetail = petRegistrationApiService.getpetdetails(petId);
// int petStatus = 0;
// // Check if petDetail is empty
// if (!petDetail.isEmpty()) {
// petStatus = (int) petDetail.get("status");
// }
// if (petStatus != 2 && petStatus != 4) {
// return new ResponseEntity<>(
// new ApiResponse("error", "PET request must be accepted by the officer to proceed with payment.",
// null, HttpStatus.BAD_REQUEST.value()),
// HttpStatus.BAD_REQUEST);
// }
// System.out.println("key ID :-----" + appConfig.getKeyId());
// int pet_id = Integer.parseInt(petId);
// double amount = Double.parseDouble("50");
// // To enable testing mode in appConstants if required for testing & development
// var client = new RazorpayClient(AppConstants.key_id, AppConstants.key_secret);
// JSONObject options = new JSONObject();
// options.put("amount", amount * 100);
// options.put("currency", "INR");
// // options.put("receipt","Pet_ID/"+pet_id);
// Order od = client.orders.create(options);
// petRegistrationApiService.saveorderLog(od.get("id").toString(), od.toString(), pet_id);
// System.out.println(od);
// return ResponseEntity.ok(new ApiResponse("success", "Order created successfully", od.toJson().toMap(),
// HttpStatus.OK.value()));
// } catch (NumberFormatException ex) {
// throw new RuntimeException(ex);
// } catch (RazorpayException e) {
// return new ResponseEntity<>(new ApiResponse("error", "Razorpay error: " + e.getMessage(), null,
// HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
// } catch (EmptyResultDataAccessException ex) {
// return new ResponseEntity<>(
// new ApiResponse("error", "PET request must be accepted by the officer to proceed with payment.",
// null, HttpStatus.BAD_REQUEST.value()),
// HttpStatus.BAD_REQUEST);
// } catch (Exception e) {
// return new ResponseEntity<>(new ApiResponse("error", "Unexpected error: " + e.getMessage(), null,
// HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
// }
// }
@PostMapping("/Confirm")
public ResponseEntity<?> confirmPayment(
@RequestParam("petId") String petId,
@RequestParam(name = "source", defaultValue = "0") String source,
@RequestParam("mobno") String mobno,
@RequestParam(value = "orderId", required = true) String orderId,
@RequestBody Map<String, Object> paymentResponse) {
try {
// Validate orderId is not null or empty
if (orderId == null || orderId.trim().isEmpty()) {
return ResponseEntity.badRequest().body(Map.of(
"message", "Order ID is required and cannot be null or empty",
"error", "Missing required parameter: orderId"));
}
System.out.println("Controller Testing.................");
return petRegistrationApiService.processPaymentConfirmation(petId, source, mobno, orderId, paymentResponse);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Failed to confirm payment", "error", e.getMessage()));
}
}
// get zones
@GetMapping("/getZones")
public ResponseEntity<?> getZones() {
List<Map<String, Object>> result = petRegistrationApiService.getZones();
try {
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// get Ward by zoneid
@GetMapping("/getWardByZoneId")
public ResponseEntity<?> getWardByZoneId(@RequestParam String zoneid) {
List<Map<String, Object>> result = petRegistrationApiService.getWardByZoneId(zoneid);
try {
// Check if mobile is missing or blank
if (zoneid == null || zoneid.trim().isEmpty()) {
return ApiResponseUtil.error("ZoneId is required", HttpStatus.BAD_REQUEST);
}
if (result.isEmpty()) {
return ApiResponseUtil.notFound("No data found");
}
return ApiResponseUtil.success(result, "Data found");
} catch (Exception e) {
return ApiResponseUtil.error("Internal server error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping(value = "/sendOTP")
public String sendOtp(HttpServletRequest request, @RequestParam String mobileNo) {
Map<String, Object> response = new HashMap<>();
String MobileNo = mobileNo;
System.out.print("\n MobileNo---:" + mobileNo);
Random rand = new Random();
int otp = rand.nextInt(90000) + 10000;
System.out.print("\n otp---:" + otp);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy%20HH:mm");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now));
String generatedToken = "Welcome to GCC " + otp + " is your OTP for gcc QR System";
String key = "pfTEYN6H";
String urlString = appConfig.getGetOtpUrl() + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + generatedToken + "&entityid=1401572690000011081&templateid=1407168250479102852";
System.out.print("\n urlString---: " + urlString);
String bodyMessage = "";
if (mobileNo == null || mobileNo.trim().isEmpty()) {
throw new IllegalArgumentException("Mobile number is required");
}
// Validate mobile number is exactly 10 digits
if (!mobileNo.matches("\\d{10}")) {
throw new IllegalArgumentException("Mobile number must be exactly 10 digits");
}
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(urlString, String.class);
// Using Jackson ObjectMapper to parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
// Add mobileNo and otp to the response JSON
jsonResponse.put("MobileNo", MobileNo);
jsonResponse.put("otp", otp);
// Convert the updated JSON object back to string
bodyMessage = jsonResponse.toString();
// bodyMessage=Response;
System.out.println("\n bodyMessage" + bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: " + e);
bodyMessage = "Error";
}
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
return bodyMessage;
}
// get licensedetails api
@GetMapping("/getLicenseDetails")
public ResponseEntity<?> getLicenseDetailsByMobileNo(
@RequestParam(value = "licenseno", required = false) String licenseno) {
if (licenseno == null || licenseno.isEmpty()) {
return ApiResponseUtil.invalidRequest("license number is required.");
}
try {
List<Map<String, Object>> licenseDetails = petRegistrationApiService.getLicenseListByMobNo(licenseno);
if (licenseDetails == null || licenseDetails.isEmpty()) {
return ApiResponseUtil.notFound("No bookings found for licenseno: " + licenseno);
}
// Success response
Map<String, Object> response = new HashMap<>();
response.put("status", "SUCCESS");
response.put("statuscode", "200");
response.put("licenseDetails", licenseDetails);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/getCountByMobileNo")
public ResponseEntity<?> getCountByMobileNo(String mobileno) {
int mobileCount = petRegistrationApiService.getCountByMobileNo(mobileno);
System.out.println("mobileCount: " + mobileCount);
if(mobileCount>=3) {
return ApiResponseUtil.success(mobileCount, "Already you reached the license limit (Max 3 pets)");
}else {
return ApiResponseUtil.success(mobileCount, "You can proceed with the license registration");
}
}
}

32
src/main/java/com/gcc/restapiservices/petregistration/controller/SMSController.java

@ -0,0 +1,32 @@
package com.gcc.restapiservices.petregistration.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.gcc.restapiservices.petregistration.service.PetSMSService;
@RestController
@RequestMapping("/gccrestservices/api/sms")
public class SMSController {
@Autowired
private PetSMSService smsService;
@PostMapping("/send")
public String sendMessage(
@RequestParam String channel, // WHATSAPP or SMS
@RequestParam int scenarioId,
@RequestParam String var1, // name
@RequestParam(required = false) String var2, // refId / OTP
@RequestParam(required = false) String var3, // link/status
@RequestParam String mobileNumber) {
if ("SMS".equals(channel)) {
return smsService.sendMessage(scenarioId, var1, var2, var3, mobileNumber);
} else if ("WHATSAPP".equals(channel)) {
return smsService.sendWhatsappMessage(scenarioId, var1, var2, var3, mobileNumber);
} else {
return "Invalid channel input";
}
}
}

949
src/main/java/com/gcc/restapiservices/petregistration/service/PetRegistrationApiService.java

@ -0,0 +1,949 @@
package com.gcc.restapiservices.petregistration.service;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.SecureRandom;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.HashMap;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.env.Environment;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gcc.restapiservices.petregistration.util.ApiResponseUtil;
import com.gcc.restapiservices.cdwaste.util.DateTimeUtil;;
@Service
public class PetRegistrationApiService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlPetRegistrationRestServicesDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
private final Environment environment;
private String fileBaseUrl;
private final ObjectMapper objectMapper = new ObjectMapper();
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int STRING_LENGTH = 15;
private static final Random RANDOM = new SecureRandom();
public PetRegistrationApiService(Environment environment) {
this.environment = environment;
this.fileBaseUrl = environment.getProperty("fileBaseUrl");
}
//breed list
public List<Map<String, Object>> getBreedList(int type) {
String sql = " SELECT id,breed FROM breed where type= ? ";
return jdbcTemplate.queryForList(sql, type);
}
//mobile number registered or not
public boolean isPhoneRegistered(String mobilenum) {
String sql = "SELECT COUNT(*) FROM pet_owner WHERE phone = ?";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class, mobilenum);
return count != null && count > 0;
}
// owner registration
public ResponseEntity<?> insertPetOwner(
String title, String username, String doornumber, String street, String area,
String city, String pincode, String zone, String ward, String phone,
String email, String pin) {
// Check if phone number already exists
String checkSql = "SELECT COUNT(*) FROM pet_owner WHERE phone = ?";
Integer count = jdbcTemplate.queryForObject(checkSql, new Object[]{phone}, Integer.class);
if (count != null && count > 0) {
return ApiResponseUtil.buildResponse(false, HttpStatus.CONFLICT,
"This mobile number is already registered.", null);
}
Date cdate = new Date();
// Insert into pet_owner (without pin)
String insertPetOwnerSql = """
INSERT INTO pet_owner (title, fname, doornumber, street, area, city, pincode, zone, ward, phone, email,cdate)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)
""";
int rows1 = jdbcTemplate.update(insertPetOwnerSql,
title, username, doornumber, street, area, city, pincode, zone, ward, phone, email, cdate);
// Insert into login_details (with pin)
String insertLoginSql = """
INSERT INTO login_detail (mobileno, pin, usertype, zone)
VALUES (?, ?, ?, ?)
""";
int rows2 = jdbcTemplate.update(insertLoginSql, phone, pin, "user", zone);
if (rows1 > 0 && rows2 > 0) {
return ApiResponseUtil.success(Map.of("phone", phone), "Registered successfully");
} else {
return ApiResponseUtil.error("Failed to register", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
// get owner details
public List<Map<String, Object>> getOwnerDetails(String mobile) {
String sql = "select id, "
+ " area, cdate, city, "
+ " doornumber, email, "
+ " fname as username, "
+ " phone, pincode, street, "
+ " title, ward, zone "
+ " from pet_owner where phone = ? ";
return jdbcTemplate.queryForList(sql, mobile);
}
//get type of pet
public List<Map<String, Object>> getTypeOfPets() {
String petsql = "select * from type";
return jdbcTemplate.queryForList(petsql);
}
public List<Map<String, Object>> getAllYears() {
String yearsql = "select * from year order by id asc";
return jdbcTemplate.queryForList(yearsql);
}
public List<Map<String, Object>> getAllMonths() {
String monthsql = "select * from month order by id asc";
return jdbcTemplate.queryForList(monthsql);
}
public String saveAllRegistrationDetails(String petname, String species, String breed, String identification_mark,
String petcolor, String gender, String age_year, String months,
String is_sterilized, String is_adopted_street, String is_rabies_vaccination,
String arv_date, String lastdate_of_deworming, String other_vaccination,
String previous_licenseNo, String consultant_name, String council_number, String mobilenum,
MultipartFile applicantphoto, MultipartFile addressproof,
MultipartFile petphoto, MultipartFile rabiesvacCertificate,String registerdate) {
// Convert age to string format like "2.3" where 2 = years and 3 = months
String computedAge;
String source="2";
try {
String yearPart = (age_year != null && !age_year.isEmpty()) ? age_year.trim() : "0";
String monthPart = (months != null && !months.isEmpty()) ? months.trim() : "0";
// Validate numeric input
Integer.parseInt(yearPart);
Integer.parseInt(monthPart);
computedAge = yearPart + "." + monthPart;
} catch (NumberFormatException e) {
e.printStackTrace();
return "error: invalid age input";
}
// Declare as final after computation
final String finalAge = computedAge;
// // Step 1: Fetch zone from pet_owner using mobile number
// String zoneFetched = null;
// try {
// zoneFetched = jdbcTemplate.queryForObject(
// "SELECT zone FROM pet_owner WHERE phone = ?",
// new Object[]{mobilenum},
// String.class
// );
// } catch (Exception e) {
// e.printStackTrace();
// return "error: unable to fetch zone from pet_owner";
// }
//
// final String zone = zoneFetched;
// Step 1: Fetch zone from pet_owner using mobile number
String zoneFetched = null;
try {
List<String> zones = jdbcTemplate.query(
"SELECT zone FROM pet_owner WHERE phone = ? ",
new Object[]{mobilenum},
(rs, rowNum) -> rs.getString("zone")
);
if (zones.isEmpty()) {
return "error: mobile number not found in pet_owner";
}
zoneFetched = zones.get(0);
} catch (Exception e) {
e.printStackTrace();
return "error: database error while fetching zone";
}
final String zone = zoneFetched;
String sql = "INSERT INTO petdetails (" +
"petname, species, breed, identificationmark, petcolor, gender, age, " +
"sterilized, stray, vaccinated, arvdate, dewormdate, othervac, " +
"previoslicense_no, veterinary_consultant, tnvcno, mobilenum,zone,status,registerdate,source) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
try {
//String finalAge = age;
int result = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
ps.setString(1, petname);
ps.setString(2, species);
ps.setString(3, breed);
ps.setString(4, identification_mark);
ps.setString(5, petcolor);
ps.setString(6, gender);
ps.setString(7, finalAge);
ps.setString(8, is_sterilized);
ps.setString(9, is_adopted_street);
ps.setString(10, is_rabies_vaccination);
ps.setString(11, arv_date);
ps.setString(12, lastdate_of_deworming);
ps.setString(13, other_vaccination);
ps.setString(14, previous_licenseNo);
ps.setString(15, consultant_name);
ps.setString(16, council_number);
ps.setString(17, mobilenum);
ps.setString(18, zone);
ps.setInt(19, 0);
ps.setString(20,registerdate);
ps.setString(21,source);
return ps;
}, keyHolder);
if (result > 0 && keyHolder.getKey() != null) {
Number petId = keyHolder.getKey();
// 4. Get uniqueid using petId
String uniqueId;
try {
uniqueId = jdbcTemplate.queryForObject(
"SELECT uniqueid FROM petdetails WHERE uniqueid = ?",
new Object[]{petId},
String.class
);
} catch (Exception e) {
e.printStackTrace();
return "error: unable to fetch uniqueid after insert";
}
// File upload and metadata
String applicantOriginalName = applicantphoto != null ? applicantphoto.getOriginalFilename() : "";
String applicantMimeType = applicantphoto != null ? applicantphoto.getContentType() : "";
String applicantPath = applicantphoto != null ? fileUpload(applicantphoto, "applicant_photo") : "";
String addressOriginalName = addressproof != null ? addressproof.getOriginalFilename() : "";
String addressMimeType = addressproof != null ? addressproof.getContentType() : "";
String addressPath = addressproof != null ? fileUpload(addressproof, "address_proof") : "";
String petOriginalName = petphoto != null ? petphoto.getOriginalFilename() : "";
String petMimeType = petphoto != null ? petphoto.getContentType() : "";
String petPath = petphoto != null ? fileUpload(petphoto, "pet_photo") : "";
String rabiesOriginalName = rabiesvacCertificate != null ? rabiesvacCertificate.getOriginalFilename() : "";
String rabiesMimeType = rabiesvacCertificate != null ? rabiesvacCertificate.getContentType() : "";
String rabiesPath = rabiesvacCertificate != null ? fileUpload(rabiesvacCertificate, "rabies_certificate") : "";
// Insert into pet_support_doc
String docSql = "INSERT INTO pet_support_doc (" +
"petdetails_uniqueid, address_file_name, address_file_type, address_proof_url, " +
"applicant_file_name, applicant_file_type, applicant_photo_url, " +
"pet_file_name, pet_file_type, pet_photo_url, " +
"rabies_file_name, rabies_file_type, rabies_certificate_url) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
jdbcTemplate.update(docSql,
uniqueId,
addressOriginalName, addressMimeType, addressPath,
applicantOriginalName, applicantMimeType, applicantPath,
petOriginalName, petMimeType, petPath,
rabiesOriginalName, rabiesMimeType, rabiesPath
);
return uniqueId;
//return String.valueOf(petId);
}
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
//generate randomstring
public static String generateRandomString() {
StringBuilder result = new StringBuilder(STRING_LENGTH);
for (int i = 0; i < STRING_LENGTH; i++) {
result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())));
}
return result.toString();
}
private byte[] compressImage(BufferedImage image, float quality) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream);
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
writer.setOutput(imageOutputStream);
ImageWriteParam param = writer.getDefaultWriteParam();
if (param.canWriteCompressed()) {
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
}
writer.write(null, new javax.imageio.IIOImage(image, null, null), param);
writer.dispose();
imageOutputStream.close();
return byteArrayOutputStream.toByteArray();
}
//fileupload
public String fileUpload(MultipartFile file, String docType) {
if (file == null || file.isEmpty()) {
return "";
}
try {
// Get base upload directory from application.properties
String baseDir = environment.getProperty("file.upload.directory");
// Decide folder based on document type
String folderName;
switch (docType) {
case "applicant_photo":
folderName = "applicantPhotos";
break;
case "address_proof":
folderName = "addressProofs";
break;
case "pet_photo":
folderName = "petPhotos";
break;
case "rabies_certificate":
folderName = "rabiesCertificates";
break;
default:
folderName = "/others";
}
// Add year/month subfolders
String year = DateTimeUtil.getCurrentYear();
String month = DateTimeUtil.getCurrentMonth();
String fullDirPath = baseDir + "/" + folderName;
// Ensure directory exists
Path directoryPath = Paths.get(fullDirPath);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
// Generate safe and unique file name
String timestamp = DateTimeUtil.getCurrentDateTime(); // like 20250715143210
String originalFileName = file.getOriginalFilename();
String fileName = docType + "_" + timestamp + "_" + originalFileName.replaceAll("\\s+", "");
Path filePath = Paths.get(fullDirPath, fileName);
// Compress image and write to disk
BufferedImage image = ImageIO.read(file.getInputStream());
byte[] compressedBytes = compressImage(image, 0.5f); // 50% quality
Files.write(filePath, compressedBytes);
// Return relative path for DB
return fileBaseUrl +"/gccrestservices/files/" + folderName + "/" + fileName;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
public List<Map<String, Object>> getPetRegistrationDetailsbyMobile(String mobilenum) {
String sql =
"SELECT " +
" pd.uniqueid, " +
" pd.tnvcno, " +
" pd.veterinary_consultant, " +
" pd.age, " +
" pd.arvdate, " +
" pd.breed, " +
" pd.dewormdate, " +
" pd.gender, " +
" pd.identificationmark, " +
" pd.mobilenum, " +
" pd.other_breed, " +
" pd.othervac, " +
" pd.petcolor, " +
" pd.petname, " +
" pd.previoslicense_no, " +
" DATE_FORMAT(pd.registerdate, '%d-%m-%Y') AS registerdate, " +
" pd.species, " +
" pd.sterilized, " +
" pd.stray, " +
" pd.updatedby, " +
" pd.vaccinated, " +
" pd.zone, " +
" psd.address_proof_url, " +
" psd.applicant_photo_url, " +
" psd.pet_photo_url, " +
" psd.rabies_certificate_url, " +
// Status mapping as flags
" CASE WHEN pd.status = 0 THEN 'in_progress' " +
" WHEN pd.status = 1 THEN 'pending_for_payment' " +
" WHEN pd.status = 2 THEN 'license_issued' " +
" WHEN pd.status = 3 THEN 'rejected' " +
" WHEN pd.status = 4 THEN 'expired' ELSE 'UNKNOWN' " +
" END AS status " +
"FROM petdetails pd " +
"JOIN pet_support_doc psd ON pd.uniqueid = psd.petdetails_uniqueid " +
"WHERE pd.mobilenum = ?";
List<Map<String, Object>> results= jdbcTemplate.queryForList(sql, mobilenum);
for (Map<String, Object> result : results) {
Object petId = result.get("uniqueid");
Object mobile = result.get("mobilenum");
if (petId != null && mobile != null) {
String licenseUrl = "https://gccservices.chennaicorporation.gov.in/gccrestservices/petregistration/downloadLicense"
+ "?name=downloadLic"
+ "&id=" + petId
+ "&mobileNo=" + mobile;
result.put("licenseUrl", licenseUrl);
}
}
return results;
}
public String updateARVAndRabiesCertificate(
String uniqueid,
String arvDateStr,
MultipartFile rabiesvacCertificate
) {
try {
// Parse arvDate
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate arvDate = LocalDate.parse(arvDateStr.trim(), formatter);
// Step 1: Fetch previous license validity date
String fetchValiditySql = "SELECT pl.validity FROM pet_license pl " +
"JOIN petdetails pd ON pd.uniqueid = pl.uniqueid " +
"WHERE pd.uniqueid = ?";
LocalDate validityDate = jdbcTemplate.queryForObject(fetchValiditySql, new Object[]{uniqueid},
(rs, rowNum) -> {
String validityStr = rs.getString("validity"); // e.g., "29-07-2026"
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
return LocalDate.parse(validityStr, inputFormat);
});
// Step 2: Check if the renewal is allowed
LocalDate allowedRenewalDate = validityDate.plusYears(1);
if (arvDate.isBefore(allowedRenewalDate)) {
return "Renewal allowed only after: " + allowedRenewalDate.toString();
}
// Step 3: Extract file metadata
String rabiesOriginalName = rabiesvacCertificate != null ? rabiesvacCertificate.getOriginalFilename() : "";
String rabiesMimeType = rabiesvacCertificate != null ? rabiesvacCertificate.getContentType() : "";
String rabiesPath = rabiesvacCertificate != null ? fileUpload(rabiesvacCertificate, "rabiesCertificates") : "";
// Step 4: Perform update
String updateSql = "UPDATE petdetails pd " +
"JOIN pet_support_doc psd ON pd.uniqueid = psd.pet_doc_id " +
"SET pd.arvdate = ?, " +
"psd.rabies_file_name = ?, " +
"psd.rabies_file_type = ?, " +
"psd.rabies_certificate_url = ? " +
"WHERE pd.uniqueid = ?";
int updated = jdbcTemplate.update(updateSql,
arvDateStr,
rabiesOriginalName,
rabiesMimeType,
rabiesPath,
uniqueid
);
return updated > 0 ? "success" : "No record found for uniqueid: " + uniqueid;
} catch (EmptyResultDataAccessException e) {
return "No license validity found for this unique ID";
} catch (DateTimeParseException e) {
return "Invalid ARV date format. Please use yyyy-MM-dd";
} catch (Exception e) {
e.printStackTrace();
return "Error while updating: " + e.getMessage();
}
}
// public String updateARVAndRabiesCertificate(
// String uniqueid,
// String arvDate,
// MultipartFile rabiesvacCertificate
// ) {
// try {
// // Extract rabies certificate file metadata
// String rabiesOriginalName = rabiesvacCertificate != null ? rabiesvacCertificate.getOriginalFilename() : "";
// String rabiesMimeType = rabiesvacCertificate != null ? rabiesvacCertificate.getContentType() : "";
// String rabiesPath = rabiesvacCertificate != null ? fileUpload(rabiesvacCertificate, "rabiesCertificates") : "";
//
// // SQL query to update both tables using join
// String sql =
// "UPDATE petdetails pd " +
// "JOIN pet_support_doc psd ON pd.uniqueid = psd.pet_doc_id " +
// "SET pd.arvdate = ?, " +
// "psd.rabies_file_name = ?, " +
// "psd.rabies_file_type = ?, " +
// "psd.rabies_certificate_url = ? " +
// "WHERE pd.uniqueid = ?";
//
// int updated = jdbcTemplate.update(sql,
// arvDate,
// rabiesOriginalName,
// rabiesMimeType,
// rabiesPath,
// uniqueid
// );
//
// if (updated > 0) {
// return "success";
// } else {
// return "No record found for uniqueid: " + uniqueid;
// }
//
// } catch (Exception e) {
// e.printStackTrace();
// return "Error while updating: " + e.getMessage();
// }
// }
public int saveorderLog(String id, String orderInfo, int petId) {
if (id == null || petId == 0) {
System.out.println("❌ Missing required fields. Order ID: " + id + ", Temp Book ID: " + petId);
return 0;
}
String sqlQuery = "INSERT INTO orderslogs(order_id, order_info, uniqueid) VALUES (?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
try {
int affectedRows = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"});
ps.setString(1, id);
ps.setString(2, orderInfo);
ps.setInt(3, petId);
return ps;
}, keyHolder);
if (affectedRows > 0) {
Number generatedId = keyHolder.getKey();
return (generatedId != null) ? generatedId.intValue() : 0;
} else {
System.out.println("❌ Failed to insert into order_log.");
return 0;
}
} catch (Exception e) {
System.out.println("🚨 Exception during insert to order_log: " + e.getMessage());
e.printStackTrace();
return 0;
}
}
public List<Map<String, Object>> getZones() {
String zonesql = "select id,zone_name from zone_master";
return jdbcTemplate.queryForList(zonesql);
}
public List<Map<String, Object>> getWardByZoneId(String zoneid) {
String wardsql = "select id,ward_name,zone_id from ward_master where zone_id = ?";
return jdbcTemplate.queryForList(wardsql, zoneid);
}
public ResponseEntity<?> processPaymentConfirmation(String petId, String source, String mobno, String orderId, Map<String, Object> paymentResponse) {
System.out.println("petId:--"+petId);
System.out.println("Payment Response: " + paymentResponse);
System.out.println("OrderId from parameter: " + orderId);
int uniqueid = Integer.parseInt(petId);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
Double amount = 50.0;
try {
// Debug: Print the structure to understand it better
System.out.println("Payment Response Keys: " + paymentResponse.keySet());
// Handle the new nested payment response structure
Map<String, Object> transaction = null;
String paymentId = null;
String status = null;
// Check if transaction is directly in paymentResponse
if (paymentResponse.containsKey("transaction")) {
transaction = (Map<String, Object>) paymentResponse.get("transaction");
System.out.println("Found transaction directly: " + transaction);
} else if (paymentResponse.containsKey("currency")) {
// New structure with nested transaction inside currency
Map<String, Object> currency = (Map<String, Object>) paymentResponse.get("currency");
System.out.println("Currency keys: " + currency.keySet());
if (currency.containsKey("transaction")) {
transaction = (Map<String, Object>) currency.get("transaction");
System.out.println("Found transaction in currency: " + transaction);
}
}
if (transaction != null) {
System.out.println("Transaction keys: " + transaction.keySet());
// Extract payment details from transaction with null checks
paymentId = transaction.get("pg_transaction_id") != null ? transaction.get("pg_transaction_id").toString() : null;
status = transaction.get("status") != null ? transaction.get("status").toString() : null;
System.out.println("Parsed values - paymentId: " + paymentId + ", status: " + status);
} else {
System.out.println("No transaction found in payment response");
}
// Use the provided orderId parameter directly (not from payment response)
String finalOrderId = orderId;
// Validate required fields from payment response
if (paymentId == null || status == null) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("message", "Invalid payment response structure");
errorResponse.put("error", "Missing required transaction fields. Found - paymentId: " + paymentId + ", status: " + status);
errorResponse.put("paymentResponse", paymentResponse);
return ResponseEntity.badRequest().body(errorResponse);
}
savePaymentResponse(finalOrderId, paymentId, status, paymentResponse, uniqueid);
if ("failed".equalsIgnoreCase(status)) {
// Convert entire response map to JSON string
ObjectMapper mapper = new ObjectMapper();
String fullResponseJson = mapper.writeValueAsString(paymentResponse);
// Save to DB (assuming you have a method)
saveFailedTransaction(finalOrderId, paymentId, status, fullResponseJson, uniqueid);
return ResponseEntity.ok(Map.of(
"message", "Your payment failed. Please try again."
));
} else if ("success".equalsIgnoreCase(status)) {
int s = Integer.parseInt(source) ;
int result = savePaymentInfo(mobno, uniqueid, paymentId, status, dtf.format(now), finalOrderId, amount, s);
System.out.println("result...result"+result);
if (result > 0) {
String licNo = savePetLicense(uniqueid, Long.parseLong(mobno));
System.out.println("Service Testing.........");
return ResponseEntity.ok(Map.of(
"message", "Your payment was successful "
));
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Failed to confirm payment"));
}
} catch (Exception ex) {
ex.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Failed to confirm payment", "error", ex.getMessage()));
}
return ResponseEntity.ok(Map.of("msg", "updated"));
}
public void savePaymentResponse(String orderId, String payId, String status,
Map<String, Object> paymentResponse, int uniqueId) {
String sql = "INSERT INTO payment_response (order_id, payment_id, payment_status, response, uniqueId) " +
"VALUES (?, ?, ?, ?, ?)";
try {
String jsonResponse = objectMapper.writeValueAsString(paymentResponse);
jdbcTemplate.update(sql, orderId, payId, status, jsonResponse, uniqueId);
} catch (Exception e) {
e.printStackTrace(); // log or rethrow as needed
}
}
public void saveFailedTransaction(String orderId, String paymentId, String status, String fullJsonResponse, int uniqueId) {
String sql = "INSERT INTO payment_failed_response (order_id, payment_id, payment_status, response, uniqueId) " +
"VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(sql, orderId, paymentId, status, fullJsonResponse, uniqueId);
}
public int savePaymentInfo(String mobno, int uniqueid, String payId, String status, String format, String orderId, Double amount, int source) {
String sql = "INSERT INTO payment (amount, mobno, order_id, payment_id, payment_status, paymentdate, uniqueid) " +
"VALUES (?, ?, ?, ?, ?, ?, ?)";
int count = jdbcTemplate.update(sql, amount, mobno, orderId, payId, status, format, uniqueid);
return count;
}
public String savePetLicense(int uniqueid, long mobno) {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
Calendar c = Calendar.getInstance();
c.setTime(date);
String issueDate = dateFormat.format(c.getTime());
c.add(Calendar.YEAR, 1);
c.add(Calendar.DATE, -1);
String validityDate = dateFormat.format(c.getTime());
Map<String, Object> ownerDetails = getOwnerDetailsByMobNo(mobno);
int year = LocalDate.now().getYear();
// int z = (int) ownerDetails.get("zone");
int z = Integer.parseInt(ownerDetails.get("zone").toString());
System.out.println("zone..."+z);
// Generate license number
String licenseNo = year + "/" + String.format("%02d", z) + "/" + String.format("%05d", uniqueid);
Map<String, Object> existingLicenses = checkLincenseExistsByMobNoAndUniqueid(mobno, uniqueid);
if (!existingLicenses.isEmpty()) {
addOldPetLic(existingLicenses);
// Renewal case - update existing license
String updateSql = "UPDATE pet_license SET license_no = ?, date = ?, validity = ? WHERE phone = ? AND uniqueid = ?";
jdbcTemplate.update(updateSql, licenseNo, new java.sql.Date(date.getTime()), validityDate, mobno, uniqueid);
} else {
// New license case - insert
String insertSql = "INSERT INTO pet_license (license_no, phone, uniqueid, date, validity) VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(insertSql, licenseNo, mobno, uniqueid, new java.sql.Date(date.getTime()), validityDate);
}
// Update pet status
System.out.println("before update pet status"+mobno+"\n"+uniqueid);
updatePetStatus(mobno, uniqueid, 2);
return licenseNo;
}
private Map<String, Object> getOwnerDetailsByMobNo(long mobno) {
String query = "SELECT * FROM pet_owner WHERE phone = ?";
try {
return jdbcTemplate.queryForMap(query, mobno);
} catch (EmptyResultDataAccessException e) {
return Collections.emptyMap();
}
}
private Map<String, Object> checkLincenseExistsByMobNoAndUniqueid(long mobno, int uniqueid) {
// Check if license already exists
String checkSql = "SELECT * FROM pet_license WHERE phone = ? AND uniqueid = ?";
// Map<String, Object> existingLicenses = jdbcTemplate.queryForMap(checkSql, mobno, uniqueid);
// return existingLicenses;
try {
return jdbcTemplate.queryForMap(checkSql, mobno, uniqueid);
} catch (EmptyResultDataAccessException e) {
return Collections.emptyMap();
}
}
private void addOldPetLic(Map<String, Object> existingLicenses) {
LocalDateTime localDateTime = (LocalDateTime) existingLicenses.get("date");
Timestamp timestamp = Timestamp.valueOf(localDateTime);
String licenseNo = (String) existingLicenses.get("license_no");
long mobno = (long) existingLicenses.get("phone");
int uniqueid = (int) existingLicenses.get("uniqueid");
String validityDate = (String) existingLicenses.get("validity");
// Timestamp dateTime = (Timestamp) existingLicenses.get("date");
String sql = "Insert into old_pet_license (license_no, phone, uniqueid, date, validity) VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(sql, licenseNo, mobno, uniqueid, timestamp, validityDate);
}
private void updatePetStatus(long mobno, int uniqueid, int status) {
System.out.println("inside pet status method");
String sql = "UPDATE petdetails SET status =?, mobilenum =? WHERE uniqueid = ?";
jdbcTemplate.update(sql, status, mobno, uniqueid);
}
// get licensedetails api
public List<Map<String, Object>> getLicenseListByMobNo(String licenseno) {
String sql = "SELECT " +
"pd.uniqueid, " +
"pd.tnvcno, " +
"pd.veterinary_consultant, " +
"pd.age, " +
"pd.arvdate, " +
"pd.breed, " +
"pd.dewormdate, " +
"pd.gender, " +
"pd.identificationmark, " +
"pd.mobilenum, " +
"pd.other_breed, " +
"pd.othervac, " +
"pd.petcolor, " +
"pd.petname, " +
"pd.previoslicense_no, " +
"DATE_FORMAT(pd.registerdate, '%d-%m-%Y') AS registerdate, " +
"pd.rejectreason, " +
"pd.species, " +
" DATE_FORMAT(pd.statusdate, '%d-%m-%Y') AS statusdate, " +
"pd.sterilized, " +
"pd.stray, " +
"pd.updatedby, " +
"pd.vaccinated, " +
"pd.zone, " +
"pl.license_no, " +
"psd.address_proof_url, " +
"psd.applicant_photo_url, " +
"psd.pet_photo_url, " +
"psd.rabies_certificate_url, " +
"CASE " +
" WHEN pd.status = 0 THEN 'in_progress' " +
" WHEN pd.status = 1 THEN 'pending_for_payment' " +
" WHEN pd.status = 2 THEN 'license_issued' " +
" WHEN pd.status = 3 THEN 'rejected' " +
" WHEN pd.status = 4 THEN 'expired' " +
" ELSE 'UNKNOWN' " +
"END AS application_status " +
"FROM petdetails pd " +
"JOIN pet_license pl ON pd.uniqueid = pl.uniqueid " +
"JOIN pet_support_doc psd ON pd.uniqueid = psd.petdetails_uniqueid " +
"WHERE pl.license_no = ?";
return jdbcTemplate.queryForList(sql, licenseno);
}
public Map<String, Object> getbymobnoanduniqueId(String mobno,int uniqueid) {
String sql = " select pd.* ,pl.validity,psd.pet_photo_url,psd.pet_file_name" +
" from petdetails pd" +
" left join pet_license pl on pl.uniqueid=pd.uniqueid" +
" left join pet_support_doc psd on psd.petdetails_uniqueid=pd.uniqueid" +
" where pl.phone=? AND pd.uniqueid= ?";
return jdbcTemplate.queryForMap(sql, mobno,uniqueid);
}
public Map<String, Object> getbylicensemobnoanduniqueId(String mobno, int uniqueid) {
String sql = "SELECT * FROM pet_license WHERE phone= ? and uniqueid= ? ";
return jdbcTemplate.queryForMap(sql, mobno, uniqueid);
}
public Map<String, Object> getOwnerDetailsbymobile(String mobile) {
String sql = "select * "
+ " from pet_owner where phone = ? ";
return jdbcTemplate.queryForMap(sql, mobile);
}
// add by sanjay use of allow only accept request
public Map<String, Object> getpetdetails(String petId) {
String sql ="select * from petdetails where uniqueid = ? AND status IN (2,4)";
return jdbcTemplate.queryForMap(sql, petId);
}
public int getCountByMobileNo(String mobileno) {
String sql = "SELECT COUNT(*) FROM petdetails pd WHERE pd.mobilenum = ? AND pd.status IN (0,1,2,4)";
return jdbcTemplate.queryForObject(sql, Integer.class, mobileno);
}
}

603
src/main/java/com/gcc/restapiservices/petregistration/service/PetSMSService.java

@ -0,0 +1,603 @@
package com.gcc.restapiservices.petregistration.service;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import org.apache.commons.lang3.ObjectUtils.Null;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.servlet.http.HttpSession;
@Service
public class PetSMSService {
private static final String GUPSHUP_API_URL = "https://media.smsgupshup.com/GatewayAPI/rest";
private static final String SMS_API_URL = "https://tmegov.onex-aura.com/api/sms?";
// Gupshup credentials
private static final String USER_ID = "2000233507";
private static final String PASSWORD = "h2YjFNcJ";
// Onex-Aura credentials
private static final String SMS_ENTITY_ID = "1401572690000011081";
private static final String SMS_TEMPLATE_ID = "";
private static final String SMS_SENDER_ID = "GCCCRP";
String apikey = "5c995535-6244-11f0-98fc-02c8a5e042bd";
String from = "919445061913";
String key = "pfTEYN6H";
public String sendMessage(int scenarioId, String var1, String var2,
String var3, String mobileNumber) {
String templateId = null;
String message = prepareMessage(scenarioId, var1, var2, var3, mobileNumber);
if (message.startsWith("Invalid")) {
return message;
}
String response = sendSms(message);
// return "Message Sent: " + message + "\nResponse: " + response;
return "Response: " + response;
}
public String sendWhatsappMessage(int scenarioId, String var1, String var2,
String var3, String mobileNumber) {
String message = prepareWhatsappMessage(scenarioId, var1, var2, var3, mobileNumber);
if (message.startsWith("Invalid")) {
return message;
}
String response = sendWhatsApp(message);
return "Response: " + response;
}
private String prepareMessage(int scenarioId, String var1, String var2, String var3, String MobileNo) {
String message;
String urlString = null;
switch (scenarioId) {
case 1: // Signup OTP
message = "Dear " + var1 + ", your OTP for account sign-up is "
+ var2 + ". This code is valid for 10 minutes. Do not share it with anyone. - GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407175923154012472";
break;
case 2: // License Application Received
message = "Dear " + var1 + ", your application ID: " + var2 + " "
+ "is currently Received. For more details, please contact us at "
+ var3 + ". – GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407175923230686244";
break;
case 3: // License Application On process
message = "Dear " + var1 + ", your application ID: " + var2 + " "
+ "is currently on process. For more details, please contact us at "
+ var3 + ". – GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407175923248822204";
break;
case 4: // Approved
message = "Dear " + var1 + ", "
+ "We are pleased to inform you that your application ID: " + var2
+ " has been approved. "
+ "For next steps or further details, please contact us at " + var3 + "– GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407175923274516644";
break;
case 5: // Rejected
message = "Dear " + var1 + ", "
+ "We regret to inform you that your application ID: " + var2 + " has been rejected. "
+ "For more details or assistance, please contact us at " + var3 + ".– GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407175923292860654";
break;
case 6: // Download License Link
message = "Dear " + var1 + ", your document is ready. Please use your ID: "
+ var2 + " to download it here: " + var3 + ". – GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407175923308512766";
break;
case 7: // Pet Transfer OTP
message = "Dear " + var1 + ", your OTP for pet transfer ID: "
+ var2 + " is " + var3 + ". Do not share this code with anyone. – GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407175923325699477";
break;
case 8: // Additional Details Pet License - Missing Data
message = "Dear " + var1 + ", your request (ID: "
+ var2
+ ") is pending due to missing details: (Old Existing details, Microchip ID). Please share the info to proceed. By GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407176034136225728";
break;
case 9: // Reset Password OTP for Pet License
message = "Dear " + var1
+ ", You have requested to reset your password. Please use the One-Time Password (OTP) below to proceed. OTP: "
+ var2
+ " For your security, this OTP will be valid only for the next [time limit, e.g., 10 minutes]. If you did not request this password reset,"
+ "please ignore this message or contact our support team immediately. By GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407176034124745780";
break;
case 10: // Pet License One Time free License Renewal
message = "Dear Pet Owner, Your previous GCC Pet License ID " + var1
+ " is eligible for one-time free license renewal. Use this OTP " + var2
+ " to skip the payment while applying for your new license.-GCC";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407176413912291986";
break;
case 11: // Pet License expires tomorrow
message = "Your Pet License expires tomorrow. Kindly visit your veterinarian today and complete the renewal process to avoid license expiry.\n"
+
"- Greater Chennai Corporation";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407178038425363123";
break;
case 12: // Pet License 7 days expiry
message = "Your Pet License will expire in 7 days. Please visit your veterinarian and complete the renewal process at the earliest to ensure uninterrupted registration.\n"
+
"- Greater Chennai Corporation";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407178038413058122";
break;
case 13: // Pet License 30 days expiry
message = "Your GCC Pet License will expire in 30 days. Kindly visit your veterinarian to complete the renewal process and avoid expiry. Thank you\n"
+ "- Greater Chennai Corporation.";
urlString = SMS_API_URL + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + MobileNo
+ "&body=" + message + "&entityid=1401572690000011081&templateid=1407178038404219687";
break;
default:
urlString = "Invalid scenario ID.";
}
return urlString;
}
private String prepareWhatsappMessage(int scenarioId, String var1, String var2, String var3, String mobNo) {
String whatsupmsg = null;
String urlString = "";
String placeholders = "";
switch (scenarioId) {
case 1: // When the Pet is added - For customer and Doctor:
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Hello+%2A" + var1 +
* "%2A%2C%0AYour+request+to+add+a+new+pet+has+been+received.%0APet+Name%3A+%2A"
* + var2 +
* "%2A%0APet+ID%3A+%2A" + var3 +
* "%2A%0AWe+will+notify+you+once+the+registration+is+complete." +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2 + "|~|" + var3, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055707&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 2: // Confirmation of the License application (Received)
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Dear+" + var1 + "%2C+your+application+%28ID%3A+%2A" + var2 +
* "%2A%29+is+currently+Received+.+%0AFor+more+details%2C+please+contact+us+at+https%3A%2F%2Fpetservice.gccservices.in%2F."
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055762&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 3: // Confirmation of the License application (On process)
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Dear+" + var1 + "%2C+your+application+%28ID%3A+%2A" + var2 +
* "%2A%29+is+currently+On+process+.+%0AFor+more+details%2C+please+contact+us+at+https%3A%2F%2Fpetservice.gccservices.in"
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055764&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 4: // approved
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Hello+" + var1 +
* "%2C%0AWe+are+pleased+to+inform+you+that+your+application+%28ID%3A+%2A"
* + var2 +
* "%2A%29+has+been+approved.%0AFor+next+steps+or+further+details%2C+please+contact+us+at+https%3A%2F%2Fpetservice.gccservices.in"
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055772&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 5: // rejected
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Hello+" + var1 +
* "%2C%0AWe+regret+to+inform+you+that+your+application+%28ID%3A+%2A" + var2
* +
* "%2A%29+has+been+rejected.%0AFor+more+details+or+assistance%2C+please+contact+us+at+https%3A%2F%2Fpetservice.gccservices.in"
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055776&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 6: // 24 Hours License Status
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Hello+" + var1 + "%2C%0AYour+application+%28ID%3A+%2A" + var2 +
* "%2A%29+is+currently+ON+process.%0AFor+more+details%2C+please+contact+us+at+https%3A%2F%2Fpetservice.gccservices.in"
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3287449&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 7: // Complaint Submitted
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Dear+" + var1 +
* "%2C++%0AWe+have+received+your+complaint%2Fgrievance+with+Reference+ID%3A+%2A"
* + var2 +
* "%2A.++%0AOur+support+team+will+review+the+details+and+keep+you+updated+on+the+progress.++%0AThank+you+for+reaching+out+to+us."
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055806&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 8: // Complaint Status
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Dear+" + var1
* +
* "%2C++%0AWe+have+received+your+complaint%2Fgrievance+with+Reference+ID%3A+%2A"
* + var2 +
* "%2A.++%0AOur+team+is+reviewing+the+details+and+will+get+back+to+you+shortly.++%0AThank+you+for+bringing+this+to+our+attention."
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055818&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 9: // Complaint Closed
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE" +
* "&msg=Dear+" + var1 +
* "%2C++%0AYour+complaint%2Fgrievance+with+Reference+ID%3A+%2A" + var2 +
* "%2A+has+been+successfully+closed.++%0AIf+you+have+any+further+concerns+or+require+assistance%2C+please+feel+free+to+contact+us.++%0AThank+you+for+your+patience+and+for+giving+us+the+opportunity+to+serve+you."
* +
* "&isTemplate=true" +
* "&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055836&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 10: // Additional Details Pet License - Missing Data
/*
* whatsupmsg = "https://mediaapi.smsgupshup.com/GatewayAPI/rest?" +
* "userid=2000233507" +
* "&password=h2YjFNcJ" +
* "&send_to=" + mobNo + "&v=1.1" +
* "&format=json" +
* "&msg_type=TEXT" +
* "&method=SENDMESSAGE&msg=Hello+" + var1
* +
* "%2C++%0A%0AWe+noticed+that+some+required+details+are+missing+from+your+recent+submission+ID%3A+"
* + var2 +
* ".++%0ATo+proceed+further%2C+please+share+the+following+missing+information%3A++%0A1.+Upload+documents+%28old+health%2C+vaccine+charts%29%0A2.+Upload+address+proof%0A3.+If+microchipped%2C+share+the+microchip+id+immediately%0A%0AKindly+provide+the+details+at+your+earliest+convenience."
* +
* "++%0AThank+you+for+your+prompt+attention." +
* "&isTemplate=true&footer=-+GCC";
*/
try {
placeholders = URLEncoder.encode(var1 + "|~|" + var2, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3055750&placeholders=" + placeholders + "";
System.out.println(urlString + ":" + mobNo);
break;
case 11: // License expires tomorrow
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3270149";
System.out.println(urlString + ":" + mobNo);
break;
case 12: // License expires in 7 days
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3270148";
System.out.println(urlString + ":" + mobNo);
break;
case 13: // License expires in 30 days
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?apikey=" + apikey + "&from="
+ from
+ "&to=91" + mobNo + ""
+ "&type=template&templateid=3270142";
System.out.println(urlString + ":" + mobNo);
break;
default:
whatsupmsg = "Invalid scenario ID.";
}
// return whatsupmsg;
return urlString;
}
private String sendWhatsApp(String msgUrl) {
System.out.println("Whatsapp URL :-" + msgUrl);
String response = "";
try {
HttpURLConnection connection = null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = responseCode + "";
System.out.println("Response Code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
private String sendSms(String urlString) {
System.out.print(" urlString---: " + urlString);
String bodyMessage = "";
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(urlString, String.class);
// Create ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();
// Parse response to ObjectNode
ObjectNode jsonResponse = (ObjectNode) mapper.readTree(Response);
bodyMessage = jsonResponse.toString();
System.out.println(" bodyMessage: " + bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: " + e);
bodyMessage = "Error";
}
return bodyMessage;
}
}

46
src/main/java/com/gcc/restapiservices/petregistration/util/ApiResponseUtil.java

@ -0,0 +1,46 @@
package com.gcc.restapiservices.petregistration.util;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
public class ApiResponseUtil {
public static ResponseEntity<List<Map<String, Object>>> success(Object data, String message) {
return buildResponse(true, HttpStatus.OK, message, data);
}
public static ResponseEntity<List<Map<String, Object>>> notFound(String message) {
return buildResponse(false, HttpStatus.NOT_FOUND, message, Collections.emptyList());
}
public static ResponseEntity<List<Map<String, Object>>> error(String message, HttpStatus status) {
return buildResponse(false, status, message, null);
}
public static ResponseEntity<List<Map<String, Object>>> invalidRequest(String message) {
return buildResponse(false, HttpStatus.BAD_REQUEST, message, Collections.emptyList());
}
public static ResponseEntity<List<Map<String, Object>>> buildResponse(
boolean statusFlag,
HttpStatus httpStatus,
String message,
Object data
) {
Map<String, Object> response = new LinkedHashMap<>();
response.put("status", statusFlag);
response.put("code", httpStatus.value());
response.put("message", message);
response.put("data", data);
List<Map<String, Object>> responseList = Collections.singletonList(response);
return ResponseEntity.status(httpStatus).body(responseList);
}
}

35
src/main/java/com/gcc/restapiservices/petregistration/util/DateTimeUtil.java

@ -0,0 +1,35 @@
// package com.gcc.restapiservices.petregistration.util;
// import org.springframework.stereotype.Service;
// import java.time.LocalDateTime;
// import java.time.format.DateTimeFormatter;
// @Service
// public class DateTimeUtil {
// public static String getCurrentDateTime() {
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyyHHmmss");
// LocalDateTime now = LocalDateTime.now();
// return now.format(formatter);
// }
// public static String getCurrentYear() {
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
// LocalDateTime now = LocalDateTime.now();
// return now.format(formatter);
// }
// public static String getCurrentMonth() {
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM");
// LocalDateTime now = LocalDateTime.now();
// return now.format(formatter);
// }
// public static String getCurrentDay() {
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd");
// LocalDateTime now = LocalDateTime.now();
// return now.format(formatter);
// }
// public static String getCurrentDateTimeMysql() {
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// LocalDateTime now = LocalDateTime.now();
// return now.format(formatter);
// }
// }

324
src/main/java/com/gcc/restapiservices/propertytax/controller/PropertyTaxOtpController.java

@ -0,0 +1,324 @@
package com.gcc.restapiservices.propertytax.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.gcc.restapiservices.propertytax.service.PropertyTaxOtpService;
@RequestMapping("/gccrestservices/api/propertytax")
@RestController
public class PropertyTaxOtpController {
private PropertyTaxOtpService propertyTaxOtpService;
@Autowired
public PropertyTaxOtpController(PropertyTaxOtpService propertyTaxOtpService) {
this.propertyTaxOtpService = propertyTaxOtpService;
}
// @GetMapping("/getErpDetails")
// public ResponseEntity<Map<String, Object>> getErpDetails(
// @RequestParam String zone,
// @RequestParam String division,
// @RequestParam String billNo,
// @RequestParam(required = false) String subBill) {
// try {
// System.out.println("zone = " + zone);
// System.out.println("division = " + division);
// System.out.println("billNo = " + billNo);
// System.out.println("subBill = " + subBill);
// // Validate required parameters
// if (zone == null || zone.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Zone parameter is required"
// ));
// }
// if (division == null || division.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Division parameter is required"
// ));
// }
// if (billNo == null || billNo.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Bill number parameter is required"
// ));
// }
// Map<String, Object> result = propertyTaxOtpService.getErpDetails(zone, division, billNo, subBill);
// if (result == null || result.isEmpty()) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of(
// "status", "error",
// "status_code", 404,
// "message", "No ERP details found for the provided parameters"
// ));
// }
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "status_code", 200,
// "data", result
// ));
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of(
// "status", "error",
// "status_code", 500,
// "message", "Internal Server Error: " + e.getMessage()
// ));
// }
// }
@GetMapping("/getWardByZoneId")
public ResponseEntity<Map<String, Object>> getWardByZoneId(@RequestParam int zoneId) {
try {
Map<String, Object> result = propertyTaxOtpService.getWardByZoneId(zoneId);
// Check if the result contains data
List<Map<String, Object>> data = (List<Map<String, Object>>) result.get("data");
if (data == null || data.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of(
"status", "error",
"status_code", 404,
"message", "No ward data found for zoneId: " + zoneId
));
}
return ResponseEntity.ok(Map.of(
"status", "success",
"status_code", 200,
"data", data
));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of(
"status", "error",
"status_code", 500,
"message", "Internal Server Error: " + e.getMessage()
));
}
}
@GetMapping("/getZoneMaster")
public ResponseEntity<Map<String, Object>> getZoneMaster() {
try {
Map<String, Object> result = propertyTaxOtpService.getZoneMaster();
// Check if the result contains data
List<Map<String, Object>> data = (List<Map<String, Object>>) result.get("data");
if (data == null || data.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(Map.of(
"status", "error",
"status_code", 404,
"message", "No zone master data found"
));
}
return ResponseEntity.ok(Map.of(
"status", "success",
"status_code", 200,
"data", data
));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of(
"status", "error",
"status_code", 500,
"message", "Internal Server Error: " + e.getMessage()
));
}
}
// @PostMapping("/sendOTPNew")
// public ResponseEntity<Map<String, Object>> sendOTP(@RequestParam String mobile) {
// try {
// // Validate mobile number
// if (mobile == null || mobile.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Mobile number is required"
// ));
// }
// if (!mobile.matches("\\d{10}")) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Mobile number must be exactly 10 digits"
// ));
// }
// Map<String, Object> result = propertyTaxOtpService.sendOTP(mobile);
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "status_code", 200,
// "data", result
// ));
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of(
// "status", "error",
// "status_code", 500,
// "message", "Internal Server Error: " + e.getMessage()
// ));
// }
// }
// @PostMapping("/verifyOTP")
// public ResponseEntity<Map<String, Object>> verifyOTP(@RequestParam String mobile, @RequestParam String otp) {
// try {
// // Validate parameters
// if (mobile == null || mobile.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Mobile number is required"
// ));
// }
// if (otp == null || otp.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "OTP is required"
// ));
// }
// if (!mobile.matches("\\d{10}")) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Mobile number must be exactly 10 digits"
// ));
// }
// Map<String, Object> result = propertyTaxOtpService.verifyOTP(mobile, otp);
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "status_code", 200,
// "data", result
// ));
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of(
// "status", "error",
// "status_code", 500,
// "message", "Internal Server Error: " + e.getMessage()
// ));
// }
// }
// @PostMapping("/submitData")
// public ResponseEntity<Map<String, Object>> submitData(
// @RequestParam String mobile,
// @RequestParam(value = "zone", required = false) String zone,
// @RequestParam(value = "ZONE", required = false) String zoneUpper,
// @RequestParam(value = "division", required = false) String division,
// @RequestParam(value = "DIVISION", required = false) String divisionUpper,
// @RequestParam(value = "billNo", required = false) String billNo,
// @RequestParam(value = "BILL", required = false) String billUpper,
// @RequestParam(required = false) String subBill,
// @RequestParam(required = false) String SUBBILL,
// @RequestParam String email,
// @RequestParam(required = false) String famCardNo) {
// try {
// // Handle both uppercase and lowercase parameters
// String finalZone = (zone != null && !zone.trim().isEmpty()) ? zone : zoneUpper;
// String finalDivision = (division != null && !division.trim().isEmpty()) ? division : divisionUpper;
// String finalBillNo = (billNo != null && !billNo.trim().isEmpty()) ? billNo : billUpper;
// String finalSubBill = (subBill != null && !subBill.trim().isEmpty()) ? subBill : SUBBILL;
// // Validate required parameters
// if (mobile == null || mobile.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Mobile number is required"
// ));
// }
// if (finalZone == null || finalZone.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Zone is required"
// ));
// }
// if (finalDivision == null || finalDivision.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Division is required"
// ));
// }
// if (finalBillNo == null || finalBillNo.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Bill number is required"
// ));
// }
// if (email == null || email.trim().isEmpty()) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Email is required"
// ));
// }
// if (!mobile.matches("\\d{10}")) {
// return ResponseEntity.badRequest().body(Map.of(
// "status", "error",
// "status_code", 400,
// "message", "Mobile number must be exactly 10 digits"
// ));
// }
// Map<String, Object> result = propertyTaxOtpService.submitData(mobile, finalZone, finalDivision, finalBillNo, finalSubBill, email, famCardNo);
// return ResponseEntity.ok(Map.of(
// "status", "success",
// "status_code", 200,
// "data", result
// ));
// } catch (Exception e) {
// e.printStackTrace();
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of(
// "status", "error",
// "status_code", 500,
// "message", "Internal Server Error: " + e.getMessage()
// ));
// }
// }
}

313
src/main/java/com/gcc/restapiservices/propertytax/service/PropertyTaxOtpService.java

@ -0,0 +1,313 @@
package com.gcc.restapiservices.propertytax.service;
import java.util.ArrayList;
import java.util.HashMap;
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;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
@Service
public class PropertyTaxOtpService {
// private JdbcTemplate oracleJdbcTemplate;
// private JdbcTemplate oraclePropertyTaxJdbcTemplate;
// private JdbcTemplate oraclePropertyTaxUatJdbcTemplate;
private JdbcTemplate mysqlJdbcTemplate;
// @Autowired
// public void setOracleDataSource(@Qualifier("oracleDataSource") DataSource oracleDataSource) {
// this.oracleJdbcTemplate = new JdbcTemplate(oracleDataSource);
// }
// @Autowired
// public void setOraclePropertyTaxDataSource(@Qualifier("oraclepropertytaxDataSource") DataSource oraclePropertyTaxDataSource) {
// this.oraclePropertyTaxJdbcTemplate = new JdbcTemplate(oraclePropertyTaxDataSource);
// }
// @Autowired
// public void setOraclePropertyTaxUatDataSource(@Qualifier("oraclepropertytax_uatDataSource") DataSource oraclePropertyTaxUatDataSource) {
// this.oraclePropertyTaxUatJdbcTemplate = new JdbcTemplate(oraclePropertyTaxUatDataSource);
// }
@Autowired
public void setMysqlDataSource(@Qualifier("mysqlGccRestServicesDataSource") DataSource mysqlDataSource) {
System.out.println("Setting MySQL DataSource: " + mysqlDataSource);
this.mysqlJdbcTemplate = new JdbcTemplate(mysqlDataSource);
System.out.println("MySQL JdbcTemplate created: " + this.mysqlJdbcTemplate);
}
// @Transactional("oracleTransactionManager")
// public Map<String, Object> getErpDetails(String zone, String division, String billNo, String subBill) {
// Map<String, Object> response = new HashMap<>();
// Map<String, Object> result = new HashMap<>();
// try {
// // Construct the UPIC number based on parameters
// String upicNo = zone + "-" + division + "-" + billNo;
// if (subBill != null && !subBill.trim().isEmpty()) {
// upicNo += "-" + subBill;
// }
// String sql = "select upicno, ownersname, address, c.mobileno, emailaddress, fam_card_no " +
// "from mv1@erp a, egpt_basic_property@erp b, egpt_address@erp c " +
// "where a.upicno = b.propertyid and a.upicno = ? and b.ADDRESSID = c.ID_ADDRESS";
// List<Map<String, Object>> data = oracleJdbcTemplate.queryForList(sql, upicNo);
// if (!data.isEmpty()) {
// Map<String, Object> erpData = data.get(0);
// result.put("upicno", erpData.get("UPICNO"));
// result.put("ownersname", erpData.get("OWNERSNAME"));
// result.put("address", erpData.get("ADDRESS"));
// result.put("mobileno", erpData.get("MOBILENO"));
// result.put("emailaddress", erpData.get("EMAILADDRESS"));
// result.put("fam_card_no", erpData.get("FAM_CARD_NO"));
// result.put("Status", "Success");
// result.put("Status Code", 200);
// result.put("Message", "ERP details fetched successfully");
// response.put("Response", result);
// } else {
// result.put("Status", "Not Found");
// result.put("Status Code", 404);
// result.put("Message", "No ERP details found for UPIC: " + upicNo);
// response.put("Response", result);
// }
// } catch (Exception e) {
// e.printStackTrace();
// result.put("Status", "Error");
// result.put("Status Code", 500);
// result.put("Message", "Error in fetching ERP details: " + e.getMessage());
// response.put("Response", result);
// }
// return response;
// }
public Map<String, Object> getZoneMaster() {
Map<String, Object> response = new HashMap<>();
try {
System.out.println("Executing getZoneMaster...");
String sql = "SELECT id, zone_name FROM zone_master";
System.out.println("SQL: " + sql);
List<Map<String, Object>> data = mysqlJdbcTemplate.queryForList(sql);
System.out.println("Data retrieved: " + data.size() + " records");
response.put("data", data);
return response;
} catch (Exception e) {
System.err.println("Error in getZoneMaster: " + e.getMessage());
e.printStackTrace();
return new HashMap<>();
}
}
public Map<String, Object> getWardByZoneId(int zoneId) {
Map<String, Object> response = new HashMap<>();
try {
System.out.println("Executing getWardByZoneId for zoneId: " + zoneId);
String sql = "SELECT wm.id, wm.ward_name FROM zone_master zm JOIN ward_master wm ON zm.id = wm.zone_id WHERE zm.id = ?";
System.out.println("SQL: " + sql);
List<Map<String, Object>> data = mysqlJdbcTemplate.queryForList(sql, zoneId);
System.out.println("Data retrieved: " + data.size() + " records");
response.put("data", data);
return response;
} catch (Exception e) {
System.err.println("Error in getWardByZoneId: " + e.getMessage());
e.printStackTrace();
return new HashMap<>();
}
}
// @Transactional("oraclePropertyTaxTransactionManager")
// public Map<String, Object> sendOTP(String mobile) {
// Map<String, Object> response = new HashMap<>();
// Map<String, Object> result = new HashMap<>();
// try {
// String checkSql = "SELECT COUNT(*) FROM coc_web.tbl_ptax_mob WHERE MOB = ?";
// int count = oraclePropertyTaxJdbcTemplate.queryForObject(checkSql, Integer.class, mobile);
// String smsIdSql = "SELECT coc_web.seq_sms_id.NEXTVAL as sms_id, ROUND(DBMS_RANDOM.VALUE(10000,99999)) as otp FROM dual";
// Map<String, Object> smsData = oraclePropertyTaxJdbcTemplate.queryForMap(smsIdSql);
// String smsId = smsData.get("SMS_ID").toString();
// String otp = smsData.get("OTP").toString();
// String insertSql;
// if (count > 0) {
// insertSql = "UPDATE coc_web.tbl_ptax_mob SET OTP = ?, CDATE = SYSDATE WHERE MOB = ?";
// oraclePropertyTaxJdbcTemplate.update(insertSql, otp, mobile);
// } else {
// insertSql = "INSERT INTO coc_web.tbl_ptax_mob (OTP, MOB, CDATE) VALUES (?, ?, SYSDATE)";
// oraclePropertyTaxJdbcTemplate.update(insertSql, otp, mobile);
// }
// String smsMessage = "Your OTP is " + otp + ".OTP is valid for the next 5 minutes.%0aBy%0aGreater Chennai Corporation.";
// smsMessage = smsMessage.replace(" ", "%20");
// String urlString = "http://10.1.0.23:8060/api/sendSMS_test?MobileNo=" + mobile + "&generatedToken=" + otp;
// try {
// String logSql = "INSERT INTO coc_web.tbl_ptax_sms (SMS_ID, MESSAGE, MOBILE, SENT_DATE) VALUES (?, ?, ?, SYSDATE)";
// oraclePropertyTaxJdbcTemplate.update(logSql, Integer.parseInt(smsId), smsMessage, mobile);
// } catch (Exception e) {
// System.out.println("SMS logging failed: " + e.getMessage());
// }
// RestTemplate restTemplate = new RestTemplate();
// String smsResponse = restTemplate.getForObject(urlString, String.class);
// result.put("mobile", mobile);
// result.put("otp", otp);
// result.put("sms_id", smsId);
// result.put("message", "OTP sent successfully");
// result.put("sms_response", smsResponse);
// result.put("Status", "Success");
// result.put("Status Code", 200);
// response.put("Response", result);
// } catch (Exception e) {
// e.printStackTrace();
// result.put("Status", "Error");
// result.put("Status Code", 500);
// result.put("Message", "Error in sending OTP: " + e.getMessage());
// response.put("Response", result);
// }
// return response;
// }
// @Transactional("oraclePropertyTaxTransactionManager")
// public Map<String, Object> verifyOTP(String mobile, String otp) {
// Map<String, Object> response = new HashMap<>();
// Map<String, Object> result = new HashMap<>();
// try {
// String verifySql = "SELECT COUNT(*) FROM coc_web.tbl_ptax_mob WHERE MOB = ? AND OTP = ?";
// int count = oraclePropertyTaxJdbcTemplate.queryForObject(verifySql, Integer.class, mobile, otp);
// if (count > 0) {
// result.put("mobile", mobile);
// result.put("otp", otp);
// result.put("message", "OTP Verified");
// result.put("verified", true);
// result.put("Status", "Success");
// result.put("Status Code", 200);
// response.put("Response", result);
// } else {
// result.put("mobile", mobile);
// result.put("otp", otp);
// result.put("message", "OTP Not Verified");
// result.put("verified", false);
// result.put("Status", "Error");
// result.put("Status Code", 400);
// response.put("Response", result);
// }
// } catch (Exception e) {
// e.printStackTrace();
// result.put("Status", "Error");
// result.put("Status Code", 500);
// result.put("Message", "Error in verifying OTP: " + e.getMessage());
// response.put("Response", result);
// }
// return response;
// }
// @Transactional("oraclePropertyTaxTransactionManager")
// public Map<String, Object> submitData(String mobile, String zone, String division, String billNo, String subBill, String email, String famCardNo) {
// Map<String, Object> response = new HashMap<>();
// Map<String, Object> result = new HashMap<>();
// try {
// // Construct property ID
// String propertyId = zone + "-" + division + "-" + billNo;
// if (subBill != null && !subBill.trim().isEmpty()) {
// propertyId += "-" + subBill;
// }
// // First, get ERP details to fetch current mobile and email
// String erpSql = "select upicno, ownersname, address, c.mobileno, emailaddress, fam_card_no " +
// "from mv1@erp a, egpt_basic_property@erp b, egpt_address@erp c " +
// "where a.upicno = b.propertyid and a.upicno = ? and b.ADDRESSID = c.ID_ADDRESS";
// List<Map<String, Object>> erpData = oracleJdbcTemplate.queryForList(erpSql, propertyId);
// if (!erpData.isEmpty()) {
// Map<String, Object> erpDetails = erpData.get(0);
// String erpMobile = (String) erpDetails.get("MOBILENO");
// String erpEmail = (String) erpDetails.get("EMAILADDRESS");
// String erpFamCardNo = (String) erpDetails.get("FAM_CARD_NO");
// // Get address ID from property using Property Tax database
// String addressIdSql = "SELECT addressid FROM egpt_basic_property@erp WHERE PROPERTYID = ?";
// String addressId = oraclePropertyTaxJdbcTemplate.queryForObject(addressIdSql, String.class, propertyId);
// if (addressId != null) {
// // Always update with the provided mobile and email values
// // Use provided values if they are not null/empty, otherwise use ERP values as fallback
// String finalMobile = (mobile != null && !mobile.trim().isEmpty()) ? mobile : erpMobile;
// String finalEmail = (email != null && !email.trim().isEmpty()) ? email : erpEmail;
// String finalFamCardNo = (famCardNo != null && !famCardNo.trim().isEmpty()) ? famCardNo : erpFamCardNo;
// System.out.println("Updating address with:");
// System.out.println("Address ID: " + addressId);
// System.out.println("Final Mobile: " + finalMobile);
// System.out.println("Final Email: " + finalEmail);
// System.out.println("Provided Mobile: " + mobile);
// System.out.println("Provided Email: " + email);
// System.out.println("ERP Mobile: " + erpMobile);
// System.out.println("ERP Email: " + erpEmail);
// String updateAddressSql = "UPDATE egpt_address@erp SET MOBILENO = ?, EMAILADDRESS = ? WHERE ID_ADDRESS = ?";
// int updateCount = oraclePropertyTaxJdbcTemplate.update(updateAddressSql, finalMobile, finalEmail, addressId);
// System.out.println("Update count: " + updateCount);
// // Insert into history table
// // String historySql = "INSERT INTO coc_web.tbl_ptax_mob_history (ZONE, DIVISION, BILL_NO, SUB_BILL, MOB, EMAIL, CDATE) VALUES (?, ?, ?, ?, ?, ?, SYSDATE)";
// // oraclePropertyTaxJdbcTemplate.update(historySql, zone, division, billNo, subBill, finalMobile, finalEmail);
// // Log the submission
// // String logSql = "INSERT INTO coc_web.tbl_ptax_submission_log (MOB, ZONE, DIVISION, BILL_NO, SUB_BILL, EMAIL, CDATE) VALUES (?, ?, ?, ?, ?, ?, SYSDATE)";
// // oraclePropertyTaxJdbcTemplate.update(logSql, finalMobile, zone, division, billNo, subBill, finalEmail);
// // Clear OTP after successful submission
// String clearOtpSql = "UPDATE coc_web.tbl_ptax_mob SET OTP = NULL WHERE MOB = ?";
// oraclePropertyTaxJdbcTemplate.update(clearOtpSql, finalMobile);
// result.put("mobile", finalMobile);
// result.put("zone", zone);
// result.put("division", division);
// result.put("billNo", billNo);
// result.put("subBill", subBill);
// result.put("email", finalEmail);
// result.put("famCardNo", finalFamCardNo);
// result.put("message", "Data submitted successfully");
// result.put("Status", "Success");
// result.put("Status Code", 200);
// response.put("Response", result);
// } else {
// result.put("Status", "Error");
// result.put("Status Code", 404);
// result.put("Message", "Property not found for ID: " + propertyId);
// response.put("Response", result);
// }
// } else {
// result.put("Status", "Error");
// result.put("Status Code", 404);
// result.put("Message", "ERP details not found for ID: " + propertyId);
// response.put("Response", result);
// }
// } catch (Exception e) {
// e.printStackTrace();
// result.put("Status", "Error");
// result.put("Status Code", 500);
// result.put("Message", "Error in submitting data: " + e.getMessage());
// response.put("Response", result);
// }
// return response;
// }
}

126
src/main/java/com/gcc/restapiservices/servicesPdf/controller/ServicePdfController.java

@ -0,0 +1,126 @@
package com.gcc.restapiservices.servicesPdf.controller;
import com.gcc.restapiservices.servicesPdf.service.ServicePdfService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/gccrestservices/api/servicespdf")
public class ServicePdfController {
@Autowired
private ServicePdfService servicePdfService;
@GetMapping("/get-services")
public ResponseEntity<List<Map<String, Object>>> listServices() {
List<Map<String, Object>> services = servicePdfService.findAllServices();
if (services.isEmpty()) {
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok(services);
}
@GetMapping("/get-types")
public ResponseEntity<List<Map<String, Object>>> getTypesByService(
@RequestParam("serviceId") int serviceId
) {
List<Map<String,Object>> types = servicePdfService.findTypesByService(serviceId);
if (types.isEmpty()) {
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok(types);
}
@GetMapping("/download")
public ResponseEntity<?> downloadPdf(
@RequestParam(value = "serviceId") String serviceIdStr,
@RequestParam(value = "typeId") String typeIdStr
) {
if (serviceIdStr == null || serviceIdStr.isBlank()) {
return ResponseEntity
.badRequest()
.body(Map.of(
"status", "error",
"message", "Missing required parameter: serviceId"
));
}
if (typeIdStr == null || typeIdStr.isBlank()) {
return ResponseEntity
.badRequest()
.body(Map.of(
"status", "error",
"message", "Missing required parameter: typeId"
));
}
if (!serviceIdStr.matches("\\d+")) {
return ResponseEntity
.badRequest()
.body(Map.of(
"status", "error",
"message", "Invalid parameter: 'serviceId' must be an integer"
));
}
if (!typeIdStr.matches("\\d+")) {
return ResponseEntity
.badRequest()
.body(Map.of(
"status", "error",
"message", "Invalid parameter: 'typeId' must be an integer"
));
}
int serviceId = Integer.parseInt(serviceIdStr);
int typeId = Integer.parseInt(typeIdStr);
try {
String pdfFullPath = servicePdfService.getPdfPathByServiceAndType(serviceId, typeId);
if (pdfFullPath == null) {
return ResponseEntity.status(404).body(Map.of(
"status", "error",
"message", "No PDF found for serviceId=" + serviceId + ", typeId=" + typeId
));
}
Resource resource = new UrlResource(pdfFullPath);
if (!resource.exists()) {
return ResponseEntity.status(404).body(Map.of(
"status", "error",
"message", "PDF file not found on server for serviceId=" + serviceId +
", typeId=" + typeId
));
}
String fileName = pdfFullPath.substring(pdfFullPath.lastIndexOf("/") + 1);
return ResponseEntity.ok(Map.of(
"status", "success",
"serviceId", serviceId,
"typeId", typeId,
"fileName", fileName,
"url", pdfFullPath
));
} catch (MalformedURLException e) {
e.printStackTrace();
return ResponseEntity.status(500).body(Map.of(
"status", "error",
"message", "Invalid URL format for PDF file."
));
}
}
}

47
src/main/java/com/gcc/restapiservices/servicesPdf/service/ServicePdfService.java

@ -0,0 +1,47 @@
package com.gcc.restapiservices.servicesPdf.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class ServicePdfService {
private final JdbcTemplate jdbcTemplate;
@Autowired
public ServicePdfService(@Qualifier("servicesPdfJdbcTemplate") JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public String getPdfPathByServiceAndType(int serviceId, int typeId) {
String sql = "SELECT pdf_file_name FROM service_pdf_mapping WHERE service_id = ?" +
" AND type_id = ? AND is_active = 1 AND is_delete = 0";
try {
return jdbcTemplate.queryForObject(sql, new Object[]{serviceId, typeId}, String.class);
} catch (Exception e) {
e.printStackTrace();
System.err.println("Error fetching PDF path: " + e.getMessage());
return null;
}
}
public List<Map<String, Object>> findAllServices() {
String sql = "SELECT id, service_name FROM services_master";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String,Object>> findTypesByService(int serviceId) {
String sql =
"SELECT id AS type_id, type_name, service_id " +
"FROM type_master " +
"WHERE service_id = ?";
return jdbcTemplate.queryForList(sql, serviceId);
}
}

59
src/main/java/com/gcc/restapiservices/swimmingpool/constants/AppConfig.java

@ -0,0 +1,59 @@
//package com.gcc.restapiservices.swimmingpool.constants;
//
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.stereotype.Component;
//
//@Component
//@ConfigurationProperties(prefix = "app")
//public class AppConfig {
//
// private String title;
// private String baseUrl;
// private String getOtpUrl;
// private String erpUrl;
//
// @Value("rzp_test_tDkHFEqWXmuEi8")
// private String keyId;
//
// public String getTitle() {
// return title;
// }
//
// public void setTitle(String title) {
// this.title = title;
// }
//
// public String getBaseUrl() {
// return baseUrl;
// }
//
// public void setBaseUrl(String baseUrl) {
// this.baseUrl = baseUrl;
// }
//
// public String getGetOtpUrl() {
// return getOtpUrl;
// }
//
// public void setGetOtpUrl(String getOtpUrl) {
// this.getOtpUrl = getOtpUrl;
// }
//
// public String getErpUrl() {
// return erpUrl;
// }
//
// public void setErpUrl(String erpUrl) {
// this.erpUrl = erpUrl;
// }
//
// public String getKeyId() {
// return keyId;
// }
//
// public void setKeyId(String keyId) {
// this.keyId = keyId;
// }
//}
//

14
src/main/java/com/gcc/restapiservices/swimmingpool/constants/AppConstants.java

@ -0,0 +1,14 @@
package com.gcc.restapiservices.swimmingpool.constants;
import org.springframework.stereotype.Component;
@Component
public final class AppConstants {
// public static String key_id="rzp_live_ySI5Ns54Y7qOcJ";
// public static String key_secret="Nwf1TjhUtaskof8vePkRR8Sb";
//uncomment for testing payment
public static String key_id="rzp_test_tDkHFEqWXmuEi8";
public static String key_secret="cBQUjMcKZ4J6vmOKSyNZ92py";
}

380
src/main/java/com/gcc/restapiservices/swimmingpool/controller/PoolApiController.java

@ -0,0 +1,380 @@
//package com.gcc.restapiservices.swimmingpool.controller;
//
//import com.gcc.restapiservices.configuration.AppConfig;
//import com.gcc.restapiservices.swimmingpool.constants.AppConstants;
//import com.gcc.restapiservices.swimmingpool.service.PoolService;
//import com.razorpay.Order;
//import com.razorpay.RazorpayClient;
//import com.razorpay.RazorpayException;
//import jakarta.servlet.http.HttpServletRequest;
//import org.json.JSONObject;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.dao.DataAccessException;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.bind.annotation.*;
//
//import java.time.LocalDate;
//import java.time.format.DateTimeFormatter;
//import java.time.format.DateTimeParseException;
//import java.util.List;
//import java.util.Map;
//
//
//@RequestMapping("/gccrestservices/api/swimmingpool")
//@RestController
//public class PoolApiController {
//
// @Autowired
// private PoolService poolService;
// @Autowired
// private AppConfig appConfig;
//
// @Autowired
// public AppConstants appConstants;
//
// @GetMapping("/slots")
// public ResponseEntity<?> getSlotsWithGender(
// @RequestParam String gender,
// @RequestParam("date") String date
// ) {
// // 1) validate gender up‐front
// if (!"1".equals(gender) && !"2".equals(gender)) {
// // returns 400 + { "message": "..." }
// return ResponseEntity
// .badRequest()
// .body(Map.of(
// "message",
// "Invalid gender: must be '2' (women) or '1' (men)"
// ));
// }
//
// try {
// // 2) validate date
// LocalDate.parse(date);
//
// // 3) run your normal query
// List<Map<String, Object>> slots = poolService.getSlotsWithGender(gender, date);
// return ResponseEntity.ok(slots);
//
// } catch (DateTimeParseException dtpe) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Invalid date format, expected YYYY-MM-DD"));
// } catch (DataAccessException dae) {
// return ResponseEntity
// .status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of("message", "Something went wrong on our end"));
// }
// }
//
// @GetMapping("/getBookedCountbySlot")
// public ResponseEntity<?> getBookedCountbySlot(
// @RequestParam("slotid") String slotid,
// @RequestParam("date") String date
// ) {
// try {
// // 1) Numeric check
// Integer.parseInt(slotid);
//
// // 2) Trim & parse with explicit ISO formatter
// String trimmed = date.trim();
// LocalDate.parse(trimmed, DateTimeFormatter.ISO_LOCAL_DATE);
//
// // 3) Safe to call the service
// List<Map<String,Object>> bookingDetails =
// poolService.getBookedCountbySlot(slotid, trimmed);
//
// return ResponseEntity.ok(bookingDetails);
//
// } catch (NumberFormatException nfe) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Invalid slotid: must be a number"));
//
// } catch (DateTimeParseException dtpe) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Invalid date format, expected YYYY-MM-DD"));
//
// } catch (DataAccessException dae) {
// return ResponseEntity
// .status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of("message", "Something went wrong on our end"));
// }
// }
//
//
// @GetMapping("/calculatePayment")
// public ResponseEntity<?> calculatePayment(
// @RequestParam("adultsCount") String adultsCountStr,
// @RequestParam("kidsCount") String kidsCountStr,
// @RequestParam(value = "bookingMode", defaultValue = "ONLINE")
// String bookingMode
// ) {
// int adultsCount, kidsCount;
// // 1) parse and validate counts
// try {
// adultsCount = Integer.parseInt(adultsCountStr);
// kidsCount = Integer.parseInt(kidsCountStr);
// } catch (NumberFormatException nfe) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "adultsCount and kidsCount must be integers"));
// }
//
// // 2) validate bookingMode
// if (!"ONLINE".equalsIgnoreCase(bookingMode)) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Invalid bookingMode: must be 'ONLINE'"));
// }
//
// // 3) delegate to service
// Map<String, Object> result = poolService.calculatePayment(adultsCount, kidsCount, bookingMode);
//
// // 4) if service signals an error, propagate as 400
// if (result.containsKey("error")) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", result.get("error")));
// }
//
// // 5) successful response
// return ResponseEntity.ok(result);
// }
//
//
// @PostMapping("/saveTempBooking")
// public ResponseEntity<?> saveTempBooking(
// // HttpServletRequest request,
// @RequestParam String name,
// @RequestParam String mobileNo,
// @RequestParam String noofadults,
// @RequestParam String noofkids,
// @RequestParam String slotfromdate,
// @RequestParam String slottodate,
// @RequestParam String totalAmount,
// @RequestParam String bookingtype,
// @RequestParam String slotorder,
// @RequestParam String poolId,
// @RequestParam String bookingMode
// ) {
// // 1) Required-field checks
// if (name.isBlank()) {
// return ResponseEntity.badRequest().body(Map.of("message", "Missing required parameter: name"));
// }
// if (mobileNo.isBlank()) {
// return ResponseEntity.badRequest().body(Map.of("message", "Missing required parameter: mobileNo"));
// }
//
// // 2) mobileNo must be digits and at least 10 characters
// if (!mobileNo.matches("\\d{10,}")) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Invalid mobileNo: must be at least 10 digits"));
// }
//
// // 3) Numeric-only checks
// if (!noofadults.matches("\\d+")) {
// return ResponseEntity.badRequest().body(Map.of("message", "Invalid noofadults: must be a whole number"));
// }
// if (!noofkids.matches("\\d+")) {
// return ResponseEntity.badRequest().body(Map.of("message", "Invalid noofkids: must be a whole number"));
// }
// if (!slotorder.matches("\\d+")) {
// return ResponseEntity.badRequest().body(Map.of("message", "Invalid slotorder: must be a whole number"));
// }
// if (!poolId.matches("\\d+")) {
// return ResponseEntity.badRequest().body(Map.of("message", "Invalid poolId: must be a whole number"));
// }
// if (!totalAmount.matches("\\d+(\\.\\d+)?")) {
// return ResponseEntity.badRequest().body(Map.of("message", "Invalid totalAmount: must be a number"));
// }
//
// // 4) Date format
// try {
// LocalDate.parse(slotfromdate);
// LocalDate.parse(slottodate);
// } catch (DateTimeParseException e) {
// return ResponseEntity.badRequest().body(Map.of("message", "Invalid date format, expected YYYY-MM-DD"));
// }
//
// // 5) Booking‐mode
// if (!List.of("ONLINE", "OFFLINE").contains(bookingMode.toUpperCase())) {
// return ResponseEntity.badRequest().body(Map.of("message", "Invalid bookingMode: must be ONLINE or OFFLINE"));
// }
//
// // 6) Delegate to service
// try {
// String tempId = poolService.saveBooking(
// name, mobileNo, noofadults, noofkids,
// slotfromdate, slottodate, totalAmount,
// bookingtype, slotorder, poolId, bookingMode
// );
// return ResponseEntity.ok(Map.of(
// "tempId", tempId,
// "message", "Your booking has been saved! Use this tempId to create your payment order."
// ));
// }
// catch (IllegalArgumentException iae) {
// // thrown by your service (e.g. mobile-too-long)
// return ResponseEntity.badRequest().body(Map.of("message", iae.getMessage()));
// }
// catch (DataAccessException dae) {
// return ResponseEntity
// .status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of("message", "Database error, please try again later"));
// }
// }
//
//
//// @PostMapping("/saveTempBooking")
//// public String saveTempBooking(HttpServletRequest request,
//// @RequestParam String name,
//// @RequestParam String mobileNo,
//// @RequestParam String noofadults,
//// @RequestParam String noofkids,
//// @RequestParam String slotfromdate,
//// @RequestParam String slottodate,
//// @RequestParam String totalAmount,
//// @RequestParam String bookingtype,
//// @RequestParam String slotorder,
//// @RequestParam String poolId,
//// @RequestParam String bookingMode) {
//// System.out.println("bookingMode: " + bookingMode);
//// return poolService.saveBooking(name,mobileNo,noofadults,noofkids,slotfromdate,slottodate,totalAmount,
//// bookingtype,slotorder,poolId,bookingMode).toString();
//// }
//
// @PostMapping("/create_order")
// public ResponseEntity<?> createOrder(@RequestParam("tempid") String tempid) {
// // 1) Validate tempid is numeric
// int id;
// try {
// id = Integer.parseInt(tempid);
// } catch (NumberFormatException nfe) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Invalid tempid: must be a number"));
// }
//
// // 2) Fetch the temp booking; if none, 404
// List<Map<String, Object>> tempBookingDetails = poolService.getTempBookingData(tempid);
// if (tempBookingDetails.isEmpty()) {
// return ResponseEntity
// .status(HttpStatus.NOT_FOUND)
// .body(Map.of("message", "No booking found for tempid: " + tempid));
// }
//
// // 3) Build and call Razorpay
// Map<String, Object> tempInfo = tempBookingDetails.get(0);
// String amountStr = tempInfo.get("total_amount").toString();
// double amount;
// try {
// amount = Double.parseDouble(amountStr);
// } catch (NumberFormatException nfe) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Stored total_amount is invalid: " + amountStr));
// }
//
// try {
// var client = new RazorpayClient(appConstants.key_id, appConstants.key_secret);
// JSONObject opts = new JSONObject()
// .put("amount", (int)(amount * 100))
// .put("currency", "INR");
// Order order = client.orders.create(opts);
// return ResponseEntity.ok(order.toString());
//
// } catch (RazorpayException re) {
// return ResponseEntity
// .status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of("message", "Failed to create Razorpay order", "error", re.getMessage()));
// }
// }
//
// @PostMapping("/Confirm")
// public ResponseEntity<?> confirmPayment(
// @RequestParam("id") String tempid,
// @RequestParam(name = "payment_id", required = false) String payId,
// @RequestParam("order_id") String orderId,
// @RequestParam("status") String status,
// @RequestParam(name = "source", defaultValue = "0") int source
// ) {
//
// if (source < 0 || source > 2) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message","Invalid source: must be 0 (web), 1 (counter) or 2 (whatsapp)"));
// }
//
// // 1) Required-param checks
// if (orderId.isBlank()) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Missing required parameter: order_id"));
// }
// if (status.isBlank()) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Missing required parameter: status"));
// }
//
// // 2) Numeric check on tempid
// int id;
// try {
// id = Integer.parseInt(tempid);
// } catch (NumberFormatException nfe) {
// return ResponseEntity
// .badRequest()
// .body(Map.of("message", "Invalid id: must be a number"));
// }
//
// // 3) Fetch the temp booking; 404 if not found
// List<Map<String, Object>> tempBookingDetails = poolService.getTempBookingData(tempid);
// if (tempBookingDetails.isEmpty()) {
// return ResponseEntity
// .status(HttpStatus.NOT_FOUND)
// .body(Map.of("message", "No booking found for id: " + tempid));
// }
//
// // 4) Delegate to service
// try {
// poolService.savePaymentInfo(
// tempid,
// /*booking_type*/ tempBookingDetails.get(0).get("booking_type").toString(),
// /*cdate*/ tempBookingDetails.get(0).get("cdate").toString(),
// /*mobile_no*/ tempBookingDetails.get(0).get("mobile_no").toString(),
// /*name*/ tempBookingDetails.get(0).get("name").toString(),
// /*no_of_adults*/ tempBookingDetails.get(0).get("no_of_adults").toString(),
// /*no_of_kids*/ tempBookingDetails.get(0).get("no_of_kids").toString(),
// /*pool_id*/ tempBookingDetails.get(0).get("pool_id").toString(),
// /*slot_from_date*/tempBookingDetails.get(0).get("slot_from_date").toString(),
// /*slot_order*/ tempBookingDetails.get(0).get("slot_order").toString(),
// /*slot_to_date*/ tempBookingDetails.get(0).get("slot_to_date").toString(),
// /*totalAmount*/ tempBookingDetails.get(0).get("total_amount").toString(),
// payId,
// orderId,
// status,
// /*paymentdate*/ tempBookingDetails.get(0).get("cdate").toString(),
// tempid,
// /*booking_mode*/ tempBookingDetails.get(0).getOrDefault("booking_mode", "ONLINE").toString(),
// source
// );
// return ResponseEntity.ok(Map.of(
// "message",
// "Your payment was successful and your booking is now confirmed! " +
// "You’ll receive the full details via WhatsApp and SMS shortly. " +
// "Please have your QR code ready at entry."
// ));
// } catch (Exception e) {
// // you could catch more specific exceptions if you want
// return ResponseEntity
// .status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body(Map.of("message", "Failed to confirm payment", "error", e.getMessage()));
// }
// }
//
//
//}

485
src/main/java/com/gcc/restapiservices/swimmingpool/controller/SwimmingPoolApiController.java

@ -0,0 +1,485 @@
package com.gcc.restapiservices.swimmingpool.controller;
import com.gcc.restapiservices.configuration.AppConfig;
import com.gcc.restapiservices.swimmingpool.constants.AppConstants;
import com.gcc.restapiservices.swimmingpool.service.SwimmingPoolService;
import com.gcc.restapiservices.swimmingpool.util.ApiResponse;
import com.razorpay.Order;
import com.razorpay.RazorpayClient;
import com.razorpay.RazorpayException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.util.*;
import java.util.stream.Collectors;
@RequestMapping("/gccrestservices/api/swimmingpool")
@RestController
public class SwimmingPoolApiController {
@Autowired
private SwimmingPoolService swimmingPoolService;
@Autowired
private AppConfig appConfig;
@Autowired
public AppConstants appConstants;
@GetMapping("/slots")
public ResponseEntity<?> getSlotsWithGender(
@RequestParam String gender,
@RequestParam("date") String date) {
// 1) validate gender up‐front
if (!"1".equals(gender) && !"2".equals(gender)) {
// returns 400 + { "message": "..." }
return ResponseEntity
.badRequest()
.body(Map.of(
"message",
"Invalid gender: must be '2' (women) or '1' (men)"
));
}
try {
// validate input date (still in yyyy-MM-dd format)
LocalDate parsedDate = LocalDate.parse(date, DateTimeFormatter.ISO_LOCAL_DATE);
// query DB with yyyy-MM-dd
List<Map<String, Object>> slots = swimmingPoolService.getSlotsWithGender(gender, date);
// format response as dd-MM-yyyy
String formattedDate = parsedDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
for (Map<String, Object> slot : slots) {
slot.put("slot_from_date", formattedDate);
}
return ResponseEntity.ok(slots);
} catch (DateTimeParseException dtpe) {
return ResponseEntity
.badRequest()
.body(Map.of("message", "Invalid date format, expected YYYY-MM-DD"));
} catch (DataAccessException dae) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Something went wrong"));
}
}
@GetMapping("/getBookedCountbySlot")
public ResponseEntity<?> getBookedCountbySlot(
@RequestParam("slotid") String slotid,
@RequestParam("date") String date) {
try {
Integer.parseInt(slotid);
String trimmed = date.trim();
LocalDate.parse(trimmed, DateTimeFormatter.ISO_LOCAL_DATE);
List<Map<String, Object>> bookingDetails =
swimmingPoolService.getBookedCountbySlot(slotid, trimmed);
return ResponseEntity.ok(bookingDetails);
} catch (NumberFormatException nfe) {
return ResponseEntity
.badRequest()
.body(Map.of("message", "Invalid slotid: must be a number"));
} catch (DateTimeParseException dtpe) {
return ResponseEntity
.badRequest()
.body(Map.of("message", "Invalid date format, expected YYYY-MM-DD"));
} catch (DataAccessException dae) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Something went wrong"));
}
}
@GetMapping("/getCountbydate")
public ResponseEntity<?> getBookedCountbySlot(
@RequestParam("date") LocalDate date,
@RequestParam(value = "slotid", required = false) String slotid,
@RequestParam(value = "gender", required = false) String gender
) {
// 0) Validate date
LocalDate today;
LocalDate parsedDate;
try {
today = LocalDate.now();
parsedDate = LocalDate.parse(date.toString(), DateTimeFormatter.ISO_LOCAL_DATE);
} catch (DateTimeParseException e) {
return ResponseEntity.badRequest()
.body(Map.of("message","Invalid date format, expected YYYY-MM-DD"));
}
// 1) Validate optional params
if (slotid != null && !slotid.isBlank() && !slotid.matches("\\d+")) {
return ResponseEntity.badRequest()
.body(Map.of("message","Invalid slotid: must be a number"));
}
if (gender != null && !gender.isBlank()) {
gender = gender.trim().toLowerCase();
if (!gender.equals("men") && !gender.equals("women")) {
return ResponseEntity.badRequest()
.body(Map.of("message","Invalid gender: must be 'men' or 'women'"));
}
}
// Women only at slot 4; if they asked for another slot + women:
if ("women".equals(gender)
&& slotid != null && !slotid.isBlank()
&& !"4".equals(slotid)) {
String msg = String.format(
"Women slots are only available for slotid 4, not slotid %s",
slotid
);
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(Map.of("message", msg));
}
// 2) Fetch all availabilities
List<Map<String,Object>> slots =
swimmingPoolService.getAvailabilityByDate(parsedDate);
// 3) Filter by slotid if present
if (slotid != null && !slotid.isBlank()) {
slots = slots.stream()
.filter(m -> slotid.equals(m.get("slot_order").toString()))
.collect(Collectors.toList());
}
// 4) If today, drop past slots
if (parsedDate.equals(today)) {
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("h:mm a")
.toFormatter(Locale.ENGLISH)
.withResolverStyle(ResolverStyle.SMART);
LocalTime now = LocalTime.now();
slots = slots.stream()
.filter(m -> {
String start = ((String)m.get("slot_timing"))
.split("\\s*-\\s*")[0].trim();
try {
return LocalTime.parse(start, fmt).isAfter(now);
} catch (DateTimeParseException ex) {
return true;
}
})
.collect(Collectors.toList());
}
// 5) Filter by gender if present
if (gender != null && !gender.isBlank()) {
String finalGender = gender;
slots = slots.stream()
.filter(m -> finalGender.equalsIgnoreCase((String)m.get("gender")))
.collect(Collectors.toList());
}
// 6) If still empty, generic 404
if (slots.isEmpty()) {
String msg;
if (slotid != null && !slotid.isBlank()) {
msg = String.format(
"No slots available for slot %s%s on %s",
slotid,
(gender!=null? " and gender="+gender : ""),
date
);
} else {
msg = String.format(
"No slots available%s on %s",
(gender!=null? " for gender="+gender : ""),
date
);
}
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(Map.of("message", msg));
}
// 7) Otherwise OK
return ResponseEntity.ok(slots);
}
@GetMapping("/calculatePayment")
public ResponseEntity<?> calculatePayment(
@RequestParam("adultsCount") String adultsCountStr,
@RequestParam("kidsCount") String kidsCountStr,
@RequestParam(value = "bookingMode", defaultValue = "ONLINE")
String bookingMode) {
int adultsCount, kidsCount;
// 1) parse and validate counts
try {
adultsCount = Integer.parseInt(adultsCountStr);
kidsCount = Integer.parseInt(kidsCountStr);
} catch (NumberFormatException nfe) {
return ResponseEntity
.badRequest()
.body(Map.of("message", "adultsCount and kidsCount must be integers"));
}
// 2) validate bookingMode
if (!"ONLINE".equalsIgnoreCase(bookingMode)) {
return ResponseEntity
.badRequest()
.body(Map.of("message", "Invalid bookingMode: must be 'ONLINE'"));
}
// 3) delegate to service
Map<String, Object> result = swimmingPoolService.calculatePayment(adultsCount, kidsCount, bookingMode);
// 4) if service signals an error, propagate as 400
if (result.containsKey("error")) {
return ResponseEntity
.badRequest()
.body(Map.of("message", result.get("error")));
}
// 5) successful response
return ResponseEntity.ok(result);
}
@PostMapping("/saveTempBooking")
public ResponseEntity<?> saveTempBooking(
HttpServletRequest request,
@RequestParam String name,
@RequestParam String mobileNo,
@RequestParam String noofadults,
@RequestParam String noofkids,
@RequestParam String slotfromdate,
@RequestParam String slottodate,
@RequestParam String totalAmount,
@RequestParam String bookingtype,
@RequestParam String slotorder,
@RequestParam String poolId,
@RequestParam String bookingMode) {
// 1) Required-field checks
if (name.isBlank()) {
return ResponseEntity.badRequest().body(Map.of("message", "Missing required parameter: name"));
}
if (mobileNo.isBlank()) {
return ResponseEntity.badRequest().body(Map.of("message", "Missing required parameter: mobileNo"));
}
// 2) mobileNo must be digits and at least 10 characters
if (!mobileNo.matches("\\d{10,}")) {
return ResponseEntity
.badRequest()
.body(Map.of("message", "Invalid mobileNo: must be at least 10 digits"));
}
// 3) Numeric-only checks
if (!noofadults.matches("\\d+")) {
return ResponseEntity.badRequest().body(Map.of("message", "Invalid noofadults: must be a whole number"));
}
if (!noofkids.matches("\\d+")) {
return ResponseEntity.badRequest().body(Map.of("message", "Invalid noofkids: must be a whole number"));
}
if (!slotorder.matches("\\d+")) {
return ResponseEntity.badRequest().body(Map.of("message", "Invalid slotorder: must be a whole number"));
}
if (!poolId.matches("\\d+")) {
return ResponseEntity.badRequest().body(Map.of("message", "Invalid poolId: must be a whole number"));
}
if (!totalAmount.matches("\\d+(\\.\\d+)?")) {
return ResponseEntity.badRequest().body(Map.of("message", "Invalid totalAmount: must be a number"));
}
// 4) Date format
try {
LocalDate.parse(slotfromdate);
LocalDate.parse(slottodate);
} catch (DateTimeParseException e) {
return ResponseEntity.badRequest().body(Map.of("message", "Invalid date format, expected YYYY-MM-DD"));
}
// 5) Booking‐mode
if (!List.of("ONLINE", "OFFLINE").contains(bookingMode.toUpperCase())) {
return ResponseEntity.badRequest().body(Map.of("message", "Invalid bookingMode: must be ONLINE or OFFLINE"));
}
// 6) Delegate to service
try {
String tempId = swimmingPoolService.saveBooking(
name, mobileNo, noofadults, noofkids,
slotfromdate, slottodate, totalAmount,
bookingtype, slotorder, poolId, bookingMode
);
return ResponseEntity.ok(Map.of(
"tempId", tempId,
"message", "Your booking has been saved! Use this tempId to create your payment order."
));
} catch (IllegalArgumentException iae) {
// thrown by your service (e.g. mobile-too-long)
return ResponseEntity.badRequest().body(Map.of("message", iae.getMessage()));
} catch (DataAccessException dae) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Database error, please try again later"));
}
}
@PostMapping("/create_order")
public ResponseEntity<?> createOrder(@RequestParam("tempid") String tempid) {
try {
Map<String, Object> tempBookingDetails = swimmingPoolService.getTempBookingData(tempid);
if (tempBookingDetails != null && !tempBookingDetails.isEmpty()) {
String tempbookid = tempBookingDetails.get("temp_id").toString();
String amount = tempBookingDetails.get("total_amount").toString();
double amountDouble = 0.0;
try {
amountDouble = Double.parseDouble(amount);
} catch (NumberFormatException e) {
return new ResponseEntity<>(new ApiResponse("error", "Invalid amount format", null, HttpStatus.BAD_REQUEST.value()), HttpStatus.BAD_REQUEST);
}
// Razorpay order creation
var client = new RazorpayClient(appConstants.key_id, appConstants.key_secret);
JSONObject options = new JSONObject();
options.put("amount", amountDouble * 100);
options.put("currency", "INR");
Order od = client.orders.create(options);
swimmingPoolService.saveorderLog(od.get("id").toString(), od.toString(), tempbookid);
return ResponseEntity.ok(new ApiResponse("success", "Order created successfully", od.toJson().toMap(), HttpStatus.OK.value()));
} else {
return new ResponseEntity<>(new ApiResponse("error", "No data found for tempid: " + tempid, null, HttpStatus.NOT_FOUND.value()), HttpStatus.NOT_FOUND);
}
} catch (RazorpayException e) {
return new ResponseEntity<>(new ApiResponse("error", "Razorpay error: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
} catch (Exception e) {
return new ResponseEntity<>(new ApiResponse("error", "Unexpected error: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@PostMapping("/Confirm")
public ResponseEntity<?> confirmPayment(
@RequestParam("id") String tempid,
@RequestParam(name = "source", defaultValue = "0") int source,
@RequestParam String orderid,
@RequestBody Map<String, Object> paymentResponse) {
try {
return swimmingPoolService.processPaymentConfirmation(tempid, source, orderid, paymentResponse);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Failed to confirm payment", "error", e.getMessage()));
}
}
@GetMapping("/getbookings")
public ResponseEntity<?> getBookingByMobileNo(@RequestParam(value = "mobileNo", required = false) String mobileNo) {
if (mobileNo == null || mobileNo.trim().isEmpty()) {
Map<String, String> errorResponse = new HashMap<>();
errorResponse.put("status", "error");
errorResponse.put("message", "Missing required parameter: mobileNo");
return ResponseEntity.badRequest().body(errorResponse);
}
if (!mobileNo.matches("\\d{10,}")) {
Map<String, String> errorResponse = new HashMap<>();
errorResponse.put("status", "error");
errorResponse.put("message", "Invalid mobile number. It should be at least 10 digits.");
return ResponseEntity.badRequest().body(errorResponse);
}
long mobile = Long.parseLong(mobileNo);
List<Map<String, Object>> bookings = swimmingPoolService.getBookingByMobileNo(mobile);
if (bookings.isEmpty()) {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(Map.of(
"status", "error",
"message", "No bookings found for mobileNo: " + mobileNo
));
}
return ResponseEntity.ok(bookings);
}
@GetMapping(value = "/sendOTP")
public ResponseEntity<Map<String, Object>> sendOtp(HttpServletRequest request, @RequestParam String mobileNo) {
Map<String, Object> response = new HashMap<>();
if (mobileNo == null || mobileNo.isBlank()) {
response.put("status","error");
response.put("message","Missing required parameter: mobileNo");
return ResponseEntity.badRequest().body(response);
}
if (!mobileNo.matches("\\d{10}")) {
response.put("status", "error");
response.put("message", "Invalid mobile number. It should be 10 digits.");
return ResponseEntity.badRequest().body(response);
}
List<?> bookingDetailsList = swimmingPoolService.findByMobileNo(Long.parseLong(mobileNo));
if (bookingDetailsList == null || bookingDetailsList.isEmpty()) {
response.put("status", "error");
response.put("message", "This number is not registered.");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
}
int otp = new Random().nextInt(90000) + 10000;
String generatedToken = "Welcome to GCC! Your OTP for GCC Swimming Pool booking is " + otp;
String key = "pfTEYN6H";
String urlString = appConfig.getGetOtpUrl() + "from=GCCCRP&key=" + key + "&sender=GCCCRP&to=" + mobileNo
+ "&body=" + generatedToken + "&entityid=1401572690000011081&templateid=1407172681010820867";
String bodyMessage;
try {
RestTemplate restTemplate = new RestTemplate();
bodyMessage = restTemplate.getForObject(urlString, String.class);
} catch (Exception e) {
response.put("status", "error");
response.put("message", "Failed to send OTP. Please try again.");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
// Save OTP in session
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
session.setAttribute("mobileNo", mobileNo);
// Prepare response
response.put("status", "success");
response.put("message", "OTP sent successfully");
response.put("otp", otp);
// response.put("smsApiResponse", bodyMessage);
return ResponseEntity.ok(response);
}
}

525
src/main/java/com/gcc/restapiservices/swimmingpool/service/PoolService.java

@ -0,0 +1,525 @@
//package com.gcc.restapiservices.swimmingpool.service;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.dao.DataAccessException;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.jdbc.core.PreparedStatementCreator;
//import org.springframework.jdbc.support.GeneratedKeyHolder;
//import org.springframework.jdbc.support.KeyHolder;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.client.RestTemplate;
//
//
//import javax.sql.DataSource;
//import java.net.HttpURLConnection;
//import java.net.URL;
//import java.sql.Connection;
//import java.sql.Date;
//import java.sql.PreparedStatement;
//import java.sql.SQLException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.function.Function;
//
//@Service
//@Configuration
//public class PoolService {
// private JdbcTemplate jdbcTemplate;
// @Autowired
// private RestTemplate restTemplate;
//
// @Autowired
// public void setDataSource(@Qualifier("mysqlSwimmingpoolDataSource") DataSource activityDataSource) {
// // Initialize JdbcTemplate with the correct DataSource
// this.jdbcTemplate = new JdbcTemplate(activityDataSource);
// }
//
// public List<Map<String,Object>> getSlotsWithGender(String gender, String date) {
// String sql = " SELECT " +
// " st.slot_timing AS time, " +
// " CASE WHEN st.gender_avail = '1' THEN 'men' ELSE 'women' END AS gender, " +
// " st.id AS value, " +
// " ? AS slot_from_date " +
// " FROM slot_timing st " +
// " LEFT JOIN booking_details b " +
// " ON b.slot_order = st.slot_order " +
// " AND b.slot_from_date = ? " +
// " AND b.is_active = 1 " +
// " AND b.is_delete = 0 " +
// " WHERE st.gender_avail = ? " +
// " GROUP BY " +
// " st.slot_timing, st.gender_avail, st.id " +
// " ORDER BY st.id";
//
// return jdbcTemplate.queryForList(sql, date, date, gender);
// }
//
//
//
// public List<Map<String, Object>> getBookedCountbySlot(String slotid, String date) {
// String sqlQuery = " SELECT "
// + " b.slot_from_date, "
// + " st.slot_timing, "
// + " CASE "
// + " WHEN b.slot_order = '4' THEN 'women' "
// + " ELSE 'men' "
// + " END AS gender, "
// + " 200 AS total_capacity, "
// + " 200 - (COALESCE(SUM(b.no_of_kids), 0) + COALESCE(SUM(b.no_of_adults), 0)) AS available_slots, "
// + " (COALESCE(SUM(b.no_of_kids), 0) + COALESCE(SUM(b.no_of_adults), 0)) AS booked_slots "
// + " FROM "
// + " booking_details b "
// + " JOIN "
// + " slot_timing st ON b.slot_order = st.slot_order "
// + " WHERE "
// + " b.is_active = 1 "
// + " AND b.is_delete = 0 "
// + " AND b.slot_from_date = ? "
// + " AND b.slot_order = ? "
// + " GROUP BY "
// + " b.slot_from_date, "
// + " b.slot_order, "
// + " st.slot_timing ";
//
// System.out.println(sqlQuery);
//
// List<Map<String, Object>> bookingDetails = jdbcTemplate.queryForList(sqlQuery, date, slotid);
//
// // If no data is returned, create a default response with 0 values
// if (bookingDetails.isEmpty()) {
// Map<String, Object> defaultData = new HashMap<>();
// defaultData.put("slot_from_date", date);
// defaultData.put("slot_timing", "Not Available"); // Set a default value for slot_timing
// defaultData.put("slot_order", slotid);
// defaultData.put("total_capacity", 200); // Set total capacity to 200
// defaultData.put("available_slots", 200); // If no bookings, all slots are available
// defaultData.put("booked_slots", 0); // No slots booked if no data
// bookingDetails.add(defaultData);
// }
//
// return bookingDetails;
// }
//
//
// public Map<String, Object> calculatePayment(int adultsCount, int kidsCount, String bookingMode) {
// int adultRate = 0;
// int kidRate = 0;
//
// // Rates based on booking mode
// if ("ONLINE".equalsIgnoreCase(bookingMode)) {
// adultRate = 45;
// kidRate = 25;
// } else {
// // Return an error response if booking mode is invalid
// Map<String, Object> errorResponse = new HashMap<>();
// errorResponse.put("error", "Invalid booking mode");
// return errorResponse;
// }
//
// // Calculate total amount
// int totalAdultsAmount = adultsCount * adultRate;
// int totalKidsAmount = kidsCount * kidRate;
// int totalAmount = totalAdultsAmount + totalKidsAmount;
//
// // Prepare the response map
// Map<String, Object> response = new HashMap<>();
// response.put("adultsCount", adultsCount);
// response.put("kidsCount", kidsCount);
// response.put("totalAdultsAmount", totalAdultsAmount);
// response.put("totalKidsAmount", totalKidsAmount);
// response.put("totalAmount", totalAmount);
//
// return response;
// }
//
// public String saveBooking(
// String name,
// String mobileNo,
// String noofadults,
// String noofkids,
// String slotfromdate,
// String slottodate,
// String totalAmount,
// String bookingtype,
// String slotorder,
// String poolId,
// String bookingMode) {
//
// // helper to take everything before the first comma
// Function<String, String> firstData = s -> {
// if (s == null) return null;
// int idx = s.indexOf(',');
// return idx < 0 ? s.trim() : s.substring(0, idx).trim();
// };
//
// // sanitize EVERY incoming param
// name = firstData.apply(name);
// mobileNo = firstData.apply(mobileNo);
// noofadults = firstData.apply(noofadults);
// noofkids = firstData.apply(noofkids);
// slotfromdate = firstData.apply(slotfromdate);
// slottodate = firstData.apply(slottodate);
// totalAmount = firstData.apply(totalAmount);
// bookingtype = firstData.apply(bookingtype);
// slotorder = firstData.apply(slotorder);
// poolId = firstData.apply(poolId);
// bookingMode = firstData.apply(bookingMode);
//
// if (mobileNo.length() > 20) {
// throw new IllegalArgumentException("Mobile number too long: " + mobileNo);
// }
//
// // parse the numeric/date fields
// int adultsCount = Integer.parseInt(noofadults);
// int kidsCount = Integer.parseInt(noofkids);
// int pool = Integer.parseInt(poolId);
// java.sql.Date fromDate = java.sql.Date.valueOf(slotfromdate);
// java.sql.Date toDate = java.sql.Date.valueOf(slottodate);
//
// String sql = " INSERT INTO temp_booking_details( booking_type, mobile_no, name, no_of_adults, no_of_kids, pool_id, slot_from_date, slot_order, slot_to_date, total_amount, booking_mode) VALUES (?,?,?,?,?,?,?,?,?,?,?) ";
//
// KeyHolder keyHolder = new GeneratedKeyHolder();
// String finalBookingtype = bookingtype;
// String finalMobileNo = mobileNo;
// String finalName = name;
// String finalSlotorder = slotorder;
// String finalTotalAmount = totalAmount;
// String finalBookingMode = bookingMode;
// int rows = jdbcTemplate.update(con -> {
// PreparedStatement ps = con.prepareStatement(sql, new String[]{"temp_id"});
// ps.setString(1, finalBookingtype);
// ps.setString(2, finalMobileNo);
// ps.setString(3, finalName);
// ps.setInt (4, adultsCount);
// ps.setInt (5, kidsCount);
// ps.setInt (6, pool);
// ps.setDate (7, fromDate);
// ps.setString(8, finalSlotorder);
// ps.setDate (9, toDate);
// ps.setString(10, finalTotalAmount);
// ps.setString(11, finalBookingMode);
// return ps;
// }, keyHolder);
//
// if (rows == 0) {
// throw new RuntimeException("Insert returned 0 rows affected");
// }
// return keyHolder.getKey().toString();
// }
//
// public List<Map<String, Object>> getTempBookingData(String tempid) {
// String sqlQuery = "SELECT * FROM temp_booking_details WHERE temp_id='"+tempid+"'";
// List<Map<String, Object>> tempBookingDetails = jdbcTemplate.queryForList(sqlQuery);
// return tempBookingDetails;
// }
//
// public String savePaymentInfo(
// String tempId,
// String booking_type,
// String cdate,
// String mobile_no,
// String name,
// String no_of_adults,
// String no_of_kids,
// String pool_id,
// String slot_from_date,
// String slot_order,
// String slot_to_date,
// String totalAmount,
// String payment_id,
// String payment_orderid,
// String payment_status,
// String paymentdate,
// String uniqueid,
// String booking_mode,
// int source ) {
//
// String lastInsertId = "0";
//
// String sqlQuery = "INSERT INTO `payment`(`amount`, `mobno`, `order_id`, `payment_id`, `payment_status`, `paymentdate`, `uniqueid`) "
// + "VALUES (?,?,?,?,?,?,?)";
//
// KeyHolder keyHolder = new GeneratedKeyHolder();
//
// try {
// int affectedRows = jdbcTemplate.update(new PreparedStatementCreator() {
// @Override
// public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
// PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"temp_id"});
// ps.setString(1, totalAmount);
// ps.setString(2, mobile_no);
// ps.setString(3, payment_orderid);
// ps.setString(4, payment_id);
// ps.setString(5, payment_status);
// ps.setString(6, paymentdate);
// ps.setString(7, uniqueid);
// return ps;
// }
// }, keyHolder);
//
// if (affectedRows > 0) {
// Number generatedId = keyHolder.getKey();
// lastInsertId = generatedId.toString();
//
// lastInsertId = saveBookingInfo(tempId, booking_type, cdate, mobile_no,
// name,
// no_of_adults,
// no_of_kids,
// pool_id,
// slot_from_date,
// slot_order,
// slot_to_date,
// totalAmount,
// payment_id,
// payment_orderid,
// payment_status,
// paymentdate,
// uniqueid,
// booking_mode,
// source);
//
//
// // Define the time slots in Java
// List<Map<String, Object>> daySlots = new ArrayList<>();
//
// daySlots.add(Map.of("time", "5:30 AM - 6:30 AM", "gender", "men", "value", 0));
// daySlots.add(Map.of("time", "5:30 AM - 6:30 AM", "gender", "men", "value", 1));
// daySlots.add(Map.of("time", "6:30 AM - 7:30 AM", "gender", "men", "value", 2));
// daySlots.add(Map.of("time", "7:30 AM - 8:30 AM", "gender", "men", "value", 3));
// daySlots.add(Map.of("time", "8:30 AM - 9:30 AM", "gender", "women", "value", 4));
// daySlots.add(Map.of("time", "9:30 AM - 10:30 AM", "gender", "men", "value", 5));
// daySlots.add(Map.of("time", "10:30 AM - 11:30 AM", "gender", "men", "value", 6));
// daySlots.add(Map.of("time", "11:30 AM - 12:30 PM", "gender", "men", "value", 7));
// daySlots.add(Map.of("time", "12:30 PM - 1:30 PM", "gender", "men", "value", 8));
// daySlots.add(Map.of("time", "1:30 PM - 2:30 PM", "gender", "men", "value", 9));
// daySlots.add(Map.of("time", "2:30 PM - 3:30 PM", "gender", "men", "value", 10));
// daySlots.add(Map.of("time", "3:30 PM - 4:30 PM", "gender", "men", "value", 11));
// daySlots.add(Map.of("time", "4:30 PM - 5:30 PM", "gender", "men", "value", 12));
// daySlots.add(Map.of("time", "5:30 PM - 6:30 PM", "gender", "men", "value", 13));
// daySlots.add(Map.of("time", "6:30 PM - 7:30 PM", "gender", "men", "value", 14));
//
// // Convert the list to an array
// Map<String, Object>[] slotArray = daySlots.toArray(new Map[0]);
//
// // Access the element in the array
// int slotOrder = Integer.parseInt(slot_order);
// Map<String, Object> slot = slotArray[slotOrder]; // Index 1 (second element)
// String time = (String) slot.get("time");
// String gender = (String) slot.get("gender");
//
//
// int adult = Integer.parseInt(no_of_adults);
// int kids = Integer.parseInt(no_of_kids);
// int totalCount = adult + kids;
// String count = String.valueOf(totalCount);
//
// //balaji
// //sendWhatsapp("h2YjFNcJ", mobile_no, slot_from_date, time, count, totalAmount,payment_orderid);
// //System.out.println(mobile_no);
// //"9444173345"
// sendWhatsapp("h2YjFNcJ",mobile_no, slot_from_date, time, count, totalAmount,payment_orderid);
// sendSMS("h2YjFNcJ", mobile_no, slot_from_date, time, count, totalAmount,payment_orderid);
//
// } else {
// System.out.println("Error on temp save!");
// }
// } catch (DataAccessException e) {
// System.out.println("Data Access Exception:");
// Throwable rootCause = e.getMostSpecificCause();
// if (rootCause instanceof SQLException) {
// SQLException sqlException = (SQLException) rootCause;
// System.out.println("SQL State: " + sqlException.getSQLState());
// System.out.println("Error Code: " + sqlException.getErrorCode());
// System.out.println("Message: " + sqlException.getMessage());
// } else {
// System.out.println("Message: " + rootCause.getMessage());
// }
// }
//
// return lastInsertId;
// }
//
// public String saveBookingInfo(
// String tempId,
// String booking_type,
// String cdate,
// String mobile_no,
// String name,
// String no_of_adults,
// String no_of_kids,
// String pool_id,
// String slot_from_date,
// String slot_order,
// String slot_to_date,
// String totalAmount,
// String payment_id,
// String payment_orderid,
// String payment_status,
// String paymentdate,
// String uniqueid,
// String booking_mode,
// int source) {
//
// String lastInsertId = "0";
//
// String sqlQuery = "INSERT INTO `booking_details`(`booking_mode`, `booking_type`, `cdate`, "
// + "`mobile_no`, `name`, `no_of_adults`, `no_of_kids`, `pool_id`, `slot_from_date`, "
// + "`slot_order`, `slot_to_date`, `total_amount`,`orderid`, `adults_remaining`,`kids_remaining`,`source`) "
// + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
//
// KeyHolder keyHolder = new GeneratedKeyHolder();
// System.out.println("booking_mode:" + booking_mode);
// try {
// int affectedRows = jdbcTemplate.update(new PreparedStatementCreator() {
// @Override
// public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
// PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"});
// ps.setString(1, booking_mode);
// ps.setString(2, booking_type);
// ps.setString(3, cdate);
// ps.setString(4, mobile_no);
// ps.setString(5, name);
// ps.setString(6, no_of_adults);
// ps.setString(7, no_of_kids);
// ps.setString(8, pool_id);
// ps.setString(9, slot_from_date);
// ps.setString(10, slot_order);
// ps.setString(11, slot_to_date);
// ps.setString(12, totalAmount);
// ps.setString(13, payment_orderid);
// ps.setString(14, no_of_adults);
// ps.setString(15, no_of_kids);
// ps.setString(16, String.valueOf(source));
// return ps;
// }
// }, keyHolder);
//
// if (affectedRows > 0) {
// Number generatedId = keyHolder.getKey();
// lastInsertId = generatedId.toString();
// } else {
// System.out.println("Error on temp save!");
// }
// } catch (DataAccessException e) {
// System.out.println("Data Access Exception:");
// Throwable rootCause = e.getMostSpecificCause();
// if (rootCause instanceof SQLException) {
// SQLException sqlException = (SQLException) rootCause;
// System.out.println("SQL State: " + sqlException.getSQLState());
// System.out.println("Error Code: " + sqlException.getErrorCode());
// System.out.println("Message: " + sqlException.getMessage());
// } else {
// System.out.println("Message: " + rootCause.getMessage());
// }
// }
//
// return lastInsertId;
// }
//
// public String sendWhatsapp(String password, String mobileno,String date, String slot, String count, String amount, String orderid) {
// System.out.println("trying send whatsapp to :"+ mobileno);
//
// String[] parts = slot.split("-");
//
// // Trim the parts to remove leading and trailing spaces
// String startTime = parts[0].trim();
// String endTime = parts[1].trim();
// // Manually replace characters in startTime and endTime to URL-encoded equivalents
// String formattedStartTime = startTime.replace(":", "%3A").replace(" ", "+");
// String formattedEndTime = endTime.replace(":", "%3A").replace(" ", "+");
//
// String tamilurl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+mobileno+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%BE%E0%AE%A9+%E0%AE%B5%E0%AE%BE%E0%AE%9F%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%B3%E0%AE%B0%E0%AF%87%2C+%0A%E0%AE%AA%E0%AF%86%E0%AE%B0%E0%AF%81%E0%AE%A8%E0%AE%95%E0%AE%B0+%E0%AE%9A%E0%AF%86%E0%AE%A9%E0%AF%8D%E0%AE%A9%E0%AF%88+%E0%AE%AE%E0%AE%BE%E0%AE%A8%E0%AE%95%E0%AE%B0%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9A%E0%AE%BF+%E0%AE%A4%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%88+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AF%81%E0%AE%9F%E0%AE%A9%E0%AF%8D+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BF%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AE%A4%E0%AF%81.++%0A%0A%E0%AE%8E%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AE%A4%E0%AF%81+%E0%AE%AE%E0%AF%86%E0%AE%B0%E0%AE%BF%E0%AE%A9%E0%AE%BE++%E0%AE%A8%E0%AF%80%E0%AE%9A%E0%AF%8D%E0%AE%9A%E0%AE%B2%E0%AF%8D++%E0%AE%95%E0%AF%81%E0%AE%B3%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%A9%E0%AF%88+"+count+"+%E0%AE%8E%E0%AE%A3%E0%AF%8D%E0%AE%A3%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88+%E0%AE%A8%E0%AE%AA%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%81%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%81+"+date+"+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AF%81+++%E0%AE%A8%E0%AF%87%E0%AE%B0+%E0%AE%87%E0%AE%9F%E0%AF%88%E0%AE%B5%E0%AF%86%E0%AE%B3%E0%AE%BF+"+formattedStartTime+"+-+"+formattedEndTime+"++%E0%AE%B2%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%8A%E0%AE%B3%E0%AF%8D%E0%AE%B3+%E0%AE%AE%E0%AF%81%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%A4%E0%AE%BF%E0%AE%B5%E0%AF%81+%E0%AE%9A%E0%AF%86%E0%AE%AF%E0%AF%8D%E0%AE%A4%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AF%80%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D.+%0A%E0%AE%87%E0%AE%A4%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BE%E0%AE%A9+%E0%AE%95%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A3%E0%AE%AE%E0%AF%8D+%2A%E0%AE%B0%E0%AF%82%2A.+"+amount+"+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AE%A4%E0%AF%81.++%0A%0A%E0%AE%87%E0%AE%A9%E0%AE%BF%E0%AE%AE%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%A9+%E0%AE%A8%E0%AF%80%E0%AE%9A%E0%AF%8D%E0%AE%9A%E0%AE%B2%E0%AF%8D+%E0%AE%85%E0%AE%A9%E0%AF%81%E0%AE%AA%E0%AE%B5%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%A9%E0%AF%88+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AF%8D%E0%AE%B1%E0%AF%81+%E0%AE%AE%E0%AE%95%E0%AE%BF%E0%AE%B4%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D%F0%9F%98%8A%0A%0A%E0%AE%A8%E0%AF%81%E0%AE%B4%E0%AF%88%E0%AE%B5%E0%AE%BE%E0%AE%AF%E0%AE%BF%E0%AE%B2%E0%AE%BF%E0%AE%B2%E0%AF%8D+%E0%AE%89%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+QR+%E0%AE%95%E0%AF%81%E0%AE%B1%E0%AE%BF%E0%AE%AF%E0%AF%80%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%88+%E0%AE%95%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D%F0%9F%91%87&isTemplate=true&buttonUrlParam=swimmingpool%2FbookingQRCode%3Forderid%3D"+orderid;
// //bookingQRCode?orderid=order_P6UOll7Kn1UfrV
// String response = restTemplate.getForObject(tamilurl, String.class);
// System.out.println("response: "+ response);
//
// try{
// HttpURLConnection connection =null;
//
// URL url = new URL(tamilurl);
// connection = (HttpURLConnection) url.openConnection();
// connection.setRequestMethod("GET");
//
// int responseCode = connection.getResponseCode();
// response=responseCode+"";
// System.out.println("Response Code: " + responseCode);
//
// }catch (Exception e){
// e.printStackTrace();
// }
// sendenglishWhatsapp(password, mobileno,date, slot, count, amount, orderid);
// return response;
// }
//
// public String sendenglishWhatsapp(String password, String mobileno,String date, String slot, String count, String amount, String orderid) {
// System.out.println("trying send whatsapp to :"+ mobileno);
//
// String[] parts = slot.split("-");
//
// // Trim the parts to remove leading and trailing spaces
// String startTime = parts[0].trim();
// String endTime = parts[1].trim();
// // Manually replace characters in startTime and endTime to URL-encoded equivalents
// String formattedStartTime = startTime.replace(":", "%3A").replace(" ", "+");
// String formattedEndTime = endTime.replace(":", "%3A").replace(" ", "+");
//
// String tamilurl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password="+password+"&send_to="+mobileno+"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Dear+Patron+%2C+%0AWelcome+to+Greater+Chennai+Corporation.++%0A%0AYou+have+booked+our+Marina+swimming+pool+for+"+count+"+number+of+persons+on+"+date+"+at+time+slot+"+formattedStartTime+"+-+"+formattedEndTime+"+.%0AThe+fee+for+the+slot+is+%2ARs%2A.+"+amount+"+received.+%0A%0AEnjoy+a+pleasant+swimming+experience%F0%9F%98%8A%0A%0APlease+show+your+QR+Code+at+Entrance%F0%9F%91%87&isTemplate=true&buttonUrlParam=swimmingpool%2FbookingQRCode%3Forderid%3D"+orderid;
// //bookingQRCode?orderid=order_P6UOll7Kn1UfrV
// String response = restTemplate.getForObject(tamilurl, String.class);
// System.out.println("response: "+ response);
//
// try{
// HttpURLConnection connection =null;
//
// URL url = new URL(tamilurl);
// connection = (HttpURLConnection) url.openConnection();
// connection.setRequestMethod("GET");
//
// int responseCode = connection.getResponseCode();
// response=responseCode+"";
// System.out.println("Response Code: " + responseCode);
//
// }catch (Exception e){
// e.printStackTrace();
// }
//
// return response;
// }
//
// public String sendSMS(String password, String mobileno,String date, String slot, String count, String amount, String orderid) {
//
// String note="";
// String[] parts = slot.split("-");
//
// // Trim the parts to remove leading and trailing spaces
// String startTime = parts[0].trim();
// String endTime = parts[1].trim();
//
// String SMSTEXT = "அன்பான வாடிக்கையாளரே, பெருநகர சென்னை மாநகராட்சி தங்களை அன்புடன் வரவேற்கின்றது. எங்களது மெரினா நீச்சல் குளத்தினை "+count+" எண்ணிக்கை நபர்களுக்கு "+date+" அன்று நேர இடைவெளி "+startTime+" முதல் "+endTime+" வரை பயன்படுத்திக்கொள்ள முன்பதிவு செய்துள்ளீர்கள். இதற்கான கட்டணம் ரூ. "+amount+" பெறப்பட்டுள்ளது. இனிமையான நீச்சல் அனுபவத்தினை பெற்று மகிழுங்கள். "+note+" நுழைவாயிலில் உங்கள் QR குறியீட்டை காட்டுங்கள்";
//
// String urlString="https://tmegov.onex-aura.com/api/sms?key=mRSm0zym&to="+mobileno+"&from=GCCCRP&body="+SMSTEXT+"&entityid=1401572690000011081&templateid=1407172667016050918";
// //System.out.println(urlString);
//
// RestTemplate restTemplate = new RestTemplate();
// String Response = restTemplate.getForObject(urlString, String.class);
//
// String SMSEnglish = "Dear Patron, Welcome to Greater Chennai Corporation. You have booked our Marina swimming pool for "+count+" Nos of persons on "+date+" at time interval "+startTime+" to "+endTime+" . The fee for the slot is Rs. "+amount+" Received. Enjoy a pleasant swimming experience. "+note+" Please Show your QR Code at Entrance";
//
// String urlString2="https://tmegov.onex-aura.com/api/sms?key=mRSm0zym&to="+mobileno+"&from=GCCCRP&body="+SMSEnglish+"&entityid=1401572690000011081&templateid=1407172666960216321";
// //System.out.println(urlString);
//
// RestTemplate restTemplate2 = new RestTemplate();
// String Response2 = restTemplate2.getForObject(urlString2, String.class);
//
// return Response2;
// }
//
//
//}

778
src/main/java/com/gcc/restapiservices/swimmingpool/service/SwimmingPoolService.java

@ -0,0 +1,778 @@
package com.gcc.restapiservices.swimmingpool.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.ObjectMapper; // For converting JSON map to String
import javax.sql.DataSource;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
@Service
@Configuration
public class SwimmingPoolService {
private JdbcTemplate jdbcTemplate;
@Autowired
private RestTemplate restTemplate;
private final ObjectMapper objectMapper = new ObjectMapper();
@Autowired
public void setDataSource(@Qualifier("mysqlSwimmingpoolDataSource") DataSource activityDataSource) {
this.jdbcTemplate = new JdbcTemplate(activityDataSource);
}
public List<Map<String, Object>> getSlotsWithGender(String gender, String date) {
String sql = " SELECT " +
"st.slot_timing AS time, " +
"CASE WHEN st.gender_avail = '1' THEN 'men' ELSE 'women' END AS gender, " +
"st.id AS value, " +
"? AS slot_from_date " +
"FROM slot_timing st " +
"LEFT JOIN booking_details b " +
"ON b.slot_order = st.slot_order " +
"AND b.slot_from_date = ? " +
"AND b.is_active = 1 " +
"AND b.is_delete = 0 " +
"WHERE st.gender_avail = ? " +
"GROUP BY " +
"st.slot_timing, st.gender_avail, st.id " +
"ORDER BY st.id";
return jdbcTemplate.queryForList(sql, date, date, gender);
}
public List<Map<String, Object>> getBookedCountbySlot(String slotid, String date) {
String sqlQuery = "SELECT "
+ " b.slot_from_date, "
+ " st.slot_timing, "
+ " CASE "
+ " WHEN b.slot_order = '4' THEN 'women' "
+ " ELSE 'men' "
+ " END AS gender, "
+ " 200 AS total_capacity, "
+ " 200 - (COALESCE(SUM(b.no_of_kids), 0) + COALESCE(SUM(b.no_of_adults), 0)) AS available_slots, "
+ " (COALESCE(SUM(b.no_of_kids), 0) + COALESCE(SUM(b.no_of_adults), 0)) AS booked_slots "
+ "FROM "
+ " booking_details b "
+ "JOIN "
+ " slot_timing st ON b.slot_order = st.slot_order "
+ "WHERE "
+ " b.is_active = 1 "
+ " AND b.is_delete = 0 "
+ " AND b.slot_from_date = ? "
+ " AND b.slot_order = ? "
+ "GROUP BY "
+ " b.slot_from_date, "
+ " b.slot_order, "
+ " st.slot_timing;";
List<Map<String, Object>> bookingDetails = jdbcTemplate.queryForList(sqlQuery, date, slotid);
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
for (Map<String, Object> row : bookingDetails) {
Object dateObj = row.get("slot_from_date");
if (dateObj != null) {
try {
LocalDate parsed = LocalDate.parse(dateObj.toString(), inputFormatter);
row.put("slot_from_date", parsed.format(outputFormatter));
} catch (DateTimeParseException dtpe) {
System.err.println("Date parsing failed for value: " + dateObj + " | Error: " + dtpe.getMessage());
// You could also add an explicit fallback:
row.put("slot_from_date", dateObj.toString());
} catch (Exception ex) {
System.err.println("Unexpected error while formatting date: " + ex.getMessage());
row.put("slot_from_date", dateObj.toString());
}
}
}
// If no data is returned, create a default response with 0 values
if (bookingDetails.isEmpty()) {
Map<String, Object> defaultData = new HashMap<>();
// Convert incoming date (yyyy-MM-dd) into dd-MM-yyyy
LocalDate parsed = LocalDate.parse(date, inputFormatter);
defaultData.put("slot_from_date", parsed.format(outputFormatter));
defaultData.put("slot_timing", "Not Available");
defaultData.put("slot_order", slotid);
String genderVal = "4".equals(slotid) ? "women" : "men";
defaultData.put("gender", genderVal);
defaultData.put("total_capacity", 200);
defaultData.put("available_slots", 200);
defaultData.put("booked_slots", 0);
bookingDetails.add(defaultData);
}
return bookingDetails;
}
public List<Map<String,Object>> getAvailabilityByDate(LocalDate date) {
String sql = """
SELECT
st.slot_order,
st.slot_timing,
CASE WHEN st.slot_order = 4 THEN 'women' ELSE 'men' END AS gender,
200 AS total_capacity,
COALESCE(b.booked_slots, 0) AS booked_slots,
200 - COALESCE(b.booked_slots, 0) AS available_slots
FROM slot_timing st
LEFT JOIN (
SELECT
slot_order,
SUM(no_of_adults + no_of_kids) AS booked_slots
FROM booking_details
WHERE slot_from_date = ?
AND is_active = 1
AND is_delete = 0
GROUP BY slot_order
) b ON CAST(st.slot_order AS UNSIGNED) = CAST(b.slot_order AS UNSIGNED)
ORDER BY CAST(st.slot_order AS UNSIGNED);
""";
// use the ISO date string for the JDBC call
List<Map<String,Object>> list =
jdbcTemplate.queryForList(sql, date.toString());
return list;
}
public Map<String, Object> calculatePayment(int adultsCount, int kidsCount, String bookingMode) {
int adultRate = 0;
int kidRate = 0;
// Rates based on booking mode
if ("ONLINE".equalsIgnoreCase(bookingMode)) {
adultRate = 45;
kidRate = 25;
} else {
// Return an error response if booking mode is invalid
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Invalid booking mode");
return errorResponse;
}
// Calculate total amount
int totalAdultsAmount = adultsCount * adultRate;
int totalKidsAmount = kidsCount * kidRate;
int totalAmount = totalAdultsAmount + totalKidsAmount;
// Prepare the response map
Map<String, Object> response = new HashMap<>();
response.put("adultsCount", adultsCount);
response.put("kidsCount", kidsCount);
response.put("totalAdultsAmount", totalAdultsAmount);
response.put("totalKidsAmount", totalKidsAmount);
response.put("totalAmount", totalAmount);
return response;
}
public String saveBooking(
String name,
String mobileNo,
String noofadults,
String noofkids,
String slotfromdate,
String slottodate,
String totalAmount,
String bookingtype,
String slotorder,
String poolId,
String bookingMode) {
// helper to take everything before the first comma
Function<String, String> firstData = s -> {
if (s == null) return null;
int idx = s.indexOf(',');
return idx < 0 ? s.trim() : s.substring(0, idx).trim();
};
// sanitize EVERY incoming param
name = firstData.apply(name);
mobileNo = firstData.apply(mobileNo);
noofadults = firstData.apply(noofadults);
noofkids = firstData.apply(noofkids);
slotfromdate = firstData.apply(slotfromdate);
slottodate = firstData.apply(slottodate);
totalAmount = firstData.apply(totalAmount);
bookingtype = firstData.apply(bookingtype);
slotorder = firstData.apply(slotorder);
poolId = firstData.apply(poolId);
bookingMode = firstData.apply(bookingMode);
if (mobileNo.length() > 20) {
throw new IllegalArgumentException("Mobile number too long: " + mobileNo);
}
// parse the numeric/date fields
int adultsCount = Integer.parseInt(noofadults);
int kidsCount = Integer.parseInt(noofkids);
int pool = Integer.parseInt(poolId);
Date fromDate = Date.valueOf(slotfromdate);
Date toDate = Date.valueOf(slottodate);
String sql = " INSERT INTO temp_booking_details( " +
"booking_type, mobile_no, name, " +
"no_of_adults, no_of_kids, pool_id, " +
"slot_from_date, slot_order, slot_to_date, " +
"total_amount, booking_mode" +
") VALUES (?,?,?,?,?,?,?,?,?,?,?) ";
KeyHolder keyHolder = new GeneratedKeyHolder();
String finalBookingtype = bookingtype;
String finalMobileNo = mobileNo;
String finalName = name;
String finalSlotorder = slotorder;
String finalTotalAmount = totalAmount;
String finalBookingMode = bookingMode;
int rows = jdbcTemplate.update(con -> {
PreparedStatement ps = con.prepareStatement(sql, new String[]{"temp_id"});
ps.setString(1, finalBookingtype);
ps.setString(2, finalMobileNo);
ps.setString(3, finalName);
ps.setInt(4, adultsCount);
ps.setInt(5, kidsCount);
ps.setInt(6, pool);
ps.setDate(7, fromDate);
ps.setString(8, finalSlotorder);
ps.setDate(9, toDate);
ps.setString(10, finalTotalAmount);
ps.setString(11, finalBookingMode);
return ps;
}, keyHolder);
if (rows == 0) {
throw new RuntimeException("Insert returned 0 rows affected");
}
return keyHolder.getKey().toString();
}
public Map<String, Object> getTempBookingData(String tempid) {
String sqlQuery = "SELECT * FROM temp_booking_details WHERE temp_id='" + tempid + "'";
Map<String, Object> tempBookingDetails = jdbcTemplate.queryForMap(sqlQuery);
return tempBookingDetails;
}
public String savePaymentInfo(
String tempId,
String booking_type,
String cdate,
String mobile_no,
String name,
String no_of_adults,
String no_of_kids,
String pool_id,
String slot_from_date,
String slot_order,
String slot_to_date,
String totalAmount,
String payment_id,
String payment_orderid,
String payment_status,
String paymentdate,
String uniqueid,
String booking_mode,
String reference_id,
int source) {
String lastInsertId = "0";
String sqlQuery = "INSERT INTO `payment`(`amount`, `mobno`, `order_id`, `payment_id`, `reference_id`,`payment_status`, `paymentdate`, `uniqueid`) "
+ "VALUES (?,?,?,?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
try {
int affectedRows = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"temp_id"});
ps.setString(1, totalAmount);
ps.setString(2, mobile_no);
ps.setString(3, payment_orderid);
ps.setString(4, payment_id);
ps.setString(5, reference_id);
ps.setString(6, payment_status);
ps.setString(7, paymentdate);
ps.setString(8, uniqueid);
return ps;
}
}, keyHolder);
if (affectedRows > 0) {
Number generatedId = keyHolder.getKey();
lastInsertId = generatedId.toString();
lastInsertId = saveBookingInfo(tempId, booking_type, cdate, mobile_no,
name,
no_of_adults,
no_of_kids,
pool_id,
slot_from_date,
slot_order,
slot_to_date,
totalAmount,
payment_id,
payment_orderid,
payment_status,
paymentdate,
uniqueid,
booking_mode,
source);
// Define the time slots in Java
List<Map<String, Object>> daySlots = new ArrayList<>();
daySlots.add(Map.of("time", "5:30 AM - 6:30 AM", "gender", "men", "value", 0));
daySlots.add(Map.of("time", "5:30 AM - 6:30 AM", "gender", "men", "value", 1));
daySlots.add(Map.of("time", "6:30 AM - 7:30 AM", "gender", "men", "value", 2));
daySlots.add(Map.of("time", "7:30 AM - 8:30 AM", "gender", "men", "value", 3));
daySlots.add(Map.of("time", "8:30 AM - 9:30 AM", "gender", "women", "value", 4));
daySlots.add(Map.of("time", "9:30 AM - 10:30 AM", "gender", "men", "value", 5));
daySlots.add(Map.of("time", "10:30 AM - 11:30 AM", "gender", "men", "value", 6));
daySlots.add(Map.of("time", "11:30 AM - 12:30 PM", "gender", "men", "value", 7));
daySlots.add(Map.of("time", "12:30 PM - 1:30 PM", "gender", "men", "value", 8));
daySlots.add(Map.of("time", "1:30 PM - 2:30 PM", "gender", "men", "value", 9));
daySlots.add(Map.of("time", "2:30 PM - 3:30 PM", "gender", "men", "value", 10));
daySlots.add(Map.of("time", "3:30 PM - 4:30 PM", "gender", "men", "value", 11));
daySlots.add(Map.of("time", "4:30 PM - 5:30 PM", "gender", "men", "value", 12));
daySlots.add(Map.of("time", "5:30 PM - 6:30 PM", "gender", "men", "value", 13));
daySlots.add(Map.of("time", "6:30 PM - 7:30 PM", "gender", "men", "value", 14));
// Convert the list to an array
Map<String, Object>[] slotArray = daySlots.toArray(new Map[0]);
// Access the element in the array
int slotOrder = Integer.parseInt(slot_order);
Map<String, Object> slot = slotArray[slotOrder]; // Index 1 (second element)
String time = (String) slot.get("time");
String gender = (String) slot.get("gender");
int adult = Integer.parseInt(no_of_adults);
int kids = Integer.parseInt(no_of_kids);
int totalCount = adult + kids;
String count = String.valueOf(totalCount);
//balaji
//sendWhatsapp("h2YjFNcJ", mobile_no, slot_from_date, time, count, totalAmount,payment_orderid);
//System.out.println(mobile_no);
//"9444173345"
sendWhatsapp("h2YjFNcJ", mobile_no, slot_from_date, time, count, totalAmount, payment_orderid);
sendSMS("h2YjFNcJ", mobile_no, slot_from_date, time, count, totalAmount, payment_orderid);
} else {
System.out.println("Error on temp save!");
}
} catch (DataAccessException e) {
System.out.println("Data Access Exception:");
Throwable rootCause = e.getMostSpecificCause();
if (rootCause instanceof SQLException) {
SQLException sqlException = (SQLException) rootCause;
System.out.println("SQL State: " + sqlException.getSQLState());
System.out.println("Error Code: " + sqlException.getErrorCode());
System.out.println("Message: " + sqlException.getMessage());
} else {
System.out.println("Message: " + rootCause.getMessage());
}
}
return lastInsertId;
}
public String saveBookingInfo(
String tempId,
String booking_type,
String cdate,
String mobile_no,
String name,
String no_of_adults,
String no_of_kids,
String pool_id,
String slot_from_date,
String slot_order,
String slot_to_date,
String totalAmount,
String payment_id,
String payment_orderid,
String payment_status,
String paymentdate,
String uniqueid,
String booking_mode,
int source) {
String lastInsertId = "0";
String sqlQuery = "INSERT INTO `booking_details`(`booking_mode`, `booking_type`, `cdate`, "
+ "`mobile_no`, `name`, `no_of_adults`, `no_of_kids`, `pool_id`, `slot_from_date`, "
+ "`slot_order`, `slot_to_date`, `total_amount`,`orderid`, `adults_remaining`,`kids_remaining`,`source`)"
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
System.out.println("booking_mode:" + booking_mode);
try {
int affectedRows = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"});
ps.setString(1, booking_mode);
ps.setString(2, booking_type);
ps.setString(3, cdate);
ps.setString(4, mobile_no);
ps.setString(5, name);
ps.setString(6, no_of_adults);
ps.setString(7, no_of_kids);
ps.setString(8, pool_id);
ps.setString(9, slot_from_date);
ps.setString(10, slot_order);
ps.setString(11, slot_to_date);
ps.setString(12, totalAmount);
ps.setString(13, payment_orderid);
ps.setString(14, no_of_adults);
ps.setString(15, no_of_kids);
ps.setString(16, String.valueOf(source));
return ps;
}
}, keyHolder);
if (affectedRows > 0) {
Number generatedId = keyHolder.getKey();
lastInsertId = generatedId.toString();
} else {
System.out.println("Error on temp save!");
}
} catch (DataAccessException e) {
System.out.println("Data Access Exception:");
Throwable rootCause = e.getMostSpecificCause();
if (rootCause instanceof SQLException) {
SQLException sqlException = (SQLException) rootCause;
System.out.println("SQL State: " + sqlException.getSQLState());
System.out.println("Error Code: " + sqlException.getErrorCode());
System.out.println("Message: " + sqlException.getMessage());
} else {
System.out.println("Message: " + rootCause.getMessage());
}
}
return lastInsertId;
}
public String sendWhatsapp(String password, String mobileno, String date, String slot, String count, String amount, String orderid) {
System.out.println("trying send whatsapp to :" + mobileno);
String[] parts = slot.split("-");
// Trim the parts to remove leading and trailing spaces
String startTime = parts[0].trim();
String endTime = parts[1].trim();
// Manually replace characters in startTime and endTime to URL-encoded equivalents
String formattedStartTime = startTime.replace(":", "%3A").replace(" ", "+");
String formattedEndTime = endTime.replace(":", "%3A").replace(" ", "+");
String tamilurl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=" + password + "&send_to=" + mobileno + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%BE%E0%AE%A9+%E0%AE%B5%E0%AE%BE%E0%AE%9F%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%B3%E0%AE%B0%E0%AF%87%2C+%0A%E0%AE%AA%E0%AF%86%E0%AE%B0%E0%AF%81%E0%AE%A8%E0%AE%95%E0%AE%B0+%E0%AE%9A%E0%AF%86%E0%AE%A9%E0%AF%8D%E0%AE%A9%E0%AF%88+%E0%AE%AE%E0%AE%BE%E0%AE%A8%E0%AE%95%E0%AE%B0%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9A%E0%AE%BF+%E0%AE%A4%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%88+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AF%81%E0%AE%9F%E0%AE%A9%E0%AF%8D+%E0%AE%B5%E0%AE%B0%E0%AE%B5%E0%AF%87%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BF%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AE%A4%E0%AF%81.++%0A%0A%E0%AE%8E%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AE%A4%E0%AF%81+%E0%AE%AE%E0%AF%86%E0%AE%B0%E0%AE%BF%E0%AE%A9%E0%AE%BE++%E0%AE%A8%E0%AF%80%E0%AE%9A%E0%AF%8D%E0%AE%9A%E0%AE%B2%E0%AF%8D++%E0%AE%95%E0%AF%81%E0%AE%B3%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%A9%E0%AF%88+" + count + "+%E0%AE%8E%E0%AE%A3%E0%AF%8D%E0%AE%A3%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%88+%E0%AE%A8%E0%AE%AA%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%81%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%81+" + date + "+%E0%AE%85%E0%AE%A9%E0%AF%8D%E0%AE%B1%E0%AF%81+++%E0%AE%A8%E0%AF%87%E0%AE%B0+%E0%AE%87%E0%AE%9F%E0%AF%88%E0%AE%B5%E0%AF%86%E0%AE%B3%E0%AE%BF+" + formattedStartTime + "+-+" + formattedEndTime + "++%E0%AE%B2%E0%AF%8D+%E0%AE%AA%E0%AE%AF%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%81%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AF%8A%E0%AE%B3%E0%AF%8D%E0%AE%B3+%E0%AE%AE%E0%AF%81%E0%AE%A9%E0%AF%8D%E0%AE%AA%E0%AE%A4%E0%AE%BF%E0%AE%B5%E0%AF%81+%E0%AE%9A%E0%AF%86%E0%AE%AF%E0%AF%8D%E0%AE%A4%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AF%80%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D.+%0A%E0%AE%87%E0%AE%A4%E0%AE%B1%E0%AF%8D%E0%AE%95%E0%AE%BE%E0%AE%A9+%E0%AE%95%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A3%E0%AE%AE%E0%AF%8D+%2A%E0%AE%B0%E0%AF%82%2A.+" + amount + "+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%B3%E0%AF%8D%E0%AE%B3%E0%AE%A4%E0%AF%81.++%0A%0A%E0%AE%87%E0%AE%A9%E0%AE%BF%E0%AE%AE%E0%AF%88%E0%AE%AF%E0%AE%BE%E0%AE%A9+%E0%AE%A8%E0%AF%80%E0%AE%9A%E0%AF%8D%E0%AE%9A%E0%AE%B2%E0%AF%8D+%E0%AE%85%E0%AE%A9%E0%AF%81%E0%AE%AA%E0%AE%B5%E0%AE%A4%E0%AF%8D%E0%AE%A4%E0%AE%BF%E0%AE%A9%E0%AF%88+%E0%AE%AA%E0%AF%86%E0%AE%B1%E0%AF%8D%E0%AE%B1%E0%AF%81+%E0%AE%AE%E0%AE%95%E0%AE%BF%E0%AE%B4%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D%F0%9F%98%8A%0A%0A%E0%AE%A8%E0%AF%81%E0%AE%B4%E0%AF%88%E0%AE%B5%E0%AE%BE%E0%AE%AF%E0%AE%BF%E0%AE%B2%E0%AE%BF%E0%AE%B2%E0%AF%8D+%E0%AE%89%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D+QR+%E0%AE%95%E0%AF%81%E0%AE%B1%E0%AE%BF%E0%AE%AF%E0%AF%80%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%88+%E0%AE%95%E0%AE%BE%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AF%81%E0%AE%99%E0%AF%8D%E0%AE%95%E0%AE%B3%E0%AF%8D%F0%9F%91%87&isTemplate=true&buttonUrlParam=swimmingpool%2FbookingQRCode%3Forderid%3D" + orderid;
//bookingQRCode?orderid=order_P6UOll7Kn1UfrV
String response = restTemplate.getForObject(tamilurl, String.class);
System.out.println("response: " + response);
try {
HttpURLConnection connection = null;
URL url = new URL(tamilurl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = responseCode + "";
System.out.println("Response Code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
sendenglishWhatsapp(password, mobileno, date, slot, count, amount, orderid);
return response;
}
public String sendenglishWhatsapp(String password, String mobileno, String date, String slot, String count, String amount, String orderid) {
System.out.println("trying send whatsapp to :" + mobileno);
String[] parts = slot.split("-");
// Trim the parts to remove leading and trailing spaces
String startTime = parts[0].trim();
String endTime = parts[1].trim();
// Manually replace characters in startTime and endTime to URL-encoded equivalents
String formattedStartTime = startTime.replace(":", "%3A").replace(" ", "+");
String formattedEndTime = endTime.replace(":", "%3A").replace(" ", "+");
String tamilurl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=" + password + "&send_to=" + mobileno + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Dear+Patron+%2C+%0AWelcome+to+Greater+Chennai+Corporation.++%0A%0AYou+have+booked+our+Marina+swimming+pool+for+" + count + "+number+of+persons+on+" + date + "+at+time+slot+" + formattedStartTime + "+-+" + formattedEndTime + "+.%0AThe+fee+for+the+slot+is+%2ARs%2A.+" + amount + "+received.+%0A%0AEnjoy+a+pleasant+swimming+experience%F0%9F%98%8A%0A%0APlease+show+your+QR+Code+at+Entrance%F0%9F%91%87&isTemplate=true&buttonUrlParam=swimmingpool%2FbookingQRCode%3Forderid%3D" + orderid;
//bookingQRCode?orderid=order_P6UOll7Kn1UfrV
String response = restTemplate.getForObject(tamilurl, String.class);
System.out.println("response: " + response);
try {
HttpURLConnection connection = null;
URL url = new URL(tamilurl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = responseCode + "";
System.out.println("Response Code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public String sendSMS(String password, String mobileno, String date, String slot, String count, String amount, String orderid) {
String note = "";
String[] parts = slot.split("-");
// Trim the parts to remove leading and trailing spaces
String startTime = parts[0].trim();
String endTime = parts[1].trim();
String SMSTEXT = "அன்பான வாடிக்கையாளரே, பெருநகர சென்னை மாநகராட்சி தங்களை அன்புடன் வரவேற்கின்றது. எங்களது மெரினா நீச்சல் குளத்தினை " + count + " எண்ணிக்கை நபர்களுக்கு " + date + " அன்று நேர இடைவெளி " + startTime + " முதல் " + endTime + " வரை பயன்படுத்திக்கொள்ள முன்பதிவு செய்துள்ளீர்கள். இதற்கான கட்டணம் ரூ. " + amount + " பெறப்பட்டுள்ளது. இனிமையான நீச்சல் அனுபவத்தினை பெற்று மகிழுங்கள். " + note + " நுழைவாயிலில் உங்கள் QR குறியீட்டை காட்டுங்கள்";
String urlString = "https://tmegov.onex-aura.com/api/sms?key=mRSm0zym&to=" + mobileno + "&from=GCCCRP&body=" + SMSTEXT + "&entityid=1401572690000011081&templateid=1407172667016050918";
//System.out.println(urlString);
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(urlString, String.class);
String SMSEnglish = "Dear Patron, Welcome to Greater Chennai Corporation. You have booked our Marina swimming pool for " + count + " Nos of persons on " + date + " at time interval " + startTime + " to " + endTime + " . The fee for the slot is Rs. " + amount + " Received. Enjoy a pleasant swimming experience. " + note + " Please Show your QR Code at Entrance";
String urlString2 = "https://tmegov.onex-aura.com/api/sms?key=mRSm0zym&to=" + mobileno + "&from=GCCCRP&body=" + SMSEnglish + "&entityid=1401572690000011081&templateid=1407172666960216321";
//System.out.println(urlString);
RestTemplate restTemplate2 = new RestTemplate();
String Response2 = restTemplate2.getForObject(urlString2, String.class);
return Response2;
}
public int saveorderLog(String order_id, String order_info, String uniqueid) {
if (order_id == null || uniqueid == null) {
System.out.println("Missing required fields. Order ID: " + order_id + ", Temp Book ID: " + uniqueid);
return 0;
}
int temp_booking_id = Integer.parseInt(uniqueid);
String sqlQuery = "INSERT INTO orderslogs(order_id, order_info, uniqueid) VALUES (?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
try {
int affectedRows = jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sqlQuery, new String[]{"id"});
ps.setString(1, order_id);
ps.setString(2, order_info);
ps.setInt(3, temp_booking_id);
return ps;
}, keyHolder);
if (affectedRows > 0) {
Number generatedId = keyHolder.getKey();
return (generatedId != null) ? generatedId.intValue() : 0;
} else {
System.out.println("Failed to insert into order_log.");
return 0;
}
} catch (Exception e) {
System.out.println("Exception during insert to order_log: " + e.getMessage());
e.printStackTrace();
return 0;
}
}
public ResponseEntity<?> processPaymentConfirmation(String tempid, int source, String orderid, Map<String, Object> paymentResponse) {
if (source < 0 || source > 2) {
return ResponseEntity.badRequest()
.body(Map.of("message", "Invalid source: must be 0 (web), 1 (counter) or 2 (whatsapp)"));
}
// Validate tempid
int id;
try {
id = Integer.parseInt(tempid);
} catch (NumberFormatException nfe) {
return ResponseEntity.badRequest()
.body(Map.of("message", "Invalid id: must be a number"));
}
// Fetch temp booking
Map<String, Object> tempBookingDetails = getTempBookingData(tempid);
if (tempBookingDetails.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("message", "No booking found for id: " + tempid));
}
try {
Map<String, Object> transaction = (Map<String, Object>) paymentResponse.get("transaction");
Map<String, Object> amountMap = (Map<String, Object>) transaction.get("amount");
Map<String, Object> methodMap = (Map<String, Object>) transaction.get("method");
String payId = transaction.get("pg_transaction_id").toString();
String referenceId = paymentResponse.get("reference_id").toString();
String orderId = orderid;
String status = transaction.get("status").toString();
savePaymentResponse(orderId, payId, status, referenceId, paymentResponse, tempid);
// Save failed transaction
if ("failed".equalsIgnoreCase(status)) {
// Convert entire response map to JSON string
ObjectMapper mapper = new ObjectMapper();
String fullResponseJson = mapper.writeValueAsString(paymentResponse);
// Save to DB (assuming you have a method)
saveFailedTransaction(orderId, payId, status, referenceId, fullResponseJson, id);
return ResponseEntity.ok(Map.of(
"message", "Your payment failed. Please try again."
));
} else if ("success".equalsIgnoreCase(status)) {
savePaymentInfo(tempid,
tempBookingDetails.get("booking_type").toString(),
tempBookingDetails.get("cdate").toString(),
tempBookingDetails.get("mobile_no").toString(),
tempBookingDetails.get("name").toString(),
tempBookingDetails.get("no_of_adults").toString(),
tempBookingDetails.get("no_of_kids").toString(),
tempBookingDetails.get("pool_id").toString(),
tempBookingDetails.get("slot_from_date").toString(),
tempBookingDetails.get("slot_order").toString(),
tempBookingDetails.get("slot_to_date").toString(),
tempBookingDetails.get("total_amount").toString(),
payId,
orderId,
referenceId,
status,
tempBookingDetails.get("cdate").toString(),
tempid,
tempBookingDetails.getOrDefault("booking_mode", "ONLINE").toString(),
source);
String qrCodeUrl = "https://gccservices.chennaicorporation.gov.in/swimmingpool/bookingQRCode?orderid=" + orderId;
return ResponseEntity.ok(Map.of(
"message", "Your payment was successful and your booking is now confirmed! " +
"You’ll receive the full details via WhatsApp and SMS shortly. " +
"Please have your QR code ready at entry.",
"qrCodeUrl", qrCodeUrl
));
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Failed to confirm payment"));
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("message", "Failed to confirm payment", "error", e.getMessage()));
}
}
private void savePaymentResponse(String orderId, String payId, String status, String referenceId,
Map<String, Object> paymentResponse, String tempid) {
String sql = "INSERT INTO payment_response (order_id, payment_id, payment_status,reference_id,response, uniqueId) " +
"VALUES (?, ?, ?, ?, ?, ?)";
try {
String jsonResponse = objectMapper.writeValueAsString(paymentResponse);
jdbcTemplate.update(sql,
orderId,
payId,
status,
referenceId,
jsonResponse,
tempid
);
} catch (Exception e) {
e.printStackTrace(); // log or rethrow as needed
}
}
public void saveFailedTransaction(String orderId, String paymentId, String status, String referenceId, String fullJsonResponse, int uniqueId) {
String sql = "INSERT INTO payment_failed_response (order_id, payment_id, payment_status, response, uniqueId,reference_id) " +
"VALUES (?, ?, ?, ?, ?, ?)";
jdbcTemplate.update(sql, orderId, paymentId, status, referenceId, fullJsonResponse, uniqueId);
}
public List<Map<String,Object>> getBookingByMobileNo(long mobileNo) {
String sqlQuery = "SELECT b.id, b.booking_mode, b.booking_type, " +
"DATE_FORMAT(b.cdate, '%d-%m-%Y') AS cdate, " + // format dd-MM-yyyy
"b.mobile_no, b.name, b.no_of_adults, b.no_of_kids, " +
"DATE_FORMAT(b.slot_from_date, '%d-%m-%Y') AS slot_from_date, " + // format dd-MM-yyyy
"st.slot_timing AS slot_order, " +
"DATE_FORMAT(b.slot_to_date, '%d-%m-%Y') AS slot_to_date, " + // format dd-MM-yyyy
"b.total_amount, b.orderid, " +
"b.adults_remaining, b.kids_remaining " +
"FROM booking_details b " +
"LEFT JOIN slot_timing st ON b.slot_order = st.id " +
"WHERE b.mobile_no = ? " +
"ORDER BY b.cdate DESC";
List<Map<String,Object>> bookings = jdbcTemplate.queryForList(sqlQuery, mobileNo);
String baseQrUrl = "https://gccservices.chennaicorporation.gov.in/swimmingpool/bookingQRCode?orderid=";
for (Map<String,Object> booking : bookings) {
// orderid comes back as a String in the map
String orderId = String.valueOf(booking.get("orderid"));
booking.put("acknowledgementLink", baseQrUrl + orderId);
}
return bookings;
}
public List<Map<String, Object>> findByMobileNo(long mobileNo){
String sqlQuery = "select id from booking_details where mobile_no = '"+mobileNo+"'";
System.out.println(sqlQuery);
return jdbcTemplate.queryForList(sqlQuery);
}
}

49
src/main/java/com/gcc/restapiservices/swimmingpool/util/ApiResponse.java

@ -0,0 +1,49 @@
package com.gcc.restapiservices.swimmingpool.util;
public class ApiResponse {
private String status;
private String message;
private Object data;
private int statusCode;
// Constructor
public ApiResponse(String status, String message, Object data, int statusCode) {
this.status = status;
this.message = message;
this.data = data;
this.statusCode = statusCode;
}
// Getters and Setters
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public int getStatusCode() {
return statusCode;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
}

42
src/main/java/com/gcc/restapiservices/townplanning/controller/BuildingApprovalApiController.java

@ -0,0 +1,42 @@
package com.gcc.restapiservices.townplanning.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.databind.JsonNode;
import com.gcc.restapiservices.townplanning.service.BuildingApprovalService;
@RequestMapping("/gccrestservices/api/townplanning")
@RestController
public class BuildingApprovalApiController {
@Autowired
private BuildingApprovalService buildingApprovalService;
// ✅ API 1: By BA Number
@GetMapping("/get-building-approval-details-by-ba")
public ResponseEntity<JsonNode> getDetailsByBaNumber(@RequestParam String baNumber) {
JsonNode result = buildingApprovalService.getBuildingApprovalDetailsByBaNumber(baNumber);
if (result == null) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
return ResponseEntity.ok(result);
}
// ✅ API 2: By PPA Number
@GetMapping("/get-building-approval-details-by-ppa")
public ResponseEntity<JsonNode> getDetailsByPpaNumber(@RequestParam String ppaNumber) {
JsonNode result = buildingApprovalService.getBuildingApprovalDetailsByPpaNumber(ppaNumber);
if (result == null) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
return ResponseEntity.ok(result);
}
}

53
src/main/java/com/gcc/restapiservices/townplanning/service/BuildingApprovalService.java

@ -0,0 +1,53 @@
package com.gcc.restapiservices.townplanning.service;
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;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@Service
public class BuildingApprovalService {
private JdbcTemplate jdbcTemplate;
private final RestTemplate restTemplate = new RestTemplate();
private final ObjectMapper mapper = new ObjectMapper();
@Autowired
public void setDataSource(@Qualifier("mysqlGccRestServicesDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//BA Number
public JsonNode getBuildingApprovalDetailsByBaNumber(String baNumber) {
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/newmobileservice" +
"?serviceId=common_api&jsonResp=Yes&subService=getBPADetails&baNum=" + baNumber;
String response = restTemplate.getForObject(url, String.class);
return mapper.readTree(response);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//PPA Number
public JsonNode getBuildingApprovalDetailsByPpaNumber(String ppaNumber) {
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/newmobileservice" +
"?serviceId=common_api&jsonResp=Yes&subService=getBPADetails&ppaNum=" + ppaNumber;
String response = restTemplate.getForObject(url, String.class);
return mapper.readTree(response);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

96
src/main/java/com/gcc/restapiservices/victoriaHallBooking/configuration/VPHPaymentConfig.java

@ -0,0 +1,96 @@
package com.gcc.restapiservices.victoriaHallBooking.configuration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@Configuration
@PropertySource("classpath:paymentConfig.properties")
public class VPHPaymentConfig {
@Value("${payment.worldline.merchantId}")
private String merchantId;
@Value("${payment.worldline.encryptionKey}")
private String encryptionKey;
@Value("${payment.worldline.encryptionIV}")
private String encryptionIV;
@Value("${payment.worldline.schemeCode}")
private String schemeCode;
@Value("${payment.worldline.merchantName}")
private String merchantName;
@Value("${payment.worldline.transactionSuccessCode}")
private String transactionSuccessCode;
@Value("${payment.worldline.refundSuccessCode}")
private String refundSuccessCode;
public String getMerchantId() {
return merchantId;
}
public void setMerchantId(String merchantId) {
this.merchantId = merchantId;
}
public String getEncryptionKey() {
return encryptionKey;
}
public byte[] getEncryptionKeyByte() {
return encryptionKey.getBytes();
}
public void setEncryptionKey(String encryptionKey) {
this.encryptionKey = encryptionKey;
}
public String getEncryptionIV() {
return encryptionIV;
}
public byte[] getEncryptionIVByte() {
return encryptionIV.getBytes();
}
public void setEncryptionIV(String encryptionIV) {
this.encryptionIV = encryptionIV;
}
public String getSchemeCode() {
return schemeCode;
}
public void setSchemeCode(String schemeCode) {
this.schemeCode = schemeCode;
}
public String getMerchantName() {
return merchantName;
}
public void setMerchantName(String merchantName) {
this.merchantName = merchantName;
}
public String getTransactionSuccessCode() {
return transactionSuccessCode;
}
public void setTransactionSuccessCode(String transactionSuccessCode) {
this.transactionSuccessCode = transactionSuccessCode;
}
public String getRefundSuccessCode() {
return refundSuccessCode;
}
public void setRefundSuccessCode(String refundSuccessCode) {
this.refundSuccessCode = refundSuccessCode;
}}

992
src/main/java/com/gcc/restapiservices/victoriaHallBooking/controller/VPHHallController.java

@ -0,0 +1,992 @@
package com.gcc.restapiservices.victoriaHallBooking.controller;
import com.gcc.restapiservices.victoriaHallBooking.dto.PaymentWebhookPayload;
import com.gcc.restapiservices.victoriaHallBooking.service.VPHPaymentService;
import com.gcc.restapiservices.victoriaHallBooking.service.victoriaHallService;
import com.gcc.restapiservices.configuration.AppConfig;
import com.gcc.restapiservices.coworkspace.controller.ApiResponse;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.dao.EmptyResultDataAccessException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Random;
@RestController
@RequestMapping("/gccrestservices/victoriahall/api")
public class VPHHallController {
@Autowired
private VPHPaymentService chPaymentService;
@Autowired
private victoriaHallService hallService;
@Autowired
private AppConfig appConfig;
@GetMapping("/getHallList")
public List<Map<String, Object>> getHallList() {
List<Map<String, Object>> hallList = new ArrayList<Map<String, Object>>();
hallList = hallService.getHallList();
if (hallList.isEmpty()) {
return hallList;
}
return hallList;
}
@GetMapping("/getReasonMaster")
public ResponseEntity<?> getReasonMaster() {
try {
List<Map<String, Object>> result = hallService.getReasonMaster();
if (result == null || result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No data found");
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/getDocumentsByReasonId")
public ResponseEntity<?> getDocumentsByReasonId(@RequestParam(value = "reasonId", required = false) Long reasonId) {
if (reasonId == null) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "reasonId is required");
errorResponse.put("message", "Missing required parameter for reasonId");
return ResponseEntity.badRequest().body(errorResponse);
}
try {
List<Map<String, Object>> result = hallService.getDocumentsByReasonId(reasonId);
if (result == null || result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No data found for reasonId: " + reasonId);
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/getRelationTypes")
public ResponseEntity<?> getRelationTypes() {
try {
List<Map<String, String>> result = hallService.getRelationTypesAsMap();
if (result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No data found");
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/getUserDetails")
public ResponseEntity<?> getUserDetails(@RequestParam(value = "Mobilenumber", required = false) Long Mobilenumber) {// @RequestParam(value
// =
// "mobileNumber",
// required
// =
// false)
// Long
// mobileNumber,
if (Mobilenumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
// Check if mobile number is 10 digits
String mobileStr = String.valueOf(Mobilenumber);
if (mobileStr.length() != 10) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Mobile number must be exactly 10 digits.");
}
try {
List<Map<String, Object>> result = hallService.getUserDetails(Mobilenumber);
if (result == null || result.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("No data found for Mobilenumber: " + Mobilenumber);
}
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@GetMapping("/calculatehallamount")
public ResponseEntity<Map<String, Object>> getHallDetailsConcession(
@RequestParam(value = "numDays", required = false) Integer numDays,
@RequestParam(value = "startPeriod", required = false) String startPeriod,
@RequestParam(value = "endPeriod", required = false) String endPeriod,
@RequestParam(value = "reasonforBooking", required = false) String reasonforBooking,
@RequestParam(value = "hallId", required = false) Integer hallId) {
// Validation for required parameters
if (numDays == null) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Number of days is required");
errorResponse.put("message", "Please provide the numDays parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (startPeriod == null || startPeriod.trim().isEmpty()) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Start period is required");
errorResponse.put("message", "Please provide the startPeriod parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (!startPeriod.equals("1") && !startPeriod.equals("2")) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Invalid startPeriod");
errorResponse.put("message", "startPeriod must be either '1' or '2'");
return ResponseEntity.badRequest().body(errorResponse);
}
if (endPeriod == null || endPeriod.trim().isEmpty()) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "End period is required");
errorResponse.put("message", "Please provide the endPeriod parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (!endPeriod.equals("1") && !endPeriod.equals("2")) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Invalid endPeriod");
errorResponse.put("message", "endPeriod must be either '1' or '2'");
return ResponseEntity.badRequest().body(errorResponse);
}
if (reasonforBooking == null || reasonforBooking.trim().isEmpty()) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Reason for booking is required");
errorResponse.put("message", "Please provide the reasonforBooking parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
if (hallId == null) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Hall ID is required");
errorResponse.put("message", "Please provide the hallId parameter");
return ResponseEntity.badRequest().body(errorResponse);
}
Map<String, Object> hallDetails = hallService.getHallDetailsById(hallId);
if (hallDetails == null) {
return ResponseEntity.status(404).body(Map.of("message", "Incorrect HallID"));
}
System.out.println("hallDetails..." + hallDetails);
Map<String, Object> concession = hallService.getHallConcessionByHallId(hallId);
System.out.println("concession....." + concession);
Boolean isSGEObj = (Boolean) hallDetails.get("is_sge");
Boolean isCGEObj = (Boolean) hallDetails.get("is_cge");
boolean isSGE = isSGEObj != null && isSGEObj;
boolean isCGE = isCGEObj != null && isCGEObj;
double fullDayAmount = toDouble(hallDetails.get("full_day_rent"));
double halfDayAmount = toDouble(hallDetails.get("half_day_rent"));
double depositAmount = toDouble(hallDetails.get("deposit_amount"));
double gstRate = toDouble(hallDetails.get("gst"));
System.out.println("tete");
System.out.println(depositAmount);
Map<String, Object> response = new HashMap<>();
double amount = calculateAmount(numDays, startPeriod, endPeriod, fullDayAmount, halfDayAmount);
double totalDepositAmount = calculateDepositAmount(numDays, startPeriod, endPeriod, depositAmount);
double totalAmount = 0;
double discountAmount = 0;
response.put("reasonforBooking", reasonforBooking);
if (!isSGE) {
double gst = round(amount * gstRate / 100.0);
totalAmount = round(amount + gst + totalDepositAmount);
response.put("discount", 0);
response.put("amount", round(amount));
response.put("totalAmount", totalAmount);
response.put("depositAmount", round(totalDepositAmount));
response.put("gst", gst);
response.put("discountAmount", round(amount));
} else if ("SGE".equalsIgnoreCase(reasonforBooking) && concession != null) {
double fullCleaning = toDouble(concession.get("fullday_cleaningcharges"));
double fullPA = toDouble(concession.get("fullday_pasystem"));
double fullEB = toDouble(concession.get("fullday_ebcharges"));
double halfCleaning = toDouble(concession.get("halfday_cleaningcharges"));
double halfPA = toDouble(concession.get("halfday_pasystem"));
double halfEB = toDouble(concession.get("halfday_ebcharges"));
double fullAdd = fullCleaning + fullPA + fullEB;
double halfAdd = halfCleaning + halfPA + halfEB;
double addCharges = calculateAmount(numDays, startPeriod, endPeriod, fullAdd, halfAdd);
double sgeDiscount = toDouble(hallDetails.get("sge_discount"));
double fullRent = toDouble(concession.get("fulldayhallamount"));
double halfRent = toDouble(concession.get("halfdayhallamount"));
double gst = round(addCharges * gstRate / 100.0);
totalAmount = round(addCharges + totalDepositAmount + gst);
discountAmount = round((fullRent * sgeDiscount) / 100.0);
response.put("startPeriod", startPeriod);
response.put("endPeriod", endPeriod);
response.put("fulldayhallAmount", round(fullRent));
response.put("halfdayhallAmount", round(halfRent));
response.put("discount", sgeDiscount);
response.put("rentAmount", 0);
response.put("additionalCharges", round(addCharges));
response.put("netAmount", round(addCharges));
response.put("gst", gst);
response.put("depositAmount", round(totalDepositAmount));
response.put("totalAmount", totalAmount);
response.put("discountAmount", discountAmount);
} else if ("CGE".equalsIgnoreCase(reasonforBooking) && concession != null) {
double fullCleaning = toDouble(concession.get("fullday_cleaningcharges"));
double fullPA = toDouble(concession.get("fullday_pasystem"));
double fullEB = toDouble(concession.get("fullday_ebcharges"));
double halfCleaning = toDouble(concession.get("halfday_cleaningcharges"));
double halfPA = toDouble(concession.get("halfday_pasystem"));
double halfEB = toDouble(concession.get("halfday_ebcharges"));
double fullAdd = fullCleaning + fullPA + fullEB;
double halfAdd = halfCleaning + halfPA + halfEB;
double addCharges = calculateAmount(numDays, startPeriod, endPeriod, fullAdd, halfAdd);
double cgeDiscount = toDouble(hallDetails.get("cge_discount"));
double rentAmount = round((amount * cgeDiscount) / 100.0);
double netAmount = round(rentAmount + addCharges);
double gst = round(netAmount * gstRate / 100.0);
totalAmount = round(netAmount + gst + totalDepositAmount);
response.put("startPeriod", startPeriod);
response.put("endPeriod", endPeriod);
response.put("fulldayhallAmount", round(fullDayAmount));
response.put("halfdayhallAmount", round(halfDayAmount));
response.put("discount", cgeDiscount);
response.put("rentAmount", rentAmount);
response.put("additionalCharges", round(addCharges));
response.put("netAmount", netAmount);
response.put("gst", gst);
response.put("depositAmount", round(totalDepositAmount));
response.put("totalAmount", totalAmount);
response.put("discountAmount", round(discountAmount));
} else {
double gstValue = round(gstRate * amount / 100.0);
totalAmount = round(amount + gstValue + totalDepositAmount);
response.put("discount", 0);
response.put("amount", round(amount));
response.put("totalAmount", totalAmount);
response.put("depositAmount", round(totalDepositAmount));
response.put("gst", gstValue);
response.put("discountAmount", round(amount));
}
response.put("numDays", numDays);
response.put("startPeriod", startPeriod);
response.put("endPeriod", endPeriod);
response.put("reasonforBooking", reasonforBooking);
response.put("hallId", hallId);
return ResponseEntity.ok(response);
}
// Helper to safely convert Object to double
private double toDouble(Object value) {
if (value instanceof Number) {
return ((Number) value).doubleValue();
}
return 0.0;
}
// Helper to round to 2 decimal places
private double round(double value) {
return Math.round(value * 100.0) / 100.0;
}
public double calculateAmount(double numDays, String startPeriod, String endPeriod, double fullDayAmount,
double halfDayAmount) {
double amount = 0;
// If there is only one day
if (numDays == 1) {
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
amount = fullDayAmount;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
amount = halfDayAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
amount = halfDayAmount;
} else {
amount = numDays;
}
} else {
// For multiple days
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
amount = fullDayAmount * numDays;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
amount = fullDayAmount * (numDays - 1) + halfDayAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
amount = fullDayAmount * (numDays - 1) + halfDayAmount;
} else if ("2".equals(startPeriod) && "1".equals(endPeriod)) {
amount = fullDayAmount * (numDays - 2) + halfDayAmount * 2;
} else {
amount = numDays;
}
}
return amount;
}
public double calculateDepositAmount(double numDays, String startPeriod, String endPeriod, double depositAmount) {
double damount = 0;
// If there is only one day
if (numDays == 1) {
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
damount = depositAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount;
} else {
damount = numDays;
}
} else {
// For multiple days
if ("1".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount * numDays;
} else if ("1".equals(startPeriod) && "1".equals(endPeriod)) {
damount = depositAmount * (numDays - 1) + depositAmount;
} else if ("2".equals(startPeriod) && "2".equals(endPeriod)) {
damount = depositAmount * (numDays - 1) + depositAmount;
} else if ("2".equals(startPeriod) && "1".equals(endPeriod)) {
damount = depositAmount * (numDays - 2) + depositAmount;
} else {
damount = numDays;
}
}
return damount;
}
/*
* @GetMapping("/checkMobileExits") public String checkMobileExits(@RequestParam
* (value = "Mobilenumber", required = false) long Mobilenumber) {
* // @RequestParam(value = "mobileNumber", required = false) Long mobileNumber,
*
* try {
*
* // Validate mobile number has exactly 10 digits String mobileStr =
* String.valueOf(Mobilenumber); if (mobileStr.length() != 10) { return
* "Invalid mobile number. Must be exactly 10 digits."; } return
* !hallService.checkMobileExits(Mobilenumber).isEmpty() ? "Already Registered"
* : "Allow to Register"; } catch (Exception e) { return "error"; } }
*/
@GetMapping("/checkMobileExits")
public ResponseEntity<String> checkMobileExits(
@RequestParam(value = "Mobilenumber", required = false) Long Mobilenumber) {
if (Mobilenumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
try {
String mobileStr = String.valueOf(Mobilenumber);
if (mobileStr.length() != 10) {
return ResponseEntity.badRequest().body("Invalid mobile number. Must be exactly 10 digits.");
}
boolean exists = !hallService.checkMobileExits(Mobilenumber).isEmpty();
return ResponseEntity.ok(exists ? "Already Registered" : "Allow to Register");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal server error");
}
}
// otp
@GetMapping(value = "/sendOTP")
public String sendOtp(HttpServletRequest request, @RequestParam String mobile) {
// Validate mobile number has exactly 10 digits
if (mobile == null || mobile.trim().isEmpty()) {
return "Mobile number is required.";
}
String mobileTrimmed = mobile.trim();
if (mobileTrimmed.length() != 10) {
return "Invalid mobile number. Must be exactly 10 digits.";
}
String MobileNo = mobile;
System.out.print("\n MobileNo---:" + mobile);
Random rand = new Random();
int otp = rand.nextInt(90000) + 10000;
// int otp= 22222;
System.out.print("\n otp---:" + otp);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy%20HH:mm");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now));
String generatedToken = "Welcome to GCC! Your OTP for GCC Community Centre is " + otp;
String key = "pfTEYN6H";
String urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + MobileNo
+ "&from=GCCCRP&body=OTP for your Victoria Public Hall booking " + otp
+ "\r\n- GCC&entityid=1401572690000011081&templateid=1407176491887361640";
System.out.print("\n urlString---: " + urlString);
String bodyMessage = "";
try {
RestTemplate restTemplate = new RestTemplate();
String Response = restTemplate.getForObject(urlString, String.class);
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode jsonResponse = (ObjectNode) objectMapper.readTree(Response);
jsonResponse.put("MobileNo", MobileNo);
jsonResponse.put("otp", otp);
bodyMessage = jsonResponse.toString();
System.out.println("\n bodyMessage" + bodyMessage);
System.out.println("OTP sent successfully!");
} catch (Exception e) {
System.out.print("ERROR---: " + e);
bodyMessage = "Error";
}
HttpSession session = request.getSession();
session.setAttribute("otp", otp);
return bodyMessage;
}
@GetMapping("/verifyEmployee")
public ResponseEntity<?> verifyEmployee(@RequestParam String userType,
@RequestParam(value = "EmployeeID", required = false) String EmployeeID) {
if (EmployeeID == null || EmployeeID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Missing or empty 'EmployeeID' parameter");
}
if (!"GCC EMPLOYEE".equalsIgnoreCase(userType)) {
return ResponseEntity.badRequest().body("Invalid userType for Employee verification.");
}
if (EmployeeID == null || EmployeeID.isBlank()) {
return ResponseEntity.badRequest().body("Employee ID is required for GCC EMPLOYEE.");
}
List<Map<String, Object>> existingEmployeeUsers = hallService.checkEmployeeExits(EmployeeID);
if (existingEmployeeUsers != null && !existingEmployeeUsers.isEmpty()) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Employee number already registered");
}
try {
String responseBody = getEmployeeResponse(EmployeeID);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
boolean resultStatus = rootNode.path("ResultStatus").asBoolean();
if (!resultStatus) {
return ResponseEntity.badRequest().body("Invalid employee ID.");
}
return ResponseEntity.ok(rootNode);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Employee verification failed.");
}
}
@GetMapping("/verifyPensioner")
public ResponseEntity<?> verifyPensioner(@RequestParam String userType,
@RequestParam(value = "PensionerID", required = false) String PensionerID) {
if (PensionerID == null || PensionerID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Missing or empty 'PensionerID' parameter");
}
if (!"GCC PENSIONER".equalsIgnoreCase(userType)) {
return ResponseEntity.badRequest().body("Invalid userType for Pensioner verification.");
}
if (PensionerID == null || PensionerID.isBlank()) {
return ResponseEntity.badRequest().body("Pensioner ID is required for GCC PENSIONER.");
}
List<Map<String, Object>> existingEmployeeUsers = hallService.checkPenionerExits(PensionerID);
if (existingEmployeeUsers != null && !existingEmployeeUsers.isEmpty()) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Pensioner number already registered");
}
try {
String responseBody = getPensionerResponse(PensionerID);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
boolean resultStatus = rootNode.path("ResultStatus").asBoolean();
if (!resultStatus) {
return ResponseEntity.badRequest().body("Invalid pensioner ID.");
}
return ResponseEntity.ok(rootNode);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Pensioner verification failed.");
}
}
@PostMapping("/register")
public ResponseEntity<String> registerUser(@RequestParam(value = "userType", required = false) String userType,
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "mobileNumber", required = false) Long mobileNumber,
@RequestParam(value = "aadharNumber", required = false) String aadharNumber,
@RequestParam(required = false) MultipartFile profilePhoto, @RequestParam(required = false) String emailId,
@RequestParam(value = "doorNo", required = false) String doorNo,
@RequestParam(value = "street", required = false) String street,
@RequestParam(value = "area", required = false) String area,
@RequestParam(value = "location", required = false) String location,
@RequestParam(value = "pincode", required = false) String pincode,
@RequestParam(required = false) String PensionerID,
@RequestParam(required = false) String PensionerDepartment,
@RequestParam(required = false) String EmployeeID,
@RequestParam(required = false) String EmployeeDepartment) {
try {
if (userType == null || userType.trim().isEmpty()) {
return ResponseEntity.badRequest().body("User type is required.");
}
if (name == null || name.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Name is required.");
}
if (mobileNumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
if (aadharNumber == null || aadharNumber.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Aadhar number is required.");
}
if (doorNo == null || doorNo.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Door number is required.");
}
if (street == null || street.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Street is required.");
}
if (area == null || area.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Area is required.");
}
if (location == null || location.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Location is required.");
}
if (pincode == null || pincode.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Pincode is required.");
}
// Additional validations for specific user types
if ("GCC PENSIONER".equalsIgnoreCase(userType)) {
if (PensionerID == null || PensionerID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Pensioner ID is required for GCC PENSIONER user type.");
}
if (PensionerID.length() != 6) {
return ResponseEntity.badRequest().body("Invalid PensionerID. Must be exactly 6 digits..");
}
if (PensionerDepartment == null || PensionerDepartment.trim().isEmpty()) {
return ResponseEntity.badRequest()
.body("Pensioner Department is required for GCC PENSIONER user type.");
}
}
if ("GCC EMPLOYEE".equalsIgnoreCase(userType)) {
if (EmployeeID == null || EmployeeID.trim().isEmpty()) {
return ResponseEntity.badRequest().body("Employee ID is required for GCC EMPLOYEE user type.");
}
if (EmployeeID.length() != 6) {
return ResponseEntity.badRequest().body("Invalid EmployeeID. Must be exactly 6 digits..");
}
if (EmployeeDepartment == null || EmployeeDepartment.trim().isEmpty()) {
return ResponseEntity.badRequest()
.body("Employee Department is required for GCC EMPLOYEE user type.");
}
}
// Format validations
if (String.valueOf(mobileNumber).length() != 10) {
return ResponseEntity.badRequest().body("Mobile number must be exactly 10 digits.");
}
if (pincode.length() != 6) {
return ResponseEntity.badRequest().body("Pincode must be exactly 6 digits.");
}
if (emailId != null && !emailId.isBlank()) {
String emailRegex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.com$";
if (!emailId.matches(emailRegex)) {
return ResponseEntity.badRequest().body("Invalid email ID.");
}
}
if (aadharNumber.length() != 12) {
return ResponseEntity.badRequest().body("Aadhar number must be exactly 12 digits.");
}
// Mobile number check only for PUBLIC users
if ("PUBLIC".equalsIgnoreCase(userType)) {
List<Map<String, Object>> existingUsers = hallService.checkMobileExits(mobileNumber);
boolean exists = existingUsers != null && !existingUsers.isEmpty();
if (exists) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Mobile number already registered");
}
}
if ("GCC PENSIONER".equalsIgnoreCase(userType)) {
List<Map<String, Object>> existingUsers = hallService.checkPenionerExits(PensionerID);
boolean exists = existingUsers != null && !existingUsers.isEmpty();
if (exists) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Pensioner number already registered ");
}
}
if ("GCC EMPLOYEE".equalsIgnoreCase(userType)) {
List<Map<String, Object>> existingUsers = hallService.checkEmployeeExits(EmployeeID);
boolean exists = existingUsers != null && !existingUsers.isEmpty();
if (exists) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Employee number already registered");
}
}
// Register all user types
hallService.registerUser(userType, name, mobileNumber, aadharNumber, profilePhoto, emailId, doorNo, street,
area, location, pincode, PensionerID, PensionerDepartment, EmployeeID, EmployeeDepartment);
// return ResponseEntity.ok("Pending.");
// Return different success messages based on user type
String successMessage;
if ("PUBLIC".equalsIgnoreCase(userType)) {
successMessage = "Welcome to GCC, Your User Registration for booking Community Centre is successful.";
} else if ("GCC PENSIONER".equalsIgnoreCase(userType) || "COUNCILLOR".equalsIgnoreCase(userType)
|| "GCC EMPLOYEE".equalsIgnoreCase(userType)) {
successMessage = "Welcome to GCC, Your User Registration request for booking Community Centre is submitted successfully.";
} else {
successMessage = "Welcome to GCC, your registration is successful.";
}
return ResponseEntity.ok(successMessage);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Registration failed.");
}
}
private String getPensionerResponse(String pensionerId) {
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?serviceId=getPensionerDetailsList&pensionerId="
+ pensionerId;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
String responseBody = responseEntity.getBody();
System.out.println("response.. " + responseBody);
return responseBody;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private String getEmployeeResponse(String employeeId) {
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?serviceId=getEmployeeDetail&EmployeeID="
+ employeeId;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
String responseBody = responseEntity.getBody();
System.out.println("Employee API response: " + responseBody);
return responseBody;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@GetMapping("/verifyCounsellor")
public ResponseEntity<?> checkCounsellorMobileExits(
@RequestParam(value = "mobileNo", required = false) Long mobileNo) {// @RequestParam(value = "mobileNumber",
// required = false) Long mobileNumber,
if (mobileNo == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
String mobileStr = String.valueOf(mobileNo);
if (mobileStr.length() != 10) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Mobile number must be exactly 10 digits.");
}
try {
// Validate input
if (mobileNo == null || mobileNo.toString().trim().isEmpty()) {
return ResponseEntity.badRequest().body("Missing or empty 'mobileNo' parameter.");
}
// Search for counsellor using mobile1 or mobile2
List<Map<String, Object>> counsellorList = hallService.findCounsellorByMobile(mobileNo);
if (counsellorList == null || counsellorList.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Counsellor mobile number not found.");
}
Map<String, Object> counsellor = counsellorList.get(0);
String mobile1 = String.valueOf(counsellor.get("mobile1"));
String mobile2 = String.valueOf(counsellor.get("mobile2"));
// Check if either number is already used in Users table
boolean isMobile1Used = !hallService.checkMobileExits(Long.parseLong(mobile1)).isEmpty();
boolean isMobile2Used = !hallService.checkMobileExits(Long.parseLong(mobile2)).isEmpty();
if (isMobile1Used || isMobile2Used) {
return ResponseEntity.status(HttpStatus.CONFLICT)
.body("One of the counsellor's mobile numbers is already used.");
}
return ResponseEntity.ok(counsellor.get("name").toString());
} catch (NumberFormatException e) {
return ResponseEntity.badRequest().body("Invalid mobile number format.");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Mobile number verification failed.");
}
}
// acknowledgment
/*
* @GetMapping("/acknowledgement") public ResponseEntity<Map<String, Object>>
* getBookingDetails(@RequestParam(value = "bookingId", required = false) int
* bookingId) { Map<String, Object> bookingDetails =
* hallService.getBookingDetailsById(bookingId); return
* ResponseEntity.ok(bookingDetails); }
*/
@GetMapping("/acknowledgement")
public ResponseEntity<?> getBookingDetails(@RequestParam(value = "bookingId", required = false) Integer bookingId) {
if (bookingId == null) {
return ResponseEntity.badRequest().body("Booking ID is required.");
}
try {
Map<String, Object> bookingDetails = hallService.getBookingDetailsById(bookingId);
return ResponseEntity.ok(bookingDetails);
} catch (EmptyResultDataAccessException ex) {
// No booking found
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No booking found for bookingId");
} catch (Exception e) {
// Any other error
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
//mobile
/*
* @GetMapping("/viewhistory") public ResponseEntity<Map<String, Object>>
* getBookingsByMobile(
*
* @RequestParam("mobileNumber") Long mobileNumber) {
*
*
* Map<String, Object> response = new HashMap<>();
*
* // Step 1: Check if user exists List<Map<String, Object>> userResult =
* hallService.checkMobileExits(mobileNumber);
*
* if (userResult.isEmpty()) { response.put("status", "NOT_FOUND");
* response.put("message", "No user found with the given mobile number"); return
* ResponseEntity.ok(response); }
*
* // Step 2: If exists → Call service List<Map<String, Object>> bookings =
* hallService.getBookingsByMobile(mobileNumber);
*
* response.put("status", "SUCCESS");
*
* response.put("mobile_no", mobileNumber); response.put("bookings", bookings);
*
* return ResponseEntity.ok(response); }
*/
@GetMapping("/viewhistory")
public ResponseEntity<?> getBookingsByMobile(
@RequestParam(value = "mobileNumber", required = false) Long mobileNumber) {
if (mobileNumber == null) {
return ResponseEntity.badRequest().body("Mobile number is required.");
}
// Check if mobile number is exactly 10 digits
String mobileStr = String.valueOf(mobileNumber);
if (mobileStr.length() != 10) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Mobile number must be exactly 10 digits.");
}
try {
// Step 1: Check if user exists
List<Map<String, Object>> userResult = hallService.checkMobileExits(mobileNumber);
if (userResult.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No user found with the given mobile number ");
}
// Step 2: Get bookings
List<Map<String, Object>> bookings = hallService.getBookingsByMobile(mobileNumber);
if (bookings == null || bookings.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body("No bookings found for mobile number: " + mobileNumber);
}
// Success response
Map<String, Object> response = new HashMap<>();
response.put("status", "SUCCESS");
response.put("mobile_no", mobileNumber);
response.put("bookings", bookings);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Internal server error: " + e.getMessage());
}
}
@PostMapping(path = "/saveTheRequest2", consumes = {"multipart/form-data"})
public ResponseEntity<?> saveTheBookingDetails2(HttpServletRequest request) {
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, Object> bookingDetails = splitFormData(multipartRequest);
Map<String, Object> saveBookingDetails = hallService.saveBookingDetails(bookingDetails);
return ResponseEntity.ok(new ApiResponse("success", "Booking details saved successfully",
saveBookingDetails, HttpStatus.OK.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to save booking details " + e.getMessage(), null,
HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
public Map<String, Object> splitFormData(MultipartHttpServletRequest multipartRequest) {
Map<String, Object> formData = new HashMap<>();
// Iterate through the request parameters
Enumeration<String> parameterNames = multipartRequest.getParameterNames();
while (parameterNames.hasMoreElements()) {
String paramName = parameterNames.nextElement();
String paramValues = multipartRequest.getParameter(paramName);
formData.put(paramName, paramValues);
}
// Iterate through the request parts (files)
try {
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
MultipartFile file = entry.getValue();
if (!file.isEmpty()) {
formData.put(entry.getKey(), file);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return formData;
}
@PostMapping("/payment-request")
public ResponseEntity<?> startPayment(@RequestParam int bookingId) {
try {
Map<String, Object> paymentDetails = hallService.startPayment(bookingId);
return ResponseEntity.ok(new ApiResponse("success", "Payment request initiated successfully",
paymentDetails, HttpStatus.OK.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ApiResponse("error", "Failed to initiate payment request: " + e.getMessage(), null,
HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
@PostMapping("/payment-response")
public ResponseEntity<?> paymentResponse(@RequestParam String orderId, @RequestBody PaymentWebhookPayload payload) {
try {
ResponseEntity<?> result = chPaymentService.processPaymentResponse(orderId, payload);
return ResponseEntity
.ok(new ApiResponse("success", "Payment processed successfully", result, HttpStatus.OK.value()));
} catch (IllegalArgumentException e) {
e.printStackTrace();
return ResponseEntity.badRequest().body(new ApiResponse("error", "Invalid request: " + e.getMessage(), null,
HttpStatus.BAD_REQUEST.value()));
} catch (EmptyResultDataAccessException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ApiResponse("error",
"No payment record found for Order ID: " + orderId, null, HttpStatus.NOT_FOUND.value()));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ApiResponse("error",
"Failed to Process the Payment: " + e.getMessage(), null, HttpStatus.INTERNAL_SERVER_ERROR.value()));
}
}
@GetMapping("/checkSlot")
public ResponseEntity<Map<String, Object>> checkSlotAvailability(
@RequestParam int hallId,
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam int startingSlot, // 1 = morning, 2 = evening
@RequestParam int endingSlot // 1 = morning, 2 = evening
) {
Map<String, Object> result = hallService.checkSlotAvailability(hallId, startDate, endDate, startingSlot, endingSlot);
return ResponseEntity.ok(result);
}
}

198
src/main/java/com/gcc/restapiservices/victoriaHallBooking/dto/PaymentWebhookPayload.java

@ -0,0 +1,198 @@
package com.gcc.restapiservices.victoriaHallBooking.dto;
import java.math.BigDecimal;
public class PaymentWebhookPayload {
private String reference_id;
private Currency currency;
private Amount paymentAmount;
private Transaction transaction;
public String getReference_id() {
return reference_id;
}
public void setReference_id(String reference_id) {
this.reference_id = reference_id;
}
public Currency getCurrency() {
return currency;
}
public void setCurrency(Currency currency) {
this.currency = currency;
}
public Amount getPaymentAmount() {
return paymentAmount;
}
public void setPaymentAmount(Amount paymentAmount) {
this.paymentAmount = paymentAmount;
}
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
public static class Currency {
private String reference_id;
private Amount amount;
private String currency;
private Transaction transaction;
public String getReference_id() {
return reference_id;
}
public void setReference_id(String reference_id) {
this.reference_id = reference_id;
}
public Amount getAmount() {
return amount;
}
public void setAmount(Amount amount) {
this.amount = amount;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public Transaction getTransaction() {
return transaction;
}
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
}
public static class Amount {
private double value;
private double offset;
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public double getOffset() {
return offset;
}
public void setOffset(double offset) {
this.offset = offset;
}
}
public static class Transaction {
private String id;
private String pg_transaction_id;
private String type;
private String status;
private long created_timestamp;
private long updated_timestamp;
private Amount amount;
private String currency;
private Method method;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPg_transaction_id() {
return pg_transaction_id;
}
public void setPg_transaction_id(String pg_transaction_id) {
this.pg_transaction_id = pg_transaction_id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public long getCreated_timestamp() {
return created_timestamp;
}
public void setCreated_timestamp(long created_timestamp) {
this.created_timestamp = created_timestamp;
}
public long getUpdated_timestamp() {
return updated_timestamp;
}
public void setUpdated_timestamp(long updated_timestamp) {
this.updated_timestamp = updated_timestamp;
}
public Amount getAmount() {
return amount;
}
public void setAmount(Amount amount) {
this.amount = amount;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public Method getMethod() {
return method;
}
public void setMethod(Method method) {
this.method = method;
}
}
public static class Method {
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
}

83
src/main/java/com/gcc/restapiservices/victoriaHallBooking/dto/TransactionData.java

@ -0,0 +1,83 @@
package com.gcc.restapiservices.victoriaHallBooking.dto;
public class TransactionData {
private Merchant merchant = new Merchant();
private Transaction transaction = new Transaction();
public Merchant getMerchant() {
return merchant;
}
public Transaction getTransaction() {
return transaction;
}
public static class Merchant {
private String identifier;
public String getIdentifier() {
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
}
public static class Transaction {
private String amount;
private String identifier;
private String dateTime;
private String requestType;
private String token;
private String reference;
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getIdentifier() {
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
public String getDateTime() {
return dateTime;
}
public void setDateTime(String dateTime) {
this.dateTime = dateTime;
}
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getReference() {
return reference;
}
public void setReference(String reference) {
this.reference = reference;
}
}
}

73
src/main/java/com/gcc/restapiservices/victoriaHallBooking/dto/TransactionRefundResponse.java

@ -0,0 +1,73 @@
package com.gcc.restapiservices.victoriaHallBooking.dto;
public class TransactionRefundResponse {
private String merchantTransactionIdentifier;
private PaymentMethod paymentMethod;
public String getMerchantTransactionIdentifier() {
return merchantTransactionIdentifier;
}
public void setMerchantTransactionIdentifier(String merchantTransactionIdentifier) {
this.merchantTransactionIdentifier = merchantTransactionIdentifier;
}
public PaymentMethod getPaymentMethod() {
return paymentMethod;
}
public void setPaymentMethod(PaymentMethod paymentMethod) {
this.paymentMethod = paymentMethod;
}
public static class PaymentMethod {
private PaymentTransaction paymentTransaction;
public PaymentTransaction getPaymentTransaction() {
return paymentTransaction;
}
public void setPaymentTransaction(PaymentTransaction paymentTransaction) {
this.paymentTransaction = paymentTransaction;
}
}
public static class PaymentTransaction {
private String statusCode;
private String amount;
private String balanceAmount;
private String refundIdentifier;
public String getStatusCode() {
return statusCode;
}
public void setStatusCode(String statusCode) {
this.statusCode = statusCode;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getBalanceAmount() {
return balanceAmount;
}
public void setBalanceAmount(String balanceAmount) {
this.balanceAmount = balanceAmount;
}
public String getRefundIdentifier() {
return refundIdentifier;
}
public void setRefundIdentifier(String refundIdentifier) {
this.refundIdentifier = refundIdentifier;
}
}
}

536
src/main/java/com/gcc/restapiservices/victoriaHallBooking/service/VPHPaymentService.java

@ -0,0 +1,536 @@
package com.gcc.restapiservices.victoriaHallBooking.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gcc.restapiservices.victoriaHallBooking.configuration.VPHPaymentConfig;
import com.gcc.restapiservices.victoriaHallBooking.dto.PaymentWebhookPayload;
import com.gcc.restapiservices.victoriaHallBooking.dto.TransactionData;
import com.gcc.restapiservices.victoriaHallBooking.dto.TransactionRefundResponse;
import com.gcc.restapiservices.victoriaHallBooking.util.VPHEncryptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import javax.sql.DataSource;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
public class VPHPaymentService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private VPHPaymentConfig paymentConfig;
@Autowired
private WhatsappMsgService whatsappMsgServiceImpl;
@Autowired
private VPHEncryptionUtils encryptionUtils;
private final ObjectMapper objectMapper = new ObjectMapper();
@Autowired
public void setDataSource(@Qualifier("mysqlCommunityHallDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional("mysqlCommunityHallTransactionManager")
public ResponseEntity<?> processPaymentResponse(
@RequestParam String OrderId,
@RequestBody PaymentWebhookPayload payload) throws Exception {
Map<String, Object> result = new HashMap<>();
String transactionId = OrderId;
String pgTxnId = payload.getTransaction().getPg_transaction_id();
String status = payload.getTransaction().getStatus();
double amount = payload.getTransaction().getAmount().getValue() / 100.0;
String dateTime = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss")
.withZone(ZoneId.of("Asia/Kolkata"))
.format(Instant.ofEpochSecond(payload.getTransaction().getCreated_timestamp()));
Map<String, Object> txn;
try {
txn = jdbcTemplate.queryForMap(
"SELECT * FROM transaction_response WHERE txansaction_id = ? AND status_code ='temp' ",
transactionId);
} catch (EmptyResultDataAccessException e) {
result.put("status", "error");
result.put("message", "Transaction not found or already processed.");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
}
int bookingId = (int) txn.get("booking_id");
int hallId = (int) txn.get("hall_id");
String userId = (String) txn.get("user_id");
jdbcTemplate.update(
"UPDATE transaction_response SET tpsl_txn_id = ?, amount = ?, date = ?, status_code = ?, response = ?, "
+
"booking_id = ?, hall_id = ?, user_id = ? WHERE txansaction_id = ?",
pgTxnId, String.valueOf(amount), dateTime, status,
objectMapper.writeValueAsString(payload), bookingId, hallId, userId, transactionId);
Map<String, Object> booking;
try {
booking = jdbcTemplate.queryForMap("SELECT * FROM booking_details WHERE booking_id = ?", bookingId);
} catch (EmptyResultDataAccessException e) {
result.put("status", "error");
result.put("message", "Booking not found.");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(result);
}
double expectedAmount = booking.get("amount_received") != null
? ((Number) booking.get("amount_received")).doubleValue()
: 0.0;
jdbcTemplate.update("INSERT INTO payments "
+ " (transaction_id, amount_received, payment_status, cdate, booking_details_booking_id) "
+ " VALUES (?, ?, ?, ?, ?)", transactionId, amount, "Not Completed", new Date(),
bookingId);
if (expectedAmount != amount) {
updatePaymentStatus(transactionId, "Failed");
// bookingFailure(bookingId, 1);
result.put("status", "error");
result.put("message", "Amount mismatch. Payment failed.");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
}
if ("success".equalsIgnoreCase(status)) {
updatePaymentStatus(transactionId, "Success");
confirmBooking(bookingId);
String acknowledgementUrl = "https://gccservices.chennaicorporation.gov.in/communityhall/user/acknowledgement?bookingId="
+ bookingId;
result.put("status", "success");
result.put("message", "Payment processed successfully.");
result.put("acknowledgement_url", acknowledgementUrl);
return ResponseEntity.ok(result);
} else {
updatePaymentStatus(transactionId, "Failed");
result.put("status", "error");
result.put("message", "Payment failed.");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
}
}
public void updatePaymentStatus(String transactionId, String status) {
jdbcTemplate.update("UPDATE payments SET payment_status = ? WHERE transaction_id = ?", status, transactionId);
}
@Transactional(value = "mysqlCommunityHallTransactionManager", propagation = Propagation.REQUIRES_NEW)
public void bookingFailure(int bookingId, int flag) {
String comment = flag == 1 ? "Booking Not Confirmed"
: "Slot occupied by other user, Amount paid will be refunded.";
jdbcTemplate.update("UPDATE booking_details SET booking_status = 'REFUNDED', comments = ? WHERE booking_id = ?",
comment, bookingId);
/*
* String refundStatus = booking.get("refund_status").toString();
* if (!("COMPLETED".equalsIgnoreCase(refundStatus)) &&
* !("CLOSED".equalsIgnoreCase(refundStatus))) {
* refundTheAmount(bookingId, Integer.parseInt(userId));
* }
*/
}
@Transactional("mysqlCommunityHallTransactionManager")
public String confirmBooking(int bookingId) {
Map<String, Object> booking = jdbcTemplate.queryForMap("SELECT * FROM booking_details WHERE booking_id = ?",
bookingId);
try {
int hallId = (int) booking.get("hall_details_hall_id");
LocalDate startDate = LocalDate.parse((String) booking.get("start_date"));
LocalDate endDate = LocalDate.parse((String) booking.get("end_date"));
int startSlot = (int) booking.get("starting_slot");
int endSlot = (int) booking.get("ending_slot");
double noOfDays = booking.get("no_of_days") != null ? (double) booking.get("no_of_days") : 1.0;
// int i = 0;
// for (LocalDate date = startDate; !date.isAfter(endDate); date =
// date.plusDays(1)) {
// String checkSql = "SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id
// = ?";
// List<Map<String, Object>> existing = jdbcTemplate.queryForList(checkSql,
// date, hallId);
// if (!existing.isEmpty()) {
// Map<String, Object> cal = existing.get(0);
// if ((boolean) cal.get("is_blocked")) throw new RuntimeException("GCC Blocked
// Date");
// boolean morningBooked = (boolean) cal.get("morning_slot");
// boolean eveningBooked = (boolean) cal.get("evening_slot");
// if ((date.equals(startDate) && startSlot == 1 && morningBooked) ||
// (date.equals(startDate) && startSlot == 2 && eveningBooked) ||
// (date.equals(endDate) && endSlot == 1 && morningBooked) ||
// (date.equals(endDate) && endSlot == 2 && eveningBooked)) {
// throw new RuntimeException("Slot already booked or partially occupied");
// }
// updateCalendarWithBooking(date, bookingId, hallId, startDate, endDate,
// startSlot, endSlot, i);
// } else {
// insertCalendarWithBooking(date, bookingId, hallId, startDate, endDate,
// startSlot, endSlot, i);
// }
// i++;
// }
int i = 0;
for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
String checkSql = "SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id = ?";
List<Map<String, Object>> existing = jdbcTemplate.queryForList(checkSql, date, hallId);
if (!existing.isEmpty()) {
Map<String, Object> cal = existing.get(0);
if ((boolean) cal.get("is_blocked"))
throw new RuntimeException("GCC Blocked Date");
boolean morningBooked = (boolean) cal.get("morning_slot");
boolean eveningBooked = (boolean) cal.get("evening_slot");
int isBooked = (int) cal.get("is_booked");
String bookingId1 = (String) cal.get("booking_id_1");
String bookingId2 = (String) cal.get("booking_id_2");
// ====== Validation ======
if ((date.equals(startDate) && startSlot == 1 && morningBooked) ||
(date.equals(startDate) && startSlot == 2 && eveningBooked) ||
(date.equals(endDate) && endSlot == 1 && morningBooked) ||
(date.equals(endDate) && endSlot == 2 && eveningBooked) ||
(morningBooked && eveningBooked)) {
throw new RuntimeException("Slot already booked or partially occupied");
}
// ====== Update slots ======
if (date.equals(startDate)) {
if (startSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
if (!date.equals(endDate) || (startDate.equals(endDate) && endSlot == 2)) {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else if (date.equals(endDate)) {
if (endSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
if (endSlot == 2) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
}
}
} else {
morningBooked = true;
eveningBooked = true;
bookingId1 = String.valueOf(bookingId);
bookingId2 = String.valueOf(bookingId);
isBooked += 2;
}
// ====== Run UPDATE ======
String updateSql = "UPDATE booking_calendar " +
"SET morning_slot=?, evening_slot=?, is_booked=?, booking_id_1=?, booking_id_2=? " +
"WHERE bdate=? AND hall_id=?";
jdbcTemplate.update(updateSql,
morningBooked, eveningBooked, isBooked, bookingId1, bookingId2,
date, hallId);
} else {
// ====== Insert new row ======
boolean morningBooked = false;
boolean eveningBooked = false;
boolean isDelete = false;
boolean isBlocked = false;
int isBooked = 0;
String bookingId1 = null, bookingId2 = null;
if (date.equals(startDate)) {
if (startSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
if (!date.equals(endDate) || (startDate.equals(endDate) && endSlot == 2)) {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
}
} else if (date.equals(endDate)) {
if (endSlot == 1) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
} else {
eveningBooked = true;
bookingId2 = String.valueOf(bookingId);
isBooked++;
if (endSlot == 2) {
morningBooked = true;
bookingId1 = String.valueOf(bookingId);
isBooked++;
}
}
} else {
morningBooked = true;
eveningBooked = true;
bookingId1 = String.valueOf(bookingId);
bookingId2 = String.valueOf(bookingId);
isBooked += 2;
}
String uniqueId = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
System.out.println("uniqueId...."+uniqueId+"\n hallId: "+hallId+"\n morningBooked: "+morningBooked+
"\n eveningBooked: "+eveningBooked+"\n isBooked: "+isBooked+"\n bookingId1: "+bookingId1+"\n bookingId2: "+bookingId2);
String insertSql = "INSERT INTO booking_calendar " +
"(bdate, hall_id, morning_slot, evening_slot, is_booked, booking_id_1, booking_id_2, is_active, unique_id, is_delete, is_blocked) "
+"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
jdbcTemplate.update(insertSql,date, hallId, morningBooked, eveningBooked, isBooked,bookingId1, bookingId2, true, uniqueId, isDelete, isBlocked);
}
i++;
}
String reason = (String) booking.get("reason");
String reasonCode = fetchReasonCode(reason);
String status = "APPROVED";
String comments = "Booking Confirmed Successfully";
if (reasonCode != null && !reasonCode.trim().isEmpty()) {
if (List.of("CGE", "CAO", "SGE").contains(reasonCode)) {
status = "WAITING_FOR_NOC";
comments = "Waiting For NOC Documents";
}
}
jdbcTemplate.update("UPDATE booking_details SET booking_status = ?, comments = ? WHERE booking_id = ?",
status, comments, bookingId);
sendConfirmationMessages(bookingId, booking);
return comments;
} catch (Exception e) {
e.printStackTrace();
// bookingFailure(bookingId, 2);
return "redirect:/communityhall/user/acknowledgement?bookingId=" + bookingId;
}
}
private void updateCalendarWithBooking(LocalDate date, int bookingId, int hallId, LocalDate startDate,
LocalDate endDate, int startSlot, int endSlot, int i) {
String updateSql = "UPDATE booking_calendar SET morning_slot = ?, evening_slot = ?, booking_id_1 = ?, booking_id_2 = ?, is_booked = is_booked + ? WHERE bdate = ? AND hall_id = ?";
boolean isMorning = true;
boolean isEvening = true;
int increment = 2;
jdbcTemplate.update(updateSql, isMorning, isEvening, bookingId, bookingId, increment, date, hallId);
}
private void insertCalendarWithBooking(LocalDate date, int bookingId, int hallId, LocalDate startDate,
LocalDate endDate, int startSlot, int endSlot, int i) {
String uniqueId = date.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + hallId;
String insertSql = "INSERT INTO booking_calendar (bdate, hall_id, is_active, is_booked, is_delete, morning_slot, evening_slot, booking_id_1, booking_id_2, is_blocked, unique_id) VALUES (?, ?, true, ?, false, ?, ?, ?, ?, false, ?)";
jdbcTemplate.update(insertSql, date, hallId, 2, true, true, bookingId, bookingId, uniqueId);
}
private String fetchReasonCode(String reason) {
try {
String sql = "SELECT reasoncode FROM reason_master WHERE reason = ?";
return jdbcTemplate.queryForObject(sql, String.class, reason);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
private String sendConfirmationMessages(int bookingId, Map<String, Object> booking) {
System.out.println("confirmation message calling..");
try {
String bookingconfirmationmsg, urlString, whatsupmsg;
String reason = booking.get("reason").toString();
String reasonCode = fetchReasonCode(reason);
String bookingDate = booking.get("booking_date").toString();
String startDate = booking.get("start_date").toString();
int userId = Integer.parseInt(booking.get("users_user_id").toString());
Map<String, Object> userData = jdbcTemplate.queryForMap("SELECT * FROM users WHERE user_id = ? ", userId);
String userMobNo = userData.get("mobile_no").toString();
if (reasonCode != null && !reasonCode.trim().isEmpty()) {
if (reasonCode.equals("CGE") || reasonCode.equals("CAO") || reasonCode.equals("SGE")) {
updateBookingStatus(bookingId, "WAITING_FOR_NOC", "Waiting For NOC Documents");
bookingconfirmationmsg = "Your booking ID " + bookingId + " on " + bookingDate
+ " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + userMobNo +
"&from=GCCCRP&body=" + bookingconfirmationmsg
+ "&entityid=1401572690000011081&templateid=1407172346459428987";
whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="
+userMobNo + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+"
+bookingId + "+on+" + bookingDate+ "+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Waiting For NOC Documents";
} else {
updateBookingStatus(bookingId, "APPROVED", "Booking Confirmed Successfully");
bookingconfirmationmsg = "Your booking ID " + bookingId + " on " + startDate
+ " has been confirmed successfully. Thanks for using GCC Community Hall Booking System.";
urlString = "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + userMobNo +
"&from=GCCCRP&body=" + bookingconfirmationmsg
+ "&entityid=1401572690000011081&templateid=1407172346459428987";
whatsupmsg = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to="
+
userMobNo + "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+booking+with+ID+"
+
bookingId + "+on+" + startDate
+ "+has+been+successfully+confirmed.+%0AThanks+for+using+GCC+Community+Hall+Booking+System.";
whatsappMsgServiceImpl.sendMsg(whatsupmsg);
whatsappMsgServiceImpl.sendSMS(urlString);
return "Booking confirmed successfully";
}
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return "Incorrect booking data";
}
/*
* public String refundTheAmount(int bookingId, int userId) {
* try {
*
* // get mobile no using userId --> need to add
* Map<String, Object> txn = jdbcTemplate.
* queryForMap("SELECT * FROM transaction_response WHERE booking_id = ? AND status_code = ? ORDER BY id DESC LIMIT 1"
* , bookingId, paymentConfig.getTransactionSuccessCode());
* String amount = (String) txn.get("amount");
* String txnDate = ((String) txn.get("date")).split(" ")[0];
* String tpslTxnId = (String) txn.get("tpsl_txn_id");
*
* TransactionData payload = new TransactionData();
* payload.getMerchant().setIdentifier(paymentConfig.getMerchantId());
* payload.getTransaction().setAmount(amount);
* payload.getTransaction().setIdentifier("");
* payload.getTransaction().setDateTime(txnDate);
* payload.getTransaction().setRequestType("R");
* payload.getTransaction().setToken("");
* payload.getTransaction().setReference(tpslTxnId);
*
* String json = objectMapper.writeValueAsString(payload);
* String encrypted = encryptionUtils.encryptHxRefund(json);
*
* String url = "https://www.tpsl-india.in/PaymentGateway/merchant2.pg/" +
* paymentConfig.getMerchantId();
* ResponseEntity<String> response = new RestTemplate().postForEntity(url,
* encrypted, String.class);
* String decrypted = encryptionUtils.decryptHxTRefund(response.getBody());
*
* TransactionRefundResponse refundRes = objectMapper.readValue(decrypted,
* TransactionRefundResponse.class);
* String refundStatusCode =
* refundRes.getPaymentMethod().getPaymentTransaction().getStatusCode();
* String refundTxnId = refundRes.getMerchantTransactionIdentifier();
* String refundIdentifier =
* refundRes.getPaymentMethod().getPaymentTransaction().getRefundIdentifier();
* String refundedAmount =
* refundRes.getPaymentMethod().getPaymentTransaction().getAmount();
* String balanceAmount =
* refundRes.getPaymentMethod().getPaymentTransaction().getBalanceAmount();
*
* jdbcTemplate.
* update("INSERT INTO refund_response (booking_id, user_id, response, status_code, txansaction_id, amount, balace_amount, date) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
* , bookingId, userId, decrypted, refundStatusCode, refundTxnId,
* refundedAmount, balanceAmount, LocalDate.now());
*
* Map<String, Object> booking =
* jdbcTemplate.queryForMap("SELECT * FROM booking_details WHERE booking_id = ?"
* , bookingId);
*
* jdbcTemplate.
* update("INSERT INTO refund_transaction (amount_refunded, cdate, booking_details_booking_id, refund_identifier, refund_status, transaction_id) VALUES (?, ?, ?, ?, ?, ?)"
* , Double.parseDouble(refundedAmount), new Date(), bookingId,
* refundIdentifier, refundStatusCode, refundTxnId);
*
* if (refundStatusCode.equals(paymentConfig.getRefundSuccessCode())) {
* jdbcTemplate.
* update("UPDATE booking_details SET refund_status = 'COMPLETED' WHERE booking_id = ?"
* , bookingId);
*
* long mobile = (long) booking.get("users_user_id");
* double amt = Double.parseDouble(refundedAmount);
* whatsappMsgServiceImpl.sendSMS(buildSMSUrl(mobile, amt, bookingId));
* whatsappMsgServiceImpl.sendMsg(buildWhatsAppUrl(mobile, amt, bookingId));
* return "Refunded";
* }
*
* return "Error";
* } catch (Exception e) {
* e.printStackTrace();
* return "error";
* }
* }
*/
private String buildSMSUrl(long mobile, double amt, int bookingId) {
return "https://tmegov.onex-aura.com/api/sms?key=pfTEYN6H&to=" + mobile
+ "&from=GCCCRP&body=Your refund amount of Rs. " + amt + " for Booking ID " + bookingId
+ " has been initiated.";
}
private String buildWhatsAppUrl(long mobile, double amt, int bookingId) {
return "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507&password=h2YjFNcJ&send_to=" + mobile
+ "&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE&msg=Your+refund+of+Rs.+" + amt
+ "+for+Booking+ID+" + bookingId + "+has+been+initiated.";
}
public void updateBookingStatus(int bookingId, String bookingStatus, String comments) {
String updateSql = "update booking_details set booking_status =?, comments= ? WHERE booking_id = ?";
jdbcTemplate.update(updateSql, bookingStatus, comments, bookingId);
}
}

41
src/main/java/com/gcc/restapiservices/victoriaHallBooking/service/WhatsappMsgService.java

@ -0,0 +1,41 @@
package com.gcc.restapiservices.victoriaHallBooking.service;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.net.HttpURLConnection;
import java.net.URL;
@Service
public class WhatsappMsgService {
public String sendMsg(String msgUrl) {
System.out.println("Whatsapp URL :-" + msgUrl);
String response = "";
try {
HttpURLConnection connection = null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = responseCode + "";
System.out.println("Response Code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public String sendSMS(String SMS_Url) {
System.out.println("SMS URL:- " + SMS_Url);
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(SMS_Url, String.class);
return response;
}
}

849
src/main/java/com/gcc/restapiservices/victoriaHallBooking/service/victoriaHallService.java

@ -0,0 +1,849 @@
package com.gcc.restapiservices.victoriaHallBooking.service;
import com.gcc.restapiservices.victoriaHallBooking.configuration.VPHPaymentConfig;
import com.gcc.restapiservices.victoriaHallBooking.util.VPHTransactionNumberGenerator;
import com.gcc.restapiservices.configuration.AppConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.util.Random;
import com.gcc.restapiservices.configuration.AppConfig;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import javax.sql.DataSource;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@Service
public class victoriaHallService {
private JdbcTemplate jdbcTemplate;
@Autowired
private AppConfig appConfig;
@Autowired
private Environment environment;
@Autowired
private VPHPaymentConfig paymentConfig;
@Autowired
private VPHTransactionNumberGenerator transactionNumberGenerator;
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final int STRING_LENGTH = 15;
private static final Random RANDOM = new SecureRandom();
@Value("${file.upload.directory.victoriahall}")
private String uploadDirectory;
@Value("${file.fullpath.victoriahall}")
private String serverPath;
@Autowired
public void setDataSource(@Qualifier("mysqlVictoriaHallDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getHallList() {
return jdbcTemplate.queryForList("SELECT * FROM hall_details WHERE is_active = 1 order by hall_name asc");
}
public List<Map<String, Object>> getReasonMaster() {
String sql = "SELECT reason_id,reason,maxdays,reasoncode FROM reason_master";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getDocumentsByReasonId(Long reasonId) {
String sql = "SELECT doc_field_name,field_name FROM reason_document_master WHERE reason_id = ?";
return jdbcTemplate.queryForList(sql, reasonId);
}
public List<Map<String, String>> getRelationTypesAsMap() {
List<Map<String, String>> relationList = new ArrayList<>();
String[] relations = {"Self"};
for (String rel : relations) {
Map<String, String> map = new HashMap<>();
map.put("relation_name", rel);
map.put("value", rel);
relationList.add(map);
}
return relationList;
}
public List<Map<String, Object>> getUserDetails(Long Mobilenumber) {
String sql = "SELECT name,email,mobile_no,doorno,area,location,pin_code,user_status,usertype,profilephoto FROM users WHERE mobile_no = ?";
return jdbcTemplate.queryForList(sql, Mobilenumber);
}
public Map<String, Object> getHallDetailsById(int hallId) {
String sql = "SELECT * FROM hall_details WHERE hall_id = ?";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, hallId);
if (result.isEmpty()) {
return null; // or Collections.emptyMap() if you prefer
}
return result.get(0);
}
public Map<String, Object> getHallConcessionByHallId(int hallId) {
String sql = "SELECT * FROM hall_details_concession WHERE hall_id = ?";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, hallId);
if (result.isEmpty()) {
return null; // or Collections.emptyMap()
}
return result.get(0); // ✅ safe return of first result
}
public List<Map<String, Object>> checkMobileExits(Long Mobilenumber) {
String sql = "SELECT * FROM users WHERE mobile_no = ?";
return jdbcTemplate.queryForList(sql, Mobilenumber);
}
public List<Map<String, Object>> checkEmployeeExits(String EmployeeID) {
String sql = "SELECT * FROM users WHERE government_id= ?";
return jdbcTemplate.queryForList(sql, EmployeeID);
}
/*
* public Map<String, Object> getBookingDetailsById(int bookingId) { String sql
* = "SELECT " +
* "bd.booking_id, bd.booking_date, bd.start_date, bd.end_date, bd.comments, bd.booking_status, "
* +
* "bd.starting_slot, bd.ending_slot, bd.no_of_days, bd.reason, bd.gst, bd.deposit_amount, "
* + "bd.hall_amount, bd.amount_received AS booking_amount_received, " +
* "u.name, u.usertype, u.mobile_no, u.email, " +
* "hd.zone, hd.division, hd.hall_incharge_name, hd.hall_incharge_no, hd.hall_name, "
* + "CONCAT_WS(', ', hd.street, hd.area, hd.pin_code) AS address, " +
* "p.transaction_id, p.payment_status, p.amount_received AS payment_amount_received "
* + "FROM booking_details bd " +
* "INNER JOIN users u ON bd.users_user_id = u.user_id " +
* "INNER JOIN hall_details hd ON bd.hall_details_hall_id = hd.hall_id " +
* "INNER JOIN payments p ON bd.booking_id = p.booking_details_booking_id " +
* "WHERE bd.booking_id = ?";
*
* return jdbcTemplate.queryForMap(sql, bookingId); }
*/
public Map<String, Object> getBookingDetailsById(int bookingId) {
String sql = "SELECT "
+ "bd.booking_id, DATE_FORMAT(bd.booking_date, '%d-%m-%Y') AS booking_date, "
+ " DATE_FORMAT(bd.start_date, '%d-%m-%Y') AS start_date, "
+ " DATE_FORMAT(bd.end_date, '%d-%m-%Y') AS end_date, "
+ " bd.comments, bd.booking_status, "
+ "bd.starting_slot, bd.ending_slot, bd.no_of_days, bd.reason, bd.gst, bd.deposit_amount, "
+ "bd.hall_amount, bd.amount_received AS total_amount, " + "u.name, u.usertype, u.mobile_no, u.email, "
+ "hd.zone, hd.division, hd.hall_incharge_name as caretaker_name, hd.hall_incharge_no as caretaker_mobileno, hd.hall_name, "
+ "CONCAT_WS(', ', hd.street, hd.area, hd.pin_code) AS hall_address, "
+ "p.transaction_id, p.payment_status, p.amount_received AS payment_amount_received "
+ "FROM booking_details bd " + "INNER JOIN users u ON bd.users_user_id = u.user_id "
+ "INNER JOIN hall_details hd ON bd.hall_details_hall_id = hd.hall_id "
+ "INNER JOIN payments p ON bd.booking_id = p.booking_details_booking_id " + "WHERE bd.booking_id = ?";
Map<String, Object> result = jdbcTemplate.queryForMap(sql, bookingId);
// Add the acknowledgement URL to the result
String acknowledgementUrl = "https://gccservices.chennaicorporation.gov.in/communityhall/user/acknowledgement?bookingId=" + bookingId;
result.put("acknowledgement_url", acknowledgementUrl);
return result;
}
public List<Map<String, Object>> getBookingsByMobile(Long mobileNumber) {
String sql = "SELECT bd.booking_id , DATE_FORMAT(bd.booking_date, '%d-%m-%Y') AS booking_date,"
+ " DATE_FORMAT(bd.start_date, '%d-%m-%Y') AS start_date,"
+ " DATE_FORMAT(bd.end_date, '%d-%m-%Y') AS end_date, "
+ "bd.starting_slot, bd.ending_slot, bd.reason, bd.booking_status, "
+ "p.payment_status AS payment_status " + "FROM booking_details bd "
+ "INNER JOIN users u ON bd.users_user_id = u.user_id "
+ "INNER JOIN payments p ON bd.booking_id = p.booking_details_booking_id "
+ "WHERE u.mobile_no = ? " + "AND bd.booking_status NOT IN ('PENDING')";
List<Map<String, Object>> bookings = jdbcTemplate.queryForList(sql, mobileNumber);
// Add acknowledgement URL to each booking
for (Map<String, Object> booking : bookings) {
Object bookingId = booking.get("booking_id");
if (bookingId != null) {
String acknowledgementUrl = "https://gccservices.chennaicorporation.gov.in/communityhall/user/acknowledgement?bookingId="
+ bookingId;
booking.put("acknowledgement_url", acknowledgementUrl);
}
}
return bookings;
}
public List<Map<String, Object>> checkPenionerExits(String PensionerID) {
String sql = "SELECT * FROM users WHERE government_id= ?";
return jdbcTemplate.queryForList(sql, PensionerID);
}
//
public List<Map<String, Object>> findCounsellorByMobile(long mobileNo) {
String sql = "SELECT * FROM counsellor_details WHERE mobile1 = ? OR mobile2 = ?";
return jdbcTemplate.queryForList(sql, mobileNo, mobileNo);
}
public void registerUser(String userType, String name, long mobileNumber, String aadharNumber,
MultipartFile profilePhoto, String emailId, String doorNo, String street, String area, String location,
String pincode, String pensionerID, String pensionerDepartment, String employeeID,
String employeeDepartment) throws IOException {
String uploadPhotoUrl = null;
if (profilePhoto != null && !profilePhoto.isEmpty()) {
uploadPhotoUrl = saveFile(profilePhoto);
}
// Default values for government_id and department
String governmentId = null;
String department = null;
String userstatus = "APPROVED";
// Logic for conditional insertion based on userType
if ("GCC PENSIONER".equalsIgnoreCase(userType)) {
governmentId = pensionerID;
department = pensionerDepartment;
userstatus = "PENDING";
} else if ("GCC EMPLOYEE".equalsIgnoreCase(userType)) {
governmentId = employeeID;
department = employeeDepartment;
userstatus = "PENDING";
}
String sql = "INSERT INTO users (usertype, name, mobile_no, aadhar_number, profilephoto, email, "
+ "doorno, street, area, location, pin_code, government_id, department,user_status) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
jdbcTemplate.update(sql, userType, name, mobileNumber, aadharNumber, uploadPhotoUrl, emailId, doorNo, street,
area, location, pincode, governmentId, department, userstatus);
}
public String saveFile(MultipartFile file) throws IOException {
String order_copy_url = "";
// Handle file upload if a file is provided
if (file == null || file.isEmpty()) {
return order_copy_url;
}
// Get the base upload directory from properties
String uploadDirectory = environment.getProperty("file.upload.directory"); // e.g., /opt/myapp/uploads
// Define the subdirectory structure
String serviceFolderName = "images/userPhoto"; // You can also get from properties if needed
// Build the full folder path
String fullUploadPath = uploadDirectory + File.separator + serviceFolderName;
Path directoryPath = Paths.get(fullUploadPath);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
// Generate unique file name
// String datetimetxt = DateTimeUtil.getCurrentDateTime();
String fileName = generateRandomStringForFile(10) + "_" + file.getOriginalFilename();
// Physical file path
Path filePath = directoryPath.resolve(fileName);
// Write the file to the physical path
Files.write(filePath, file.getBytes());
// Relative path for storing in DB
String filepath_txt = "/" + serviceFolderName + "/" + fileName;
return filepath_txt;
}
public static String generateRandomStringForFile(int String_Lenth) {
StringBuilder result = new StringBuilder(String_Lenth);
for (int i = 0; i < STRING_LENGTH; i++) {
result.append(CHARACTERS.charAt(RANDOM.nextInt(CHARACTERS.length())));
}
return result.toString();
}
@Transactional("mysqlVictoriaHallTransactionManager")
public Map<String, Object> saveBookingDetails(Map<String, Object> formData) {
Map<String, Object> hs = new HashMap<>();
Map<String, Object> userMaster = jdbcTemplate.queryForMap("SELECT * FROM users WHERE mobile_no = ?",
(formData.get("mobNo").toString()));
Integer userId = (Integer) userMaster.get("user_id");
Map<String, Object> reasonMaster = jdbcTemplate.queryForMap("SELECT * FROM reason_master WHERE reason_id = ?",
Integer.parseInt(formData.get("reasonId").toString()));
Map<String, Object> hallDetails = jdbcTemplate.queryForMap("SELECT * FROM hall_details WHERE hall_id = ?",
Integer.parseInt(formData.get("hallId").toString()));
// Fetch User
Map<String, Object> user = jdbcTemplate.queryForMap("SELECT * FROM users WHERE user_id = ?", userId);
String bookingId = formData.get("bookingId").toString();
Map<String, Object> bookingDetails = null;
if (bookingId != null && bookingId.equals("0")) {
} else {
List<Map<String, Object>> bookings = jdbcTemplate
.queryForList("SELECT * FROM booking_details WHERE booking_id = ?", Integer.parseInt(bookingId));
if (!bookings.isEmpty()) {
bookingDetails = bookings.get(0);
jdbcTemplate.update("DELETE FROM booking_documents WHERE booking_id = ?", Integer.parseInt(bookingId));
}
}
if (user != null) {
String startDate = formData.get("startDate").toString();
String endDate = formData.get("endDate").toString();
String relation = formData.get("relation").toString();
double days = Double.parseDouble(formData.get("days").toString());
int daysrange = Integer.parseInt(formData.get("daysrange").toString());
String usertype = user.get("usertype").toString();
String reason = reasonMaster.get("reason").toString();
int startingSlot = Integer.parseInt(formData.get("startingSlot").toString());
int endingSlot = Integer.parseInt(formData.get("endingSlot").toString());
String startingSlot_txt = formData.get("startingSlot").toString();
String endingSlot_txt = formData.get("endingSlot").toString();
Map<String, Object> discountrange = jdbcTemplate
.queryForMap("SELECT * FROM discount_range WHERE usertype = ?", usertype);
float discount = Float.parseFloat(discountrange.get("discount_range").toString());
double hallAmount = calcHallAmountJdbc(hallDetails, daysrange, startingSlot, endingSlot);
hs.put("actualhallamount", hallAmount);
double depositeamount = Double.parseDouble(hallDetails.get("deposit_amount").toString());
double halfDepositAmount = Double.parseDouble(hallDetails.get("half_deposit_amount").toString());
double Totaldepositeamount = calculateDepositAmountJdbc(daysrange, startingSlot_txt, endingSlot_txt,
depositeamount, halfDepositAmount);
depositeamount = Totaldepositeamount;
double discountAmount = 0;
double gstAmount = 0.00;
String reasoncode = reasonMaster.get("reasoncode") != null ? reasonMaster.get("reasoncode").toString() : "";
hs.put("reasoncode", reasoncode);
/*Map<String, Object> governmentevents = jdbcTemplate.queryForMap(
"SELECT * FROM hall_details_concession WHERE hall_id = ?",
Integer.parseInt(hallDetails.get("hall_id").toString()));*/
List<Map<String, Object>> rows = jdbcTemplate.queryForList(
"SELECT * FROM hall_details_concession WHERE hall_id = ?",
Integer.parseInt(hallDetails.get("hall_id").toString())
);
Map<String, Object> governmentevents = rows.isEmpty()
? Collections.emptyMap() // or null, your call
: rows.get(0);
if (reasoncode.equals("SGE")) {
if (startingSlot == 1 && endingSlot == 2) {
discountAmount = (Double.parseDouble(governmentevents.get("fulldayhallamount").toString())
* Double.parseDouble(hallDetails.get("sgediscount").toString())) / 100;
hallAmount = Double.parseDouble(governmentevents.get("fulldayhallamount").toString());
hs.put("discount", hallDetails.get("sgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("full_day_cleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("fulldaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("fulldayebcharges").toString());
double additionalcharges = cleaningCharges + PASystem + EB;
gstAmount = Math.round(additionalcharges * Double.parseDouble(hallDetails.get("gst").toString()))
/ 100.0;
double depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
double totalAmount = additionalcharges + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, additionalcharges, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
} else {
hallAmount = Double.parseDouble(governmentevents.get("halfdayhallamount").toString());
discountAmount = (hallAmount * Double.parseDouble(hallDetails.get("sgediscount").toString())) / 100;
hs.put("discount", hallDetails.get("sgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("halfdaycleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("halfdaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("halfdayebcharges").toString());
double additionalcharges = cleaningCharges + PASystem + EB;
gstAmount = Math.round(additionalcharges * Double.parseDouble(hallDetails.get("gst").toString()))
/ 100.0;
double depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
double totalAmount = additionalcharges + gstAmount + depositAmount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, additionalcharges, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
}
} else if (reasoncode.equals("CGE")) {
double rentAmount, netAmount, depositAmount, totalAmount, truncatedTotalAmount, additionalcharges;
if (startingSlot == 1 && endingSlot == 2) {
discountAmount = (Double.parseDouble(hallDetails.get("full_day_rent").toString())
* Double.parseDouble(hallDetails.get("cgediscount").toString())) / 100;
hallAmount = Double.parseDouble(hallDetails.get("full_day_rent").toString());
hs.put("discount", hallDetails.get("cgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("full_day_cleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("fulldaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("fulldayebcharges").toString());
additionalcharges = cleaningCharges + PASystem + EB;
rentAmount = hallAmount - discountAmount;
netAmount = rentAmount + additionalcharges;
gstAmount = Math.round(netAmount * Double.parseDouble(hallDetails.get("gst").toString())) / 100.0;
depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
totalAmount = netAmount + gstAmount + depositAmount;
truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("rentAmount", rentAmount);
hs.put("gstAmount", gstAmount);
hs.put("netAmount", netAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, netAmount, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
} else {
discountAmount = (Double.parseDouble(hallDetails.get("half_day_rent").toString())
* Double.parseDouble(hallDetails.get("cge_discount").toString())) / 100;
hallAmount = Double.parseDouble(hallDetails.get("half_day_rent").toString());
hs.put("discount", hallDetails.get("cgediscount"));
double cleaningCharges = Double
.parseDouble(governmentevents.get("half_day_cleaningcharges").toString());
double PASystem = Double.parseDouble(governmentevents.get("halfdaypasystem").toString());
double EB = Double.parseDouble(governmentevents.get("halfdayebcharges").toString());
additionalcharges = cleaningCharges + PASystem + EB;
rentAmount = hallAmount - discountAmount;
netAmount = rentAmount + additionalcharges;
gstAmount = Math.round(netAmount * Double.parseDouble(hallDetails.get("gst").toString())) / 100.0;
depositAmount = Double.parseDouble(hallDetails.get("deposit_amount").toString()) * daysrange;
totalAmount = netAmount + gstAmount + depositAmount;
truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("actualhallamount", hallAmount);
hs.put("rentAmount", rentAmount);
hs.put("gstAmount", gstAmount);
hs.put("netAmount", netAmount);
hs.put("additionalcharges", additionalcharges);
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, netAmount, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
}
} else {
if (usertype.equals("COUNCILLOR") || usertype.equals("PENSIONER") || usertype.equals("GCC_EMPLOYEE")
|| usertype.equals("PUBLIC")) {
discountAmount = (hallAmount * discount) / 100;
hallAmount = hallAmount - discountAmount;
gstAmount = Math.round(hallAmount * Double.parseDouble(hallDetails.get("gst").toString())) / 100.0;
double totalAmount = hallAmount + gstAmount + depositeamount;
double truncatedTotalAmount = Math.round(totalAmount * 100.0) / 100.0;
hs.put("totalAmount", truncatedTotalAmount);
bookingId = insertOrUpdateBookingDetailsJdbc(jdbcTemplate, bookingId, user, hallDetails, startDate,
endDate, days, startingSlot, endingSlot, depositeamount, hallAmount, gstAmount,
truncatedTotalAmount, reason, relation, "WAITING", "Booking Slot not Confirmed.", "ONLINE");
}
}
System.out.println("bookingId...." + bookingId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start = LocalDate.parse(startDate, formatter);
LocalDate end = LocalDate.parse(endDate, formatter);
int hallId = Integer.parseInt(hallDetails.get("hall_id").toString());
int i = 0;
for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
Map<String, Object> bookingCalendar = null;
List<Map<String, Object>> calList = jdbcTemplate.queryForList(
"SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id = ?", date.toString(), hallId);
if (!calList.isEmpty())
bookingCalendar = calList.get(0);
if (bookingCalendar != null) {
boolean morningSlot = Boolean.TRUE.equals(bookingCalendar.get("morning_slot"));
boolean eveningSlot = Boolean.TRUE.equals(bookingCalendar.get("evening_slot"));
if ((date.equals(start) && startingSlot == 1 && morningSlot)
|| (date.equals(start) && startingSlot == 2 && eveningSlot)
|| (date.equals(end) && endingSlot == 1 && morningSlot)
|| (date.equals(end) && endingSlot == 2 && eveningSlot)) {
return Collections.singletonMap("status", "slotOccupied");
} else if (morningSlot && eveningSlot) {
return Collections.singletonMap("status", "slotOccupied");
} else if (!date.equals(end) && i != 0 && i != Math.round(days - 1)
&& (morningSlot || eveningSlot)) {
return Collections.singletonMap("status", "slotOccupied");
} else if (date.equals(end) && endingSlot == 2 && morningSlot && i != 0
&& i == Math.round(days - 1)) {
return Collections.singletonMap("status", "slotOccupied");
}
}
i++;
}
List<Map<String, Object>> reasonDocMaster = jdbcTemplate.queryForList(
"SELECT * FROM reason_document_master WHERE reason_id = ?",
Integer.parseInt(formData.get("reasonId").toString()));
List<Map<String, Object>> uploadedDocs = new ArrayList<>();
for (Map<String, Object> rm : reasonDocMaster) {
Map<String, Object> docMap = new HashMap<>();
String fieldName = "";
String value = "";
String fileName = "";
String fileUrl = "";
String filePath = "";
if (Boolean.TRUE.equals(rm.get("add_text_field"))) {
fieldName = rm.get("field_name").toString();
value = formData.get(fieldName).toString();
jdbcTemplate.update(
"INSERT INTO booking_documents (booking_details_booking_id, booking_label, name) VALUES (?, ?, ?)",
Integer.parseInt(bookingId), fieldName, value);
docMap.put("booking_label", fieldName);
docMap.put("name", value);
}
if (Boolean.TRUE.equals(rm.get("add_document_field"))) {
String docFieldName = rm.get("doc_field_name").toString();
MultipartFile file = (MultipartFile) formData.get(docFieldName);
fileName = bookingId + "_" + file.getOriginalFilename();
fileUrl = serverPath + "images/" + reason + "/" + fileName;
filePath = uploadDirectory + "/" + reason + "/" + fileName;
// Create directory if it doesn't exist
File directory = new File(uploadDirectory + "/" + reason);
if (!directory.exists()) {
directory.mkdirs(); // Creates parent directories if needed
}
docMap.put("documentName", file.getOriginalFilename());
docMap.put("documentType", file.getContentType());
docMap.put("bookingDocUrl", fileUrl);
// Save file to disk
try (FileOutputStream fos = new FileOutputStream(filePath)) {
byte[] bytes = file.getBytes();
fos.write(bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
jdbcTemplate.update(
"INSERT INTO booking_documents (booking_details_booking_id, booking_doc_url, document_name, document_type, booking_label, name) VALUES (?, ?, ?, ?, ?, ?)",
Integer.parseInt(bookingId), fileUrl, file.getOriginalFilename(), file.getContentType(),
fieldName, value);
}
uploadedDocs.add(docMap);
}
hs.put("bookingId", bookingId);
hs.put("hallName", hallDetails.get("hall_name"));
hs.put("NoOfDay", days);
hs.put("startDate", startDate);
hs.put("endDate", endDate);
hs.put("startingSlot", startingSlot);
hs.put("endingSlot", endingSlot);
hs.put("hallAmount", hallAmount);
hs.put("gst", gstAmount);
hs.put("depositAmount", depositeamount);
hs.put("username", user.get("name"));
hs.put("userId", user.get("user_id"));
hs.put("mobileNo", user.get("mobile_no"));
hs.put("userType", user.get("usertype"));
hs.put("reason", reason);
hs.put("bookingId", bookingId);
hs.put("uploadedDocs", uploadedDocs);
}
return hs;
}
private double calcHallAmountJdbc(Map<String, Object> hallDetails, int daysrange, int startPeriod, int endPeriod) {
double fullDayRent = Double.parseDouble(hallDetails.get("full_day_rent").toString());
double halfDayRent = Double.parseDouble(hallDetails.get("half_day_rent").toString());
if (daysrange == 1) {
if (startPeriod == 1 && endPeriod == 2)
return fullDayRent;
else if (startPeriod == 1 && endPeriod == 1)
return halfDayRent;
else if (startPeriod == 2 && endPeriod == 2)
return halfDayRent;
else if (startPeriod == 2 && endPeriod == 1)
return fullDayRent;
} else {
if (startPeriod == 1 && endPeriod == 2)
return fullDayRent * daysrange;
else if (startPeriod == 1 && endPeriod == 1)
return fullDayRent * (daysrange - 1) + halfDayRent;
else if (startPeriod == 2 && endPeriod == 2)
return fullDayRent * (daysrange - 1) + halfDayRent;
else if (startPeriod == 2 && endPeriod == 1)
return fullDayRent * (daysrange - 2) + halfDayRent * 2;
}
return 0;
}
private double calculateDepositAmountJdbc(double numDays, String startPeriod, String endPeriod,
double depositAmount, double HalfDepositAmount) {
double damount = 0;
if (numDays == 1) {
if ("1".equals(startPeriod) && "2".equals(endPeriod))
damount = depositAmount;
else if ("1".equals(startPeriod) && "1".equals(endPeriod))
damount = HalfDepositAmount;
else if ("2".equals(startPeriod) && "2".equals(endPeriod))
damount = HalfDepositAmount;
else
damount = numDays;
} else {
if ("1".equals(startPeriod) && "2".equals(endPeriod))
damount = depositAmount * numDays;
else if ("1".equals(startPeriod) && "1".equals(endPeriod))
damount = depositAmount * (numDays - 1) + HalfDepositAmount;
else if ("2".equals(startPeriod) && "2".equals(endPeriod))
damount = depositAmount * (numDays - 1) + HalfDepositAmount;
else if ("2".equals(startPeriod) && "1".equals(endPeriod))
damount = depositAmount * (numDays - 2) + depositAmount;
else
damount = numDays;
}
return damount;
}
private String insertOrUpdateBookingDetailsJdbc(JdbcTemplate jdbcTemplate, String bookingId,
Map<String, Object> user, Map<String, Object> hallDetails, String startDate, String endDate, double days,
int startingSlot, int endingSlot, double depositAmount, double hallAmount, double gst, double totalAmount,
String reason, String relation, String refundStatus, String comments, String bookingType) {
if (bookingId == null || bookingId.equals("0")) {
// Insert with KeyHolder
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(
"INSERT INTO booking_details (users_user_id, hall_details_hall_id, start_date, end_date, no_of_days, starting_slot, ending_slot, deposit_amount, hall_amount, gst, amount_received, reason, refund_status, comments, booking_type, relationship, booking_date, schedule_count, source) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
Statement.RETURN_GENERATED_KEYS);
ps.setObject(1, user.get("user_id"));
ps.setObject(2, hallDetails.get("hall_id"));
ps.setString(3, startDate);
ps.setString(4, endDate);
ps.setDouble(5, days);
ps.setInt(6, startingSlot);
ps.setInt(7, endingSlot);
ps.setDouble(8, depositAmount);
ps.setDouble(9, hallAmount);
ps.setDouble(10, gst);
ps.setDouble(11, totalAmount);
ps.setString(12, reason);
ps.setString(13, refundStatus);
ps.setString(14, comments);
ps.setString(15, bookingType);
ps.setString(16, relation);
ps.setString(17, java.time.LocalDate.now().toString());
ps.setInt(18, 0);
ps.setInt(19, 2);
return ps;
}, keyHolder);
Number generatedId = keyHolder.getKey();
return generatedId != null ? generatedId.toString() : null;
} else {
// Update
jdbcTemplate.update(
"UPDATE booking_details SET users_user_id=?, hall_details_hall_id=?, start_date=?, end_date=?, no_of_days=?, starting_slot=?, ending_slot=?, deposit_amount=?, hall_amount=?, gst=?, amount_received=?, reason=?, refund_status=?, comments=?, booking_type=?, relationship=?, booking_date=?, schedule_count=? WHERE booking_id=?",
user.get("user_id"), hallDetails.get("hall_id"), startDate, endDate, days, startingSlot, endingSlot,
depositAmount, hallAmount, gst, totalAmount, reason, refundStatus, comments, bookingType, relation,
java.time.LocalDate.now().toString(), 0, Integer.parseInt(bookingId));
return bookingId;
}
}
public HashMap<String, Object> startPayment(int bookingId) {
HashMap<String, Object> hs = new HashMap<>();
String bookingSql = "SELECT b.amount_received, b.users_user_id, b.hall_details_hall_id, "
+ " u.user_id, u.mobile_no, u.email " + " FROM booking_details b "
+ " JOIN users u ON b.users_user_id = u.user_id " + " WHERE b.booking_id = ?";
try {
Map<String, Object> data = jdbcTemplate.queryForMap(bookingSql, bookingId);
double amountReceived = (double) data.get("amount_received");
int UserId = (int) data.get("user_id");
long mobileNo = (long) data.get("mobile_no");
String email = (String) data.get("email");
int hallId = (int) data.get("hall_details_hall_id");
String txnId = "CHB" + transactionNumberGenerator.generateTransactionNumber()
+ String.format("%05d", UserId);
String totalAmt = String.valueOf(amountReceived);
String insertSql = "INSERT INTO transaction_response (txansaction_id, hall_id, user_id, status_code, booking_id) "
+ " VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(insertSql, txnId, hallId, String.valueOf(UserId), "temp", bookingId);
String merchantId = paymentConfig.getMerchantId();
String consumerId = String.format("%05d", UserId);
String encryptedToken = getToken(merchantId + "|", txnId + "|", totalAmt + "|", "|", consumerId + "|",
mobileNo + "|", email + "|", "|", "|", "|", "|", "|", "|", "|", "|", "|",
paymentConfig.getEncryptionKey());
hs.put("txansactionId", txnId);
hs.put("token", encryptedToken);
hs.put("amount", totalAmt);
/*
* hs.put("merchantId", merchantId); hs.put("consumerMobileNo", mobileNo);
* hs.put("consumerEmailId", email); hs.put("consumerId", consumerId);
* hs.put("error", false);
*/
} catch (EmptyResultDataAccessException | NoSuchAlgorithmException e) {
hs.put("error", true);
hs.put("message", "Invalid booking ID or no user data found. ");
e.printStackTrace();
}
return hs;
}
public String getToken(String merchantId, String txnId, String totalAmt, String accountNo, String consumerId,
String consumerMobileNo, String consumerEmailId, String debitStartDate, String debitEndDate,
String maxAmount, String amountType, String frequency, String cardNumber, String expMonth, String expYear,
String cvvCode, String salt) throws NoSuchAlgorithmException {
String token = merchantId + txnId + totalAmt + accountNo + consumerId + consumerMobileNo + consumerEmailId
+ debitStartDate + debitEndDate + maxAmount + amountType + frequency + cardNumber + expMonth + expYear
+ cvvCode + salt;
return generateToken(token);
}
public String generateToken(String token) throws NoSuchAlgorithmException {
// System.out.println("Token:-" + token);
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(token.getBytes());
byte[] bytes = md.digest();
BigInteger bigInt = new BigInteger(1, bytes);
String encryptedtoken = bigInt.toString(16);
while (encryptedtoken.length() < 128) {
encryptedtoken = "0" + encryptedtoken;
}
// System.out.println("Encryption :- " + encryptedtoken);
return encryptedtoken;
}
public Map<String, Object> checkSlotAvailability(int hallId, String startDate, String endDate, int startingSlot, int endingSlot) {
// Validate slot numbers
if (startingSlot < 1 || startingSlot > 2 || endingSlot < 1 || endingSlot > 2) {
throw new IllegalArgumentException("Slot values must be 1 (morning) or 2 (evening).");
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start;
LocalDate end;
try {
start = LocalDate.parse(startDate, formatter);
end = LocalDate.parse(endDate, formatter);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid date format. Use yyyy-MM-dd.");
}
if (end.isBefore(start)) {
throw new IllegalArgumentException("End date cannot be before start date.");
}
long days = java.time.temporal.ChronoUnit.DAYS.between(start, end) + 1;
int i = 0;
try {
for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
List<Map<String, Object>> calList = jdbcTemplate.queryForList(
"SELECT * FROM booking_calendar WHERE bdate = ? AND hall_id = ?",
date.toString(), hallId
);
if (!calList.isEmpty()) {
Map<String, Object> bookingCalendar = calList.get(0);
boolean morningSlot = Boolean.TRUE.equals(bookingCalendar.get("morning_slot"));
boolean eveningSlot = Boolean.TRUE.equals(bookingCalendar.get("evening_slot"));
if ((date.equals(start) && startingSlot == 1 && morningSlot)
|| (date.equals(start) && startingSlot == 1 && eveningSlot)
|| (date.equals(end) && endingSlot == 1 && morningSlot)
|| (date.equals(end) && endingSlot == 1 && eveningSlot)) {
return Map.of("status", "slotOccupied");
} else if (morningSlot && eveningSlot) {
return Map.of("status", "slotOccupied");
} else if (!date.equals(end) && i != 0 && i != Math.round(days - 1)
&& (morningSlot || eveningSlot)) {
return Map.of("status", "slotOccupied");
} else if (date.equals(end) && endingSlot == 2 && morningSlot && i != 0
&& i == Math.round(days - 1)) {
return Map.of("status", "slotOccupied");
}
}
i++;
}
} catch (DataAccessException e) {
e.printStackTrace();
throw new RuntimeException("Database error occurred while checking slot availability.");
}
return Map.of("status", "slotAvailable");
}
}

63
src/main/java/com/gcc/restapiservices/victoriaHallBooking/util/VPHEncryptionUtils.java

@ -0,0 +1,63 @@
package com.gcc.restapiservices.victoriaHallBooking.util;
import com.gcc.restapiservices.victoriaHallBooking.configuration.VPHPaymentConfig;
import org.apache.commons.codec.binary.Hex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
@Component
public class VPHEncryptionUtils {
@Autowired
private VPHPaymentConfig paymentConfig;
public String encryptHxRefund(String text) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(this.paymentConfig.getEncryptionKeyByte(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(this.paymentConfig.getEncryptionIVByte());
cipher.init(1, keySpec, ivSpec);
byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
String hxencstr = ToHexStrRefund(results);
return hxencstr;
}
public String ToHexStrRefund(byte[] dataBuf) {
String hxstr = null;
Hex hx = new Hex();
hxstr = new String(hx.encode(dataBuf));
return hxstr;
}
public String decryptHxTRefund(String hxstrr) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(this.paymentConfig.getEncryptionKeyByte(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(this.paymentConfig.getEncryptionIVByte());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decbytes = FromHexStr(hxstrr);
byte[] results = cipher.doFinal(decbytes);
return new String(results, "UTF-8").trim();
}
public byte[] FromHexStr(String hxStr) {
byte[] charArray = hxStr.getBytes();
byte[] bufstr = null;
Hex hxx = new Hex();
try {
bufstr = hxx.decode(charArray);
} catch (Exception e) {
e.printStackTrace();
}
return bufstr;
}
}

37
src/main/java/com/gcc/restapiservices/victoriaHallBooking/util/VPHTransactionNumberGenerator.java

@ -0,0 +1,37 @@
package com.gcc.restapiservices.victoriaHallBooking.util;
import org.springframework.stereotype.Service;
import java.util.Random;
@Service
public class VPHTransactionNumberGenerator {
public String generateTransactionNumber() {
// Define the length of the transaction number
int length = 12;
// Define characters to be used in the transaction number
String characters = "0123456789";
// Create a StringBuilder to store the transaction number
StringBuilder sb = new StringBuilder();
// Create an instance of Random class
Random random = new Random();
// Generate the transaction number
for (int i = 0; i < length; i++) {
// Generate a random index within the range of characters
int randomIndex = random.nextInt(characters.length());
// Append the character at the random index to the transaction number
sb.append(characters.charAt(randomIndex));
}
// Convert StringBuilder to String and return
return sb.toString();
}
}

36
src/main/resources/application-dev.properties

@ -0,0 +1,36 @@
spring.application.name=restapiservices
spring.datasource.url=jdbc:mysql://localhost:3306/dumpwastecollector
spring.datasource.username=root
spring.datasource.password=root
#spring.jpa.show-sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8050
spring.servlet.multipart.max-file-size=20MB
file.upload.directory=${user.dir}/gccoffice_uploads
file.dump.upload.directory=${user.dir}/cd_waste_docs/cdwaste_dump
file.fullpath=/
file.dump.fullpath=/cd_waste_docs/
fileBaseUrl=https://gccservices.in
app.getOtpUrl=https://tmegov.onex-aura.com/api/sms?
app.erpUrl=https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?
dump_directory=cdwaste_dump
feedback_directory = whatsapp_feedback
#fileHanding
file.upload.directory.communityhall=${user.dir}/communityHallDocuments
file.fullpath.communityhall=/
# Used for know your zone and division based on address
google.api.key=AIzaSyCi7N6uW5MZaSkd50Kzw7ax2GkMN1vjE-E
gis.api.url=https://gisgcc.chennaicorporation.gov.in/server/rest/services/GCCDepts/EDPMobile2025/FeatureServer/0/query

46
src/main/resources/application-prod.properties

@ -0,0 +1,46 @@
spring.application.name= restapiservices
spring.datasource.url=jdbc:mysql://gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306/gcc_c_d_waste_web
spring.datasource.username=root
spring.datasource.password=gcc-facial-password
# spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8050
#for using cd waste
spring.servlet.multipart.max-file-size=20MB
file.upload.directory=${user.dir}/gccoffice_uploads
file.fullpath=/
file.dump.fullpath=/cd_waste_docs/
fileBaseUrl=https://gccservices.in
#payment.razorpay.my_key_id="rzp_live_66FhxMUNAb9McO"
#payment.razorpay.my_key_id="rzp_test_tDkHFEqWXmuEi8"
app.getOtpUrl=https://tmegov.onex-aura.com/api/sms?
app.erpUrl=http://coc-staging.egovernments.org:9980/pgr/external/mobileservice?
dump_directory=cdwaste_dump
feedback_directory = whatsapp_feedback
#fileHanding
file.upload.directory.communityhall=${user.dir}/communityHallDocuments
file.fullpath.communityhall=/
#fileHanding
file.upload.directory.victoriahall=${user.dir}/victoriaHallDocuments
file.fullpath.victoriahall=/
# Used for know your zone and division based on address
google.api.key=AIzaSyCi7N6uW5MZaSkd50Kzw7ax2GkMN1vjE-E
gis.api.url=https://gisgcc.chennaicorporation.gov.in/server/rest/services/GCCDepts/EDPMobile2025/FeatureServer/0/query

3
src/main/resources/application.properties

@ -0,0 +1,3 @@
#Generated by Eclipse Messages Editor (Eclipse Babel)
spring.profiles.active = prod

15
src/main/resources/paymentConfig.properties

@ -0,0 +1,15 @@
#payment.worldline.merchantId=T955031
#payment.worldline.encryptionKey=1025180466GPADTD
#payment.worldline.encryptionIV=3232693456UWOWHC
#payment.worldline.schemeCode=FIRST
#payment.worldline.merchantName=Greater Chennai Corporation
#payment.worldline.transactionSuccessCode=0300
#payment.worldline.refundSuccessCode=0400
payment.worldline.merchantId=L1037717
payment.worldline.encryptionKey=6207149300MFLGNY
payment.worldline.encryptionIV=3422107798TKQCNG
payment.worldline.schemeCode=FIRST
payment.worldline.merchantName=Greater Chennai Corporation
payment.worldline.transactionSuccessCode=0300
payment.worldline.refundSuccessCode=0400
Loading…
Cancel
Save