From f9034fbe50e42f7552af02e4e0c78a407d713e19 Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Thu, 13 Jul 2023 07:50:01 +0700 Subject: [PATCH] Initial commit --- .gitignore | 33 + .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .mvn/wrapper/maven-wrapper.properties | 18 + mvnw | 316 ++++++++++ mvnw.cmd | 188 ++++++ pom.properties | 5 + pom.xml | 148 +++++ src/main/java/com/reporting/ReportingApp.java | 16 + src/main/java/com/reporting/Utility/Age.java | 29 + .../com/reporting/Utility/AgeCalculator.java | 66 ++ .../java/com/reporting/Utility/Constants.java | 42 ++ .../reporting/Utility/DatabaseUtility.java | 91 +++ .../java/com/reporting/config/DbConfig.java | 57 ++ .../controller/ReportingController.java | 334 +++++++++++ .../reporting/controller/UserController.java | 104 ++++ .../java/com/reporting/dao/LabelGizi.java | 43 ++ .../java/com/reporting/dao/ReportingDao.java | 566 ++++++++++++++++++ .../java/com/reporting/dao/UserDaoImpl.java | 100 ++++ .../java/com/reporting/model/ApiResponse.java | 37 ++ .../com/reporting/model/InfoResponse.java | 16 + src/main/java/com/reporting/model/Pasien.java | 155 +++++ .../java/com/reporting/model/Printer.java | 16 + .../java/com/reporting/model/PrinterForm.java | 16 + src/main/java/com/reporting/model/Resep.java | 64 ++ .../java/com/reporting/model/ResepDetail.java | 45 ++ .../model/VerifikasiTagihanSupplier.java | 144 +++++ .../model/VerifikasiTagihanSupplier2.java | 135 +++++ .../com/reporting/service/LapLabService.java | 52 ++ .../reporting/service/ReportingService.java | 92 +++ .../com/reporting/service/ResepService.java | 218 +++++++ .../com/reporting/service/UserService.java | 28 + .../VerifikasiTagihanSupplierServices.java | 470 +++++++++++++++ src/main/resources/application.properties | 20 + .../java/com/reporting/ReportingAppTests.java | 13 + 34 files changed, 3677 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.properties create mode 100644 pom.xml create mode 100644 src/main/java/com/reporting/ReportingApp.java create mode 100644 src/main/java/com/reporting/Utility/Age.java create mode 100644 src/main/java/com/reporting/Utility/AgeCalculator.java create mode 100644 src/main/java/com/reporting/Utility/Constants.java create mode 100644 src/main/java/com/reporting/Utility/DatabaseUtility.java create mode 100644 src/main/java/com/reporting/config/DbConfig.java create mode 100644 src/main/java/com/reporting/controller/ReportingController.java create mode 100644 src/main/java/com/reporting/controller/UserController.java create mode 100644 src/main/java/com/reporting/dao/LabelGizi.java create mode 100644 src/main/java/com/reporting/dao/ReportingDao.java create mode 100644 src/main/java/com/reporting/dao/UserDaoImpl.java create mode 100644 src/main/java/com/reporting/model/ApiResponse.java create mode 100644 src/main/java/com/reporting/model/InfoResponse.java create mode 100644 src/main/java/com/reporting/model/Pasien.java create mode 100644 src/main/java/com/reporting/model/Printer.java create mode 100644 src/main/java/com/reporting/model/PrinterForm.java create mode 100644 src/main/java/com/reporting/model/Resep.java create mode 100644 src/main/java/com/reporting/model/ResepDetail.java create mode 100644 src/main/java/com/reporting/model/VerifikasiTagihanSupplier.java create mode 100644 src/main/java/com/reporting/model/VerifikasiTagihanSupplier2.java create mode 100644 src/main/java/com/reporting/service/LapLabService.java create mode 100644 src/main/java/com/reporting/service/ReportingService.java create mode 100644 src/main/java/com/reporting/service/ResepService.java create mode 100644 src/main/java/com/reporting/service/UserService.java create mode 100644 src/main/java/com/reporting/service/VerifikasiTagihanSupplierServices.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/reporting/ReportingAppTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 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

