Add initial application setup with configurations, controllers, DTOs, and error handling.
This commit is contained in:
commit
015b0d0f93
88 changed files with 5299 additions and 0 deletions
7
.env
Normal file
7
.env
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Database Configuration
|
||||
SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/taric
|
||||
SPRING_DATASOURCE_USERNAME=spring
|
||||
SPRING_DATASOURCE_PASSWORD=wrHpGVYwX5YHpmEsXX7y
|
||||
DB_ROOT_PASSWORD=ok88pbzFocFpTZb4ezGK
|
||||
|
||||
SERVER_PORT=8090
|
||||
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
/mvnw text eol=lf
|
||||
*.cmd text eol=crlf
|
||||
33
.gitignore
vendored
Normal file
33
.gitignore
vendored
Normal file
|
|
@ -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/
|
||||
3
.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
3
.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
wrapperVersion=3.3.4
|
||||
distributionType=only-script
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
|
||||
295
mvnw
vendored
Normal file
295
mvnw
vendored
Normal file
|
|
@ -0,0 +1,295 @@
|
|||
#!/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.4
|
||||
#
|
||||
# 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:]'
|
||||
}
|
||||
|
||||
scriptDir="$(dirname "$0")"
|
||||
scriptName="$(basename "$0")"
|
||||
|
||||
# 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 <"$scriptDir/.mvn/wrapper/maven-wrapper.properties"
|
||||
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.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${scriptName#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
|
||||
|
||||
# Find the actual extracted directory name (handles snapshots where filename != directory name)
|
||||
actualDistributionDir=""
|
||||
|
||||
# First try the expected directory name (for regular distributions)
|
||||
if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then
|
||||
if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then
|
||||
actualDistributionDir="$distributionUrlNameMain"
|
||||
fi
|
||||
fi
|
||||
|
||||
# If not found, search for any directory with the Maven executable (for snapshots)
|
||||
if [ -z "$actualDistributionDir" ]; then
|
||||
# enable globbing to iterate over items
|
||||
set +f
|
||||
for dir in "$TMP_DOWNLOAD_DIR"/*; do
|
||||
if [ -d "$dir" ]; then
|
||||
if [ -f "$dir/bin/$MVN_CMD" ]; then
|
||||
actualDistributionDir="$(basename "$dir")"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
set -f
|
||||
fi
|
||||
|
||||
if [ -z "$actualDistributionDir" ]; then
|
||||
verbose "Contents of $TMP_DOWNLOAD_DIR:"
|
||||
verbose "$(ls -la "$TMP_DOWNLOAD_DIR")"
|
||||
die "Could not find Maven distribution directory in extracted archive"
|
||||
fi
|
||||
|
||||
verbose "Found extracted Maven distribution directory: $actualDistributionDir"
|
||||
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url"
|
||||
mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
|
||||
|
||||
clean || :
|
||||
exec_maven "$@"
|
||||
189
mvnw.cmd
vendored
Normal file
189
mvnw.cmd
vendored
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
<# : 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.4
|
||||
@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 -eq $False) { "/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_M2_PATH = "$HOME/.m2"
|
||||
if ($env:MAVEN_USER_HOME) {
|
||||
$MAVEN_M2_PATH = "$env:MAVEN_USER_HOME"
|
||||
}
|
||||
|
||||
if (-not (Test-Path -Path $MAVEN_M2_PATH)) {
|
||||
New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null
|
||||
}
|
||||
|
||||
$MAVEN_WRAPPER_DISTS = $null
|
||||
if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) {
|
||||
$MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists"
|
||||
} else {
|
||||
$MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists"
|
||||
}
|
||||
|
||||
$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain"
|
||||
$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::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
|
||||
|
||||
# Find the actual extracted directory name (handles snapshots where filename != directory name)
|
||||
$actualDistributionDir = ""
|
||||
|
||||
# First try the expected directory name (for regular distributions)
|
||||
$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain"
|
||||
$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD"
|
||||
if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) {
|
||||
$actualDistributionDir = $distributionUrlNameMain
|
||||
}
|
||||
|
||||
# If not found, search for any directory with the Maven executable (for snapshots)
|
||||
if (!$actualDistributionDir) {
|
||||
Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object {
|
||||
$testPath = Join-Path $_.FullName "bin/$MVN_CMD"
|
||||
if (Test-Path -Path $testPath -PathType Leaf) {
|
||||
$actualDistributionDir = $_.Name
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$actualDistributionDir) {
|
||||
Write-Error "Could not find Maven distribution directory in extracted archive"
|
||||
}
|
||||
|
||||
Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir"
|
||||
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -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"
|
||||
104
pom.xml
Normal file
104
pom.xml
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.5.7</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>de.avatic</groupId>
|
||||
<artifactId>taric</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>taric</name>
|
||||
<description>taric</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-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jdbc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springdoc</groupId>
|
||||
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
|
||||
<version>2.8.13</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.flywaydb</groupId>
|
||||
<artifactId>flyway-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.flywaydb</groupId>
|
||||
<artifactId>flyway-mysql</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</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/de/avatic/taric/TaricApplication.java
Normal file
13
src/main/java/de/avatic/taric/TaricApplication.java
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
package de.avatic.taric;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class TaricApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(TaricApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
package de.avatic.taric.config;
|
||||
|
||||
import de.avatic.taric.serializer.DescSetSerializer;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.servlet.HandlerInterceptor;
|
||||
|
||||
@Component
|
||||
public class LanguageInterceptor implements HandlerInterceptor {
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
|
||||
Object handler) {
|
||||
String lang = request.getParameter("lang");
|
||||
if (lang == null) {
|
||||
lang = request.getHeader("Accept-Language");
|
||||
if (lang != null && lang.length() >= 2) {
|
||||
lang = lang.substring(0, 2).toUpperCase();
|
||||
}
|
||||
}
|
||||
DescSetSerializer.setLanguage(lang);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
|
||||
Object handler, Exception ex) {
|
||||
DescSetSerializer.clearLanguage();
|
||||
}
|
||||
}
|
||||
28
src/main/java/de/avatic/taric/config/SecurityConfig.java
Normal file
28
src/main/java/de/avatic/taric/config/SecurityConfig.java
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
package de.avatic.taric.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Profile;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
|
||||
@Configuration
|
||||
@EnableMethodSecurity
|
||||
public class SecurityConfig {
|
||||
|
||||
@Bean
|
||||
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
|
||||
http.authorizeHttpRequests(auth -> auth
|
||||
.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
|
||||
.requestMatchers("/actuator/health").permitAll()
|
||||
.requestMatchers("/actuator/**").hasRole("SERVICE")
|
||||
.requestMatchers("/api/**").permitAll()
|
||||
.anyRequest().permitAll()
|
||||
);
|
||||
|
||||
return http.build();
|
||||
|
||||
}
|
||||
}
|
||||
20
src/main/java/de/avatic/taric/config/WebConfig.java
Normal file
20
src/main/java/de/avatic/taric/config/WebConfig.java
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
package de.avatic.taric.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
|
||||
private final LanguageInterceptor languageInterceptor;
|
||||
|
||||
public WebConfig(LanguageInterceptor languageInterceptor) {
|
||||
this.languageInterceptor = languageInterceptor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInterceptors(InterceptorRegistry registry) {
|
||||
registry.addInterceptor(languageInterceptor);
|
||||
}
|
||||
}
|
||||
42
src/main/java/de/avatic/taric/controller/GeoController.java
Normal file
42
src/main/java/de/avatic/taric/controller/GeoController.java
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
package de.avatic.taric.controller;
|
||||
|
||||
import de.avatic.taric.model.Geo;
|
||||
import de.avatic.taric.model.GeoGroup;
|
||||
import de.avatic.taric.service.GeoService;
|
||||
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.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/geo")
|
||||
public class GeoController {
|
||||
|
||||
|
||||
private final GeoService geoService;
|
||||
|
||||
public GeoController(GeoService geoService) {
|
||||
this.geoService = geoService;
|
||||
}
|
||||
|
||||
@GetMapping("")
|
||||
public Optional<Geo> getGeo(@RequestParam String countryCode) {
|
||||
return geoService.getGeo(countryCode);
|
||||
}
|
||||
|
||||
@GetMapping("/group")
|
||||
public List<GeoGroup> getGeoGroup(@RequestParam(required = false) String countryCode, @RequestParam(required = false) String abbr) {
|
||||
|
||||
if (countryCode != null && abbr == null)
|
||||
return geoService.getGeoGroupByCountryCode(countryCode);
|
||||
|
||||
if (countryCode == null && abbr != null)
|
||||
return geoService.getGeoGroup(abbr);
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
package de.avatic.taric.controller;
|
||||
|
||||
import de.avatic.taric.model.Nomenclature;
|
||||
import de.avatic.taric.service.NomenclatureService;
|
||||
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.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/nomenclature")
|
||||
public class NomenclatureController {
|
||||
|
||||
private final NomenclatureService nomenclatureService;
|
||||
|
||||
public NomenclatureController(NomenclatureService nomenclatureService) {
|
||||
this.nomenclatureService = nomenclatureService;
|
||||
}
|
||||
|
||||
@GetMapping("")
|
||||
public Optional<Nomenclature> getNomenclature(@RequestParam String hscode) {
|
||||
return nomenclatureService.getNomenclature(hscode);
|
||||
}
|
||||
|
||||
@GetMapping("/declarable")
|
||||
public List<Nomenclature> getDeclarable(@RequestParam String hscode) {
|
||||
return nomenclatureService.getDeclarableChildren(hscode);
|
||||
}
|
||||
|
||||
@GetMapping("/cascade")
|
||||
public List<Nomenclature> getCascade(@RequestParam String hscode) {
|
||||
var found = nomenclatureService.getNomenclatureCascade(hscode);
|
||||
return found;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
package de.avatic.taric.controller;
|
||||
|
||||
import de.avatic.taric.service.TariffService;
|
||||
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;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/tariff")
|
||||
public class TariffController {
|
||||
|
||||
|
||||
private final TariffService tariffService;
|
||||
|
||||
public TariffController(TariffService tariffService) {
|
||||
this.tariffService = tariffService;
|
||||
}
|
||||
|
||||
@GetMapping("")
|
||||
public void getTariffRate(@RequestParam String hsCode, @RequestParam String countryCode) {
|
||||
|
||||
tariffService.importTariffs( hsCode, countryCode);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
131
src/main/java/de/avatic/taric/controller/TariffController2.java
Normal file
131
src/main/java/de/avatic/taric/controller/TariffController2.java
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
package de.avatic.taric.controller;
|
||||
|
||||
import de.avatic.taric.service.TariffService2;
|
||||
import de.avatic.taric.service.TariffService2.TariffResult;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.Pattern;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
//@RestController
|
||||
//@RequestMapping("/api/v1/tariff")
|
||||
|
||||
@Tag(name = "Tariff API", description = "API zur Abfrage von Zolltarifen")
|
||||
public class TariffController2 {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TariffController2.class);
|
||||
|
||||
private final TariffService2 tariffService;
|
||||
|
||||
public TariffController2(TariffService2 tariffService) {
|
||||
this.tariffService = tariffService;
|
||||
}
|
||||
|
||||
@GetMapping("/rate")
|
||||
@Operation(summary = "Zolltarif abfragen",
|
||||
description = "Ermittelt den Zolltarif für einen HS-Code und ein Herkunftsland")
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "Tarif erfolgreich gefunden"),
|
||||
@ApiResponse(responseCode = "404", description = "Kein Tarif gefunden"),
|
||||
@ApiResponse(responseCode = "400", description = "Ungültige Eingabeparameter")
|
||||
})
|
||||
public ResponseEntity<TariffResponse> getTariffRate(
|
||||
@Parameter(description = "HS-Code (6, 8 oder 10 Stellen)", example = "850410")
|
||||
@RequestParam
|
||||
@NotBlank(message = "HS Code ist erforderlich")
|
||||
@Pattern(regexp = "^[0-9]{4,10}$", message = "HS Code muss 4-10 Ziffern enthalten")
|
||||
String hsCode,
|
||||
|
||||
@Parameter(description = "ISO-2 Ländercode", example = "CN")
|
||||
@RequestParam
|
||||
@NotBlank(message = "Ländercode ist erforderlich")
|
||||
@Pattern(regexp = "^[A-Z]{2}$", message = "Ländercode muss 2 Großbuchstaben sein")
|
||||
String countryCode) {
|
||||
|
||||
log.info("Tariff rate request - HS Code: {}, Country: {}", hsCode, countryCode);
|
||||
|
||||
try {
|
||||
TariffResult result = tariffService.getTariffRate(hsCode, countryCode);
|
||||
|
||||
if (result.isFound()) {
|
||||
TariffResponse response = TariffResponse.success(
|
||||
result.getRate(),
|
||||
result.getHsCode(),
|
||||
result.getCountryCode()
|
||||
);
|
||||
return ResponseEntity.ok(response);
|
||||
} else {
|
||||
TariffResponse response = TariffResponse.notFound(result.getMessage());
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("Error getting tariff rate", e);
|
||||
TariffResponse response = TariffResponse.error("Internal server error: " + e.getMessage());
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping("/health")
|
||||
@Operation(summary = "Health Check", description = "Prüft ob der Service verfügbar ist")
|
||||
public ResponseEntity<Map<String, String>> health() {
|
||||
Map<String, String> response = new HashMap<>();
|
||||
response.put("status", "UP");
|
||||
response.put("service", "TARIC Tariff Service");
|
||||
return ResponseEntity.ok(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Response-Klasse für Tarif-Abfragen
|
||||
*/
|
||||
public static class TariffResponse {
|
||||
private final boolean success;
|
||||
private final BigDecimal tariffRate;
|
||||
private final String hsCode;
|
||||
private final String countryCode;
|
||||
private final String message;
|
||||
private final String formattedRate;
|
||||
|
||||
private TariffResponse(boolean success, BigDecimal tariffRate,
|
||||
String hsCode, String countryCode, String message) {
|
||||
this.success = success;
|
||||
this.tariffRate = tariffRate;
|
||||
this.hsCode = hsCode;
|
||||
this.countryCode = countryCode;
|
||||
this.message = message;
|
||||
this.formattedRate = tariffRate != null ?
|
||||
tariffRate.toString() + " %" : null;
|
||||
}
|
||||
|
||||
public static TariffResponse success(BigDecimal rate, String hsCode, String countryCode) {
|
||||
return new TariffResponse(true, rate, hsCode, countryCode,
|
||||
"Tariff rate found successfully");
|
||||
}
|
||||
|
||||
public static TariffResponse notFound(String message) {
|
||||
return new TariffResponse(false, null, null, null, message);
|
||||
}
|
||||
|
||||
public static TariffResponse error(String message) {
|
||||
return new TariffResponse(false, null, null, null, message);
|
||||
}
|
||||
|
||||
// Getters
|
||||
public boolean isSuccess() { return success; }
|
||||
public BigDecimal getTariffRate() { return tariffRate; }
|
||||
public String getHsCode() { return hsCode; }
|
||||
public String getCountryCode() { return countryCode; }
|
||||
public String getMessage() { return message; }
|
||||
public String getFormattedRate() { return formattedRate; }
|
||||
}
|
||||
}
|
||||
13
src/main/java/de/avatic/taric/dto/NomenclatureDTO.java
Normal file
13
src/main/java/de/avatic/taric/dto/NomenclatureDTO.java
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
package de.avatic.taric.dto;
|
||||
|
||||
import de.avatic.taric.model.Nomenclature;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class NomenclatureDTO {
|
||||
|
||||
private List<Nomenclature> cascade;
|
||||
|
||||
private List<Nomenclature> declarables;
|
||||
|
||||
}
|
||||
16
src/main/java/de/avatic/taric/error/ArgumentException.java
Normal file
16
src/main/java/de/avatic/taric/error/ArgumentException.java
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
package de.avatic.taric.error;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class ArgumentException extends RuntimeException {
|
||||
|
||||
private final String arg;
|
||||
|
||||
public ArgumentException(String arg) {
|
||||
super();
|
||||
this.arg = arg;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
22
src/main/java/de/avatic/taric/error/ErrorController.java
Normal file
22
src/main/java/de/avatic/taric/error/ErrorController.java
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
package de.avatic.taric.error;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
|
||||
import javax.swing.text.html.HTML;
|
||||
|
||||
@ControllerAdvice
|
||||
public class ErrorController {
|
||||
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
@ExceptionHandler
|
||||
public ResponseEntity<ErrorDTO> handleException(ArgumentException ex) {
|
||||
var dto = new ErrorDTO();
|
||||
dto.setField(ex.getArg());
|
||||
dto.setMessage("Invalid argument");
|
||||
return new ResponseEntity<>(dto, HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
11
src/main/java/de/avatic/taric/error/ErrorDTO.java
Normal file
11
src/main/java/de/avatic/taric/error/ErrorDTO.java
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package de.avatic.taric.error;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class ErrorDTO {
|
||||
private String field;
|
||||
private String message;
|
||||
}
|
||||
83
src/main/java/de/avatic/taric/model/AdditionalCode.java
Normal file
83
src/main/java/de/avatic/taric/model/AdditionalCode.java
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
|
||||
@Table("additional_code")
|
||||
public class AdditionalCode {
|
||||
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 4)
|
||||
private String additionalCode;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<AdditionalCodeDesc> desc;
|
||||
|
||||
public AdditionalCode(String additionalCode, LocalDate startDate, LocalDate endDate) {
|
||||
this.desc = new HashSet<>();
|
||||
this.additionalCode = additionalCode;
|
||||
this.startDate = startDate;
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public void addDesc(AdditionalCodeDesc desc) {
|
||||
this.desc.add(desc);
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getAdditionalCode() {
|
||||
return additionalCode;
|
||||
}
|
||||
|
||||
public void setAdditionalCode(String additionalCode) {
|
||||
this.additionalCode = additionalCode;
|
||||
}
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public void setStartDate(LocalDate startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public Set<AdditionalCodeDesc> getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(Set<AdditionalCodeDesc> desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
}
|
||||
62
src/main/java/de/avatic/taric/model/AdditionalCodeDesc.java
Normal file
62
src/main/java/de/avatic/taric/model/AdditionalCodeDesc.java
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
@Table("additional_code_desc")
|
||||
public class AdditionalCodeDesc {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
public AdditionalCodeDesc(String lang, String desc, LocalDate descStartDate) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
}
|
||||
127
src/main/java/de/avatic/taric/model/AppliedMeasure.java
Normal file
127
src/main/java/de/avatic/taric/model/AppliedMeasure.java
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
public class AppliedMeasure {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
private String amount;
|
||||
|
||||
@Column("order_number")
|
||||
private Integer orderNumber;
|
||||
|
||||
@MappedCollection(idColumn = "applied_measure_id")
|
||||
private Set<MeasureFootnote> measureFootnotes;
|
||||
|
||||
@NotNull
|
||||
@Column("measure_id")
|
||||
private AggregateReference<Measure, Integer> measure;
|
||||
|
||||
|
||||
@Column("legal_base_id")
|
||||
private AggregateReference<LegalBase, Integer> legalBase;
|
||||
|
||||
@Column("legal_base")
|
||||
private String additionalLegalBase;
|
||||
|
||||
@MappedCollection(idColumn = "applied_measure_id")
|
||||
private Set<MeasureExclusion> exclusions;
|
||||
|
||||
@MappedCollection(idColumn = "applied_measure_id")
|
||||
private Set<AppliedMeasureCondition> conditions;
|
||||
|
||||
public AppliedMeasure(AggregateReference<Measure, Integer> measure, Set<MeasureFootnote> measureFootnotes,
|
||||
AggregateReference<LegalBase, Integer> legalBase, String additionalLegalBase, Set<MeasureExclusion> exclusions,
|
||||
Set<AppliedMeasureCondition> conditions, LocalDate startDate, LocalDate endDate, String amount, Integer orderNumber) {
|
||||
this.measure = measure;
|
||||
this.measureFootnotes = measureFootnotes;
|
||||
this.legalBase = legalBase;
|
||||
this.exclusions = exclusions;
|
||||
this.conditions = conditions;
|
||||
this.startDate = startDate;
|
||||
this.endDate = endDate;
|
||||
this.amount = amount;
|
||||
this.orderNumber = orderNumber;
|
||||
this.additionalLegalBase = additionalLegalBase;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public void setStartDate(final LocalDate startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(final LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public String getAmount() {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public void setAmount(final String amount) {
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public AggregateReference<Measure, Integer> getMeasure() {
|
||||
return measure;
|
||||
}
|
||||
|
||||
public void setMeasure(final AggregateReference<Measure, Integer> measure) {
|
||||
this.measure = measure;
|
||||
}
|
||||
|
||||
public AggregateReference<LegalBase, Integer> getLegalBase() {
|
||||
return legalBase;
|
||||
}
|
||||
|
||||
public void setLegalBase(final AggregateReference<LegalBase, Integer> legalBase) {
|
||||
this.legalBase = legalBase;
|
||||
}
|
||||
|
||||
public Integer getOrderNumber() {
|
||||
return orderNumber;
|
||||
}
|
||||
|
||||
public Set<MeasureFootnote> getMeasureFootnotes() {
|
||||
return measureFootnotes;
|
||||
}
|
||||
|
||||
public Set<MeasureExclusion> getExclusions() {
|
||||
return exclusions;
|
||||
}
|
||||
|
||||
public Set<AppliedMeasureCondition> getConditions() {
|
||||
return conditions;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
118
src/main/java/de/avatic/taric/model/AppliedMeasureCondition.java
Normal file
118
src/main/java/de/avatic/taric/model/AppliedMeasureCondition.java
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.lang.Nullable;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
public class AppliedMeasureCondition {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private Integer sequenceNo;
|
||||
|
||||
private String amount;
|
||||
|
||||
@NotNull
|
||||
@Column("measure_action_id")
|
||||
private AggregateReference<MeasureAction, Integer> measureAction;
|
||||
|
||||
@Column("monetary_unit_id")
|
||||
@Nullable
|
||||
private AggregateReference<MonetaryUnit, Integer> monetaryUnit;
|
||||
|
||||
|
||||
@Column("unit_id")
|
||||
@Nullable
|
||||
private AggregateReference<Unit, Integer> unit;
|
||||
|
||||
@Column("certificate_id")
|
||||
@Nullable
|
||||
private AggregateReference<Certificate, Integer> certificate;
|
||||
|
||||
@NotNull
|
||||
@Column("condition_type_id")
|
||||
private AggregateReference<ConditionType, Integer> conditionType;
|
||||
|
||||
public AppliedMeasureCondition(AggregateReference<MeasureAction, Integer> measureAction,
|
||||
AggregateReference<MonetaryUnit, Integer> monetaryUnit,
|
||||
AggregateReference<Unit, Integer> unit,
|
||||
AggregateReference<Certificate, Integer> certificate,
|
||||
AggregateReference<ConditionType, Integer> conditionType, String amount, Integer squenceNo) {
|
||||
this.measureAction = measureAction;
|
||||
this.monetaryUnit = monetaryUnit;
|
||||
this.unit = unit;
|
||||
this.certificate = certificate;
|
||||
this.conditionType = conditionType;
|
||||
this.amount = amount;
|
||||
this.sequenceNo = squenceNo;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Integer getSequenceNo() {
|
||||
return sequenceNo;
|
||||
}
|
||||
|
||||
public void setSequenceNo(final Integer sequenceNo) {
|
||||
this.sequenceNo = sequenceNo;
|
||||
}
|
||||
|
||||
public String getAmount() {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public void setAmount(final String amount) {
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public AggregateReference<MeasureAction, Integer> getMeasureAction() {
|
||||
return measureAction;
|
||||
}
|
||||
|
||||
public void setMeasureAction(final AggregateReference<MeasureAction, Integer> measureAction) {
|
||||
this.measureAction = measureAction;
|
||||
}
|
||||
|
||||
public AggregateReference<MonetaryUnit, Integer> getMonetaryUnit() {
|
||||
return monetaryUnit;
|
||||
}
|
||||
|
||||
public void setMonetaryUnit(final AggregateReference<MonetaryUnit, Integer> monetaryUnit) {
|
||||
this.monetaryUnit = monetaryUnit;
|
||||
}
|
||||
|
||||
public AggregateReference<Unit, Integer> getUnit() {
|
||||
return unit;
|
||||
}
|
||||
|
||||
public void setUnit(final AggregateReference<Unit, Integer> unit) {
|
||||
this.unit = unit;
|
||||
}
|
||||
|
||||
public AggregateReference<Certificate, Integer> getCertificate() {
|
||||
return certificate;
|
||||
}
|
||||
|
||||
public void setCertificate(final AggregateReference<Certificate, Integer> certificate) {
|
||||
this.certificate = certificate;
|
||||
}
|
||||
|
||||
public AggregateReference<ConditionType, Integer> getConditionType() {
|
||||
return conditionType;
|
||||
}
|
||||
|
||||
public void setConditionType(final AggregateReference<ConditionType, Integer> conditionType) {
|
||||
this.conditionType = conditionType;
|
||||
}
|
||||
|
||||
}
|
||||
88
src/main/java/de/avatic/taric/model/Certificate.java
Normal file
88
src/main/java/de/avatic/taric/model/Certificate.java
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class Certificate {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 4)
|
||||
private String certificateCode;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
@NotNull
|
||||
@Column("certificate_type_id")
|
||||
private AggregateReference<CertificateType, Integer> certificateType;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<CertificateDesc> certificateDesc;
|
||||
|
||||
public Certificate(String certificateCode, LocalDate startDate, LocalDate endDate, AggregateReference<CertificateType, Integer> certificateType) {
|
||||
this.certificateCode = certificateCode;
|
||||
this.startDate = startDate;
|
||||
this.endDate = endDate;
|
||||
this.certificateType = certificateType;
|
||||
this.certificateDesc = new HashSet<>();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getCertificateCode() {
|
||||
return certificateCode;
|
||||
}
|
||||
|
||||
public void setCertificateCode(final String certificateCode) {
|
||||
this.certificateCode = certificateCode;
|
||||
}
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public void setStartDate(final LocalDate startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(final LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public AggregateReference<CertificateType, Integer> getCertificateType() {
|
||||
return certificateType;
|
||||
}
|
||||
|
||||
public void setCertificateType(final AggregateReference<CertificateType, Integer> certificateType) {
|
||||
this.certificateType = certificateType;
|
||||
}
|
||||
|
||||
public void addCertificateDesc(CertificateDesc certificateDesc) {
|
||||
this.certificateDesc.add(certificateDesc);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
63
src/main/java/de/avatic/taric/model/CertificateDesc.java
Normal file
63
src/main/java/de/avatic/taric/model/CertificateDesc.java
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class CertificateDesc {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
public CertificateDesc(String lang, String desc, LocalDate descStartDate) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDescc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDescc(final String descc) {
|
||||
this.desc = descc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
49
src/main/java/de/avatic/taric/model/CertificateType.java
Normal file
49
src/main/java/de/avatic/taric/model/CertificateType.java
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
public class CertificateType {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 1)
|
||||
private String certificateTypeCode;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<CertificateTypeDesc> certificateTypeDesc;
|
||||
|
||||
public CertificateType(String certificateTypeCode) {
|
||||
this.certificateTypeCode = certificateTypeCode;
|
||||
this.certificateTypeDesc = new HashSet<>();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getCertificateTypeCode() {
|
||||
return certificateTypeCode;
|
||||
}
|
||||
|
||||
public void setCertificateTypeCode(final String certificateTypeCode) {
|
||||
this.certificateTypeCode = certificateTypeCode;
|
||||
}
|
||||
|
||||
public void addCertificateTypeDesc(CertificateTypeDesc certificateTypeDesc) {
|
||||
this.certificateTypeDesc.add(certificateTypeDesc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
62
src/main/java/de/avatic/taric/model/CertificateTypeDesc.java
Normal file
62
src/main/java/de/avatic/taric/model/CertificateTypeDesc.java
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class CertificateTypeDesc {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
public CertificateTypeDesc(String lang, String desc, LocalDate descStartDate) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDescc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDescc(final String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
47
src/main/java/de/avatic/taric/model/ConditionType.java
Normal file
47
src/main/java/de/avatic/taric/model/ConditionType.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
public class ConditionType {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String conditionTypeCode;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<ConditionTypeDesc> conditionTypeDesc;
|
||||
|
||||
public ConditionType(String conditionTypeCode) {
|
||||
this.conditionTypeCode = conditionTypeCode;
|
||||
this.conditionTypeDesc = new HashSet<>();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getConditionTypeCode() {
|
||||
return conditionTypeCode;
|
||||
}
|
||||
|
||||
public void setConditionTypeCode(final String conditionTypeCode) {
|
||||
this.conditionTypeCode = conditionTypeCode;
|
||||
}
|
||||
|
||||
public void addConditionTypeDesc(ConditionTypeDesc conditionTypeDesc) {
|
||||
this.conditionTypeDesc.add(conditionTypeDesc);
|
||||
}
|
||||
|
||||
}
|
||||
61
src/main/java/de/avatic/taric/model/ConditionTypeDesc.java
Normal file
61
src/main/java/de/avatic/taric/model/ConditionTypeDesc.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class ConditionTypeDesc {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
public ConditionTypeDesc(String lang, String desc, LocalDate descStartDate) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDescc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(final String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
}
|
||||
8
src/main/java/de/avatic/taric/model/Description.java
Normal file
8
src/main/java/de/avatic/taric/model/Description.java
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
public interface Description {
|
||||
|
||||
String getLang();
|
||||
|
||||
|
||||
}
|
||||
46
src/main/java/de/avatic/taric/model/Footnote.java
Normal file
46
src/main/java/de/avatic/taric/model/Footnote.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.DescSetSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Table("footnote")
|
||||
public class Footnote {
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 8)
|
||||
@Column("footnote")
|
||||
private String footnote;
|
||||
|
||||
@Column("start_date")
|
||||
private LocalDate startDate;
|
||||
|
||||
|
||||
@Column("end_date")
|
||||
private LocalDate endDate;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
@JsonSerialize(using = DescSetSerializer.class)
|
||||
@JsonProperty("desc")
|
||||
private Set<FootnotesDesc> footnotesDesc;
|
||||
|
||||
}
|
||||
31
src/main/java/de/avatic/taric/model/FootnotesDesc.java
Normal file
31
src/main/java/de/avatic/taric/model/FootnotesDesc.java
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.DescriptionSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Table("footnotes_desc")
|
||||
public class FootnotesDesc implements Description {
|
||||
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
@JsonSerialize(using = DescriptionSerializer.class)
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
}
|
||||
33
src/main/java/de/avatic/taric/model/Geo.java
Normal file
33
src/main/java/de/avatic/taric/model/Geo.java
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAnyGetter;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.DescSetSerializer;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class Geo {
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
@Column("iso_3166_code")
|
||||
private String iso3166Code;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
@JsonSerialize(using = DescSetSerializer.class)
|
||||
private Set<GeoDesc> geoDesc;
|
||||
|
||||
|
||||
}
|
||||
32
src/main/java/de/avatic/taric/model/GeoDesc.java
Normal file
32
src/main/java/de/avatic/taric/model/GeoDesc.java
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.DescriptionSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class GeoDesc implements Description{
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
@JsonSerialize(using = DescriptionSerializer.class)
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
|
||||
}
|
||||
44
src/main/java/de/avatic/taric/model/GeoGroup.java
Normal file
44
src/main/java/de/avatic/taric/model/GeoGroup.java
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.DescSetSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class GeoGroup {
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 4)
|
||||
private String geoGroupCode;
|
||||
|
||||
private String abbr;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
@MappedCollection(idColumn = "geo_group_id")
|
||||
private Set<GeoGroupMembership> geoGroupMembers;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
@JsonSerialize(using = DescSetSerializer.class)
|
||||
private Set<GeoGroupDesc> geoGroupDescs;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
27
src/main/java/de/avatic/taric/model/GeoGroupDesc.java
Normal file
27
src/main/java/de/avatic/taric/model/GeoGroupDesc.java
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class GeoGroupDesc implements Description {
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
}
|
||||
67
src/main/java/de/avatic/taric/model/GeoGroupMembership.java
Normal file
67
src/main/java/de/avatic/taric/model/GeoGroupMembership.java
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.GeoReferenceSerializer;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
|
||||
|
||||
|
||||
public class GeoGroupMembership {
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
@Column("geo_id")
|
||||
@JsonSerialize(using = GeoReferenceSerializer.class)
|
||||
private AggregateReference<Geo, Integer> geo;
|
||||
|
||||
public GeoGroupMembership(LocalDate startDate, LocalDate endDate,
|
||||
AggregateReference<Geo, Integer> geo) {
|
||||
this.startDate = startDate;
|
||||
this.endDate = endDate;
|
||||
this.geo = geo;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public void setStartDate(LocalDate startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public AggregateReference<Geo, Integer> getGeo() {
|
||||
return geo;
|
||||
}
|
||||
|
||||
public void setGeo(AggregateReference<Geo, Integer> geo) {
|
||||
this.geo = geo;
|
||||
}
|
||||
}
|
||||
87
src/main/java/de/avatic/taric/model/Import.java
Normal file
87
src/main/java/de/avatic/taric/model/Import.java
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
@Table("import")
|
||||
public class Import {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@NotNull
|
||||
@Column("nomenclature_id")
|
||||
private AggregateReference<Nomenclature, Integer> nomenclature;
|
||||
|
||||
@Column("additional_code_id")
|
||||
private AggregateReference<AdditionalCode, Integer> additionalCode;
|
||||
|
||||
@Column("geo_id")
|
||||
private AggregateReference<Geo, Integer> geo;
|
||||
|
||||
@Column("geo_group_id")
|
||||
private AggregateReference<GeoGroup, Integer> geoGroup;
|
||||
|
||||
@MappedCollection(idColumn = "import_id")
|
||||
Set<AppliedMeasure> appliedMeasures;
|
||||
|
||||
public Import(AggregateReference<Nomenclature, Integer> nomenclature,
|
||||
AggregateReference<AdditionalCode, Integer> additionalCode, Set<AppliedMeasure> appliedMeasures, AggregateReference<Geo,Integer> geo,
|
||||
AggregateReference<GeoGroup, Integer> geoGroup) {
|
||||
this.nomenclature = nomenclature;
|
||||
this.additionalCode = additionalCode;
|
||||
this.appliedMeasures = appliedMeasures;
|
||||
this.geo = geo;
|
||||
this.geoGroup = geoGroup;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public AggregateReference<Nomenclature, Integer> getNomenclature() {
|
||||
return nomenclature;
|
||||
}
|
||||
|
||||
public void setNomenclature(final AggregateReference<Nomenclature, Integer> nomenclature) {
|
||||
this.nomenclature = nomenclature;
|
||||
}
|
||||
|
||||
public AggregateReference<AdditionalCode, Integer> getAdditionalCode() {
|
||||
return additionalCode;
|
||||
}
|
||||
|
||||
public void setAdditionalCode(final AggregateReference<AdditionalCode, Integer> additionalCode) {
|
||||
this.additionalCode = additionalCode;
|
||||
}
|
||||
|
||||
public AggregateReference<Geo, Integer> getGeo() {
|
||||
return geo;
|
||||
}
|
||||
|
||||
public void setGeo(final AggregateReference<Geo, Integer> geo) {
|
||||
this.geo = geo;
|
||||
}
|
||||
|
||||
public AggregateReference<GeoGroup, Integer> getGeoGroup() {
|
||||
return geoGroup;
|
||||
}
|
||||
|
||||
public void setGeoGroup(final AggregateReference<GeoGroup, Integer> geoGroup) {
|
||||
this.geoGroup = geoGroup;
|
||||
}
|
||||
|
||||
}
|
||||
29
src/main/java/de/avatic/taric/model/LegalBase.java
Normal file
29
src/main/java/de/avatic/taric/model/LegalBase.java
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
public class LegalBase {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 255)
|
||||
private String legalBase;
|
||||
|
||||
@Size(max = 255)
|
||||
private String journal;
|
||||
|
||||
private Integer page;
|
||||
|
||||
private LocalDate date;
|
||||
|
||||
|
||||
}
|
||||
39
src/main/java/de/avatic/taric/model/Measure.java
Normal file
39
src/main/java/de/avatic/taric/model/Measure.java
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@Table("measure")
|
||||
public class Measure {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 3)
|
||||
private String measureCode;
|
||||
|
||||
private String shortDesc;
|
||||
|
||||
private Integer tmCode;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<MeasureDesc> measureDesc;
|
||||
|
||||
@Column("measure_series_id")
|
||||
AggregateReference<MeasureSeries, Integer> measureSeries;
|
||||
|
||||
}
|
||||
49
src/main/java/de/avatic/taric/model/MeasureAction.java
Normal file
49
src/main/java/de/avatic/taric/model/MeasureAction.java
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Table("measure_action")
|
||||
public class MeasureAction {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String measureActionCode;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<MeasureActionDesc> measureActionDesc;
|
||||
|
||||
public MeasureAction(String measureActionCode) {
|
||||
this.measureActionCode = measureActionCode;
|
||||
this.measureActionDesc = new HashSet<>();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getMeasureActionCode() {
|
||||
return measureActionCode;
|
||||
}
|
||||
|
||||
public void setMeasureActionCode(final String measureActionCode) {
|
||||
this.measureActionCode = measureActionCode;
|
||||
}
|
||||
|
||||
public void addMeasureActionDesc(MeasureActionDesc measureActionDesc) {
|
||||
this.measureActionDesc.add(measureActionDesc);
|
||||
}
|
||||
|
||||
}
|
||||
58
src/main/java/de/avatic/taric/model/MeasureActionDesc.java
Normal file
58
src/main/java/de/avatic/taric/model/MeasureActionDesc.java
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class MeasureActionDesc {
|
||||
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
public MeasureActionDesc(String lang, String desc, LocalDate descStartDate) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(final String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
60
src/main/java/de/avatic/taric/model/MeasureDesc.java
Normal file
60
src/main/java/de/avatic/taric/model/MeasureDesc.java
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class MeasureDesc {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
public MeasureDesc(String lang, String desc) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(final String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
}
|
||||
30
src/main/java/de/avatic/taric/model/MeasureExclusion.java
Normal file
30
src/main/java/de/avatic/taric/model/MeasureExclusion.java
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class MeasureExclusion {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
LocalDate startDate;
|
||||
|
||||
LocalDate endDate;
|
||||
|
||||
@NotNull
|
||||
@Column("geo_id")
|
||||
private AggregateReference<Geo, Integer> geo;
|
||||
|
||||
|
||||
}
|
||||
27
src/main/java/de/avatic/taric/model/MeasureFootnote.java
Normal file
27
src/main/java/de/avatic/taric/model/MeasureFootnote.java
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class MeasureFootnote {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
LocalDate startDate;
|
||||
LocalDate endDate;
|
||||
|
||||
@Column("footnote_id")
|
||||
private AggregateReference<Footnote, Integer> footnote;
|
||||
|
||||
|
||||
|
||||
}
|
||||
49
src/main/java/de/avatic/taric/model/MeasureSeries.java
Normal file
49
src/main/java/de/avatic/taric/model/MeasureSeries.java
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Table("measure_series")
|
||||
public class MeasureSeries {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 1)
|
||||
private String measureSeriesCode;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<MeasureSeriesDesc> measureSeriesDesc;
|
||||
|
||||
public MeasureSeries(String measureSeriesCode) {
|
||||
this.measureSeriesCode = measureSeriesCode;
|
||||
this.measureSeriesDesc = new HashSet<>();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getMeasureSeriesCode() {
|
||||
return measureSeriesCode;
|
||||
}
|
||||
|
||||
public void setMeasureSeriesCode(final String measureSeriesCode) {
|
||||
this.measureSeriesCode = measureSeriesCode;
|
||||
}
|
||||
|
||||
public void addMeasureSeriesDesc(MeasureSeriesDesc measureSeriesDesc) {
|
||||
this.measureSeriesDesc.add(measureSeriesDesc);
|
||||
}
|
||||
|
||||
}
|
||||
61
src/main/java/de/avatic/taric/model/MeasureSeriesDesc.java
Normal file
61
src/main/java/de/avatic/taric/model/MeasureSeriesDesc.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
@Table("measure_series_desc")
|
||||
public class MeasureSeriesDesc {
|
||||
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
|
||||
public MeasureSeriesDesc(String lang, String desc) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDescc(final String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
}
|
||||
48
src/main/java/de/avatic/taric/model/MonetaryUnit.java
Normal file
48
src/main/java/de/avatic/taric/model/MonetaryUnit.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class MonetaryUnit {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 3)
|
||||
private String monetaryUnitCode;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<MonetaryUnitDesc> monetaryUnitDesc;
|
||||
|
||||
public MonetaryUnit(String monetaryUnitCode) {
|
||||
this.monetaryUnitCode = monetaryUnitCode;
|
||||
this.monetaryUnitDesc = new HashSet<>();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getMonetaryUnitCode() {
|
||||
return monetaryUnitCode;
|
||||
}
|
||||
|
||||
public void setMonetaryUnitCode(final String monetaryUnitCode) {
|
||||
this.monetaryUnitCode = monetaryUnitCode;
|
||||
}
|
||||
|
||||
public void addMonetaryUnitDesc(MonetaryUnitDesc monetaryUnitDesc) {
|
||||
this.monetaryUnitDesc.add(monetaryUnitDesc);
|
||||
}
|
||||
|
||||
}
|
||||
61
src/main/java/de/avatic/taric/model/MonetaryUnitDesc.java
Normal file
61
src/main/java/de/avatic/taric/model/MonetaryUnitDesc.java
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class MonetaryUnitDesc {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
public MonetaryUnitDesc(String lang, String desc, LocalDate descStartDate) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDescc(final String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
54
src/main/java/de/avatic/taric/model/Nomenclature.java
Normal file
54
src/main/java/de/avatic/taric/model/Nomenclature.java
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.DescSetSerializer;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class Nomenclature {
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 10)
|
||||
private String hscode;
|
||||
|
||||
@Size(max = 2)
|
||||
private String suffix;
|
||||
|
||||
private Integer hierachy;
|
||||
|
||||
private Integer indent;
|
||||
|
||||
private LocalDate startDate;
|
||||
|
||||
private LocalDate endDate;
|
||||
|
||||
@JsonProperty("isLeaf")
|
||||
private Boolean isLeaf;
|
||||
|
||||
private LocalDate isLeafStartDate;
|
||||
|
||||
private Integer parentId;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
@JsonSerialize(using = DescSetSerializer.class)
|
||||
@JsonProperty("desc")
|
||||
private Set<NomenclatureDesc> nomenclatureDescs;
|
||||
|
||||
@MappedCollection(idColumn = "nomenclature_id")
|
||||
private Set<NomenclatureFootnote> footnotes;
|
||||
|
||||
}
|
||||
31
src/main/java/de/avatic/taric/model/NomenclatureDesc.java
Normal file
31
src/main/java/de/avatic/taric/model/NomenclatureDesc.java
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.DescriptionSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class NomenclatureDesc implements Description {
|
||||
|
||||
@Id
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
@JsonSerialize(using = DescriptionSerializer.class)
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import de.avatic.taric.serializer.FootnoteReferenceSerializer;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.relational.core.mapping.Column;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class NomenclatureFootnote {
|
||||
|
||||
@JsonIgnore
|
||||
private Integer id;
|
||||
|
||||
@NotNull
|
||||
@Column("footnote_id")
|
||||
@JsonSerialize(using = FootnoteReferenceSerializer.class)
|
||||
private AggregateReference<Footnote, Integer> footnote;
|
||||
|
||||
}
|
||||
83
src/main/java/de/avatic/taric/model/SetupStatus.java
Normal file
83
src/main/java/de/avatic/taric/model/SetupStatus.java
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.Table;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Table("setup_status")
|
||||
public class SetupStatus {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private Integer currentRecord;
|
||||
|
||||
private Integer maxRecord;
|
||||
|
||||
@Size(max = 255)
|
||||
private String statusText;
|
||||
|
||||
private Boolean running;
|
||||
|
||||
@Size(max = 255)
|
||||
private String exitStatus;
|
||||
|
||||
public SetupStatus(int currentRecord, int maxRecord, String statusText, boolean running, String exitStatus) {
|
||||
this.currentRecord = currentRecord;
|
||||
this.maxRecord = maxRecord;
|
||||
this.statusText = statusText;
|
||||
this.running = running;
|
||||
this.exitStatus = exitStatus;
|
||||
}
|
||||
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Integer getCurrentRecord() {
|
||||
return currentRecord;
|
||||
}
|
||||
|
||||
public void setCurrentRecord(final Integer currentRecord) {
|
||||
this.currentRecord = currentRecord;
|
||||
}
|
||||
|
||||
public Integer getMaxRecord() {
|
||||
return maxRecord;
|
||||
}
|
||||
|
||||
public void setMaxRecord(final Integer maxRecord) {
|
||||
this.maxRecord = maxRecord;
|
||||
}
|
||||
|
||||
public String getStatusText() {
|
||||
return statusText;
|
||||
}
|
||||
|
||||
public void setStatusText(final String statusText) {
|
||||
this.statusText = statusText;
|
||||
}
|
||||
|
||||
public Boolean getRunning() {
|
||||
return running;
|
||||
}
|
||||
|
||||
public void setRunning(final Boolean running) {
|
||||
this.running = running;
|
||||
}
|
||||
|
||||
public String getExitStatus() {
|
||||
return exitStatus;
|
||||
}
|
||||
|
||||
public void setExitStatus(final String exitStatus) {
|
||||
this.exitStatus = exitStatus;
|
||||
}
|
||||
|
||||
}
|
||||
71
src/main/java/de/avatic/taric/model/Unit.java
Normal file
71
src/main/java/de/avatic/taric/model/Unit.java
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.relational.core.mapping.MappedCollection;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class Unit {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 3)
|
||||
private String unitCode;
|
||||
|
||||
@Size(max = 1)
|
||||
private String unitQualifier;
|
||||
|
||||
private String label;
|
||||
|
||||
@MappedCollection(idColumn = "ref_id")
|
||||
private Set<UnitDesc> unitDesc;
|
||||
|
||||
public Unit(String unitCode, String unitQualifier, String label) {
|
||||
this.unitCode = unitCode;
|
||||
this.unitQualifier = unitQualifier;
|
||||
this.label = label;
|
||||
this.unitDesc = new HashSet<>();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getUnitCode() {
|
||||
return unitCode;
|
||||
}
|
||||
|
||||
public void setUnitCode(final String unitCode) {
|
||||
this.unitCode = unitCode;
|
||||
}
|
||||
|
||||
public String getUnitQualifier() {
|
||||
return unitQualifier;
|
||||
}
|
||||
|
||||
public void setUnitQualifier(final String unitQualifier) {
|
||||
this.unitQualifier = unitQualifier;
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setLabel(final String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
public void addUnitDesc(UnitDesc desc) {
|
||||
unitDesc.add(desc);
|
||||
}
|
||||
|
||||
}
|
||||
62
src/main/java/de/avatic/taric/model/UnitDesc.java
Normal file
62
src/main/java/de/avatic/taric/model/UnitDesc.java
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
package de.avatic.taric.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.annotation.Id;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
public class UnitDesc {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@Size(max = 2)
|
||||
private String lang;
|
||||
|
||||
private String desc;
|
||||
|
||||
private LocalDate descStartDate;
|
||||
|
||||
|
||||
public UnitDesc(String lang, String desc, LocalDate descStartDate) {
|
||||
this.lang = lang;
|
||||
this.desc = desc;
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(final Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLang() {
|
||||
return lang;
|
||||
}
|
||||
|
||||
public void setLang(final String lang) {
|
||||
this.lang = lang;
|
||||
}
|
||||
|
||||
public String getDescc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(final String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public LocalDate getDescStartDate() {
|
||||
return descStartDate;
|
||||
}
|
||||
|
||||
public void setDescStartDate(final LocalDate descStartDate) {
|
||||
this.descStartDate = descStartDate;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.AdditionalCode;
|
||||
|
||||
public interface AdditionalCodeRepository extends CrudRepository<AdditionalCode, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.AppliedMeasureCondition;
|
||||
|
||||
public interface AppliedMeasureConditionRepository extends CrudRepository<AppliedMeasureCondition, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import de.avatic.taric.model.Import;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.AppliedMeasure;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface AppliedMeasureRepository extends CrudRepository<AppliedMeasure, Integer> {
|
||||
|
||||
@Query("SELECT * FROM applied_measure WHERE import_id = :importId")
|
||||
List<AppliedMeasure> findByImport(@Param("importId") AggregateReference<Import, Integer> importRef);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.Certificate;
|
||||
|
||||
public interface CertificateRepository extends CrudRepository<Certificate, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.CertificateType;
|
||||
|
||||
public interface CertificateTypeRepository extends CrudRepository<CertificateType, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.ConditionType;
|
||||
|
||||
public interface ConditionTypeRepository extends CrudRepository<ConditionType, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.Footnote;
|
||||
|
||||
public interface FootnoteRepository extends CrudRepository<Footnote, Integer> {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.GeoGroupMembership;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface GeoGroupMembershipRepository extends CrudRepository<GeoGroupMembership, Integer> {
|
||||
|
||||
@Query("SELECT * FROM geo_group_membership WHERE geo_id = :geoId")
|
||||
List<GeoGroupMembership> findByGeoId(@Param("geoId") Integer geoId);
|
||||
|
||||
@Query("SELECT geo_group_id FROM geo_group_membership WHERE id = :membershipId")
|
||||
Integer findGeoGroupIdByMembershipId(@Param("membershipId") Integer membershipId);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.GeoGroup;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public interface GeoGroupRepository extends CrudRepository<GeoGroup, Integer> {
|
||||
|
||||
@Query("SELECT * FROM geo_group WHERE geo_group_code = :code")
|
||||
Optional<GeoGroup> findByGeoGroupCode(@Param("code") String code);
|
||||
|
||||
@Query("""
|
||||
SELECT * FROM geo_group AS gg
|
||||
LEFT JOIN geo_group_membership AS ggm ON gg.id = ggm.geo_group_id
|
||||
LEFT JOIN geo AS g ON ggm.geo_id = g.id
|
||||
WHERE iso_3166_code = :countryCode""")
|
||||
List<GeoGroup> findByCountryCode(@Param("countryCode") String countryCode);
|
||||
|
||||
List<GeoGroup> findByAbbr(String abbr);
|
||||
}
|
||||
20
src/main/java/de/avatic/taric/repository/GeoRepository.java
Normal file
20
src/main/java/de/avatic/taric/repository/GeoRepository.java
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import de.avatic.taric.model.Geo;
|
||||
import de.avatic.taric.model.GeoGroup;
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface GeoRepository extends CrudRepository<Geo, Integer> {
|
||||
|
||||
@Query("SELECT * FROM geo WHERE iso_3166_code = :code AND (end_date IS NULL OR end_date >= CURRENT_DATE)")
|
||||
Optional<Geo> findByIso3166Code(@Param("code") String code);
|
||||
|
||||
|
||||
@Query("SELECT * FROM geo_group WHERE geo_group_code = '1011'")
|
||||
Optional<GeoGroup> findErgaOmnes();
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import de.avatic.taric.model.Import;
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface ImportRepository extends CrudRepository<Import, Integer> {
|
||||
|
||||
@Query("SELECT * FROM import WHERE nomenclature_id = :nomenclatureId AND geo_id = :geoId")
|
||||
List<Import> findByNomenclatureIdAndGeoId(Integer nomenclatureId, Integer geoId);
|
||||
|
||||
@Query("SELECT * FROM import WHERE nomenclature_id = :nomenclatureId AND geo_group_id = :geoGroupId")
|
||||
List<Import> findByNomenclatureIdAndGeoGroupId(Integer nomenclatureId, Integer geoGroupId);
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.LegalBase;
|
||||
|
||||
public interface LegalBaseRepository extends CrudRepository<LegalBase, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.MeasureAction;
|
||||
|
||||
public interface MeasureActionRepository extends CrudRepository<MeasureAction, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import de.avatic.taric.model.AppliedMeasure;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.MeasureExclusion;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface MeasureExclusionRepository extends CrudRepository<MeasureExclusion, Integer>
|
||||
{
|
||||
|
||||
@Query("SELECT * FROM measure_exclusion WHERE applied_measure_id = :appliedMeasureId")
|
||||
List<MeasureExclusion> findByAppliedMeasure(@Param("appliedMeasureId") AggregateReference<AppliedMeasure, Integer> appliedMeasureRef);
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.MeasureFootnote;
|
||||
|
||||
public interface MeasureFootnoteRepository extends CrudRepository<MeasureFootnote, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import de.avatic.taric.model.Measure;
|
||||
|
||||
public interface MeasureRepository extends CrudRepository<Measure, Integer> {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.MeasureSeries;
|
||||
|
||||
public interface MeasureSeriesRepository extends CrudRepository<MeasureSeries, Integer> {
|
||||
|
||||
public MeasureSeries findByMeasureSeriesCode(String measureSeriesCode);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.MonetaryUnit;
|
||||
|
||||
public interface MonetaryUnitRepository extends CrudRepository<MonetaryUnit, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.NomenclatureFootnote;
|
||||
|
||||
public interface NomenclatureFootnoteRepository extends CrudRepository<NomenclatureFootnote, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import de.avatic.taric.model.Nomenclature;
|
||||
import org.springframework.data.jdbc.repository.query.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface NomenclatureRepository extends CrudRepository<Nomenclature, Integer> {
|
||||
|
||||
@Query("SELECT * FROM nomenclature WHERE hscode = :hscode AND (end_date IS NULL OR end_date >= CURRENT_DATE)")
|
||||
Optional<Nomenclature> findByHscode(String hscode);
|
||||
|
||||
@Query("SELECT * FROM nomenclature WHERE is_leaf = 1 AND hscode LIKE CONCAT(:code, '%') AND (end_date IS NULL OR end_date >= CURRENT_DATE)")
|
||||
List<Nomenclature> findDeclarableChildren(@Param("code") String code);
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package de.avatic.taric.repository;
|
||||
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
|
||||
import de.avatic.taric.model.Unit;
|
||||
|
||||
public interface UnitRepository extends CrudRepository<Unit, Integer> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
package de.avatic.taric.serializer;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import de.avatic.taric.model.Description;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
public class DescSetSerializer extends JsonSerializer<Set<Description>> {
|
||||
|
||||
private static final ThreadLocal<String> LANGUAGE_CONTEXT = new ThreadLocal<>();
|
||||
|
||||
public static void setLanguage(String language) {
|
||||
LANGUAGE_CONTEXT.set(language);
|
||||
}
|
||||
|
||||
public static void clearLanguage() {
|
||||
LANGUAGE_CONTEXT.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(Set<Description> value, JsonGenerator gen, SerializerProvider serializer) throws IOException {
|
||||
if (value != null) {
|
||||
var filtered = value;
|
||||
|
||||
String language = LANGUAGE_CONTEXT.get();
|
||||
if (language != null) {
|
||||
filtered = value.stream()
|
||||
.filter(desc -> language.equalsIgnoreCase(desc.getLang()))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
if (filtered.isEmpty()) {
|
||||
filtered = value.stream()
|
||||
.filter(desc -> "EN".equalsIgnoreCase(desc.getLang()))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
if(filtered.size() == 1)
|
||||
gen.writeObject(filtered.iterator().next());
|
||||
else
|
||||
gen.writeObject(filtered);
|
||||
} else {
|
||||
gen.writeNull();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
package de.avatic.taric.serializer;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Component
|
||||
public class DescriptionSerializer extends JsonSerializer<String> {
|
||||
@Override
|
||||
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||
|
||||
if (value != null) {
|
||||
String converted = value
|
||||
.replace("!1!", "\n") // Paragraph mark (carriage return)
|
||||
.replace("|", "\u00A0") // Unbreakable space (non-breaking space)
|
||||
.replace("!X!", "×") // Multiply sign
|
||||
.replace("!x!", "×") // Multiply sign
|
||||
.replace("!o!", "°") // Degree symbol
|
||||
.replace("!O!", "°") // Degree symbol
|
||||
.replace("!<=!", "≤") // Less than or equal to
|
||||
.replace("!>=!", "≥") // Greater than or equal to
|
||||
.replace("\\n", "\n")
|
||||
.replaceAll("\\$(.)", "<sup>$1</sup>") // Superscript
|
||||
.replaceAll("@(.)", "<sub>$1</sub>"); // Subscript
|
||||
|
||||
|
||||
gen.writeString(converted);
|
||||
} else {
|
||||
gen.writeNull();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package de.avatic.taric.serializer;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import de.avatic.taric.model.Footnote;
|
||||
import de.avatic.taric.repository.FootnoteRepository;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Component
|
||||
public class FootnoteReferenceSerializer extends JsonSerializer<AggregateReference<Footnote, Integer>> {
|
||||
|
||||
protected final FootnoteRepository footnoteRepository;
|
||||
|
||||
public FootnoteReferenceSerializer(FootnoteRepository footnoteRepository) {
|
||||
this.footnoteRepository = footnoteRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(AggregateReference<Footnote, Integer> value, JsonGenerator gen,
|
||||
SerializerProvider serializers) throws IOException {
|
||||
if (value != null) {
|
||||
Footnote footnote = footnoteRepository.findById(value.getId())
|
||||
.orElse(null);
|
||||
|
||||
gen.writeObject(footnote);
|
||||
} else {
|
||||
gen.writeNull();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
package de.avatic.taric.serializer;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import de.avatic.taric.model.Footnote;
|
||||
import de.avatic.taric.model.Geo;
|
||||
import de.avatic.taric.repository.GeoRepository;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Component
|
||||
public class GeoReferenceSerializer extends JsonSerializer<AggregateReference<Geo, Integer>> {
|
||||
|
||||
private final GeoRepository geoRepository;
|
||||
|
||||
public GeoReferenceSerializer(GeoRepository geoRepository) {
|
||||
this.geoRepository = geoRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(AggregateReference<Geo, Integer> value, JsonGenerator gen, SerializerProvider serializer) throws IOException {
|
||||
|
||||
if (value != null) {
|
||||
Geo geo = geoRepository.findById(value.getId()).orElse(null);
|
||||
|
||||
gen.writeObject(geo);
|
||||
} else {
|
||||
gen.writeNull();
|
||||
}
|
||||
}
|
||||
}
|
||||
34
src/main/java/de/avatic/taric/service/GeoService.java
Normal file
34
src/main/java/de/avatic/taric/service/GeoService.java
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
package de.avatic.taric.service;
|
||||
|
||||
import de.avatic.taric.model.Geo;
|
||||
import de.avatic.taric.model.GeoGroup;
|
||||
import de.avatic.taric.repository.GeoGroupRepository;
|
||||
import de.avatic.taric.repository.GeoRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Service
|
||||
public class GeoService {
|
||||
|
||||
private final GeoGroupRepository geoGroupRepository;
|
||||
private final GeoRepository geoRepository;
|
||||
|
||||
public GeoService(GeoGroupRepository geoGroupRepository, GeoRepository geoRepository) {
|
||||
this.geoGroupRepository = geoGroupRepository;
|
||||
this.geoRepository = geoRepository;
|
||||
}
|
||||
|
||||
public Optional<Geo> getGeo(String countryCode) {
|
||||
return geoRepository.findByIso3166Code(countryCode);
|
||||
}
|
||||
|
||||
public List<GeoGroup> getGeoGroupByCountryCode(String countryCode) {
|
||||
return geoGroupRepository.findByCountryCode(countryCode);
|
||||
}
|
||||
|
||||
public List<GeoGroup> getGeoGroup(String abbr) {
|
||||
return geoGroupRepository.findByAbbr(abbr);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
package de.avatic.taric.service;
|
||||
|
||||
import de.avatic.taric.model.Nomenclature;
|
||||
import de.avatic.taric.repository.NomenclatureRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Service
|
||||
public class NomenclatureService {
|
||||
|
||||
private final NomenclatureRepository nomenclatureRepository;
|
||||
|
||||
public NomenclatureService(NomenclatureRepository nomenclatureRepository) {
|
||||
this.nomenclatureRepository = nomenclatureRepository;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Optional<Nomenclature> getNomenclature(String hscode) {
|
||||
return nomenclatureRepository.findByHscode(normalize(hscode.replaceAll("[^0-9]", "")));
|
||||
}
|
||||
|
||||
public boolean isDeclarable(String hscode) {
|
||||
var nomenclature = getNomenclature(hscode);
|
||||
if(nomenclature.isEmpty()) return false;
|
||||
return nomenclature.get().getIsLeaf();
|
||||
}
|
||||
|
||||
public List<Nomenclature> getDeclarableChildren(String hscode) {
|
||||
var normalized = normalize(hscode.replaceAll("[^0-9]", ""));
|
||||
var level = getHierarchyLevel(normalized);
|
||||
return nomenclatureRepository.findDeclarableChildren(normalized.substring(0, level));
|
||||
}
|
||||
|
||||
public List<Nomenclature> getNomenclatureCascade(String hscode) {
|
||||
if (hscode == null) return Collections.emptyList();
|
||||
List<String> cascade = getCascade(normalize(hscode.replaceAll("[^0-9]", "")));
|
||||
|
||||
var cascadeResp = cascade.stream().map(nomenclatureRepository::findByHscode).toList();
|
||||
|
||||
return cascade.stream().map(nomenclatureRepository::findByHscode).flatMap(Optional::stream).toList();
|
||||
}
|
||||
|
||||
private List<String> getCascade(String hscode) {
|
||||
var parents = new ArrayList<String>();
|
||||
var hierarchyLevel = getHierarchyLevel(hscode);
|
||||
|
||||
while (hierarchyLevel > 0) {
|
||||
parents.add(getParent(hscode, hierarchyLevel));
|
||||
hierarchyLevel -= 2;
|
||||
}
|
||||
|
||||
return parents;
|
||||
}
|
||||
|
||||
private String getParent(String hscode, int level) {
|
||||
return normalize(hscode.substring(0, level));
|
||||
}
|
||||
|
||||
private int getHierarchyLevel(String hscode) {
|
||||
int idx = hscode.length();
|
||||
|
||||
while(idx > 0) {
|
||||
idx--;
|
||||
if (hscode.charAt(idx) != '0') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (idx+1) % 2 == 0 ? idx + 1 : idx + 2;
|
||||
}
|
||||
|
||||
private String normalize(String hscode) {
|
||||
|
||||
StringBuilder normalizedHsCode = new StringBuilder(hscode);
|
||||
|
||||
while (normalizedHsCode.length() < 10) {
|
||||
normalizedHsCode.append("0");
|
||||
}
|
||||
|
||||
if (normalizedHsCode.length() > 10) {
|
||||
normalizedHsCode = new StringBuilder(normalizedHsCode.substring(0, 10));
|
||||
}
|
||||
|
||||
return normalizedHsCode.toString();
|
||||
}
|
||||
|
||||
}
|
||||
35
src/main/java/de/avatic/taric/service/TariffService.java
Normal file
35
src/main/java/de/avatic/taric/service/TariffService.java
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
package de.avatic.taric.service;
|
||||
|
||||
|
||||
import de.avatic.taric.error.ArgumentException;
|
||||
import de.avatic.taric.model.Nomenclature;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class TariffService {
|
||||
|
||||
private final GeoService geoService;
|
||||
private final NomenclatureService nomenclatureService;
|
||||
|
||||
public TariffService(GeoService geoService, NomenclatureService nomenclatureService) {
|
||||
this.geoService = geoService;
|
||||
this.nomenclatureService = nomenclatureService;
|
||||
}
|
||||
|
||||
public void importTariffs(String hsCode, String countryCode) {
|
||||
|
||||
var geoGroups = geoService.getGeoGroupByCountryCode(countryCode);
|
||||
var geo = geoService.getGeo(countryCode);
|
||||
|
||||
var nomenclature = nomenclatureService.getNomenclature(hsCode);
|
||||
var cascade = nomenclatureService.getNomenclatureCascade(hsCode);
|
||||
|
||||
if(nomenclature.isEmpty() || !nomenclature.get().getIsLeaf()) throw new ArgumentException("hsCode");
|
||||
if(geo.isEmpty()) throw new ArgumentException("countryCode");
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
303
src/main/java/de/avatic/taric/service/TariffService2.java
Normal file
303
src/main/java/de/avatic/taric/service/TariffService2.java
Normal file
|
|
@ -0,0 +1,303 @@
|
|||
package de.avatic.taric.service;
|
||||
|
||||
import de.avatic.taric.model.*;
|
||||
import de.avatic.taric.repository.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.data.jdbc.core.mapping.AggregateReference;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@Service
|
||||
public class TariffService2 {
|
||||
|
||||
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TariffService2.class);
|
||||
|
||||
private final ImportRepository importRepository;
|
||||
private final AppliedMeasureRepository appliedMeasureRepository;
|
||||
private final NomenclatureRepository nomenclatureRepository;
|
||||
private final GeoRepository geoRepository;
|
||||
private final GeoGroupRepository geoGroupRepository;
|
||||
private final GeoGroupMembershipRepository geoGroupMembershipRepository;
|
||||
private final MeasureRepository measureRepository;
|
||||
private final MeasureExclusionRepository measureExclusionRepository;
|
||||
|
||||
public TariffService2(ImportRepository importRepository, AppliedMeasureRepository appliedMeasureRepository, NomenclatureRepository nomenclatureRepository, GeoRepository geoRepository, GeoGroupRepository geoGroupRepository, GeoGroupMembershipRepository geoGroupMembershipRepository, MeasureRepository measureRepository, MeasureExclusionRepository measureExclusionRepository) {
|
||||
this.importRepository = importRepository;
|
||||
this.appliedMeasureRepository = appliedMeasureRepository;
|
||||
this.nomenclatureRepository = nomenclatureRepository;
|
||||
this.geoRepository = geoRepository;
|
||||
this.geoGroupRepository = geoGroupRepository;
|
||||
this.geoGroupMembershipRepository = geoGroupMembershipRepository;
|
||||
this.measureRepository = measureRepository;
|
||||
this.measureExclusionRepository = measureExclusionRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ermittelt den Zolltarif für einen HS-Code und ein Herkunftsland
|
||||
*
|
||||
* @param hsCode HS-Code (kann 6, 8 oder 10 Stellen haben)
|
||||
* @param countryCode ISO-2 Ländercode (z.B. "CN" für China)
|
||||
* @return Zolltarif in Prozent
|
||||
*/
|
||||
@Transactional(readOnly = true)
|
||||
public TariffResult getTariffRate(String hsCode, String countryCode) {
|
||||
log.info("Getting tariff rate for HS Code: {} from country: {}", hsCode, countryCode);
|
||||
|
||||
// Normalisiere HS-Code auf 10 Stellen
|
||||
String normalizedHsCode = normalizeHsCode(hsCode);
|
||||
|
||||
// Finde alle relevanten Nomenclature-Codes (inkl. Parent-Codes durch Cascade-Prinzip)
|
||||
List<String> relevantCodes = findRelevantNomenclatureCodes(normalizedHsCode);
|
||||
log.debug("Found relevant codes: {}", relevantCodes);
|
||||
|
||||
// Hole das Land
|
||||
Optional<Geo> countryOpt = geoRepository.findByIso3166Code(countryCode);
|
||||
if (countryOpt.isEmpty()) {
|
||||
log.warn("Country not found: {}", countryCode);
|
||||
return TariffResult.notFound("Country code not found: " + countryCode);
|
||||
}
|
||||
|
||||
Geo country = countryOpt.get();
|
||||
|
||||
// Finde alle Imports für die relevanten Codes
|
||||
List<Import> imports = findRelevantImports(relevantCodes, country);
|
||||
|
||||
if (imports.isEmpty()) {
|
||||
log.info("No imports found for codes: {} and country: {}", relevantCodes, countryCode);
|
||||
// Versuche Erga Omnes (alle Länder)
|
||||
imports = findErgaOmnesImports(relevantCodes);
|
||||
}
|
||||
|
||||
if (imports.isEmpty()) {
|
||||
return TariffResult.notFound("No tariff data found for HS code: " + hsCode);
|
||||
}
|
||||
|
||||
// Finde die anwendbaren Maßnahmen
|
||||
BigDecimal tariffRate = calculateTariffRate(imports, country);
|
||||
|
||||
return TariffResult.success(tariffRate, normalizedHsCode, countryCode);
|
||||
}
|
||||
|
||||
private String normalizeHsCode(String hsCode) {
|
||||
// Entferne alle nicht-numerischen Zeichen
|
||||
String cleaned = hsCode.replaceAll("[^0-9]", "");
|
||||
|
||||
// Fülle auf 10 Stellen mit Nullen auf
|
||||
while (cleaned.length() < 10) {
|
||||
cleaned += "0";
|
||||
}
|
||||
|
||||
// Begrenze auf 10 Stellen
|
||||
if (cleaned.length() > 10) {
|
||||
cleaned = cleaned.substring(0, 10);
|
||||
}
|
||||
|
||||
return cleaned;
|
||||
}
|
||||
|
||||
private List<String> findRelevantNomenclatureCodes(String hsCode) {
|
||||
List<String> codes = new ArrayList<>();
|
||||
codes.add(hsCode);
|
||||
|
||||
// Füge Parent-Codes hinzu (Cascade-Prinzip)
|
||||
// Beispiel: 8504101010 -> auch 85041010, 850410, 8504, 85
|
||||
String code = hsCode;
|
||||
while (code.length() > 2) {
|
||||
// Entferne die letzten 2 Nullen
|
||||
if (code.endsWith("00")) {
|
||||
code = code.substring(0, code.length() - 2);
|
||||
codes.add(code + "0".repeat(10 - code.length()));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return codes;
|
||||
}
|
||||
|
||||
private List<Import> findRelevantImports(List<String> nomenclatureCodes, Geo country) {
|
||||
List<Import> imports = new ArrayList<>();
|
||||
|
||||
for (String code : nomenclatureCodes) {
|
||||
// Suche direkte Länder-Zuordnungen
|
||||
Optional<Nomenclature> nomenclatureOpt = nomenclatureRepository.findByHscode(code);
|
||||
if (nomenclatureOpt.isPresent()) {
|
||||
Nomenclature nomenclature = nomenclatureOpt.get();
|
||||
|
||||
// Suche Imports mit direkter Geo-Zuordnung
|
||||
imports.addAll(importRepository.findByNomenclatureIdAndGeoId(
|
||||
nomenclature.getId(), country.getId()));
|
||||
|
||||
// Suche auch nach Ländergruppen-Mitgliedschaften
|
||||
List<GeoGroupMembership> memberships =
|
||||
geoGroupMembershipRepository.findByGeoId(country.getId());
|
||||
|
||||
for (GeoGroupMembership membership : memberships) {
|
||||
// Hole die geo_group_id aus der membership
|
||||
Integer geoGroupId = geoGroupMembershipRepository
|
||||
.findGeoGroupIdByMembershipId(membership.getId());
|
||||
if (geoGroupId != null) {
|
||||
imports.addAll(importRepository.findByNomenclatureIdAndGeoGroupId(
|
||||
nomenclature.getId(), geoGroupId));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return imports;
|
||||
}
|
||||
|
||||
private List<Import> findErgaOmnesImports(List<String> nomenclatureCodes) {
|
||||
List<Import> imports = new ArrayList<>();
|
||||
|
||||
// Erga Omnes hat normalerweise den Code "1011"
|
||||
Optional<GeoGroup> ergaOmnes = geoGroupRepository.findByGeoGroupCode("1011");
|
||||
if (ergaOmnes.isEmpty()) {
|
||||
return imports;
|
||||
}
|
||||
|
||||
for (String code : nomenclatureCodes) {
|
||||
Optional<Nomenclature> nomenclatureOpt = nomenclatureRepository.findByHscode(code);
|
||||
if (nomenclatureOpt.isPresent()) {
|
||||
imports.addAll(importRepository.findByNomenclatureIdAndGeoGroupId(
|
||||
nomenclatureOpt.get().getId(), ergaOmnes.get().getId()));
|
||||
}
|
||||
}
|
||||
|
||||
return imports;
|
||||
}
|
||||
|
||||
private BigDecimal calculateTariffRate(List<Import> imports, Geo country) {
|
||||
BigDecimal lowestRate = null;
|
||||
LocalDate today = LocalDate.now();
|
||||
|
||||
for (Import imp : imports) {
|
||||
// Nutze die korrekte Repository-Methode mit Import-Reference
|
||||
List<AppliedMeasure> measures = appliedMeasureRepository
|
||||
.findByImport(AggregateReference.to(imp.getId()));
|
||||
|
||||
for (AppliedMeasure appliedMeasure : measures) {
|
||||
// Prüfe ob Maßnahme gültig ist
|
||||
if (!isMeasureValid(appliedMeasure, today)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Prüfe ob das Land ausgeschlossen ist
|
||||
if (isCountryExcluded(appliedMeasure, country)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Hole die Maßnahme über die AggregateReference
|
||||
if (appliedMeasure.getMeasure() == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Optional<Measure> measureOpt = measureRepository.findById(
|
||||
appliedMeasure.getMeasure().getId());
|
||||
if (measureOpt.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Measure measure = measureOpt.get();
|
||||
|
||||
// Wir interessieren uns hauptsächlich für Third Country Duty (103)
|
||||
// und Preferential Tariff (142, 143)
|
||||
if (!"103".equals(measure.getMeasureCode()) &&
|
||||
!"142".equals(measure.getMeasureCode()) &&
|
||||
!"143".equals(measure.getMeasureCode())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Parse den Zollsatz aus dem amount String
|
||||
BigDecimal rate = parseTariffRate(appliedMeasure.getAmount());
|
||||
if (rate != null && (lowestRate == null || rate.compareTo(lowestRate) < 0)) {
|
||||
lowestRate = rate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lowestRate != null ? lowestRate : BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
private boolean isMeasureValid(AppliedMeasure measure, LocalDate date) {
|
||||
if (measure.getStartDate() != null && measure.getStartDate().isAfter(date)) {
|
||||
return false;
|
||||
}
|
||||
if (measure.getEndDate() != null && measure.getEndDate().isBefore(date)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean isCountryExcluded(AppliedMeasure measure, Geo country) {
|
||||
// Finde Exclusions für diese AppliedMeasure
|
||||
List<MeasureExclusion> exclusions =
|
||||
measureExclusionRepository.findByAppliedMeasure(
|
||||
AggregateReference.to(measure.getId()));
|
||||
|
||||
return exclusions.stream()
|
||||
.anyMatch(exc -> exc.getGeo() != null &&
|
||||
exc.getGeo().getId().equals(country.getId()));
|
||||
}
|
||||
|
||||
private BigDecimal parseTariffRate(String amount) {
|
||||
if (amount == null || amount.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Einfacher Parser für Prozentsätze
|
||||
// Format: "12.5 %" oder "12.5% + ..." oder "12.5 % MAX ..."
|
||||
Pattern pattern = Pattern.compile("^([0-9]+\\.?[0-9]*)\\s*%");
|
||||
Matcher matcher = pattern.matcher(amount);
|
||||
|
||||
if (matcher.find()) {
|
||||
try {
|
||||
return new BigDecimal(matcher.group(1));
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("Could not parse tariff rate from: {}", amount);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Result-Klasse für Tarif-Abfragen
|
||||
*/
|
||||
public static class TariffResult {
|
||||
private final boolean found;
|
||||
private final BigDecimal rate;
|
||||
private final String hsCode;
|
||||
private final String countryCode;
|
||||
private final String message;
|
||||
|
||||
private TariffResult(boolean found, BigDecimal rate, String hsCode,
|
||||
String countryCode, String message) {
|
||||
this.found = found;
|
||||
this.rate = rate;
|
||||
this.hsCode = hsCode;
|
||||
this.countryCode = countryCode;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public static TariffResult success(BigDecimal rate, String hsCode, String countryCode) {
|
||||
return new TariffResult(true, rate, hsCode, countryCode, null);
|
||||
}
|
||||
|
||||
public static TariffResult notFound(String message) {
|
||||
return new TariffResult(false, null, null, null, message);
|
||||
}
|
||||
|
||||
// Getters
|
||||
public boolean isFound() { return found; }
|
||||
public BigDecimal getRate() { return rate; }
|
||||
public String getHsCode() { return hsCode; }
|
||||
public String getCountryCode() { return countryCode; }
|
||||
public String getMessage() { return message; }
|
||||
}
|
||||
}
|
||||
1
src/main/resources/application.properties
Normal file
1
src/main/resources/application.properties
Normal file
|
|
@ -0,0 +1 @@
|
|||
spring.application.name=taric
|
||||
344
src/main/resources/db/migration/V1__Create_schema.sql
Normal file
344
src/main/resources/db/migration/V1__Create_schema.sql
Normal file
|
|
@ -0,0 +1,344 @@
|
|||
-- meta tables, like units and certificates
|
||||
create table if not exists `legal_base`
|
||||
(
|
||||
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
`legal_base` VARCHAR(255),
|
||||
`journal` VARCHAR(255),
|
||||
`page` INT,
|
||||
`date` DATE
|
||||
);
|
||||
|
||||
create table if not exists `monetary_unit`
|
||||
(
|
||||
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
`monetary_unit_code` CHAR(3)
|
||||
);
|
||||
|
||||
create table if not exists `unit`
|
||||
(
|
||||
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
`unit_code` CHAR(3),
|
||||
`unit_qualifier` CHAR(1),
|
||||
`label` TEXT
|
||||
);
|
||||
|
||||
create table if not exists `certificate_type`
|
||||
(
|
||||
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
`certificate_type_code` CHAR(1)
|
||||
);
|
||||
|
||||
create table if not exists `condition_type`
|
||||
(
|
||||
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
`condition_type_code` CHAR(2)
|
||||
);
|
||||
|
||||
create table if not exists `certificate`
|
||||
(
|
||||
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
`certificate_code` CHAR(4),
|
||||
`certificate_type_id` INT NOT NULL,
|
||||
`start_date` DATE,
|
||||
`end_date` DATE,
|
||||
FOREIGN KEY (certificate_type_id) REFERENCES certificate_type(id)
|
||||
);
|
||||
|
||||
-- measure meta infos
|
||||
create table if not exists `footnote`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
footnote CHAR(8),
|
||||
start_date DATE,
|
||||
end_date DATE
|
||||
);
|
||||
|
||||
create table if not exists `measure_series`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
measure_series_code CHAR(1)
|
||||
);
|
||||
|
||||
create table if not exists `measure`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
measure_series_id INT NOT NULL,
|
||||
measure_code CHAR(3),
|
||||
short_desc TEXT,
|
||||
tm_code TINYINT,
|
||||
start_date DATE,
|
||||
FOREIGN KEY (measure_series_id) REFERENCES measure_series(id)
|
||||
);
|
||||
|
||||
create table if not exists `measure_action`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
measure_action_code CHAR(2),
|
||||
CONSTRAINT UC_MeasureAction UNIQUE (measure_action_code)
|
||||
);
|
||||
|
||||
-- geo
|
||||
create table if not exists `geo`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
iso_3166_code CHAR(2),
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
CONSTRAINT UC_IsoCode UNIQUE (iso_3166_code)
|
||||
);
|
||||
|
||||
create table if not exists `geo_group`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
geo_group_code CHAR(4),
|
||||
abbr TEXT,
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
CONSTRAINT UC_GroupCode UNIQUE (geo_group_code)
|
||||
);
|
||||
|
||||
create table if not exists `geo_group_membership`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
geo_id INT NOT NULL,
|
||||
geo_group_id INT NOT NULL,
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
FOREIGN KEY (geo_id) REFERENCES geo(id),
|
||||
FOREIGN KEY (geo_group_id) REFERENCES geo_group(id),
|
||||
CONSTRAINT UC_GeoGroupTuple UNIQUE (geo_id, geo_group_id)
|
||||
);
|
||||
|
||||
-- nomenclature
|
||||
create table if not exists `nomenclature`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
hscode CHAR(10),
|
||||
suffix CHAR(2),
|
||||
hierachy TINYINT,
|
||||
indent TINYINT,
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
is_leaf BOOLEAN,
|
||||
is_leaf_start_date DATE,
|
||||
parent_id INT NULL -- TODO: for each child do: alter table nomenclature add constraint parent_nomenclature foreign key (parent_id) references nomenclature(id) on delete set null;
|
||||
);
|
||||
|
||||
create table if not exists `nomenclature_footnote`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
footnote_id INT NOT NULL,
|
||||
nomenclature_id INT NOT NULL,
|
||||
FOREIGN KEY (footnote_id) REFERENCES footnote(id),
|
||||
FOREIGN KEY (nomenclature_id) REFERENCES nomenclature(id)
|
||||
);
|
||||
|
||||
create table if not exists `additional_code`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
additional_code CHAR(4),
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
CONSTRAINT UC_AdditionalCode UNIQUE (additional_code)
|
||||
);
|
||||
|
||||
-- import, applied_measures
|
||||
create table if not exists `import`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
nomenclature_id INT NOT NULL,
|
||||
additional_code_id INT DEFAULT NULL,
|
||||
geo_id INT DEFAULT NULL,
|
||||
geo_group_id INT DEFAULT NULL,
|
||||
FOREIGN KEY (nomenclature_id) REFERENCES nomenclature(id),
|
||||
FOREIGN KEY (additional_code_id) REFERENCES additional_code(id),
|
||||
FOREIGN KEY (geo_id) REFERENCES geo(id),
|
||||
FOREIGN KEY (geo_group_id) REFERENCES geo_group(id)
|
||||
);
|
||||
|
||||
create table if not exists `applied_measure`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
import_id INT NOT NULL,
|
||||
measure_id INT NOT NULL,
|
||||
legal_base_id INT DEFAULT NULL,
|
||||
legal_base TEXT DEFAULT NULL,
|
||||
start_date DATE DEFAULT NULL,
|
||||
end_date DATE DEFAULT NULL,
|
||||
amount TEXT DEFAULT NULL,
|
||||
order_number INT DEFAULT NULL,
|
||||
FOREIGN KEY (import_id) REFERENCES import(id),
|
||||
FOREIGN KEY (measure_id) REFERENCES measure(id),
|
||||
FOREIGN KEY (legal_base_id) REFERENCES legal_base(id)
|
||||
);
|
||||
|
||||
create table if not exists `measure_footnote`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
footnote_id INT NOT NULL,
|
||||
applied_measure_id INT NOT NULL,
|
||||
FOREIGN KEY (footnote_id) REFERENCES footnote(id),
|
||||
FOREIGN KEY (applied_measure_id) REFERENCES applied_measure(id)
|
||||
);
|
||||
|
||||
create table if not exists `applied_measure_condition`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
sequence_no INT DEFAULT NULL,
|
||||
applied_measure_id INT NOT NULL,
|
||||
measure_action_id INT NOT NULL,
|
||||
monetary_unit_id INT DEFAULT NULL,
|
||||
unit_id INT DEFAULT NULL,
|
||||
certificate_id INT DEFAULT NULL,
|
||||
condition_type_id INT NOT NULL,
|
||||
amount TEXT,
|
||||
FOREIGN KEY (applied_measure_id) REFERENCES applied_measure(id),
|
||||
FOREIGN KEY (measure_action_id) REFERENCES measure_action(id),
|
||||
FOREIGN KEY (monetary_unit_id) REFERENCES monetary_unit(id),
|
||||
FOREIGN KEY (unit_id) REFERENCES unit(id),
|
||||
FOREIGN KEY (certificate_id) REFERENCES certificate(id),
|
||||
FOREIGN KEY (condition_type_id) REFERENCES condition_type(id)
|
||||
);
|
||||
|
||||
create table if not exists `measure_exclusion`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
geo_id INT NOT NULL,
|
||||
applied_measure_id INT NOT NULL,
|
||||
FOREIGN KEY (geo_id) REFERENCES geo(id),
|
||||
FOREIGN KEY (applied_measure_id) REFERENCES applied_measure(id)
|
||||
);
|
||||
|
||||
-- descriptions
|
||||
create table if not exists `footnotes_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES footnote(id)
|
||||
);
|
||||
|
||||
create table if not exists `measure_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES measure(id)
|
||||
);
|
||||
|
||||
create table if not exists `measure_series_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES measure_series(id)
|
||||
);
|
||||
|
||||
create table if not exists `measure_action_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES measure_action(id)
|
||||
);
|
||||
|
||||
create table if not exists `geo_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES geo(id)
|
||||
);
|
||||
|
||||
create table if not exists `geo_group_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES geo_group(id)
|
||||
);
|
||||
|
||||
create table if not exists `monetary_unit_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES monetary_unit(id)
|
||||
);
|
||||
|
||||
create table if not exists `unit_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES unit(id)
|
||||
);
|
||||
|
||||
create table if not exists `certificate_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES certificate(id)
|
||||
);
|
||||
|
||||
create table if not exists `certificate_type_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES certificate_type(id)
|
||||
);
|
||||
|
||||
create table if not exists `condition_type_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES condition_type(id)
|
||||
);
|
||||
|
||||
create table if not exists `additional_code_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES additional_code(id)
|
||||
);
|
||||
|
||||
create table if not exists `nomenclature_desc`
|
||||
(
|
||||
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
ref_id INT NOT NULL,
|
||||
lang CHAR(2),
|
||||
`desc` TEXT,
|
||||
desc_start_date DATE,
|
||||
FOREIGN KEY (ref_id) REFERENCES nomenclature(id)
|
||||
);
|
||||
|
||||
|
||||
|
||||
1048
src/main/resources/db/migration/V2__Initial_Import.sql
Normal file
1048
src/main/resources/db/migration/V2__Initial_Import.sql
Normal file
File diff suppressed because one or more lines are too long
13
src/test/java/de/avatic/taric/TaricApplicationTests.java
Normal file
13
src/test/java/de/avatic/taric/TaricApplicationTests.java
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
package de.avatic.taric;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
class TaricApplicationTests {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue