From 22f2a7e2111bce70ee48609c24563078eb2701f9 Mon Sep 17 00:00:00 2001 From: Code_with_Priyabrata <140397635+PriyabrataSur@users.noreply.github.com> Date: Thu, 23 Apr 2026 23:36:33 +0530 Subject: [PATCH] Backend uploaded --- SplitDash/HELP.md | 26 ++ SplitDash/mvnw | 295 ++++++++++++++++++ SplitDash/mvnw.cmd | 189 +++++++++++ SplitDash/pom.xml | 125 ++++++++ .../sigma/SplitDash/SplitDashApplication.java | 13 + .../SplitDash/controller/BillController.java | 72 +++++ .../java/in/sigma/SplitDash/dto/ItemDto.java | 24 ++ .../java/in/sigma/SplitDash/entity/Bill.java | 40 +++ .../java/in/sigma/SplitDash/entity/Item.java | 52 +++ .../in/sigma/SplitDash/entity/ItemStatus.java | 6 + .../sigma/SplitDash/repository/BillRepo.java | 10 + .../sigma/SplitDash/repository/ItemRepo.java | 21 ++ .../sigma/SplitDash/service/BillService.java | 18 ++ .../SplitDash/service/BillServiceImpl.java | 120 +++++++ .../src/main/resources/application.properties | 9 + .../SplitDash/SplitDashApplicationTests.java | 13 + .../target/classes/application.properties | 9 + .../SplitDash/SplitDashApplication.class | Bin 0 -> 752 bytes .../SplitDash/controller/BillController.class | Bin 0 -> 5895 bytes .../in/sigma/SplitDash/dto/ItemDto.class | Bin 0 -> 4117 bytes .../in/sigma/SplitDash/entity/Bill.class | Bin 0 -> 5393 bytes .../in/sigma/SplitDash/entity/Item.class | Bin 0 -> 6711 bytes .../sigma/SplitDash/entity/ItemStatus.class | Bin 0 -> 1269 bytes .../sigma/SplitDash/repository/BillRepo.class | Bin 0 -> 422 bytes .../sigma/SplitDash/repository/ItemRepo.class | Bin 0 -> 1423 bytes .../sigma/SplitDash/service/BillService.class | Bin 0 -> 1179 bytes .../SplitDash/service/BillServiceImpl.class | Bin 0 -> 9032 bytes .../SplitDash/SplitDashApplicationTests.class | Bin 0 -> 540 bytes 28 files changed, 1042 insertions(+) create mode 100644 SplitDash/HELP.md create mode 100644 SplitDash/mvnw create mode 100644 SplitDash/mvnw.cmd create mode 100644 SplitDash/pom.xml create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/SplitDashApplication.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/controller/BillController.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/dto/ItemDto.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/entity/Bill.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/entity/Item.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/entity/ItemStatus.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/repository/BillRepo.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/repository/ItemRepo.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/service/BillService.java create mode 100644 SplitDash/src/main/java/in/sigma/SplitDash/service/BillServiceImpl.java create mode 100644 SplitDash/src/main/resources/application.properties create mode 100644 SplitDash/src/test/java/in/sigma/SplitDash/SplitDashApplicationTests.java create mode 100644 SplitDash/target/classes/application.properties create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/SplitDashApplication.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/controller/BillController.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/dto/ItemDto.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/entity/Bill.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/entity/Item.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/entity/ItemStatus.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/repository/BillRepo.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/repository/ItemRepo.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/service/BillService.class create mode 100644 SplitDash/target/classes/in/sigma/SplitDash/service/BillServiceImpl.class create mode 100644 SplitDash/target/test-classes/com/SplitDash/SplitDashApplicationTests.class diff --git a/SplitDash/HELP.md b/SplitDash/HELP.md new file mode 100644 index 0000000..b1f9f2d --- /dev/null +++ b/SplitDash/HELP.md @@ -0,0 +1,26 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) +* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/4.0.5/maven-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/4.0.5/maven-plugin/build-image.html) +* [Spring Data JPA](https://docs.spring.io/spring-boot/4.0.5/reference/data/sql.html#data.sql.jpa-and-spring-data) +* [Spring Web](https://docs.spring.io/spring-boot/4.0.5/reference/web/servlet.html) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) + +### Maven Parent overrides + +Due to Maven's design, elements are inherited from the parent POM to the project POM. +While most of the inheritance is fine, it also inherits unwanted elements like `` and `` from the parent. +To prevent this, the project POM contains empty overrides for these elements. +If you manually switch to a different parent and actually want the inheritance, you need to remove those overrides. + diff --git a/SplitDash/mvnw b/SplitDash/mvnw new file mode 100644 index 0000000..bd8896b --- /dev/null +++ b/SplitDash/mvnw @@ -0,0 +1,295 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.4 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" + +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi +fi + +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi + +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/SplitDash/mvnw.cmd b/SplitDash/mvnw.cmd new file mode 100644 index 0000000..92450f9 --- /dev/null +++ b/SplitDash/mvnw.cmd @@ -0,0 +1,189 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.4 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' + +$MAVEN_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/SplitDash/pom.xml b/SplitDash/pom.xml new file mode 100644 index 0000000..0752167 --- /dev/null +++ b/SplitDash/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 4.0.5 + + + in.sigma + SplitDash + 0.0.1-SNAPSHOT + + + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-webmvc + + + + com.microsoft.sqlserver + mssql-jdbc + runtime + + + com.mysql + mysql-connector-j + runtime + + + org.projectlombok + lombok + 1.18.30 + true + + + org.springframework.boot + spring-boot-starter-data-jpa-test + test + + + org.springframework.boot + spring-boot-starter-webmvc-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + 1.18.30 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + compile + + compile + + + + + org.projectlombok + lombok + 1.18.30 + + + + + + default-testCompile + test-compile + + testCompile + + + + + org.projectlombok + lombok + + + + + + + + + + diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/SplitDashApplication.java b/SplitDash/src/main/java/in/sigma/SplitDash/SplitDashApplication.java new file mode 100644 index 0000000..46c736e --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/SplitDashApplication.java @@ -0,0 +1,13 @@ +package in.sigma.SplitDash; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SplitDashApplication { + + public static void main(String[] args) { + SpringApplication.run(SplitDashApplication.class, args); + } + +} diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/controller/BillController.java b/SplitDash/src/main/java/in/sigma/SplitDash/controller/BillController.java new file mode 100644 index 0000000..3eab4c6 --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/controller/BillController.java @@ -0,0 +1,72 @@ +package in.sigma.SplitDash.controller; + +import in.sigma.SplitDash.dto.ItemDto; +import in.sigma.SplitDash.entity.Bill; +import in.sigma.SplitDash.service.BillService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/bills") +@CrossOrigin(origins = "*", allowedHeaders = "*") +@RequiredArgsConstructor +public class BillController { + + private final BillService billService; + + @PostMapping + public ResponseEntity> createBill(@RequestBody Map request) { + String billName = request.getOrDefault("name", "Dinner Bill"); + String sessionId = billService.createBill(billName); + return ResponseEntity.ok(Map.of("sessionId", sessionId)); + } + + @GetMapping("/{sessionId}") + public ResponseEntity getBill(@PathVariable String sessionId) { + Bill bill = billService.getBill(sessionId); + return bill != null ? ResponseEntity.ok(bill) : ResponseEntity.notFound().build(); + } + + @GetMapping("/{sessionId}/items") + public ResponseEntity> getItems(@PathVariable String sessionId) { + List items = billService.getItems(sessionId); + return ResponseEntity.ok(items); + } + + @PostMapping("/{sessionId}/items") + public ResponseEntity addItems(@PathVariable String sessionId, @RequestBody List items) { + billService.addItems(sessionId, items); + return ResponseEntity.ok().build(); + } + + @PostMapping("/{sessionId}/items/{itemId}/claim") + public ResponseEntity claimItem(@PathVariable String sessionId, + @PathVariable Long itemId, + @RequestParam String claimedBy) { + try { + ItemDto item = billService.claimItem(sessionId, itemId, claimedBy); + return ResponseEntity.ok(item); + } catch (RuntimeException e) { + return ResponseEntity.badRequest().build(); + } + } + + @GetMapping("/{sessionId}/progress") + public ResponseEntity getProgress(@PathVariable String sessionId) { + BigDecimal progress = billService.getClaimedPercentage(sessionId); + return ResponseEntity.ok(progress); + } + + @PostMapping("/{sessionId}/shares") + public ResponseEntity> calculateShares(@PathVariable String sessionId, + @RequestParam(defaultValue = "8.875") BigDecimal taxPercent, + @RequestParam(defaultValue = "20") BigDecimal tipPercent) { + Map shares = billService.calculateShares(sessionId, taxPercent, tipPercent); + return ResponseEntity.ok(shares); + } +} \ No newline at end of file diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/dto/ItemDto.java b/SplitDash/src/main/java/in/sigma/SplitDash/dto/ItemDto.java new file mode 100644 index 0000000..868afee --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/dto/ItemDto.java @@ -0,0 +1,24 @@ +package in.sigma.SplitDash.dto; + +import in.sigma.SplitDash.entity.ItemStatus; +import lombok.Data; +import java.math.BigDecimal; + +@Data +public class ItemDto { + private Long id; + private String name; + private BigDecimal price; + private ItemStatus status; + private String claimedBy; + + public ItemDto() {} + + public ItemDto(Long id, String name, BigDecimal price, ItemStatus status, String claimedBy) { + this.id = id; + this.name = name; + this.price = price; + this.status = status; + this.claimedBy = claimedBy; + } +} diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/entity/Bill.java b/SplitDash/src/main/java/in/sigma/SplitDash/entity/Bill.java new file mode 100644 index 0000000..a4ea505 --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/entity/Bill.java @@ -0,0 +1,40 @@ +package in.sigma.SplitDash.entity; + + +import jakarta.persistence.*; +import lombok.Data; +import java.math.BigDecimal; +import java.time.Instant; +import java.util.UUID; + +@Data +@Entity +@Table(name = "bills") +public class Bill { + @Id + private String id = UUID.randomUUID().toString(); + + @Column(nullable = false) + private String name; + + @Column(precision = 10, scale = 2) + private BigDecimal subtotal = BigDecimal.ZERO; + + @Column(precision = 10, scale = 2) + private BigDecimal tax = BigDecimal.ZERO; + + @Column(precision = 10, scale = 2) + private BigDecimal tip = BigDecimal.ZERO; + + @Column + private Instant createdAt = Instant.now(); + + @Version + private Long version; + + public Bill() {} + + public Bill(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/entity/Item.java b/SplitDash/src/main/java/in/sigma/SplitDash/entity/Item.java new file mode 100644 index 0000000..c558cd6 --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/entity/Item.java @@ -0,0 +1,52 @@ +package in.sigma.SplitDash.entity; + + +import jakarta.persistence.*; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.Instant; + +@Entity +@Data +public class Item { + // Getters and Setters + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String sessionId; + + @Column(nullable = false) + private String name; + + @Column(nullable = false, precision = 10, scale = 2) + private BigDecimal price; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ItemStatus status = ItemStatus.UNCLAIMED; + + @Column + private String claimedBy; + + @Column + private Instant claimedAt; + + @Version + private Long version; + + @Column(name = "last_updated") + private Instant lastUpdated = Instant.now(); + + // Constructors + public Item() {} + + public Item(String sessionId, String name, BigDecimal price) { + this.sessionId = sessionId; + this.name = name; + this.price = price; + } + +} \ No newline at end of file diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/entity/ItemStatus.java b/SplitDash/src/main/java/in/sigma/SplitDash/entity/ItemStatus.java new file mode 100644 index 0000000..1e4b785 --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/entity/ItemStatus.java @@ -0,0 +1,6 @@ +package in.sigma.SplitDash.entity; + + +public enum ItemStatus { + UNCLAIMED, CLAIMING, CLAIMED, LOCKED +} diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/repository/BillRepo.java b/SplitDash/src/main/java/in/sigma/SplitDash/repository/BillRepo.java new file mode 100644 index 0000000..6d88f5a --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/repository/BillRepo.java @@ -0,0 +1,10 @@ +package in.sigma.SplitDash.repository; + + +import in.sigma.SplitDash.entity.Bill; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface BillRepo extends JpaRepository { +} diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/repository/ItemRepo.java b/SplitDash/src/main/java/in/sigma/SplitDash/repository/ItemRepo.java new file mode 100644 index 0000000..6ad98bd --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/repository/ItemRepo.java @@ -0,0 +1,21 @@ +package in.sigma.SplitDash.repository; + +import in.sigma.SplitDash.entity.Item; +import in.sigma.SplitDash.entity.ItemStatus; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ItemRepo extends JpaRepository { + List findBySessionId(String sessionId); + List findBySessionIdAndStatus(String sessionId, ItemStatus status); + Optional findByIdAndSessionId(Long id, String sessionId); + + @Query("SELECT i FROM Item i WHERE i.sessionId = :sessionId AND i.status = 'UNCLAIMED' ORDER BY i.lastUpdated ASC") + List findUnclaimedItemsBySessionId(@Param("sessionId") String sessionId); +} diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/service/BillService.java b/SplitDash/src/main/java/in/sigma/SplitDash/service/BillService.java new file mode 100644 index 0000000..f4e6297 --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/service/BillService.java @@ -0,0 +1,18 @@ +package in.sigma.SplitDash.service; + +import in.sigma.SplitDash.dto.ItemDto; +import in.sigma.SplitDash.entity.Bill; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +public interface BillService { + String createBill(String billName); + Bill getBill(String sessionId); + List getItems(String sessionId); + ItemDto claimItem(String sessionId, Long itemId, String claimedBy); + void addItems(String sessionId, List itemDtos); + BigDecimal getClaimedPercentage(String sessionId); + Map calculateShares(String sessionId, BigDecimal taxPercent, BigDecimal tipPercent); +} diff --git a/SplitDash/src/main/java/in/sigma/SplitDash/service/BillServiceImpl.java b/SplitDash/src/main/java/in/sigma/SplitDash/service/BillServiceImpl.java new file mode 100644 index 0000000..ec1498b --- /dev/null +++ b/SplitDash/src/main/java/in/sigma/SplitDash/service/BillServiceImpl.java @@ -0,0 +1,120 @@ +package in.sigma.SplitDash.service; + +import in.sigma.SplitDash.dto.ItemDto; +import in.sigma.SplitDash.entity.Bill; +import in.sigma.SplitDash.entity.Item; +import in.sigma.SplitDash.entity.ItemStatus; +import in.sigma.SplitDash.repository.BillRepo; +import in.sigma.SplitDash.repository.ItemRepo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Instant; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional +public class BillServiceImpl implements BillService { + + private final BillRepo billRepository; + private final ItemRepo itemRepository; + + @Override + public String createBill(String billName) { + Bill bill = new Bill(billName); + Bill savedBill = billRepository.save(bill); + return savedBill.getId(); + } + + @Override + public Bill getBill(String sessionId) { + return billRepository.findById(sessionId).orElse(null); + } + + @Override + public List getItems(String sessionId) { + List items = itemRepository.findBySessionId(sessionId); + return items.stream() + .map(item -> new ItemDto(item.getId(), item.getName(), item.getPrice(), + item.getStatus(), item.getClaimedBy())) + .collect(Collectors.toList()); + } + + @Override + public ItemDto claimItem(String sessionId, Long itemId, String claimedBy) { + Item item = itemRepository.findByIdAndSessionId(itemId, sessionId) + .orElseThrow(() -> new RuntimeException("Item not found: " + itemId)); + + if (item.getStatus() != ItemStatus.UNCLAIMED) { + throw new RuntimeException("Item is not available. Current status: " + item.getStatus()); + } + + // Atomic claim operation + item.setStatus(ItemStatus.CLAIMED); + item.setClaimedBy(claimedBy); + item.setClaimedAt(Instant.now()); + + Item savedItem = itemRepository.save(item); + return new ItemDto(savedItem.getId(), savedItem.getName(), savedItem.getPrice(), + savedItem.getStatus(), savedItem.getClaimedBy()); + } + + @Override + public void addItems(String sessionId, List itemDtos) { + itemDtos.forEach(dto -> { + Item item = new Item(sessionId, dto.getName(), dto.getPrice()); + itemRepository.save(item); + }); + } + + @Override + public BigDecimal getClaimedPercentage(String sessionId) { + List allItems = itemRepository.findBySessionId(sessionId); + List claimedItems = itemRepository.findBySessionIdAndStatus(sessionId, ItemStatus.CLAIMED); + + if (allItems.isEmpty()) return BigDecimal.ZERO; + + BigDecimal totalValue = allItems.stream() + .map(Item::getPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal claimedValue = claimedItems.stream() + .map(Item::getPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + return totalValue.compareTo(BigDecimal.ZERO) > 0 ? + claimedValue.divide(totalValue, 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)) : + BigDecimal.ZERO; + } + + @Override + public Map calculateShares(String sessionId, BigDecimal taxPercent, BigDecimal tipPercent) { + List claimedItems = itemRepository.findBySessionIdAndStatus(sessionId, ItemStatus.CLAIMED); + + if (claimedItems.isEmpty()) { + return Map.of(); + } + + BigDecimal totalClaimed = claimedItems.stream() + .map(Item::getPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + BigDecimal tax = totalClaimed.multiply(taxPercent).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + BigDecimal tip = totalClaimed.multiply(tipPercent).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + + BigDecimal extraPerPerson = tax.add(tip) + .divide(BigDecimal.valueOf(claimedItems.size()), 2, RoundingMode.HALF_UP); + + return claimedItems.stream().collect(Collectors.toMap( + Item::getClaimedBy, + item -> item.getPrice().add(extraPerPerson), + (existing, replacement) -> existing + )); + } +} \ No newline at end of file diff --git a/SplitDash/src/main/resources/application.properties b/SplitDash/src/main/resources/application.properties new file mode 100644 index 0000000..1fde739 --- /dev/null +++ b/SplitDash/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.application.name=SplitDash +spring.datasource.username=root +spring.datasource.password=root +spring.datasource.url=jdbc:mysql://localhost:3306/splitdash + +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.hibernate.ddl-auto=update + +spring.jpa.show-sql=true \ No newline at end of file diff --git a/SplitDash/src/test/java/in/sigma/SplitDash/SplitDashApplicationTests.java b/SplitDash/src/test/java/in/sigma/SplitDash/SplitDashApplicationTests.java new file mode 100644 index 0000000..5c53d8e --- /dev/null +++ b/SplitDash/src/test/java/in/sigma/SplitDash/SplitDashApplicationTests.java @@ -0,0 +1,13 @@ +package in.sigma.SplitDash; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SplitDashApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/SplitDash/target/classes/application.properties b/SplitDash/target/classes/application.properties new file mode 100644 index 0000000..1fde739 --- /dev/null +++ b/SplitDash/target/classes/application.properties @@ -0,0 +1,9 @@ +spring.application.name=SplitDash +spring.datasource.username=root +spring.datasource.password=root +spring.datasource.url=jdbc:mysql://localhost:3306/splitdash + +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.hibernate.ddl-auto=update + +spring.jpa.show-sql=true \ No newline at end of file diff --git a/SplitDash/target/classes/in/sigma/SplitDash/SplitDashApplication.class b/SplitDash/target/classes/in/sigma/SplitDash/SplitDashApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..c9a34d477969ef34eb2e19a7136ef11634b4ab56 GIT binary patch literal 752 zcma)4y;9pi5dO|T$TkiTJ3t_zpo;Ax>S!E16U?MCkcl&*NOcm2d_=nQoK7UKm5NM? zJU||bVNWoz3KeKZySM+l-|oNrKYsxnK+75#BJC;97OU6CCFvq=rB)quu09N-%8Bq!Q96a|f9fh8#O{otsE}lCH_U|2rrR_uipKwlBG|G8KW$ zq?=wTZHvuNl1U|K#X5LyHKA9aCZ3jaLVGF|7~>EgosRozVD5N`Zj$5^XT+PMJFs7c zd5fqsgF;>s?LIo7hdxPdyuvmmaluDLGN9G-M!(U%T*bRP1>KW}^-_)&cCbtO*Yr0D RVPZAx6?7kOh`X|Hfd^iz#5e!| literal 0 HcmV?d00001 diff --git a/SplitDash/target/classes/in/sigma/SplitDash/controller/BillController.class b/SplitDash/target/classes/in/sigma/SplitDash/controller/BillController.class new file mode 100644 index 0000000000000000000000000000000000000000..3bd3c9a4b0928bf0413d9ebc22dcdfe41ee8918f GIT binary patch literal 5895 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 Wl9QkC^CSF%voxt+;#c@Ja{mE-SPYK< literal 0 HcmV?d00001 diff --git a/SplitDash/target/classes/in/sigma/SplitDash/entity/Item.class b/SplitDash/target/classes/in/sigma/SplitDash/entity/Item.class new file mode 100644 index 0000000000000000000000000000000000000000..1c27c349e0bf682730fda486b6ad9f34e6f8a1f7 GIT binary patch literal 6711 zcmcgx>vvpL760ALd*&vYByH(nsG*%g9&N)zQEn(DNt-g5gtiH(fC{(CB^ffA2{Sjv z;sX`Mw;;X{-!JN;Dj+Ej5kUpl@{=FKhM7i;2>T}qY04&qBdfPTgcw+o_707Zh5x<=2Lfj)4qlHb;WYg zzurQmyJsqeBvJ{aZDe3u$QR4~wc_l8+dr{bD*A`r+FZX^_KW_R{(|oMZb+JB$$-p4*J5q%Er}VEpghb ziqmQG-fH6-yv;&#+ASZsXUQ$e8U-fO=`hf9n}Dyi;b4HC&w9R!xW1YyX62J4)jfN^V6m|oGHb^Wz#D)@05H{%%BM&>k`+D(PcQ%xfW#J~v~6LqJD>#Ht;TWm~8`bjiK zFzAcmoi=V2K??<=E9oU`b-Rss;obCpjzu(FnPEP#;0kHnfjbj$ZJfgNs`}KcA)Dxy zmb{zqVrhl#S6~ax`n9w2JsWpn*1|;#?z}f#DNnop$)eABb(OGYp9&gNJG$P||An)` z+@^ekMP?y)Vu{^n!J8`9il<86V7Xl3#xlbh&`x?g?^b=ce^K(T=6mI7wuKocV?I=L z)GK>css1ThV8W6$U&ga%E}+5rCeJJ?jl$t0&u25q~%1aB{V;YR9v|#7l5NdpkPfVUDj32ddNhs13 zDJ|O45bs#3cf_bp(pJ`sH@>uR%BxO_|I+>{bal$D7G-RhQGc$;P3XEnb#a=5!NfBu zOV8@Z(kjl{vhJB;iHv#vTxI5%TV-GHxz)0Ex=nQiO{=^T1)I`9&so*=%xnTn5GJig z@}SXRa>inqBRmoseWj=S0)d;hQun9PPPBWCCc;C)%ose>21G5*>C9%a!Eg|0Fcz%J z>T}7obFNLrpYy5=Pc|qo$4gRi6lp7_IVCJKYe{3=qQrrduT=vAoRosdiAN8$)C`os zoO~HAsgJZ-(~@mt(+u^T)Ae?1!OR)ptbz>k$X^W+PF78^>V$98^Q_`Eb6ck8$J|Ae z#j#^2c#Gj`7I>&tz1mVqE);sz@{MIl=K~86%jl zS9BtB4JRr~)oE{}D3z9yOV$CYjg9)t5p@}3Rb_`N6~D&*wW!OZmc+9b?h*st#hHWF zzOIJPG7z8TseD#a<+D%?p96zIUj}9YgbcWU(CTT8)Zn8I95;J56`n?sphIxbwwTSF61fE2%Z z1LVmt$59(cMLzH5c-}(^3uN#fYQz~n%luSs!y*N|b%qOg`!s^>N+Y5*?kS*(S^++F zdHXhy9ULu@KJDRNyfERHx6XAu-Z=xjGxWbnuG)rIcY1dX_hBcQd?DfY z`v@B&(BiYB_Ze8dPa(04=H6$~zKoquDl6~j_YNum`w*qY47%xe5865Y0J#za)$u{x z&!?FF5KW5d2lCoSMUC1>{*#1epWr2Wf zAjViDM&74GlsnfdcZ4eQavh@FwN`mYs4{QiAuUxBqS*SAK2||>2u2t>{RsIMbFuCmTDLECF%)NXi zUv-vbl(tl{$V~{EJx}Wa-IA@v$(Iom(}jJCQNDOPPEy++^2QP3j(IOzu`D zKaNj?c^N3w%>&on&zRh+Onwrd3NzWfRWEh7G$z}W$xnv|-nUhgy15#Y`<2Ph;Im;~ z9@wf$-J6ZcE0oF4g(uOKTQ#X$yD@pSGWk%rmw}GG`S$3O!I->QndFZNI`F1H^0}QY za=x$kam1qM`d&uMV~9o0^}U3av3t1E3)%LC}zs%q0YrG@wK-832tqDS}3vbS@>Jv;n1Z z=>VwUWC$uab}l0z+ki*~Kx0lbL1Ru!u311W2GpEu34o3}tppu+vbk0PWeun`mkod> zoi>6do%URtfZ7eHE!Q3Zopd?~I_Yf7bqHvi0d?fI)j`p7>=2Q_siXVJYkC{%{luEb z!}vT~$aZTAkMOi@Lf$%xFOV1EFHVE_BB>~jT6uhlR19O*E_|6(oR^q4@D)-CUOxVX zM@c35`4hg%?-V7k;W1KaoX0Z0Mk<3B@N;~fl#M@g)^Ct%#$Q>%-z3#y0rU74sa7iv z58o!0wf15J-yzjz_2CA5msGoT6VL1Kk?OFH@#gS-QrqwY#=3xAiR8c0l0eJr*pWaJ z|B}}0*s00X|CUr205;%{WCjoUG$(Tkk0JD9Lpn_?K_La{`0u)PT?PNq9VvejU*{WqeVkb zOo>=8N-3F()kPytT#4ch5vxdR6`X_;v4D(LqAnV9l1h|ph*(xy>$sCrB36{qO4UV^ zPFji54H4^1Yn^m5O2iT~S{Wtk3{T_x^pcn~j^H179A~*;G5j4rB-O;k`x}15b&X&T zQ}M^7qWp35IsAlF47W1r&XJ1q()<8^N-BYecvb%ysU*>3OjSwaS9mpif>auR;hFy= zsf;9BQv~gAkP&6FSr!uvmh}dwS{XM9V>@DXKphiZ%`&if0Jef$%QfJ{YVZm^L|{~s z>r_^>!evI0|2xnD5+D3i@kZre3*lm;p58#dGW%u-VWxy);$@D{^OGd~96!(C*Bqruy@cQ3cgX!0jT}6o literal 0 HcmV?d00001 diff --git a/SplitDash/target/classes/in/sigma/SplitDash/entity/ItemStatus.class b/SplitDash/target/classes/in/sigma/SplitDash/entity/ItemStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..40e444715fa0bbbbe5fdad5c052a8949c5205fcf GIT binary patch literal 1269 zcma)5?@!ZE6g_Wi*RB>f#}5TT5hrY*)F~*^K_FwA#Q`RjnZ-|K)KSuPrt3)j=AWb^ z5u(xX*+0s7-`fl$YO*Em-M#OgbKgBV{rT(b4*+XeQxIWDyS~wK>kZqm-g|DiWw#Cu z#}D1`gHZ~dh85ajyA=n6q(erGA-=a$C~uawi(3q{|@*TY`<>o?jJd|(9|%2n+hg%OyL&YGefG}tl3`04qQ&wW0ZWm zLBy%Q)nQ0(JKEO)4qV^%$bObv_sNq1@kTS* z3OOoY^LlEo^bO*g=Lfs}x=BN=W;>`k&t0xW;==li+y)ytl7E7}8hK-!e+2+Vva^Wf zU=hi+Kyrdxm3PwleJl{}0cA53`A_R0`2{2A82v;U!y>(7;!L9cDHw=|{w0bWp{3aT z8OG1Scz@(l|3j+i-7e(th_c7@$PBrUyp?>0s36NxjM9-Zzc6`<+n?$0|Ckgk@ht>X zJc8vU@PwYH0_!u&=Isk_lrq)!kP$vsIVib!TI--g%*j(!P{e~Q6uRJjTE}(PY!Z@Lr3YWkgAd?CiCK$S zq$dyakAdHO-+X+&y#v5GObQq%IAW(0*DdNQSe9!{k2+HDiN(jIzG7=}~!MO5WT+j{MEN1d!`lJ`7;BeMuKudR=cy8&^IWH*e tT~ctoQDzc~Xr?BxGL?uwiTunVK_I)=Smhk3sb@CB~QhFAaq literal 0 HcmV?d00001 diff --git a/SplitDash/target/classes/in/sigma/SplitDash/repository/ItemRepo.class b/SplitDash/target/classes/in/sigma/SplitDash/repository/ItemRepo.class new file mode 100644 index 0000000000000000000000000000000000000000..12b8e0bbc6b513f5846244d98865655c09ba26a1 GIT binary patch literal 1423 zcmb_cU2oGc6ul1ppkreL25i6}LK6ca&Ef$GQHIpDspyohkWeOg^BS*nNs|yeLlysw z2YvuQ3UQr`rbXRWAs(XEKJvNe+^?U%zW)G#9Wcva5O^d4Dn)zX21FxW3K%rwibAv4XCI+4O!G9NQ$2(0L*e|$fe<_)d68}xi8hTPMg zDyQ0M-AS;DL;gWXap?0}5QLaq)Q3f*_PkyDF5&SA{S;4_pI}P~*RrkpdsCQAr_(ld zSp0wR#&RrEY>)fU+%aF~huVHagK2FM+3N1s?OLmCHMY!-)36+K_aovyld2ox=y1=h zxpe{$ryYzte#*+Tv#m@F@)vD`rVME2+e8_&QLdiNa^4tUSg46WY5(Y9T5!W8?(wGZ zF`r9+R?N1ZeF9Hs3XwSHJXE8I(|m_iar+RsgkKRiS^+my87_kX6+9I&4E|if&wxdQ zmf-3sR54O$c?_>0d=0MW@C}6W*Q*HMMB>5>Vz`yE5V(yh)+DUM9lTi7y6$E-3n(yC RaSt{SGvI#usD$tXfZx6Fuv`ED literal 0 HcmV?d00001 diff --git a/SplitDash/target/classes/in/sigma/SplitDash/service/BillService.class b/SplitDash/target/classes/in/sigma/SplitDash/service/BillService.class new file mode 100644 index 0000000000000000000000000000000000000000..2c49816bbd08d22ce8f1a827756973ba609b789d GIT binary patch literal 1179 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 Z#t$NSRS;V==w;iKOIR&p2cPH~@D3R(f7t*4 literal 0 HcmV?d00001