From 634f5a16bbc749608c9cd3a19b24257fc559909d Mon Sep 17 00:00:00 2001 From: srishanmugip Date: Thu, 12 Jun 2025 17:38:13 +0530 Subject: [PATCH] Initial project setup for Property Tax PDF Download ERP --- .gitattributes | 2 + .gitignore | 33 +++ .mvn/wrapper/maven-wrapper.properties | 19 ++ mvnw | 259 ++++++++++++++++++ mvnw.cmd | 149 ++++++++++ pom.xml | 82 ++++++ .../java/com/example/erp/ErpApplication.java | 13 + .../example/erp/controller/APIController.java | 33 +++ .../erp/service/PropertyTaxService.java | 160 +++++++++++ src/main/resources/application-dev.properties | 11 + src/main/resources/application.properties | 1 + src/main/resources/static/images/chennai.jpg | Bin 0 -> 83418 bytes .../com/example/erp/ErpApplicationTests.java | 13 + 13 files changed, 775 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/example/erp/ErpApplication.java create mode 100644 src/main/java/com/example/erp/controller/APIController.java create mode 100644 src/main/java/com/example/erp/service/PropertyTaxService.java create mode 100644 src/main/resources/application-dev.properties create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/static/images/chennai.jpg create mode 100644 src/test/java/com/example/erp/ErpApplicationTests.java diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..667aaef --- /dev/null +++ b/.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/ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..2f94e61 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.10/apache-maven-3.9.10-bin.zip diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/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-,maven-mvnd--}/ +[ -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 "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/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-,maven-mvnd--}/ +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" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..50d019a --- /dev/null +++ b/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.0 + + + com.example + erp + 0.0.1-SNAPSHOT + erp + Demo project for Spring Boot + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter-data-jdbc + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-web + + + com.itextpdf + itextpdf + 5.5.13.3 + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/example/erp/ErpApplication.java b/src/main/java/com/example/erp/ErpApplication.java new file mode 100644 index 0000000..53e5e45 --- /dev/null +++ b/src/main/java/com/example/erp/ErpApplication.java @@ -0,0 +1,13 @@ +package com.example.erp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ErpApplication { + + public static void main(String[] args) { + SpringApplication.run(ErpApplication.class, args); + } + +} diff --git a/src/main/java/com/example/erp/controller/APIController.java b/src/main/java/com/example/erp/controller/APIController.java new file mode 100644 index 0000000..9b9c48d --- /dev/null +++ b/src/main/java/com/example/erp/controller/APIController.java @@ -0,0 +1,33 @@ +package com.example.erp.controller; + +import org.springframework.beans.factory.annotation.Autowired; +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 com.example.erp.service.PropertyTaxService; + +@RestController +@RequestMapping("erp/api/property") +public class APIController { + + @Autowired + private PropertyTaxService propertyTaxService; + + @GetMapping("/download-pdf") + public ResponseEntity downloadAllAsZip() { + byte[] zipBytes = propertyTaxService.generateAllPdfsAsZip(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", "property-pdf.zip"); + + return new ResponseEntity<>(zipBytes, headers, HttpStatus.OK); + } +} + diff --git a/src/main/java/com/example/erp/service/PropertyTaxService.java b/src/main/java/com/example/erp/service/PropertyTaxService.java new file mode 100644 index 0000000..0ac0db3 --- /dev/null +++ b/src/main/java/com/example/erp/service/PropertyTaxService.java @@ -0,0 +1,160 @@ +package com.example.erp.service; + +import java.io.ByteArrayOutputStream; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.itextpdf.text.Document; +import com.itextpdf.text.Font; +import com.itextpdf.text.Image; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.BarcodeQRCode; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; + +@Service +public class PropertyTaxService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + public byte[] generateAllPdfsAsZip() { + String sql = "SELECT * FROM property_tax"; + List> rows = jdbcTemplate.queryForList(sql); + + if (rows.isEmpty()) { + throw new RuntimeException("No property records found"); + } + + try (ByteArrayOutputStream zipOutStream = new ByteArrayOutputStream(); + ZipOutputStream zipStream = new ZipOutputStream(zipOutStream)) { + + for (Map row : rows) { + String zone = "Zone-" + safeFolderName((String) row.get("zone")); + String division = "Division-" + safeFolderName((String) row.get("division")); + String propertyId = safeFileName((String) row.get("property_id")); + String ownerName = safeFileName((String) row.get("owner_name")); + + String zipEntryPath = String.format("property-pdf/%s/%s/%s_%s.pdf", zone, division, ownerName, propertyId); + + byte[] pdfBytes = generateSinglePdf(row); + + ZipEntry zipEntry = new ZipEntry(zipEntryPath); + zipStream.putNextEntry(zipEntry); + zipStream.write(pdfBytes); + zipStream.closeEntry(); + } + + zipStream.finish(); + return zipOutStream.toByteArray(); + + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error generating ZIP with PDFs", e); + } + } + + private byte[] generateSinglePdf(Map row) { + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + Document document = new Document(); + PdfWriter.getInstance(document, out); + document.open(); + + Font titleFont = new Font(Font.FontFamily.HELVETICA, 14, Font.BOLD); + Font boldFont = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD); + Font regularFont = new Font(Font.FontFamily.HELVETICA, 11); + + // 🖼 Logo + QR Code in one row + try { + Image logo = Image.getInstance("src/main/resources/static/images/chennai.jpg"); + logo.scaleToFit(60, 60); + + String propertyId = row.get("old_property_id").toString(); + String qrUrl = "http://coc-staging.egovernments.org:9980/ptis/citizen/propertyQr!payTaxByQR.action?taxType=property&screenType=1&oldPropertyId=" + propertyId; + BarcodeQRCode qrCode = new BarcodeQRCode(qrUrl, 100, 100, null); + Image qrImage = qrCode.getImage(); + qrImage.scaleToFit(80, 80); + + PdfPTable headerTable = new PdfPTable(2); + headerTable.setWidthPercentage(100); + headerTable.setSpacingAfter(10f); + + PdfPCell logoCell = new PdfPCell(logo, false); + logoCell.setBorder(0); + logoCell.setHorizontalAlignment(PdfPCell.ALIGN_LEFT); + logoCell.setPadding(5f); + + PdfPCell qrCell = new PdfPCell(qrImage, false); + qrCell.setBorder(0); + qrCell.setHorizontalAlignment(PdfPCell.ALIGN_RIGHT); + qrCell.setPadding(5f); + + headerTable.addCell(logoCell); + headerTable.addCell(qrCell); + + document.add(headerTable); + } catch (Exception imgEx) { + // Optionally log + } + + // 📝 Title + document.add(new Paragraph("Property Tax Report", titleFont)); + document.add(new Paragraph(" ")); + + // 📋 Details table + PdfPTable table = new PdfPTable(2); + table.setSpacingBefore(10f); + table.setWidthPercentage(100); + + addCell(table, "Property ID", row.get("property_id"), boldFont, regularFont); + addCell(table, "Old Property ID", row.get("old_property_id"), boldFont, regularFont); + addCell(table, "Zone", row.get("zone"), boldFont, regularFont); + addCell(table, "Division", row.get("division"), boldFont, regularFont); + addCell(table, "Owner Name", row.get("owner_name"), boldFont, regularFont); + addCell(table, "Mobile Number", row.get("mobile_number"), boldFont, regularFont); + addCell(table, "Email ID", row.get("email_id"), boldFont, regularFont); + addCell(table, "Address", row.get("address"), boldFont, regularFont); + addCell(table, "Installment Year", row.get("installment_year"), boldFont, regularFont); + addCell(table, "Tax Amount", "₹" + row.get("tax_amount"), boldFont, regularFont); + addCell(table, "Penalty", "₹" + row.get("penalty"), boldFont, regularFont); + addCell(table, "Total", "₹" + row.get("total"), boldFont, regularFont); + + document.add(table); + document.close(); + + return out.toByteArray(); + } catch (Exception e) { + throw new RuntimeException("Error creating PDF for property ID: " + row.get("property_id"), e); + } + } + + private void addCell(PdfPTable table, String label, Object value, Font labelFont, Font valueFont) { + PdfPCell labelCell = new PdfPCell(new Paragraph(label, labelFont)); + labelCell.setBorderWidth(0.5f); + labelCell.setPadding(5f); + + PdfPCell valueCell = new PdfPCell(new Paragraph(value != null ? value.toString() : "-", valueFont)); + valueCell.setBorderWidth(0.5f); + valueCell.setPadding(5f); + + table.addCell(labelCell); + table.addCell(valueCell); + } + + private String safeFolderName(String value) { + if (value == null || value.trim().isEmpty()) return "Unknown"; + return value.replaceAll("[^a-zA-Z0-9 _-]", "").trim(); + } + + private String safeFileName(String value) { + if (value == null || value.trim().isEmpty()) return "unknown"; + return value.replaceAll("[^a-zA-Z0-9 _-]", "").trim().replaceAll(" +", "_"); + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties new file mode 100644 index 0000000..a2f108d --- /dev/null +++ b/src/main/resources/application-dev.properties @@ -0,0 +1,11 @@ +spring.application.name=erp + +#Database connection properties +spring.datasource.url=jdbc:mysql://localhost:3306/gcc_erp +spring.datasource.username=root +spring.datasource.password=password +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +server.port=8070 + + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..ae13c6c --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.profiles.active= dev \ No newline at end of file diff --git a/src/main/resources/static/images/chennai.jpg b/src/main/resources/static/images/chennai.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07b010730ac6fa62271af447b48694e3b8ac4cb5 GIT binary patch literal 83418 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%0A5QqeQidNGhGFRB;xO6jeV| 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 literal 0 HcmV?d00001 diff --git a/src/test/java/com/example/erp/ErpApplicationTests.java b/src/test/java/com/example/erp/ErpApplicationTests.java new file mode 100644 index 0000000..fe4dc84 --- /dev/null +++ b/src/test/java/com/example/erp/ErpApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.erp; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ErpApplicationTests { + + @Test + void contextLoads() { + } + +}