dy!05UMhSKsK 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 VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ca5ab4b --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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 +# +# https://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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/mvnw @@ -0,0 +1,316 @@ +#!/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 +# +# https://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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + 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" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,188 @@ +@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 https://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 Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.properties b/pom.properties new file mode 100644 index 0000000..7be296d --- /dev/null +++ b/pom.properties @@ -0,0 +1,5 @@ +#Generated by Apache Maven +#Wed Mar 24 14:28:42 WIB 2021 +version=1 +groupId=com.rsabhk +artifactId=reporting-service diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1299ca2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,148 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + com.rsabhk + reporting-service + 1 + jar + reporting-service + Demo project for Spring Boot + + + UTF-8 + UTF-8 + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + com.zaxxer + HikariCP + 3.1.0 + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + + + + org.postgresql + postgresql + runtime + + + + javax.servlet + jstl + + + org.webjars + bootstrap + 4.0.0 + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + + + + org.codehaus.groovy + groovy-all + 2.0.1 + + + com.itextpdf + itext-pdfa + 5.5.0 + + + com.itextpdf + itextpdf + 5.5.0 + + + net.sf.jasperreports + jasperreports + 6.0.0 + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + net.sourceforge.barbecue + barbecue + 1.5-beta1 + + + + com.google.zxing + core + 2.2 + + + + com.google.zxing + javase + 2.2 + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/reporting/ReportingApp.java b/src/main/java/com/reporting/ReportingApp.java new file mode 100644 index 0000000..5550c73 --- /dev/null +++ b/src/main/java/com/reporting/ReportingApp.java @@ -0,0 +1,16 @@ +package com.reporting; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ReportingApp { + + public ReportingApp() { + } + + public static void main(String[] args) { + SpringApplication.run(ReportingApp.class, args); + } + +} diff --git a/src/main/java/com/reporting/Utility/Age.java b/src/main/java/com/reporting/Utility/Age.java new file mode 100644 index 0000000..509b9ba --- /dev/null +++ b/src/main/java/com/reporting/Utility/Age.java @@ -0,0 +1,29 @@ +package com.reporting.Utility; + +public class Age { + private int days; + private int months; + private int years; + + public Age(int days, int months, int years) { + this.days = days; + this.months = months; + this.years = years; + } + + public int getDays() { + return this.days; + } + + public int getMonths() { + return this.months; + } + + public int getYears() { + return this.years; + } + + public String toString() { + return this.years + " th, " + this.months + " bln, " + this.days + " hr"; + } +} diff --git a/src/main/java/com/reporting/Utility/AgeCalculator.java b/src/main/java/com/reporting/Utility/AgeCalculator.java new file mode 100644 index 0000000..dc758fc --- /dev/null +++ b/src/main/java/com/reporting/Utility/AgeCalculator.java @@ -0,0 +1,66 @@ +package com.reporting.Utility; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.Period; +import java.util.Calendar; +import java.util.Date; + +public final class AgeCalculator { + public AgeCalculator() { + } + + public static Age calculateAge(Date birthDate) { + Age age = null; + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + LocalDate today = LocalDate.now(); + LocalDate birthday = LocalDate.parse(format.format(birthDate)); + Period period = Period.between(birthday, today); + age = new Age(period.getDays(), period.getMonths(), period.getYears()); + return age; + } + + public static Age calculateAge2(Date tglRegistrasi, Date birthDate) { + int years = 0; + int months = 0; + int days = 0; + + try { + Calendar birthDay = Calendar.getInstance(); + birthDay.setTimeInMillis(birthDate.getTime()); + Calendar regDay = Calendar.getInstance(); + regDay.setTimeInMillis(tglRegistrasi.getTime()); + years = regDay.get(1) - birthDay.get(1); + int currMonth = regDay.get(2) + 1; + int birthMonth = birthDay.get(2) + 1; + months = currMonth - birthMonth; + if (months < 0) { + --years; + months = 12 - birthMonth + currMonth; + if (regDay.get(5) < birthDay.get(5)) { + --months; + } + } else if (months == 0 && regDay.get(5) < birthDay.get(5)) { + --years; + months = 11; + } + + if (regDay.get(5) > birthDay.get(5)) { + days = regDay.get(5) - birthDay.get(5); + } else if (regDay.get(5) < birthDay.get(5)) { + int today = regDay.get(5); + regDay.add(2, -1); + days = regDay.getActualMaximum(5) - birthDay.get(5) + today; + } else { + days = 0; + if (months == 12) { + ++years; + months = 0; + } + } + } catch (Exception var10) { + } + + return new Age(days, months, years); + } +} diff --git a/src/main/java/com/reporting/Utility/Constants.java b/src/main/java/com/reporting/Utility/Constants.java new file mode 100644 index 0000000..3970cd5 --- /dev/null +++ b/src/main/java/com/reporting/Utility/Constants.java @@ -0,0 +1,42 @@ +package com.reporting.Utility; + +public class Constants { + public static final long ACCESS_TOKEN_VALIDITY_SECONDS = 18000L; + public static final String SIGNING_KEY = "x1y2z399"; + public static final String TOKEN_PREFIX = ""; + public static final String HEADER_STRING = "Authorization"; + public static final boolean _TRUE = true; + public static final boolean _FALSE = false; + + public Constants() { + } + + public static final class ConnDb1 { + public static final String poolName = "PoolReporting1"; + public static final String typeDriver = "com.zaxxer.hikari.HikariDataSource"; + public static final String driverClassName = "org.postgresql.Driver"; + public static final String urlDriver = "jdbc:postgresql://172.16.88.8:5432/rsab_hk_production"; + public static final String userName = "postgres"; + public static final String password = "root"; + public static final String testQuery = "SELECT 1"; + public static final int maxTimeOut = 100000; + public static final int maxLifetime = 60000; + public static final int minIdle = 5; + public static final int idleTimeout = 300000; + public static final int maximumPoolSize = 20; + public static final Boolean autoCommit = true; + + public ConnDb1() { + } + } + + public static final class MessageInfo { + public static final String INFO_MESSAGE = "INFO_MESSAGE"; + public static final String WARNING_MESSAGE = "WARNING_MESSAGE"; + public static final String ERROR_MESSAGE = "ERROR_MESSAGE"; + public static final String EXCEPTION_MESSAGE = "EXCEPTION_MESSAGE"; + + public MessageInfo() { + } + } +} diff --git a/src/main/java/com/reporting/Utility/DatabaseUtility.java b/src/main/java/com/reporting/Utility/DatabaseUtility.java new file mode 100644 index 0000000..aa04261 --- /dev/null +++ b/src/main/java/com/reporting/Utility/DatabaseUtility.java @@ -0,0 +1,91 @@ +package com.reporting.Utility; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class DatabaseUtility { + static final Log LOG = LogFactory.getLog(DatabaseUtility.class); + + public DatabaseUtility() { + } + + public static void clear(Connection conn, PreparedStatement pstmt, ResultSet rs) throws Exception { + try { + if (pstmt != null) { + if (rs != null) { + rs.close(); + rs = null; + } + + pstmt.close(); + pstmt = null; + } + + if (conn != null) { + conn.close(); + conn = null; + } + + } catch (Exception var4) { + LOG.error("Exception at clear(conn, pstmt, rs)"); + LOG.error(DatabaseUtility.class, var4); + throw var4; + } + } + + public static void clear(Connection conn, PreparedStatement pstmt) throws Exception { + try { + if (pstmt != null) { + pstmt.close(); + pstmt = null; + } + + if (conn != null) { + conn.close(); + conn = null; + } + + } catch (Exception var3) { + LOG.error("Exception at clear(conn, pstmt)"); + LOG.error(DatabaseUtility.class, var3); + throw var3; + } + } + + public static void clear(PreparedStatement pstmt, ResultSet rs) throws Exception { + try { + if (pstmt != null) { + if (rs != null) { + rs.close(); + rs = null; + } + + pstmt.close(); + pstmt = null; + } + + } catch (Exception var3) { + LOG.error("Exception at clear(pstmt, rs)"); + LOG.error(DatabaseUtility.class, var3); + throw var3; + } + } + + public static void clear(PreparedStatement pstmt) throws Exception { + try { + if (pstmt != null) { + pstmt.close(); + pstmt = null; + } + + } catch (Exception var2) { + LOG.error("Exception at clear(pstmt)"); + LOG.error(DatabaseUtility.class, var2); + throw var2; + } + } +} diff --git a/src/main/java/com/reporting/config/DbConfig.java b/src/main/java/com/reporting/config/DbConfig.java new file mode 100644 index 0000000..9bb7685 --- /dev/null +++ b/src/main/java/com/reporting/config/DbConfig.java @@ -0,0 +1,57 @@ +package com.reporting.config; + +import com.reporting.Utility.Constants.ConnDb1; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +@Configuration +public class DbConfig { + static final Log LOG = LogFactory.getLog(DbConfig.class); + + public DbConfig() { + } + + @Primary + @Bean( + name = {"db"} + ) + public DataSource dataSource1() { + HikariConfig config = null; + + try { + config = new HikariConfig(); + config.setPoolName("PoolReporting1"); + config.setDriverClassName("org.postgresql.Driver"); + config.setConnectionTestQuery("SELECT 1"); + config.setJdbcUrl("jdbc:postgresql://172.16.88.8:5432/rsab_hk_production"); + config.setUsername("postgres"); + config.setPassword("root"); + config.setMinimumIdle(5); + config.setIdleTimeout(300000L); + config.setMaximumPoolSize(20); + config.setConnectionTimeout(100000L); + config.setAutoCommit(ConnDb1.autoCommit); + } catch (Exception var3) { + System.out.println(var3.getMessage()); + } + + return new HikariDataSource(config); + } + + @Bean( + name = {"jdbcTemplate"} + ) + public JdbcTemplate jdbcTemplate1(@Qualifier("db") DataSource ds) { + return new JdbcTemplate(ds); + } +} diff --git a/src/main/java/com/reporting/controller/ReportingController.java b/src/main/java/com/reporting/controller/ReportingController.java new file mode 100644 index 0000000..d486085 --- /dev/null +++ b/src/main/java/com/reporting/controller/ReportingController.java @@ -0,0 +1,334 @@ +package com.reporting.controller; + +import com.reporting.model.Pasien; +import com.reporting.service.ReportingService; +import com.reporting.service.ResepService; +import com.reporting.service.VerifikasiTagihanSupplierServices; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import net.sf.jasperreports.engine.JasperExportManager; +import net.sf.jasperreports.engine.JasperPrint; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +@RestController +@RequestMapping({"/service-reporting"}) +public class ReportingController { + static final Log LOG = LogFactory.getLog(ReportingController.class); + @Autowired + private ReportingService reportingService; + @Autowired + private ResepService resepService; + @Autowired + private VerifikasiTagihanSupplierServices verifikasiTagihanSupplierServices; + + public ReportingController() { + } + + @RequestMapping( + value = {"/label-gizi/{noregistrasi}"}, + method = {RequestMethod.GET} + ) + public void exportLabelGiziTest(ModelAndView mv, @PathVariable("noregistrasi") String noregistrasi, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.exportPdfLabelGizi(noregistrasi); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/permintaan-makanan"}, + method = {RequestMethod.GET} + ) + public void exportPermintaanMakanan(@RequestParam("idRu") Integer idRu, @RequestParam("tglAwal") String tglAwal, @RequestParam("tglAkhir") String tglAkhir, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.exportPdfPermintaanMakanan(idRu, tglAwal, tglAkhir); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/rekap-makanan"}, + method = {RequestMethod.GET} + ) + public void exportRekapMakanan(@RequestParam("idRu") Integer idRu, @RequestParam("tglAwal") String tglAwal, @RequestParam("tglAkhir") String tglAkhir, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.exportPdfRekapMakanan(idRu, tglAwal, tglAkhir); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/kartu-pasien/{nocm}"}, + method = {RequestMethod.GET} + ) + public void exportKartuPasien(ModelAndView mv, @PathVariable("nocm") String nocm, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printReportKartuPasien(nocm); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/resep-dokter"}, + method = {RequestMethod.GET} + ) + public Map getResepDokter(@RequestParam("strukOrder") String strukOrder) { + Map map = new HashMap(); + + try { + Pasien pasien = this.resepService.getPasien(strukOrder); + map.put("data", pasien); + } catch (Exception var4) { + var4.printStackTrace(); + } + + return map; + } + + @RequestMapping( + value = {"/resep-pasien/{strukOrder}"}, + method = {RequestMethod.GET} + ) + public void exportResepPasien(ModelAndView mv, @PathVariable("strukOrder") String strukOrder, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.resepService.exportPdfResepPasien(strukOrder); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-bedah/{noregis}"}, + method = {RequestMethod.GET} + ) + public void exportLapBedahPasien(ModelAndView mv, @PathVariable("noregis") String noregis, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printReportLapBedah(noregis); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-konsul/{noorder}"}, + method = {RequestMethod.GET} + ) + public void exportKonsulPasien(ModelAndView mv, @PathVariable("noorder") String noorder, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printReportKonsul(noorder); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-lab/{noorder}"}, + method = {RequestMethod.GET} + ) + public void showPDF(@PathVariable("noorder") String noorder, HttpServletResponse response) { + InputStream inputStream = null; + + try { + String path = "/mnt/lis/" + noorder + ".pdf"; + File file = new File(path); + inputStream = new FileInputStream(file); + + int nRead; + while ((nRead = inputStream.read()) != -1) { + response.getWriter().write(nRead); + } + } catch (Exception var15) { + System.out.println(var15.getMessage()); + } finally { + try { + inputStream.close(); + } catch (Exception var14) { + } + + } + + } + + @RequestMapping( + value = {"/cetak-sep/{norec_pd}"}, + method = {RequestMethod.GET} + ) + public void showPDFSEP(@PathVariable("norec_pd") String norec_pd, HttpServletResponse response) { + InputStream inputStream = null; + + try { + String path = "/home/admindev/reporting/" + norec_pd + ".pdf"; + File file = new File(path); + inputStream = new FileInputStream(file); + + int nRead; + while ((nRead = inputStream.read()) != -1) { + response.getWriter().write(nRead); + } + } catch (Exception var15) { + System.out.println(var15.getMessage()); + } finally { + try { + inputStream.close(); + } catch (Exception var14) { + } + + } + + } + + @RequestMapping( + value = {"/lap-upk/{nores}"}, + method = {RequestMethod.GET} + ) + public void exportUpk(ModelAndView mv, @PathVariable("nores") String nores, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printReportUpk(nores); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-verifikasi-tagihan-supplier/{noverifikasifk}"}, + method = {RequestMethod.GET} + ) + public void exportVerifikasiTagihanSupplier(ModelAndView mv, @PathVariable("noverifikasifk") String noverifikasifk, HttpServletResponse response, HttpServletRequest req) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.verifikasiTagihanSupplierServices.generateVerifikasiTagihanPdf(noverifikasifk); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-verifikasi-pembayaran-umum/{noverifikasifk}"}, + method = {RequestMethod.GET} + ) + public void exportVerifikasiPembayaranUmum(ModelAndView mv, @PathVariable("noverifikasifk") String noverifikasifk, HttpServletResponse response, HttpServletRequest req) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.verifikasiTagihanSupplierServices.generateVerifikasiPembayaranUmumPdf(noverifikasifk); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-rekap-harian-by-dept/{deptId}/{tglAwal}/{tglAkhir}"}, + method = {RequestMethod.GET} + ) + public void exportRekapPHarian(ModelAndView mv, @PathVariable("deptId") int deptId, @PathVariable("tglAwal") String tglAwal, @PathVariable("tglAkhir") String tglAkhir, HttpServletResponse response, HttpServletRequest req) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfLapRekapHarianByDept(deptId, tglAwal, tglAkhir); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-rekap-harian-by-ruangan/{deptId}/{ruangId}/{tglAwal}/{tglAkhir}"}, + method = {RequestMethod.GET} + ) + public void exportRekapPHarian(ModelAndView mv, @PathVariable("deptId") int deptId, @PathVariable("ruangId") int ruangId, @PathVariable("tglAwal") String tglAwal, @PathVariable("tglAkhir") String tglAkhir, HttpServletResponse response, HttpServletRequest req) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfLapRekapHarianByRuanganId(deptId, ruangId, tglAwal, tglAkhir); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-pengkajian-awal-by-nores/{nores}"}, + method = {RequestMethod.GET} + ) + public void exportPengkajianAwalbyNoRes(ModelAndView mv, @PathVariable("nores") String nores, HttpServletRequest req, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfPengkajianAwalByNoRes(nores); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-rekap-penjamin"}, + method = {RequestMethod.GET} + ) + public void exportRekapPenjamin(ModelAndView mv, @RequestParam("tglAwal") String tglAwal, @RequestParam("tglAkhir") String tglAkhir, @RequestParam("idDept") int idDept, @RequestParam("kelompokPasien") int kelompokPasien, HttpServletRequest req, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfRekapPenjamin(tglAwal, tglAkhir, idDept, kelompokPasien); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-rekap-penjamin-by-institusi"}, + method = {RequestMethod.GET} + ) + public void exportRekapPenjaminByInstitusiPasien(ModelAndView mv, @RequestParam("tglAwal") String tglAwal, @RequestParam("tglAkhir") String tglAkhir, @RequestParam("idDept") int idDept, @RequestParam("kelompokPasien") int kelompokPasien, @RequestParam("institusiPasien") int institusiPasien, HttpServletRequest req, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfRekapPenjaminByInstitusiPasien(tglAwal, tglAkhir, idDept, kelompokPasien, institusiPasien); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-rekap-penjamin-by-ranap"}, + method = {RequestMethod.GET} + ) + public void exportRekapPenjaminByRanap(ModelAndView mv, @RequestParam("tglAwal") String tglAwal, @RequestParam("tglAkhir") String tglAkhir, @RequestParam("idDept") int idDept, @RequestParam("kelompokPasien") int kelompokPasien, HttpServletRequest req, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfRekapPenjaminByRanap(tglAwal, tglAkhir, idDept, kelompokPasien); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-permintaan-makanan"}, + method = {RequestMethod.GET} + ) + public void exportPermintaanMakanan(ModelAndView mv, @RequestParam("idRu") int idRu, @RequestParam("tglAwal") String tglAwal, @RequestParam("tglAkhir") String tglAkhir, HttpServletRequest req, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfPermintaanMakanan(idRu, tglAwal, tglAkhir); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-rekap-makanan"}, + method = {RequestMethod.GET} + ) + public void exportRekapMakanan(ModelAndView mv, @RequestParam("idRu") int idRu, @RequestParam("tglAwal") String tglAwal, @RequestParam("tglAkhir") String tglAkhir, HttpServletRequest req, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.printPdfRekapMakanan(idRu, tglAwal, tglAkhir); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/gelang-pasien/{noregistrasi}"}, + method = {RequestMethod.GET} + ) + public void exportLabelGelangPasien(ModelAndView mv, @PathVariable("noregistrasi") String noregistrasi, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.exportPdfGelangPasien(noregistrasi); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } + + @RequestMapping( + value = {"/lap-resume-medis/{norec}"}, + method = {RequestMethod.GET} + ) + public void printLapResumeMedis(ModelAndView mv, @PathVariable("norec") String norec, HttpServletResponse response) throws Exception { + JasperPrint jasperPrint = null; + jasperPrint = this.reportingService.exportPdfResumeMedis(norec); + response.setContentType("application/pdf"); + JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); + } +} diff --git a/src/main/java/com/reporting/controller/UserController.java b/src/main/java/com/reporting/controller/UserController.java new file mode 100644 index 0000000..f6ffba5 --- /dev/null +++ b/src/main/java/com/reporting/controller/UserController.java @@ -0,0 +1,104 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.reporting.controller; + +import com.reporting.model.InfoResponse; +import com.reporting.model.Printer; +import com.reporting.model.PrinterForm; +import com.reporting.service.UserService; + +import java.io.IOException; +import java.io.OutputStream; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import javax.print.DocFlavor; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.attribute.AttributeSet; +import javax.servlet.http.HttpServletResponse; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperExportManager; +import net.sf.jasperreports.engine.JasperPrint; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +@Controller +@RequestMapping({"/"}) +public class UserController { + @Autowired + private UserService userService; + + public UserController() { + } + + @RequestMapping( + value = {"/", ""}, + method = {RequestMethod.GET} + ) + public ModelAndView home() { + ModelAndView model = new ModelAndView(); + PrinterForm printerForm = new PrinterForm(); + PrintService[] services = PrintServiceLookup.lookupPrintServices((DocFlavor) null, (AttributeSet) null); + List printers = new ArrayList(); + PrintService[] var5 = services; + int var6 = services.length; + + for (int var7 = 0; var7 < var6; ++var7) { + PrintService service = var5[var7]; + Printer printer = new Printer(); + printer.setPrinterName(service.getName()); + printers.add(printer); + } + + model.addObject("listPrinters", printers); + model.addObject("printerForm", printerForm); + model.setViewName("home"); + return model; + } + + @RequestMapping( + value = {"/export"}, + method = {RequestMethod.POST} + ) + public void export(ModelAndView model, HttpServletResponse response) throws IOException, JRException, SQLException { + JasperPrint jasperPrint = null; + response.setContentType("application/x-download"); + response.setHeader("Content-Disposition", String.format("attachment; filename=\"users.pdf\"")); + OutputStream out = response.getOutputStream(); + jasperPrint = this.userService.exportPdfFile(); + JasperExportManager.exportReportToPdfStream(jasperPrint, out); + } + + @RequestMapping( + value = {"/printDirect"}, + method = {RequestMethod.POST} + ) + public void printDirect(@ModelAttribute("printerForm") PrinterForm printerForm, ModelAndView model) throws IOException, JRException, SQLException { + JasperPrint jasperPrint = null; + jasperPrint = this.userService.exportPdfFile(); + this.userService.printReport(jasperPrint, printerForm.getPrinterName()); + } + + @RequestMapping( + value = {"/printDirectDefault"}, + method = {RequestMethod.POST} + ) + public void printDirectDefaultPrinter() throws SQLException, JRException, IOException { + JasperPrint jasperPrint = null; + InfoResponse infoResponse = new InfoResponse(); + PrintService service = PrintServiceLookup.lookupDefaultPrintService(); + String printServiceName = service.getName(); + jasperPrint = this.userService.exportPdfFile(); + this.userService.printReport(jasperPrint, printServiceName); + infoResponse.setInfo("Cetak Data Berhasil"); + } +} diff --git a/src/main/java/com/reporting/dao/LabelGizi.java b/src/main/java/com/reporting/dao/LabelGizi.java new file mode 100644 index 0000000..cfa2d03 --- /dev/null +++ b/src/main/java/com/reporting/dao/LabelGizi.java @@ -0,0 +1,43 @@ +package com.reporting.dao; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.io.ResourceLoader; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@Repository +public class LabelGizi { + @Autowired + @Qualifier("jdbcTemplate") + private JdbcTemplate jdbcTemplate; + @Autowired + private ResourceLoader resourceLoader; + + public LabelGizi() { + } + + public JasperPrint exportPdfFile() throws SQLException, JRException, IOException { + Connection conn = this.jdbcTemplate.getDataSource().getConnection(); + String path = this.resourceLoader.getResource("classpath:rpt_labelgizi.jrxml").getURI().getPath(); + JasperReport jasperReport = JasperCompileManager.compileReport(path); + String noregistrasi = "22fa0dd0-43c1-11e9-961f-8d877e74"; + Map parameters = new HashMap(); + parameters.put("noregistrasi", noregistrasi); + JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, conn); + return print; + } +} diff --git a/src/main/java/com/reporting/dao/ReportingDao.java b/src/main/java/com/reporting/dao/ReportingDao.java new file mode 100644 index 0000000..2d306eb --- /dev/null +++ b/src/main/java/com/reporting/dao/ReportingDao.java @@ -0,0 +1,566 @@ +package com.reporting.dao; + +import java.sql.Connection; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import javax.print.DocFlavor; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.attribute.AttributeSet; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.HashPrintServiceAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.PrintServiceAttributeSet; +import javax.print.attribute.standard.MediaSizeName; +import javax.print.attribute.standard.OrientationRequested; +import javax.print.attribute.standard.PrinterName; +import javax.sql.DataSource; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.export.JRPrintServiceExporter; +import net.sf.jasperreports.engine.type.OrientationEnum; +import net.sf.jasperreports.export.SimpleExporterInput; +import net.sf.jasperreports.export.SimplePrintServiceExporterConfiguration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@Repository +public class ReportingDao { + private static final Log LOG = LogFactory.getLog(ReportingDao.class); + @Autowired + @Qualifier("db") + private DataSource ds1; + @Qualifier("jdbcTemplate") + @Autowired + private JdbcTemplate jdbcTemplate1; + + public ReportingDao() { + } + + public void printReport(JasperPrint jasperPrint, String selectedPrinter) throws JRException { + PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet(); + printRequestAttributeSet.add(MediaSizeName.ISO_A4); + if (jasperPrint.getOrientationValue() == OrientationEnum.LANDSCAPE) { + printRequestAttributeSet.add(OrientationRequested.LANDSCAPE); + } else { + printRequestAttributeSet.add(OrientationRequested.PORTRAIT); + } + + PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet(); + printServiceAttributeSet.add(new PrinterName(selectedPrinter, (Locale) null)); + JRPrintServiceExporter exporter = new JRPrintServiceExporter(); + SimplePrintServiceExporterConfiguration configuration = new SimplePrintServiceExporterConfiguration(); + configuration.setPrintRequestAttributeSet(printRequestAttributeSet); + configuration.setPrintServiceAttributeSet(printServiceAttributeSet); + configuration.setDisplayPageDialog(false); + configuration.setDisplayPrintDialog(false); + exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); + exporter.setConfiguration(configuration); + PrintService[] services = PrintServiceLookup.lookupPrintServices((DocFlavor) null, (AttributeSet) null); + PrintService selectedService = null; + if (services.length != 0 || services != null) { + PrintService[] var9 = services; + int var10 = services.length; + + for (int var11 = 0; var11 < var10; ++var11) { + PrintService service = var9[var11]; + String existingPrinter = service.getName(); + if (existingPrinter.equals(selectedPrinter)) { + selectedService = service; + break; + } + } + } + + if (selectedService != null) { + exporter.exportReport(); + } else { + System.out.println("You did not set the printer!"); + } + + } + + public JasperPrint exportPdfLabelGizi(String noregistrasi) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/rpt_labelgizi.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("noregistrasi", noregistrasi); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfLabelGizi"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfPermintaanMakanan(Integer idRu, String tglAwal, String tglAkhir) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/pl_permintaan_makan.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("idRu", idRu); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var17) { + LOG.error("Exception at exportPdfPermintaanMakanan"); + LOG.error(ReportingDao.class, var17); + } finally { + try { + conn.close(); + } catch (Exception var16) { + } + + } + + return print; + } + + public JasperPrint exportPdfRekapMakanan(Integer idRu, String tglAwal, String tglAkhir) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/pl_rekap_makan.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("idRu", idRu); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var17) { + LOG.error("Exception at exportPdfRekapMakanan"); + LOG.error(ReportingDao.class, var17); + } finally { + try { + conn.close(); + } catch (Exception var16) { + } + + } + + return print; + } + + public JasperPrint exportPdfKartuPasien(String nocm) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/rpt_kartupasien.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("nocm", nocm); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfLabelGizi"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfLapBedah(String noregis) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/rpt_lapbedah.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("noregis", noregis); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfResepPasien"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfKonsul(String noorder) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/rpt_konsul.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("noorder", noorder); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfResepPasien"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfUpk(String nores) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/rpt_upk.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("nores", nores); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfUpk"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfVerifikasiTagihan(String noverifikasifk) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/BuktiKas.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("noverifikasifk", noverifikasifk); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfVerifikasiTagihan"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfLapRekapHarianByDept(int deptId, String tglAwal, String tglAkhir) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/PL_LapRekapPHarian.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("deptId", deptId); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var17) { + LOG.error("Exception at exportPdfLapRekapHarianByDept"); + LOG.error(ReportingDao.class, var17); + } finally { + try { + conn.close(); + } catch (Exception var16) { + } + + } + + return print; + } + + public JasperPrint exportPdfLapRekapHarianByRuanganId(int deptId, int ruangId, String tglAwal, String tglAkhir) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/PL_LapRekapPHarianV2.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("deptId", deptId); + parameters.put("ruangId", ruangId); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var18) { + LOG.error("Exception at exportPdfLapRekapHarianByRuanganId"); + LOG.error(ReportingDao.class, var18); + } finally { + try { + conn.close(); + } catch (Exception var17) { + } + + } + + return print; + } + + public JasperPrint exportPdfPengkajianAwalByNoRes(String nores) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/PL_PengkajianAwal.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("nores", nores); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfPengkajianAwalByNoRes"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfRekapPenjamin(String tglAwal, String tglAkhir, int idDept, int kelompokPasien) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/PL_rekap_penjamin.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + parameters.put("idDept", idDept); + parameters.put("kelompokPasien", kelompokPasien); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var18) { + LOG.error("Exception at exportPdfPengkajianAwalRekapPenjamin"); + LOG.error(ReportingDao.class, var18); + } finally { + try { + conn.close(); + } catch (Exception var17) { + } + + } + + return print; + } + + public JasperPrint exportPdfRekapPenjaminByInstitusiPasien(String tglAwal, String tglAkhir, int idDept, int kelompokPasien, int institusiPasien) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/PL_rekap_penjamin.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + parameters.put("idDept", idDept); + parameters.put("kelompokPasien", kelompokPasien); + parameters.put("institusiPasien", institusiPasien); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var19) { + LOG.error("Exception at exportPdfPengkajianAwalRekapPenjaminByInstitusiPasien"); + LOG.error(ReportingDao.class, var19); + } finally { + try { + conn.close(); + } catch (Exception var18) { + } + + } + + return print; + } + + public JasperPrint exportPdfRekapPenjaminByRanap(String tglAwal, String tglAkhir, int idDept, int kelompokPasien) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/PL_rekap_penjaminRanap.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + parameters.put("idDept", idDept); + parameters.put("kelompokPasien", kelompokPasien); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var18) { + LOG.error("Exception at exportPdfRekapPenjaminByRanap"); + LOG.error(ReportingDao.class, var18); + } finally { + try { + conn.close(); + } catch (Exception var17) { + } + + } + + return print; + } + + public JasperPrint exportPdfPermintaanMakanan(int idRu, String tglAwal, String tglAkhir) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/pl_permintaan_makan.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("idRu", idRu); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var17) { + LOG.error("Exception at exportPdfPermintaanMakanan"); + LOG.error(ReportingDao.class, var17); + } finally { + try { + conn.close(); + } catch (Exception var16) { + } + + } + + return print; + } + + public JasperPrint exportPdfRekapMakanan(int idRu, String tglAwal, String tglAkhir) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/pl_rekap_makan.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("idRu", idRu); + parameters.put("tglAwal", tglAwal); + parameters.put("tglAkhir", tglAkhir); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var17) { + LOG.error("Exception at exportPdfRekapMakanan"); + LOG.error(ReportingDao.class, var17); + } finally { + try { + conn.close(); + } catch (Exception var16) { + } + + } + + return print; + } + + public JasperPrint exportPdfGelangPasien(String noregistrasi) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/gelang_pasien.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("noregistrasi", noregistrasi); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfGelangPasien"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } + + public JasperPrint exportPdfResumeMedis(String norec) throws Exception { + JasperPrint print = null; + Connection conn = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/ResumeMedis.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + parameters.put("norec", norec); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var15) { + LOG.error("Exception at exportPdfResumeMedis"); + LOG.error(ReportingDao.class, var15); + } finally { + try { + conn.close(); + } catch (Exception var14) { + } + + } + + return print; + } +} diff --git a/src/main/java/com/reporting/dao/UserDaoImpl.java b/src/main/java/com/reporting/dao/UserDaoImpl.java new file mode 100644 index 0000000..a61a72f --- /dev/null +++ b/src/main/java/com/reporting/dao/UserDaoImpl.java @@ -0,0 +1,100 @@ +package com.reporting.dao; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import javax.print.DocFlavor; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.attribute.AttributeSet; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.HashPrintServiceAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.PrintServiceAttributeSet; +import javax.print.attribute.standard.MediaSizeName; +import javax.print.attribute.standard.OrientationRequested; +import javax.print.attribute.standard.PrinterName; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.export.JRPrintServiceExporter; +import net.sf.jasperreports.engine.type.OrientationEnum; +import net.sf.jasperreports.export.SimpleExporterInput; +import net.sf.jasperreports.export.SimplePrintServiceExporterConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.io.ResourceLoader; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@Repository +public class UserDaoImpl { + @Autowired + @Qualifier("jdbcTemplate") + private JdbcTemplate jdbcTemplate; + @Autowired + private ResourceLoader resourceLoader; + + public UserDaoImpl() { + } + + public JasperPrint exportPdfFile() throws SQLException, JRException, IOException { + Connection conn = this.jdbcTemplate.getDataSource().getConnection(); + String path = this.resourceLoader.getResource("classpath:rpt_users.jrxml").getURI().getPath(); + JasperReport jasperReport = JasperCompileManager.compileReport(path); + Map parameters = new HashMap(); + JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters, conn); + return print; + } + + public void printReport(JasperPrint jasperPrint, String selectedPrinter) throws JRException { + PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet(); + printRequestAttributeSet.add(MediaSizeName.ISO_A4); + if (jasperPrint.getOrientationValue() == OrientationEnum.LANDSCAPE) { + printRequestAttributeSet.add(OrientationRequested.LANDSCAPE); + } else { + printRequestAttributeSet.add(OrientationRequested.PORTRAIT); + } + + PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet(); + printServiceAttributeSet.add(new PrinterName(selectedPrinter, (Locale) null)); + JRPrintServiceExporter exporter = new JRPrintServiceExporter(); + SimplePrintServiceExporterConfiguration configuration = new SimplePrintServiceExporterConfiguration(); + configuration.setPrintRequestAttributeSet(printRequestAttributeSet); + configuration.setPrintServiceAttributeSet(printServiceAttributeSet); + configuration.setDisplayPageDialog(false); + configuration.setDisplayPrintDialog(false); + exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); + exporter.setConfiguration(configuration); + PrintService[] services = PrintServiceLookup.lookupPrintServices((DocFlavor) null, (AttributeSet) null); + PrintService selectedService = null; + if (services.length != 0 || services != null) { + PrintService[] var9 = services; + int var10 = services.length; + + for (int var11 = 0; var11 < var10; ++var11) { + PrintService service = var9[var11]; + String existingPrinter = service.getName(); + if (existingPrinter.equals(selectedPrinter)) { + selectedService = service; + break; + } + } + } + + if (selectedService != null) { + exporter.exportReport(); + } else { + System.out.println("You did not set the printer!"); + } + + } +} diff --git a/src/main/java/com/reporting/model/ApiResponse.java b/src/main/java/com/reporting/model/ApiResponse.java new file mode 100644 index 0000000..6d6f8f8 --- /dev/null +++ b/src/main/java/com/reporting/model/ApiResponse.java @@ -0,0 +1,37 @@ +package com.reporting.model; + +public class ApiResponse { + private int status; + private String message; + private Object result; + + public ApiResponse(int status, String message, Object result) { + this.status = status; + this.message = message; + this.result = result; + } + + public int getStatus() { + return this.status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getResult() { + return this.result; + } + + public void setResult(Object result) { + this.result = result; + } +} diff --git a/src/main/java/com/reporting/model/InfoResponse.java b/src/main/java/com/reporting/model/InfoResponse.java new file mode 100644 index 0000000..5c3a497 --- /dev/null +++ b/src/main/java/com/reporting/model/InfoResponse.java @@ -0,0 +1,16 @@ +package com.reporting.model; + +public class InfoResponse { + private String info; + + public InfoResponse() { + } + + public String getInfo() { + return this.info; + } + + public void setInfo(String info) { + this.info = info; + } +} diff --git a/src/main/java/com/reporting/model/Pasien.java b/src/main/java/com/reporting/model/Pasien.java new file mode 100644 index 0000000..a095a89 --- /dev/null +++ b/src/main/java/com/reporting/model/Pasien.java @@ -0,0 +1,155 @@ +package com.reporting.model; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.List; + +public class Pasien implements Serializable { + private String strukOrder; + private String namaPasien; + private String noRegistrasi; + private String jenisKelamin; + private String noCm; + private String tglLahir; + private String namaDokter; + private Timestamp tglInput; + private String tglOrder; + private String namaRuangan; + private String kamar; + private String alergi; + private List listResep; + private String umurPasien; + private String beratBadan; + private String riwayatAlergi; + + public Pasien() { + } + + public String getStrukOrder() { + return this.strukOrder; + } + + public void setStrukOrder(String strukOrder) { + this.strukOrder = strukOrder; + } + + public String getNamaPasien() { + return this.namaPasien; + } + + public void setNamaPasien(String namaPasien) { + this.namaPasien = namaPasien; + } + + public String getNoRegistrasi() { + return this.noRegistrasi; + } + + public void setNoRegistrasi(String noRegistrasi) { + this.noRegistrasi = noRegistrasi; + } + + public String getJenisKelamin() { + return this.jenisKelamin; + } + + public void setJenisKelamin(String jenisKelamin) { + this.jenisKelamin = jenisKelamin; + } + + public String getNoCm() { + return this.noCm; + } + + public void setNoCm(String noCm) { + this.noCm = noCm; + } + + public String getNamaDokter() { + return this.namaDokter; + } + + public void setNamaDokter(String namaDokter) { + this.namaDokter = namaDokter; + } + + public Timestamp getTglInput() { + return this.tglInput; + } + + public void setTglInput(Timestamp tglInput) { + this.tglInput = tglInput; + } + + public String getNamaRuangan() { + return this.namaRuangan; + } + + public void setNamaRuangan(String namaRuangan) { + this.namaRuangan = namaRuangan; + } + + public String getKamar() { + return this.kamar; + } + + public void setKamar(String kamar) { + this.kamar = kamar; + } + + public String getAlergi() { + return this.alergi; + } + + public void setAlergi(String alergi) { + this.alergi = alergi; + } + + public String getTglOrder() { + return this.tglOrder; + } + + public void setTglOrder(String tglOrder) { + this.tglOrder = tglOrder; + } + + public String getTglLahir() { + return this.tglLahir; + } + + public void setTglLahir(String tglLahir) { + this.tglLahir = tglLahir; + } + + public List getListResep() { + return this.listResep; + } + + public void setListResep(List listResep) { + this.listResep = listResep; + } + + public String getUmurPasien() { + return this.umurPasien; + } + + public void setUmurPasien(String umurPasien) { + this.umurPasien = umurPasien; + } + + public String getBeratBadan() { + return this.beratBadan; + } + + public void setBeratBadan(String beratBadan) { + this.beratBadan = beratBadan; + } + + public String getRiwayatAlergi() { + return this.riwayatAlergi; + } + + public void setRiwayatAlergi(String riwayatAlergi) { + this.riwayatAlergi = riwayatAlergi; + } +} diff --git a/src/main/java/com/reporting/model/Printer.java b/src/main/java/com/reporting/model/Printer.java new file mode 100644 index 0000000..9470dd9 --- /dev/null +++ b/src/main/java/com/reporting/model/Printer.java @@ -0,0 +1,16 @@ +package com.reporting.model; + +public class Printer { + private String printerName; + + public Printer() { + } + + public String getPrinterName() { + return this.printerName; + } + + public void setPrinterName(String printerName) { + this.printerName = printerName; + } +} diff --git a/src/main/java/com/reporting/model/PrinterForm.java b/src/main/java/com/reporting/model/PrinterForm.java new file mode 100644 index 0000000..e74ea2c --- /dev/null +++ b/src/main/java/com/reporting/model/PrinterForm.java @@ -0,0 +1,16 @@ +package com.reporting.model; + +public class PrinterForm { + private String printerName; + + public PrinterForm() { + } + + public String getPrinterName() { + return this.printerName; + } + + public void setPrinterName(String printerName) { + this.printerName = printerName; + } +} diff --git a/src/main/java/com/reporting/model/Resep.java b/src/main/java/com/reporting/model/Resep.java new file mode 100644 index 0000000..3b7d9ae --- /dev/null +++ b/src/main/java/com/reporting/model/Resep.java @@ -0,0 +1,64 @@ +package com.reporting.model; + +import java.io.Serializable; +import java.util.List; + +public class Resep implements Serializable { + private String resep; + private String strukOrderfk; + private String qtyProduk; + private String keteranganPakai; + private String namaObat; + private List resepDetail; + + public Resep() { + } + + public String getResep() { + return this.resep; + } + + public void setResep(String resep) { + this.resep = resep; + } + + public String getStrukOrderfk() { + return this.strukOrderfk; + } + + public void setStrukOrderfk(String strukOrderfk) { + this.strukOrderfk = strukOrderfk; + } + + public String getQtyProduk() { + return this.qtyProduk; + } + + public void setQtyProduk(String qtyProduk) { + this.qtyProduk = qtyProduk; + } + + public String getKeteranganPakai() { + return this.keteranganPakai; + } + + public void setKeteranganPakai(String keteranganPakai) { + this.keteranganPakai = keteranganPakai; + } + + public String getNamaObat() { + return this.namaObat; + } + + public void setNamaObat(String namaObat) { + this.namaObat = namaObat; + } + + public List getResepDetail() { + return this.resepDetail; + } + + public void setResepDetail(List resepDetail) { + this.resepDetail = resepDetail; + } +} diff --git a/src/main/java/com/reporting/model/ResepDetail.java b/src/main/java/com/reporting/model/ResepDetail.java new file mode 100644 index 0000000..36b151b --- /dev/null +++ b/src/main/java/com/reporting/model/ResepDetail.java @@ -0,0 +1,45 @@ +package com.reporting.model; + +import java.io.Serializable; + +public class ResepDetail implements Serializable { + private String qtyProduk; + private String keteranganPakai; + private String keteranganLainnya; + private String namaObat; + + public ResepDetail() { + } + + public String getQtyProduk() { + return this.qtyProduk; + } + + public void setQtyProduk(String qtyProduk) { + this.qtyProduk = qtyProduk; + } + + public String getKeteranganPakai() { + return this.keteranganPakai; + } + + public void setKeteranganPakai(String keteranganPakai) { + this.keteranganPakai = keteranganPakai; + } + + public String getKeteranganLainnya() { + return this.keteranganLainnya; + } + + public void setKeteranganLainnya(String keteranganLainnya) { + this.keteranganLainnya = keteranganLainnya; + } + + public String getNamaObat() { + return this.namaObat; + } + + public void setNamaObat(String namaObat) { + this.namaObat = namaObat; + } +} diff --git a/src/main/java/com/reporting/model/VerifikasiTagihanSupplier.java b/src/main/java/com/reporting/model/VerifikasiTagihanSupplier.java new file mode 100644 index 0000000..7ddb8a4 --- /dev/null +++ b/src/main/java/com/reporting/model/VerifikasiTagihanSupplier.java @@ -0,0 +1,144 @@ +package com.reporting.model; + +import java.io.Serializable; + +public class VerifikasiTagihanSupplier implements Serializable { + private String noSpk; + private String noverifikasifk; + private String kodeAnggaran; + private String namaRekanan; + private String keperluan; + private String noVerifikasi; + private Double totalBayar; + private String terbilang; + private String asalproduk; + private String kodeDana; + private String ba; + private String sppb; + private String faktur; + private Double pph; + private String tglSPK; + + public VerifikasiTagihanSupplier() { + } + + public String getNoSpk() { + return this.noSpk; + } + + public void setNoSpk(String noSpk) { + this.noSpk = noSpk; + } + + public String getNoverifikasifk() { + return this.noverifikasifk; + } + + public void setNoverifikasifk(String noverifikasifk) { + this.noverifikasifk = noverifikasifk; + } + + public String getKodeAnggaran() { + return this.kodeAnggaran; + } + + public void setKodeAnggaran(String kodeAnggaran) { + this.kodeAnggaran = kodeAnggaran; + } + + public String getNamaRekanan() { + return this.namaRekanan; + } + + public void setNamaRekanan(String namaRekanan) { + this.namaRekanan = namaRekanan; + } + + public String getKeperluan() { + return this.keperluan; + } + + public void setKeperluan(String keperluan) { + this.keperluan = keperluan; + } + + public String getNoVerifikasi() { + return this.noVerifikasi; + } + + public void setNoVerifikasi(String noVerifikasi) { + this.noVerifikasi = noVerifikasi; + } + + public Double getTotalBayar() { + return this.totalBayar; + } + + public void setTotalBayar(Double totalBayar) { + this.totalBayar = totalBayar; + } + + public String getTerbilang() { + return this.terbilang; + } + + public void setTerbilang(String terbilang) { + this.terbilang = terbilang; + } + + public String getAsalproduk() { + return this.asalproduk; + } + + public void setAsalproduk(String asalproduk) { + this.asalproduk = asalproduk; + } + + public String getKodeDana() { + return this.kodeDana; + } + + public void setKodeDana(String kodeDana) { + this.kodeDana = kodeDana; + } + + public String getBa() { + return this.ba; + } + + public void setBa(String ba) { + this.ba = ba; + } + + public String getSppb() { + return this.sppb; + } + + public void setSppb(String sppb) { + this.sppb = sppb; + } + + public String getFaktur() { + return this.faktur; + } + + public void setFaktur(String faktur) { + this.faktur = faktur; + } + + public Double getPph() { + return this.pph; + } + + public void setPph(Double pph) { + this.pph = pph; + } + + public String getTglSPK() { + return this.tglSPK; + } + + public void setTglSPK(String tglSPK) { + this.tglSPK = tglSPK; + } +} diff --git a/src/main/java/com/reporting/model/VerifikasiTagihanSupplier2.java b/src/main/java/com/reporting/model/VerifikasiTagihanSupplier2.java new file mode 100644 index 0000000..6b548bf --- /dev/null +++ b/src/main/java/com/reporting/model/VerifikasiTagihanSupplier2.java @@ -0,0 +1,135 @@ +package com.reporting.model; + +import java.io.Serializable; + +public class VerifikasiTagihanSupplier2 implements Serializable { + private String noSpk; + private String noverifikasifk; + private String kodeAnggaran; + private String namaRekanan; + private String keperluan; + private String noVerifikasi; + private Double totalBayar; + private String terbilang; + private String asalproduk; + private String kodeDana; + private String ba; + private String sppb; + private String faktur; + private Double pph; + + public VerifikasiTagihanSupplier2() { + } + + public String getNoSpk() { + return this.noSpk; + } + + public void setNoSpk(String noSpk) { + this.noSpk = noSpk; + } + + public String getNoverifikasifk() { + return this.noverifikasifk; + } + + public void setNoverifikasifk(String noverifikasifk) { + this.noverifikasifk = noverifikasifk; + } + + public String getKodeAnggaran() { + return this.kodeAnggaran; + } + + public void setKodeAnggaran(String kodeAnggaran) { + this.kodeAnggaran = kodeAnggaran; + } + + public String getNamaRekanan() { + return this.namaRekanan; + } + + public void setNamaRekanan(String namaRekanan) { + this.namaRekanan = namaRekanan; + } + + public String getKeperluan() { + return this.keperluan; + } + + public void setKeperluan(String keperluan) { + this.keperluan = keperluan; + } + + public String getNoVerifikasi() { + return this.noVerifikasi; + } + + public void setNoVerifikasi(String noVerifikasi) { + this.noVerifikasi = noVerifikasi; + } + + public Double getTotalBayar() { + return this.totalBayar; + } + + public void setTotalBayar(Double totalBayar) { + this.totalBayar = totalBayar; + } + + public String getTerbilang() { + return this.terbilang; + } + + public void setTerbilang(String terbilang) { + this.terbilang = terbilang; + } + + public String getAsalproduk() { + return this.asalproduk; + } + + public void setAsalproduk(String asalproduk) { + this.asalproduk = asalproduk; + } + + public String getKodeDana() { + return this.kodeDana; + } + + public void setKodeDana(String kodeDana) { + this.kodeDana = kodeDana; + } + + public String getBa() { + return this.ba; + } + + public void setBa(String ba) { + this.ba = ba; + } + + public String getSppb() { + return this.sppb; + } + + public void setSppb(String sppb) { + this.sppb = sppb; + } + + public String getFaktur() { + return this.faktur; + } + + public void setFaktur(String faktur) { + this.faktur = faktur; + } + + public Double getPph() { + return this.pph; + } + + public void setPph(Double pph) { + this.pph = pph; + } +} diff --git a/src/main/java/com/reporting/service/LapLabService.java b/src/main/java/com/reporting/service/LapLabService.java new file mode 100644 index 0000000..bfa463c --- /dev/null +++ b/src/main/java/com/reporting/service/LapLabService.java @@ -0,0 +1,52 @@ +package com.reporting.service; + +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.PdfTextExtractor; +import com.reporting.dao.ReportingDao; + +import java.io.File; +import java.io.FileInputStream; +import javax.sql.DataSource; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service("lapLabService") +public class LapLabService { + static final Log LOG = LogFactory.getLog(LapLabService.class); + @Autowired + @Qualifier("db") + private DataSource ds1; + @Qualifier("jdbcTemplate") + @Autowired + private JdbcTemplate jdbcTemplate1; + + public LapLabService() { + } + + public void getLapLab() { + new File("/home/iwankasan/Documents/lap_lab/19057181.pdf"); + FileInputStream fis = null; + + try { + String path = "/home/iwankasan/Documents/lap_lab/19057181.pdf"; + PdfReader pdfReader = new PdfReader(path); + int pages = pdfReader.getNumberOfPages(); + + for (int i = 1; i <= pages; ++i) { + String pageContent = PdfTextExtractor.getTextFromPage(pdfReader, i); + System.out.println("Content on page " + i + ": " + pageContent); + } + + pdfReader.close(); + } catch (Exception var8) { + LOG.error("Exception at LapLabService"); + LOG.error(ReportingDao.class, var8); + } + + } +} diff --git a/src/main/java/com/reporting/service/ReportingService.java b/src/main/java/com/reporting/service/ReportingService.java new file mode 100644 index 0000000..b36e380 --- /dev/null +++ b/src/main/java/com/reporting/service/ReportingService.java @@ -0,0 +1,92 @@ +package com.reporting.service; + +import com.reporting.dao.ReportingDao; +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperPrint; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ReportingService { + @Autowired + private ReportingDao reportingDao; + + public ReportingService() { + } + + public JasperPrint exportPdfLabelGizi(String noregistrasi) throws Exception { + return this.reportingDao.exportPdfLabelGizi(noregistrasi); + } + + public JasperPrint exportPdfPermintaanMakanan(Integer idRu, String tglAwal, String tglAkhir) throws Exception { + return this.reportingDao.exportPdfPermintaanMakanan(idRu, tglAwal, tglAkhir); + } + + public JasperPrint exportPdfRekapMakanan(Integer idRu, String tglAwal, String tglAkhir) throws Exception { + return this.reportingDao.exportPdfRekapMakanan(idRu, tglAwal, tglAkhir); + } + + public void printReport(JasperPrint jasperPrint, String selectedPrinter) throws JRException { + this.reportingDao.printReport(jasperPrint, selectedPrinter); + } + + public JasperPrint printReportKartuPasien(String nocm) throws Exception { + return this.reportingDao.exportPdfKartuPasien(nocm); + } + + public JasperPrint printReportLapBedah(String noregis) throws Exception { + return this.reportingDao.exportPdfLapBedah(noregis); + } + + public JasperPrint printReportKonsul(String noregis) throws Exception { + return this.reportingDao.exportPdfKonsul(noregis); + } + + public JasperPrint printReportUpk(String nores) throws Exception { + return this.reportingDao.exportPdfUpk(nores); + } + + public JasperPrint printReportVerifikasiTagihan(String noverifikasifk) throws Exception { + return this.reportingDao.exportPdfVerifikasiTagihan(noverifikasifk); + } + + public JasperPrint printPdfLapRekapHarianByDept(int deptId, String tglAwal, String tglAkhir) throws Exception { + return this.reportingDao.exportPdfLapRekapHarianByDept(deptId, tglAwal, tglAkhir); + } + + public JasperPrint printPdfLapRekapHarianByRuanganId(int deptId, int ruangId, String tglAwal, String tglAkhir) throws Exception { + return this.reportingDao.exportPdfLapRekapHarianByRuanganId(deptId, ruangId, tglAwal, tglAkhir); + } + + public JasperPrint printPdfPengkajianAwalByNoRes(String nores) throws Exception { + return this.reportingDao.exportPdfPengkajianAwalByNoRes(nores); + } + + public JasperPrint printPdfRekapPenjamin(String tglAwal, String tglAkhir, int idDept, int kelompokPasien) throws Exception { + return this.reportingDao.exportPdfRekapPenjamin(tglAwal, tglAkhir, idDept, kelompokPasien); + } + + public JasperPrint printPdfRekapPenjaminByInstitusiPasien(String tglAwal, String tglAkhir, int idDept, int kelompokPasien, int institusiPasien) throws Exception { + return this.reportingDao.exportPdfRekapPenjaminByInstitusiPasien(tglAwal, tglAkhir, idDept, kelompokPasien, institusiPasien); + } + + public JasperPrint printPdfRekapPenjaminByRanap(String tglAwal, String tglAkhir, int idDept, int kelompokPasien) throws Exception { + return this.reportingDao.exportPdfRekapPenjaminByRanap(tglAwal, tglAkhir, idDept, kelompokPasien); + } + + public JasperPrint printPdfPermintaanMakanan(int idRu, String tglAwal, String tglAkhir) throws Exception { + return this.reportingDao.exportPdfPermintaanMakanan(idRu, tglAwal, tglAkhir); + } + + public JasperPrint printPdfRekapMakanan(int idRu, String tglAwal, String tglAkhir) throws Exception { + return this.reportingDao.exportPdfRekapMakanan(idRu, tglAwal, tglAkhir); + } + + public JasperPrint exportPdfGelangPasien(String noregistrasi) throws Exception { + return this.reportingDao.exportPdfGelangPasien(noregistrasi); + } + + public JasperPrint exportPdfResumeMedis(String norec) throws Exception { + return this.reportingDao.exportPdfResumeMedis(norec); + } +} diff --git a/src/main/java/com/reporting/service/ResepService.java b/src/main/java/com/reporting/service/ResepService.java new file mode 100644 index 0000000..1623ea7 --- /dev/null +++ b/src/main/java/com/reporting/service/ResepService.java @@ -0,0 +1,218 @@ +package com.reporting.service; + +import com.reporting.Utility.Age; +import com.reporting.Utility.AgeCalculator; +import com.reporting.Utility.DatabaseUtility; +import com.reporting.dao.ReportingDao; +import com.reporting.model.Pasien; +import com.reporting.model.Resep; +import com.reporting.model.ResepDetail; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.sql.DataSource; + +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service("resepService") +public class ResepService { + static final Log LOG = LogFactory.getLog(ResepService.class); + @Autowired + @Qualifier("db") + private DataSource ds1; + @Qualifier("jdbcTemplate") + @Autowired + private JdbcTemplate jdbcTemplate1; + + public ResepService() { + } + + public Pasien getPasien(String strukOrder) throws Exception { + Pasien pasien = null; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + String SQL = "select st.norec,st.objectpegawaiorderfk as dokter,to_char(st.tglorder,'dd-MM-yyyy') as tglorder,st.noregistrasifk, \tpg.namalengkap,ru.namaruangan,pd.noregistrasi,pd.tglregistrasi,ps.nocm,ps.namapasien, to_char(ps.tgllahir,'dd-MM-yyyy') as tgllahir,st.noorder,date(ps.tgllahir) as umurPasien, \tst.masalah as riwayatAlergi, st.diagnosis as beratBadan\tfrom strukorder_t st \tleft join pasien_m ps on st.nocmfk=ps.id \tleft join pasiendaftar_t pd on pd.norec=st.noregistrasifk \tleft join pegawai_m pg on pg.id=st.objectpegawaiorderfk \tleft join ruangan_m ru on ru.id=st.objectruanganfk \twhere st.statusenabled=true and st.keteranganorder='Order Farmasi' and st.norec='" + strukOrder + "'"; + + try { + this.ds1 = this.jdbcTemplate1.getDataSource(); + conn = this.ds1.getConnection(); + pstmt = conn.prepareStatement(SQL); + rs = pstmt.executeQuery(); + + while (rs.next()) { + pasien = new Pasien(); + pasien.setNoRegistrasi(rs.getString("noregistrasi")); + pasien.setNamaDokter(rs.getString("namalengkap")); + pasien.setTglOrder(rs.getString("tglorder")); + pasien.setTglLahir(rs.getString("tgllahir")); + pasien.setNamaPasien(rs.getString("namapasien")); + pasien.setNamaRuangan(rs.getString("namaruangan")); + pasien.setNoCm(rs.getString("nocm")); + Age age = AgeCalculator.calculateAge(rs.getDate("umurPasien")); + String umurPasien = Integer.toString(age.getYears()) + " tahun " + Integer.toString(age.getMonths()) + " bulan " + Integer.toString(age.getDays()) + " hari"; + pasien.setUmurPasien(umurPasien); + if (rs.getString("riwayatAlergi") != null) { + pasien.setRiwayatAlergi(rs.getString("riwayatAlergi")); + } else { + pasien.setRiwayatAlergi("-"); + } + + pasien.setBeratBadan(rs.getString("beratBadan")); + pasien.setUmurPasien(umurPasien); + pasien.setListResep(this.getResepHeader(strukOrder)); + } + } catch (Exception var16) { + LOG.error("Exception at getPasien()", var16); + throw var16; + } finally { + try { + DatabaseUtility.clear(conn, pstmt, rs); + } catch (Exception var15) { + } + + } + + return pasien; + } + + public List getResepHeader(String strukOrder) throws Exception { + List list = null; + Resep resep = null; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + String SQL_HEADER = "select rd.racikanke as resep,rd.strukorderfk as strukorder from \t t_resep_dokter rd where rd.strukorderfk='" + strukOrder + "' \t and rd.statusenabled='true' group by rd.racikanke,rd.strukorderfk order by rd.racikanke asc"; + + try { + list = new ArrayList(); + this.ds1 = this.jdbcTemplate1.getDataSource(); + conn = this.ds1.getConnection(); + pstmt = conn.prepareStatement(SQL_HEADER); + rs = pstmt.executeQuery(); + + while (rs.next()) { + resep = new Resep(); + resep.setResep(rs.getString("resep")); + resep.setResepDetail(this.getResepDetail(strukOrder, rs.getString("resep"))); + if (resep != null) { + list.add(resep); + } + } + } catch (Exception var16) { + LOG.error("Exception at getResepDetail()", var16); + throw var16; + } finally { + resep = null; + + try { + DatabaseUtility.clear(conn, pstmt, rs); + } catch (Exception var15) { + } + + } + + return list; + } + + private List getResepDetail(String strukOrder, String resepke) throws Exception { + List list = null; + ResepDetail detail = null; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + String SQL_ITEM = "select rd.objectprodukfk,rd.qtyproduk,rd.satuanview, rd.keteranganpakai,rd.keteranganlainnya,rd.namaobat from t_resep_dokter rd where rd.strukorderfk='" + strukOrder + "' and rd.racikanke='" + resepke + "'"; + + try { + list = new ArrayList(); + this.ds1 = this.jdbcTemplate1.getDataSource(); + conn = this.ds1.getConnection(); + pstmt = conn.prepareStatement(SQL_ITEM); + rs = pstmt.executeQuery(); + + while (rs.next()) { + detail = new ResepDetail(); + detail.setNamaObat(rs.getString("namaobat")); + detail.setKeteranganLainnya(rs.getString("keteranganlainnya")); + detail.setKeteranganPakai(rs.getString("keteranganpakai")); + detail.setQtyProduk(rs.getString("qtyproduk")); + if (detail != null) { + list.add(detail); + } + } + } catch (Exception var17) { + LOG.error("Exception at getResepDetail()", var17); + throw var17; + } finally { + detail = null; + + try { + DatabaseUtility.clear(conn, pstmt, rs); + } catch (Exception var16) { + } + + } + + return list; + } + + public JasperPrint exportPdfResepPasien(String strukOrder) throws Exception { + JasperPrint print = null; + Connection conn = null; + Map parameters = null; + + try { + conn = this.jdbcTemplate1.getDataSource().getConnection(); + String path = "/usr/share/app/reporting/rpt_eresep1.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + String namaPasien = this.getPasien(strukOrder).getNamaPasien(); + String noRegistrasi = this.getPasien(strukOrder).getNoRegistrasi(); + String tglInput = this.getPasien(strukOrder).getTglOrder(); + String namaDokter = this.getPasien(strukOrder).getNamaDokter(); + String namaRuangan = this.getPasien(strukOrder).getNamaRuangan(); + String umurPasien = this.getPasien(strukOrder).getUmurPasien(); + String tglLahir = this.getPasien(strukOrder).getTglLahir(); + String noCM = this.getPasien(strukOrder).getNoCm(); + String alergi = this.getPasien(strukOrder).getRiwayatAlergi(); + String beratBadan = this.getPasien(strukOrder).getBeratBadan(); + parameters = new HashMap(); + parameters.put("strukOrder", strukOrder); + parameters.put("noRegistrasi", noRegistrasi); + parameters.put("namaPasien", namaPasien); + parameters.put("tglInput", tglInput); + parameters.put("tglLahir", tglLahir); + parameters.put("namaDokter", namaDokter); + parameters.put("namaRuangan", namaRuangan); + parameters.put("umurPasien", umurPasien); + parameters.put("noCM", noCM); + parameters.put("alergi", alergi); + parameters.put("beratBadan", beratBadan); + print = JasperFillManager.fillReport(jasperReport, parameters, conn); + } catch (Exception var25) { + LOG.error("Exception at exportPdfResepPasien"); + LOG.error(ReportingDao.class, var25); + } finally { + try { + conn.close(); + } catch (Exception var24) { + } + + } + + return print; + } +} diff --git a/src/main/java/com/reporting/service/UserService.java b/src/main/java/com/reporting/service/UserService.java new file mode 100644 index 0000000..e97eb66 --- /dev/null +++ b/src/main/java/com/reporting/service/UserService.java @@ -0,0 +1,28 @@ +package com.reporting.service; + +import com.reporting.dao.UserDaoImpl; + +import java.io.IOException; +import java.sql.SQLException; + +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JasperPrint; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + @Autowired + private UserDaoImpl userDao; + + public UserService() { + } + + public JasperPrint exportPdfFile() throws SQLException, JRException, IOException { + return this.userDao.exportPdfFile(); + } + + public void printReport(JasperPrint jasperPrint, String selectedPrinter) throws JRException { + this.userDao.printReport(jasperPrint, selectedPrinter); + } +} diff --git a/src/main/java/com/reporting/service/VerifikasiTagihanSupplierServices.java b/src/main/java/com/reporting/service/VerifikasiTagihanSupplierServices.java new file mode 100644 index 0000000..7b3a7cd --- /dev/null +++ b/src/main/java/com/reporting/service/VerifikasiTagihanSupplierServices.java @@ -0,0 +1,470 @@ +package com.reporting.service; + +import com.reporting.Utility.DatabaseUtility; +import com.reporting.model.VerifikasiTagihanSupplier; +import com.reporting.model.VerifikasiTagihanSupplier2; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; +import javax.sql.DataSource; + +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service("verifikasiTagihanSupplierServices") +public class VerifikasiTagihanSupplierServices { + static final Log LOG = LogFactory.getLog(VerifikasiTagihanSupplierServices.class); + @Autowired + @Qualifier("db") + private DataSource ds1; + @Qualifier("jdbcTemplate") + @Autowired + private JdbcTemplate jdbcTemplate1; + + public VerifikasiTagihanSupplierServices() { + } + + public static String terbilang(BigDecimal value) { + value = value.setScale(0, 6); + String strValue = value.toString(); + int lenValue = strValue.length(); + int x = 0; + int y = 0; + String bil1 = ""; + String bil2 = ""; + String urai = ""; + + while (x < lenValue) { + int z; + int strTot; + ++x; + strTot = Integer.valueOf(strValue.substring(x - 1, x)); + y += strTot; + z = lenValue - x + 1; + label94: + switch (strTot) { + case 1: + if (z != 1 && z != 7 && z != 10 && z != 13) { + if (z == 4) { + if (x == 1) { + bil1 = "Se"; + } else { + bil1 = "Satu "; + } + break; + } + + if (z != 2 && z != 5 && z != 8 && z != 11 && z != 14) { + bil1 = "Se"; + break; + } + + ++x; + int newStrTot = Integer.valueOf(strValue.substring(x - 1, x)); + z = lenValue - x + 1; + bil2 = ""; + switch (newStrTot) { + case 0: + bil1 = "Sepuluh "; + break label94; + case 1: + bil1 = "Sebelas "; + break label94; + case 2: + bil1 = "Dua belas "; + break label94; + case 3: + bil1 = "Tiga belas "; + break label94; + case 4: + bil1 = "Empat belas "; + break label94; + case 5: + bil1 = "Lima belas "; + break label94; + case 6: + bil1 = "Enam belas "; + break label94; + case 7: + bil1 = "Tujuh belas "; + break label94; + case 8: + bil1 = "Delapan belas "; + break label94; + case 9: + bil1 = "Sembilan belas "; + default: + break label94; + } + } + + bil1 = "Satu "; + break; + case 2: + bil1 = "Dua "; + break; + case 3: + bil1 = "Tiga "; + break; + case 4: + bil1 = "Empat "; + break; + case 5: + bil1 = "Lima "; + break; + case 6: + bil1 = "Enam "; + break; + case 7: + bil1 = "Tujuh "; + break; + case 8: + bil1 = "Delapan "; + break; + case 9: + bil1 = "Sembilan "; + break; + default: + bil1 = ""; + } + + if (strTot > 0) { + if (z != 2 && z != 5 && z != 8 && z != 11 && z != 14) { + if (z != 3 && z != 6 && z != 9 && z != 12 && z != 15) { + bil2 = ""; + } else { + bil2 = "Ratus "; + } + } else { + bil2 = "Puluh "; + } + } else { + bil2 = ""; + } + + if (y > 0) { + switch (z) { + case 4: + bil2 = bil2 + "Ribu "; + y = 0; + case 5: + case 6: + case 8: + case 9: + case 11: + case 12: + default: + break; + case 7: + bil2 = bil2 + "Juta "; + y = 0; + break; + case 10: + bil2 = bil2 + "Milyar "; + y = 0; + break; + case 13: + bil2 = bil2 + "Trilyun "; + y = 0; + } + } + + if (bil1.equals("Se")) { + String pre = bil2.substring(0, 1); + urai = urai + bil1 + bil2.replace(pre, pre.toLowerCase()); + } else { + urai = urai + bil1 + bil2; + } + } + + return urai; + } + + public String bilangx(double angka) { + String[] nomina = new String[]{"", "satu", "dua", "tiga", "empat", "lima", "enam", "tujuh", "delapan", "sembilan", "sepuluh", "sebelas"}; + if (angka < 12.0) { + return nomina[(int) angka]; + } else if (angka >= 12.0 && angka <= 19.0) { + return nomina[(int) angka % 10] + " belas "; + } else if (angka >= 20.0 && angka <= 99.0) { + return nomina[(int) angka / 10] + " puluh " + nomina[(int) angka % 10]; + } else if (angka >= 100.0 && angka <= 199.0) { + return "seratus " + this.bilangx(angka % 100.0); + } else if (angka >= 200.0 && angka <= 999.0) { + return nomina[(int) angka / 100] + " ratus " + this.bilangx(angka % 100.0); + } else if (angka >= 1000.0 && angka <= 1999.0) { + return "seribu " + this.bilangx(angka % 1000.0); + } else if (angka >= 2000.0 && angka <= 999999.0) { + return this.bilangx((double) ((int) angka / 1000)) + " ribu " + this.bilangx(angka % 1000.0); + } else { + return angka >= 1000000.0 && angka <= 9.99999999E8 ? this.bilangx((double) ((int) angka / 1000000)) + " juta " + this.bilangx(angka % 1000000.0) : ""; + } + } + + public VerifikasiTagihanSupplier getVerifikasiTagihanSupplier(String noverifikasifk) throws Exception { + VerifikasiTagihanSupplier verif = null; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + String SQL = "select * from(select xx.norec,xx.noverifikasifk,xx.tglstruk,xx.tgldokumen,xx.tgljatuhtempo,xx.rknid,xx.namarekanan,xx.asalproduk,xx.nostruk,xx.nodokumen,xx.nopo,xx.keperluan,xx.nosbk, \t\t\t\t(CASE WHEN xx.noverifikasi is null THEN '-' ELSE xx.noverifikasi END) as noverifikasi,xx.total,xx.totalppn,xx.totaldiskon,xx.subtotal,xx.sisautang, (CASE WHEN xx.noverifikasi is null THEN '-' ELSE xx.noverifikasi END) as noverifikasi, (case when xx.noorder is null then '-' else xx.noorder end) as nospk, (CASE WHEN xx.totalbayar = 0 THEN 'BELUM LUNAS' WHEN xx.totalbayar <> 0 and xx.totalbayar > 0 and xx.sisautang <> 0 THEN 'KREDIT' WHEN xx.totalbayar = xx.subtotal OR xx.sisautang = 0 THEN 'LUNAS' ELSE '' END) as statusbayar, (Case when xx.noverifikasi is null THEN 'BLM VERIFIKASI' WHEN xx.noverifikasi is not null THEN 'VERIFIKASI' ELSE '' END) as status, (Case when xx.confirmfk is null THEN 'BLM CONFIRM' ELSE 'CONFIRM' END) as statusconfirmkabag, (Case when xx.confirm1fk is null THEN 'BLM CONFIRM' ELSE 'CONFIRM' END) as statusconfirmanggaran, xx.noorderintern,xx.tglorder,xx.confirmfk,xx.confirm1fk,xx.keteranganlainnya as kodeanggaran,xx.kode_dana,xx.kode_dana,xx.ba,xx.sppb,xx.faktur,xx.pph FROM(SELECT x.norec,x.tglstruk,x.asalproduk,x.tgldokumen,x.tgljatuhtempo,x.rknid,x.namarekanan,x.nostruk,x.nodokumen,x.nopo, x.totalppn as totalppn, x.totaldiskon as totaldiskon, x.total as total, (x.total+x.totalppn-x.totaldiskon) as subtotal, x.totaldibayar as totalbayar, (case when x.totalsisahutang is null then (x.total+x.totalppn-x.totaldiskon) ELSE \t\t\t\t x.totalsisahutang end) as sisautang, x.nosbk,x.noverifikasi,x.noverifikasifk,x.confirmfk,x.confirm1fk,x.noorderintern,x.noorder,x.tglorder,x.keteranganlainnya,x.keperluan,x.kode_dana,x.ba,x.sppb,x.faktur,x.pph FROM (SELECT sp.norec,sp.tglstruk,sp.tglfaktur as tgldokumen,sp.nostruk,sp.nosppb as nopo,sp.nofaktur as nodokumen, SUM(spd.qtyproduk*spd.hargasatuan) as total, asp.asalproduk as asalproduk, SUM(spd.qtyproduk*spd.hargappn) as totalppn,SUM(spd.qtyproduk*spd.hargadiscount) as totaldiskon, CASE WHEN sbk.totaldibayar is null then 0 else sbk.totaldibayar end as totaldibayar, CASE WHEN sbk.totalsudahdibayar is null then 0 else sbk.totalsudahdibayar end as totalsudahdibayar,\t sbk.nosbk,sv.noverifikasi,sv.norec as noverifikasifk,sp.tgljatuhtempo,rkn.id as rknid,rkn.namarekanan,sbk.totalsisahutang, sv.confirmfk,sv.confirm1fk,so.noorderintern,so.noorder,so.tglorder,sv.keteranganlainnya,sv.keperluan,pg.kode_dana,sv.ba,sv.sppb,sv.faktur,sv.pph from strukpelayanan_t as sp left join strukorder_t as so on so.norec = sp.noorderfk inner join strukpelayanandetail_t as spd on spd.nostrukfk = sp.norec \t\t\t\t LEFT JOIN asalproduk_m as asp ON asp.id = spd.objectasalprodukfk left join rekanan_m as rkn on rkn.id = sp.objectrekananfk left join strukbuktipengeluaran_t as sbk on sbk.norec = sp.nosbklastfk left join strukverifikasi_t as sv on sv.norec = spd.noverifikasifk left join ruangan_m as ru on ru.id = sv.objectruanganfk \t\t\t\t left join penggunaan_anggaran_t as pg on pg.kode_anggaran=sv.keteranganlainnya\t where sp.objectkelompoktransaksifk=35 and sv.norec='" + noverifikasifk + "' GROUP BY sp.norec,sp.tglstruk,sp.tglfaktur,sp.nostruk,sp.nosppb,sp.nofaktur,sp.nosbklastfk,sbk.totaldibayar,pg.kode_dana, sbk.totalsudahdibayar,sp.tgljatuhtempo,rkn.id,rkn.namarekanan,sbk.nosbk,sv.noverifikasi,sv.norec,sbk.totalsisahutang,so.noorderintern,so.noorder,so.tglorder,asp.asalproduk) as x) as xx) as su"; + + try { + this.ds1 = this.jdbcTemplate1.getDataSource(); + conn = this.ds1.getConnection(); + pstmt = conn.prepareStatement(SQL); + rs = pstmt.executeQuery(); + if (rs.next()) { + verif = null; + verif = new VerifikasiTagihanSupplier(); + verif.setNoverifikasifk(rs.getString("noverifikasifk")); + verif.setNoSpk(rs.getString("nospk")); + verif.setKodeAnggaran(rs.getString("kodeanggaran")); + verif.setKodeDana(rs.getString("kode_dana")); + verif.setNamaRekanan(rs.getString("namarekanan")); + verif.setTotalBayar(rs.getDouble("subtotal")); + verif.setKeperluan(rs.getString("keperluan")); + verif.setAsalproduk(rs.getString("asalproduk")); + verif.setNoVerifikasi(rs.getString("noverifikasi")); + verif.setBa(rs.getString("ba")); + verif.setSppb(rs.getString("sppb")); + verif.setFaktur(rs.getString("faktur")); + verif.setPph(rs.getDouble("pph")); + verif.setTerbilang(terbilang(new BigDecimal(rs.getDouble("subtotal"))).toUpperCase() + "RUPIAH"); + } + } catch (Exception var15) { + LOG.error("Exception at getVerifikasiTagihanSupplier()"); + LOG.error("VerifikasiTagihanSupplierServices.class", var15); + throw var15; + } finally { + try { + DatabaseUtility.clear(conn, pstmt, rs); + } catch (Exception var14) { + } + + } + + return verif; + } + + public VerifikasiTagihanSupplier getVerifikasiPembayaranUmum(String noverifikasifk) throws Exception { + VerifikasiTagihanSupplier verif = null; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + String SQL = "select spu.norec,to_char(spu.tgltransaksi,'dd-MM-yyyy') as tglSPK,spu.keperluan,spu.totaltagihan,spu.totalbayar,\t sv.norec as noverifikasifk,sv.tglverifikasi,sv.noverifikasi,sv.confirmfk,sv.confirm1fk,sv.keteranganlainnya as kodeanggaran,\t pg.kode_dana,spu.nospk,spu.keperluan,spu.namarekanan,spu.dana as asalproduk,sv.ba,sv.sppb,sv.faktur,sv.pph\t from strukpembayaranumum_t as spu \t left join strukverifikasi_t as sv on sv.norec=spu.noverifikasifk left join penggunaan_anggaran_t as pg on pg.kode_anggaran=sv.keteranganlainnya where sv.norec='" + noverifikasifk + "'"; + + try { + this.ds1 = this.jdbcTemplate1.getDataSource(); + conn = this.ds1.getConnection(); + pstmt = conn.prepareStatement(SQL); + rs = pstmt.executeQuery(); + if (rs.next()) { + verif = null; + verif = new VerifikasiTagihanSupplier(); + verif.setNoverifikasifk(rs.getString("noverifikasifk")); + verif.setNoSpk(rs.getString("nospk")); + verif.setKodeAnggaran(rs.getString("kodeanggaran")); + verif.setKodeDana(rs.getString("kode_dana")); + verif.setNamaRekanan(rs.getString("namarekanan")); + verif.setTotalBayar(rs.getDouble("totaltagihan")); + verif.setKeperluan(rs.getString("keperluan")); + verif.setAsalproduk(rs.getString("asalproduk")); + verif.setNoVerifikasi(rs.getString("noverifikasi")); + verif.setTglSPK(rs.getString("tglSPK")); + verif.setBa(rs.getString("ba")); + verif.setSppb(rs.getString("sppb")); + verif.setFaktur(rs.getString("faktur")); + verif.setPph(rs.getDouble("pph")); + verif.setTerbilang(terbilang(new BigDecimal(rs.getDouble("totaltagihan"))).toUpperCase() + "RUPIAH"); + } + } catch (Exception var15) { + LOG.error("Exception at getVerifikasiPembayaranUmum()"); + LOG.error("VerifikasiTagihanSupplierServices.class", var15); + throw var15; + } finally { + try { + DatabaseUtility.clear(conn, pstmt, rs); + } catch (Exception var14) { + } + + } + + return verif; + } + + public JasperPrint generateVerifikasiTagihanPdf(String noverifikasifk) throws Exception { + JasperPrint print = null; + Map parameters = null; + JRBeanCollectionDataSource jrbcds = null; + Vector collection = null; + VerifikasiTagihanSupplier verif = null; + VerifikasiTagihanSupplier2 verif2 = null; + + try { + try { + if (noverifikasifk == null) { + throw new Exception("Cannot find verifikasi = " + noverifikasifk + "."); + } + + collection = null; + collection = new Vector(); + verif = null; + verif = this.getVerifikasiTagihanSupplier(noverifikasifk); + verif2 = null; + verif2 = new VerifikasiTagihanSupplier2(); + verif2.setNoSpk(verif.getNoSpk()); + verif2.setKodeAnggaran(verif.getKodeAnggaran()); + verif2.setKodeDana(verif.getKodeDana()); + verif2.setNamaRekanan(verif.getNamaRekanan()); + verif2.setTotalBayar(verif.getTotalBayar()); + verif2.setKeperluan(verif.getKeperluan()); + if (verif.getAsalproduk() != null) { + verif2.setAsalproduk(verif.getAsalproduk()); + } else { + verif2.setAsalproduk("-"); + } + + verif2.setNoVerifikasi(verif.getNoVerifikasi()); + verif2.setTerbilang("#" + verif.getTerbilang() + "#"); + if (verif.getBa() != null) { + verif2.setBa(verif.getBa()); + } else { + verif2.setBa("-"); + } + + if (verif.getSppb() != null) { + verif2.setSppb(verif.getSppb()); + } else { + verif2.setSppb("-"); + } + + if (verif.getFaktur() != null) { + verif2.setFaktur(verif.getFaktur()); + } else { + verif2.setFaktur("-"); + } + + if (verif.getPph() != null) { + verif2.setPph(verif.getPph()); + } else { + verif2.setPph(0.0); + } + + collection.add(verif2); + parameters = new HashMap(); + parameters.put("noverifikasifk", noverifikasifk); + jrbcds = new JRBeanCollectionDataSource(collection); + String path = "/usr/share/app/reporting/rpt_verifikasitagihansupplier.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + print = JasperFillManager.fillReport(jasperReport, parameters, jrbcds); + } catch (Exception var13) { + LOG.error("Exception at generateVerifikasiTagihanPdf()"); + LOG.error(VerifikasiTagihanSupplierServices.class, var13); + } + + return print; + } finally { + ; + } + } + + public JasperPrint generateVerifikasiPembayaranUmumPdf(String noverifikasifk) throws Exception { + JasperPrint print = null; + Map parameters = null; + JRBeanCollectionDataSource jrbcds = null; + Vector collection = null; + VerifikasiTagihanSupplier verif = null; + VerifikasiTagihanSupplier2 verif2 = null; + + try { + try { + if (noverifikasifk == null) { + throw new Exception("Cannot find verifikasi = " + noverifikasifk + "."); + } + + collection = null; + collection = new Vector(); + verif = null; + verif = this.getVerifikasiPembayaranUmum(noverifikasifk); + verif2 = null; + verif2 = new VerifikasiTagihanSupplier2(); + if (verif.getNoSpk() != null) { + verif2.setNoSpk(verif.getNoSpk()); + } else { + verif2.setNoSpk("-"); + } + + verif2.setKodeAnggaran(verif.getKodeAnggaran()); + verif2.setKodeDana(verif.getKodeDana()); + if (verif.getNamaRekanan() != null) { + verif2.setNamaRekanan(verif.getNamaRekanan()); + } else { + verif2.setNamaRekanan("-"); + } + + verif2.setTotalBayar(verif.getTotalBayar()); + verif2.setKeperluan(verif.getKeperluan()); + if (verif.getAsalproduk() != null) { + verif2.setAsalproduk(verif.getAsalproduk()); + } else { + verif2.setAsalproduk("-"); + } + + verif2.setNoVerifikasi(verif.getNoVerifikasi()); + verif2.setTerbilang("#" + verif.getTerbilang() + "#"); + if (verif.getBa() != null) { + verif2.setBa(verif.getBa()); + } else { + verif2.setBa("-"); + } + + if (verif.getSppb() != null) { + verif2.setSppb(verif.getSppb()); + } else { + verif2.setSppb("-"); + } + + if (verif.getFaktur() != null) { + verif2.setFaktur(verif.getFaktur()); + } else { + verif2.setFaktur("-"); + } + + if (verif.getPph() != null) { + verif2.setPph(verif.getPph()); + } else { + verif2.setPph(0.0); + } + + collection.add(verif2); + parameters = new HashMap(); + parameters.put("noverifikasifk", noverifikasifk); + jrbcds = new JRBeanCollectionDataSource(collection); + String path = "/usr/share/app/reporting/rpt_verifikasipembayaranumum.jrxml"; + JasperReport jasperReport = JasperCompileManager.compileReport(path); + print = JasperFillManager.fillReport(jasperReport, parameters, jrbcds); + } catch (Exception var13) { + LOG.error("Exception at generateVerifikasiPembayaranUmumPdf()"); + LOG.error(VerifikasiTagihanSupplierServices.class, var13); + } + + return print; + } finally { + ; + } + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..d00c453 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,20 @@ +server.port=7777 +#Datasource +spring.datasource.type=com.zaxxer.hikari.HikariDataSource +spring.datasource.driver-class-name=org.postgresql.Driver +#spring.datasource.url=jdbc:postgresql://localhost:5432/simrs_db_new +spring.datasource.url=jdbc:postgresql://172.16.88.8:5432/rsab_hk_production +#spring.datasource.url=jdbc:postgresql://192.168.12.1:5432/rsab_hk_production +#spring.datasource.url=jdbc:postgresql://192.168.12.3:5432/rsabhk_db_17022020 +spring.datasource.username=postgres +spring.datasource.password=root +#spring.datasource.hikari.pool-name=SpringBootHikariCP +#spring.datasource.hikari.connection-test-query=SELECT 1 +#spring.datasource.hikari.minimum-idle=5 +#spring.datasource.hikari.maximum-pool-size=50 +#spring.datasource.hikari.connection-timeout=30000 +#spring.datasource.hikari.idle-timeout=600000 +#spring.datasource.hikari.max-lifetime=1800000 +#spring.datasource.hikari.auto-commit=true +spring.mvc.dispatch-trace-request=true +spring.main.banner-mode=off diff --git a/src/test/java/com/reporting/ReportingAppTests.java b/src/test/java/com/reporting/ReportingAppTests.java new file mode 100644 index 0000000..5ee42d1 --- /dev/null +++ b/src/test/java/com/reporting/ReportingAppTests.java @@ -0,0 +1,13 @@ +package com.reporting; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ReportingAppTests { + + @Test + void contextLoads() { + } + +}